本文主要探索了 WS1408 上刷入 OpenWrt 的方式,以及对该设备上 Armbian 的展望
OpenWrt 固件制作及输入流程,Ctrl+F 搜索关键字 “实现流程” 跳跃至正文 – 开始操作
⚠阅前须知⚠
本文是从一个对嵌入式开发一无所知的使用者的角度,对一款不太热门的设备的研究过程,冗长而无趣,但有用?轻喷
TODO
1. 解决知乎 markdown 有序列表间插入代码块,编号不连续的问题
本次研究缘起 赚钱宝1代2代3代openwrt官网固件线刷包 by dybjxx,正好我杂物堆里又翻出了一台迅雷赚钱宝一代,那不得整起?
迅雷赚钱宝初代,板代号 WS1408,配置如下:
CPU:amologic s805 (Meson8 Family, Meson8b, Quad 32bit Cortex-A5, ARMv7, 28nm, 1.5GHz)
RAM:Nanya DDR3 256MB
ROM: Spansion S34ML01G100TF100 1Gb SLC NAND FLASH
USB:USB2.0-OTG
T-Flash:最高支持Class-10,64GB
网口:IC+ IP101GR 100Mbps
电源:12V/1A
TTL波特率:115200
除开百兆网口以外,这配置做一台 Linux 小主机还是8错的,甚至可以做一台弱鸡单臂路由。
一些拆机
https://blog.ich8.com/post/5994https://www.right.com.cn/forum/forum.php?mod=viewthread&tid=168677
官方固件有什么
先来看看官方固件。据我所知,迅雷并没有公开提供过赚钱宝的线刷固件,所以只能求助万能的网友了。
从网上收集到两个线刷固件
收集物x2
thunder-miner-rom_445.img miner_rom_V1.3.1330.img
固件解析
整理了一些分析工具的输出结果
文件名: miner_rom_V1.3.1330.img
文件大小: 28.3 MB (29,742,256 字节)
MD5: B19C7C0F117265225EB9AC521939FE47
SHA1: 8832C416D91AE428FFF1FA9811BB06CA7520F082
SHA256: 5ACF38186A50337D96EF6E22ECB56434A1F2C23EFDE6FD4EFD2B5003A4391328
SHA512: BECFBD2E0C717D3C39E4B440DA6B9B021A7933801832D993E09FCB5035075BE3067EE39812843098659B4D0040F800A44FE7179424F694D69B2BCBA935C8E5AA
CRC32: 3F483A2E
# binwalk.diff
425352 0x67D88 uImage header, header size: 64 bytes, header CRC: 0xD6ADBBD4, created: 2015-07-20 05:49:31, image size: 4792105 bytes, Data Address: 0x208000, Entry Point: 0x208000, data CRC: 0xDD4AD31F, OS: Linux, CPU: ARM, image type: OS Kernel Image, image name: "Linux-3.10.33"
5217672 0x4F9D88 gzip compressed data, maximum compression, has original file name: "rootfs.cpio", from Unix, last modified: 2015-07-20 05:49:39
# linux-amlogic-toolkit
[Msg]Unpack item [USB , DDR] to (output/image/DDR.USB) size:13640 bytes
[Msg]Unpack item [USB , UBOOT_COMP] to (output/image/UBOOT_COMP.USB) size:391871 bytes
[Msg]Unpack item [conf , platform] to (output/image/platform.conf) size:116 bytes
[Msg]Unpack item [dtb , meson] to (output/image/meson.dtb) size:16201 bytes
[Msg]Unpack item [conf , keys] to (output/image/keys.conf) size:0 bytes
[Msg]Unpack item [PARTITION , boot] to (output/image/boot.PARTITION) size:6292439 bytes
[Msg]Unpack item [PARTITION , upgrade] to (output/image/upgrade.PARTITION) size:22601728 bytes
[Msg]Unpack item [PARTITION , bootloader] to (output/image/bootloader.PARTITION) size:424640 bytes
# U-boot banner
U-boot-00000-g094c33d-dirty(m8b_m201_v1@) (Jul 27 2016 - 17:18:23)
another 应该是旧一点的
文件名: thunder-miner-rom_445.img
文件大小: 21.6 MB (22,650,996 字节)
MD5: F58048BFE42885C27D7FD799512882EA
SHA1: 078981FB9CF6CF813C3427DE8377ACE8EBEDCB61
SHA256: EC0D532474D7384AD06A719AF3830C6470560912EF284D62193D39C6CB103D3B
SHA512: E829FA622372C23CDDBAB6FF523CE892ADDD8DF32F4884658C9C84E75B8F06E43F8EF5BEE6DE3798AEF58CC2D3D0B5818427A2C5A922E99944511159D75B6417
CRC32: D829A6E7
# binwalk.diff
424680 0x67AE8 uImage header, header size: 64 bytes, header CRC: 0xDBF0C66F, created: 2014-12-23 02:38:32, image size: 4691103 bytes, Data Address: 0x208000, Entry Point: 0x208000, data CRC: 0x780B54DC, OS: Linux, CPU: ARM, image type: OS Kernel Image, image name: "Linux-3.10.33"
5116648 0x4E12E8 gzip compressed data, maximum compression, has original file name: "rootfs.cpio", from Unix, last modified: 2014-12-23 02:38:42
# linux-amlogic-toolkit
[Msg]Unpack item [USB , DDR] to (output/image/DDR.USB) size:13640 bytes
[Msg]Unpack item [USB , UBOOT_COMP] to (output/image/UBOOT_COMP.USB) size:391235 bytes
[Msg]Unpack item [conf , platform] to (output/image/platform.conf) size:116 bytes
[Msg]Unpack item [dtb , meson] to (output/image/meson.dtb) size:16167 bytes
[Msg]Unpack item [conf , keys] to (output/image/keys.conf) size:0 bytes
[Msg]Unpack item [PARTITION , boot] to (output/image/boot.PARTITION) size:6186156 bytes
[Msg]Unpack item [PARTITION , upgrade] to (output/image/upgrade.PARTITION) size:15618048 bytes
[Msg]Unpack item [PARTITION , bootloader] to (output/image/bootloader.PARTITION) size:424016 bytes
可见,WS1408 的固件中只有三个分区:bootloader, boot, 以及 upgrade。
分区名 |
描述 |
备注 |
bootloader |
启动引导 |
U-Boot |
boot |
Android bootimg |
包括 boot header,kernel,ramdisk |
upgrade |
工作分区 |
文件系统为ubifs,启动后会 switch_root 到这里 |
Reference:
Initramfs 原理和实践
随后的记录,都是在 miner_rom_V1.3.1330.img
的基础上展开啦,旧的 445 固件就让他长眠吧。
一些记录
在 boot 分区 (initramfs) 中存储了一些明文信息,具体含义我也不懂,不知道后面能不能用上。
# boot/etc/os-release
NAME=Buildroot
VERSION=2014.05-g1be8007-dirty
ID=buildroot
VERSION_ID=2014.05
PRETTY_NAME="Buildroot 2014.05"
# boot/init
这应该是个多功能的初始化脚本,在不带参数的情况下做两件事:
1. 挂载 upgrade 分区(ubifs文件系统)
2. switch_root 过去完成启动
在 upgrade 分区中,根目录下有一个 thunder 文件夹,不出意外就是赚钱宝的服务程序了。
# upgrade/etc/init.d/rcS
sh /thunder/bin/run.sh
# 籍此完成业务组件的启动
解包小记
解包的主要目的,是学习固件包的结构,其实最后看回来,单纯的重打包并不需要了解的太深入。
解 AMLogic 线刷包
工欲善其事必先利其器,AMLogic 固件的解包工具,在 Windows 和 Linux 平台上都有。
平台 |
工具名 |
描述 |
Windows |
AMLogic CustomizationTool |
最新版 v2.0.10,发布于 2017.4.12,随后停更 |
Linux |
linux-amlogic-toolkit |
开源在 GitHub 上,最后提交在 2019.1.23。但有分支仍在提交。 |
Windows |
AMLogicTools |
由 Ricky Divjakovski 发布在 XDA 论坛上,最后更新 在 2020-09-26,版本 v7.10 |
以上工具多多少少都不甚完善,如:
- 官方的 CustomizationTool 具备较多的的核心功能,但仍较为简陋,使用引导很差。
- 开源工具的缺点当然是没有 GUI 了 233
- AMLogicTools 在这种缺胳膊少腿的固件下(分区不都有的),基本没什么可用的功能。。
但——又不是不能用
AMLogic 开源解包工具及其分支:
https://github.com/natinusala/linux-amlogic-toolkit (源库,能完成基本的拆包)
https://github.com/Eliminater74/linux-amlogic-toolkit (fork,对 boot 分区的拆解更彻底)
https://github.com/syvaidya/linux-amlogic-toolkit (fork,增加了 vendor, product, odm and recovery 分区的支持)
解 upgrade 分区(ubifs)
直接挂载提取文件这条路不好走,要借助一些项目。
@ IoT(八)ubi文件系统挂载&解包
UBI 文件系统不能直接挂载,而是要用 nandsim 模拟出一个 mtd 设备 …
上述通过挂载方式读取ubi文件的过程较为繁琐,其实已经有现成开源的解包工具可用。
对比 ubi_reader 和 ubidump 的输出结果,可以发现 ubi_reader 提取的内容更为完整,也保留了文件的时间戳信息
# 安装依赖
sudo apt install liblzo2-dev
sudo pip install python-lzo
# 安装 ubi_reader
sudo pip install ubi_reader
ubi_reader工具提供了以下脚本:
ubireader_extract_files // 提取文件内容
ubireader_list_files // 列出文件内容,需要在 -P 参数后提供路径,如根目录应为"-P /"
ubireader_extract_images // 提取镜像
ubireader_utils_info // 分析UBI镜像并创建shell脚本和UBI配置文件
ubireader_display_info // 获取UBI信息以及布局块等信息
ubireader_display_blocks // 多用来DEBUG
简单使用如提取镜像里面的文件,默认不指定路径,输出会保存到./ubifs-root/
目录里
ubireader_extract_files upgrade.PARTITION
解 boot 分区(android boot image)
boot 分区包含 boot header,kernel,ramdisk。尚未探究内核相关及其替换的可能。留空
OpenWrt
要点小结
根据 libgcc 的 arm盒子快速移植OpenWrt 一文其实只要替换掉 rootfs,即可实现固件的魔改
在这款 meson8b 上做一下技术总结:
- 主要手段为替换 upgrade.PARTITION,其余保持不变。
- S805 架构为 Cortex-A5,OpenWrt 源中对应的目标应为 at91 / sama5,如 sama5d3。注意,用 armvirt 是无法启动的。
- 最新的 22.03 openwrt会出现一大堆 loop crash,初步估计是内核太旧(3.10.33)。21版目前看来还行。
- ubifs 的制作参数与闪存有关,WS1408 的闪存是 S34ML01G100TF100,查阅 datasheet:
S34ML01G100TF100
Page Size=2048 bytes=0x800 bytes
Block Size=64Pages=128K
根据 meson.dtb 有 upgrade partition size=0x5800000 bytes=88M,由此计算:
min-io-size=2048, leb-size=(128-2)*2048=126976, max-leb-cnt=size/BlockSize=704
也可以通过 ubireader_display_info 查看解包后的原 upgrade.PARTITION 获得 max_leb_cnt
于是 mkfs 命令为
mkfs.ubifs --root=<rootfs_dir> --min-io-size=0x800 --leb-size=126976 --max-leb-cnt=704 --output=upgrade.PARTITION
- 修改 IP 获取方式
OpenWrt 默认的 LAN IP 获取方式为静态IP,需要改为 DHCP。
对 /etc/config/network
进行修改,从
config interface lan option ifname eth0 option type none option proto static option ipaddr 192.168.1.1 option netmask 255.255.255.0
修改为
config interface lan option ifname eth0 option type none option proto dhcp
sed -i '/config interface lan/,/^$/{s/static/dhcp/;/ipaddr/d;/netmask/d;}' openwrt/etc/config/network
实现流程
环境:Windows 10 21H2 with WSL2
工具:linux-amlogic-toolkit + USB Burning Tool 2.2.4
步骤:
- 本地构建解包工具
# 注意:一定是要在 WSL2 下,否则 linux-amlogic-toolkit 会无法解包。要因是 WSL 的文件系统管理不支持一些 mount 动作。
# 安装依赖
sudo -E apt-get -y -qq install git build-essential zlib1g-dev liblzma-dev libblkid-dev python-magic binwalk
# 安装 ubi_reader
sudo pip install ubi_reader
# 创建测试目录
mkdir ~/test && cd ~/test
# 下载并构建构建解包工具
log_dir=log
mkdir -p ${log_dir}
( git clone https://github.com/natinusala/linux-amlogic-toolkit amlogic-toolkit-natinusala
cd amlogic-toolkit-natinusala
( ./bin/build | tee ${log_dir}/amlkit-natinusala.log ) 3>&1 1>&2 2>&3 | tee ${log_dir}/amlkit-natinusala.err.log
) &
- 解包
首先将 miner_rom_V1.3.1330.img 复制到目录下
# 打开资源管理器,复制大家都会哈
explorer.exe .
解包
cd linux-amlogic-toolkit
./bin/unpack ../miner_rom_V1.3.1330.img
# 解包文件会位于被创建的 ./output 文件夹内
# 解开 update.PATTITON
ubireader_extract_files linux-amlogic-toolkit/output/image/upgrade.PARTITION
# 不指定路径,输出会保存到 ./ubifs-root 目录里
解包后,目录组织如下(部分不重要的已隐去)
$ tree linux-amlogic-toolkit -L 3
linux-amlogic-toolkit
├── README.md
├── bin
└── output
├── boot
│ ├── bootimg.cfg
│ ├── initrd.img
│ ├── stage2.img
│ └── zImage
├── image
│ ├── DDR.USB
│ ├── UBOOT_COMP.USB
│ ├── boot.PARTITION
│ ├── bootloader.PARTITION
│ ├── image.cfg
│ ├── keys.conf
│ ├── meson.dtb
│ ├── meson.dtb.bak
│ ├── meson.dts
│ ├── platform.conf
│ ├── system.img
│ └── upgrade.PARTITION
├── logo
└── system
$ tree ubifs-root -L 1
ubifs-root
├── bin
├── dev
├── etc
├── home
├── init
├── lib
├── lib32 -> lib
├── linuxrc -> bin/busybox
├── media
├── mnt
├── opt
├── proc
├── root
├── run -> /tmp/run
├── sbin
├── sys
├── thunder
├── tmp
├── usr
└── var
- 利用官方包制作 openwrt 的 ubifs 镜像
cd ~/test
# 下载 rootfs 并解包
curl -L https://downloads.openwrt.org/releases/21.02.3/targets/at91/sama5/openwrt-21.02.3-at91-sama5-rootfs.tar.gz -o openwrt.tgz
mkdir -p openwrt && tar xzf openwrt.tgz -C openwrt
做一些修改
# Mod.1 LAN DHCP&DHCPv6
sed -i '/config interface lan/,/^$/{s/static/dhcp/;/ipaddr/d;/netmask/d;}' openwrt/etc/config/network
cat << EOF >> openwrt/etc/config/network
config interface 'lan6'
option proto 'dhcpv6'
option device 'eth0'
option reqaddress 'try'
option reqprefix 'auto'
EOF
# Mod.2 opkg换腾讯源
sed -i 's/downloads.openwrt.org/mirrors.cloud.tencent.com\/openwrt/g' openwrt/etc/opkg/distfeeds.conf
# Mod.3 移植kmod
to_dir=`find ubifs-root/lib/modules/ -maxdepth 1 -mindepth 1 -type d -exec basename {} \; | xargs -i echo openwrt/lib/modules/{}`
mkdir -pv ${to_dir}
find ubifs-root/lib/modules/*/kernel/ -type f -exec cp -fv {} ${to_dir}/ \;
# Mod.4 启用串口的getty
echo "ttyAML0::askfirst:/usr/libexec/login.sh" | tee -a openwrt/etc/inittab
用 root 权限制作 ubifs
sudo chown -R root:root openwrt/*
# PageSize=2048bytes, BlockSize=64Pages=128k, upgrade.size=0x5800000
# min-io-size=2048=0x800, leb-size=(128-2)*2048=126976bytes, max-leb-cnt=0x5800000÷128k=704
sudo mkfs.ubifs --min-io-size=0x800 --leb-size=126976 --max-leb-cnt=704 --output=upgrade.PARTITION --root=openwrt
- 替换分区、重封装
sudo cp -fv upgrade.PARTITION linux-amlogic-toolkit/output/image/
cd linux-amlogic-toolkit
sudo ./bin/repack openwrt_ws1408.img
如果使用 AMLogic CustomizationTool
1. 加载 – 勾选替换 UBoot / Kernel – 确定 – 选择源包(如 miner_rom_V1.3.1330.img) – 确定解包
2. 解包出来的文件在 C:\Program Files (x86)\Amlogic\CustomizationTool\tmp\level1\
3. 复制制作的 openwrt ubifs(\\wsl$\Ubuntu\\…..\test\upgrade.PARTITION),覆盖替换 C:\Program Files (x86)\Amlogic\CustomizationTool\tmp\level1\upgrade.PARTITION
4. CustomizationTool中,点击压缩,保存为镜像
5. 替换包制作完成
- 使用 USB Burning Tool 刷入,勾选擦除flash+普通擦除,不勾选擦除 bootloader,勾选烧录成功重启(可选),开始
- 设备上电,同时按下电源接口旁边的 reset 按键,可以从 TTL 输出中(如果有接)观察到
Enter v2 usbburning mode
。使用公对公线连接设备和电脑,开始烧录。
- 烧录完成,拔掉所有线断电。
- 接上网线和电源,在路由器后台找到设备的IP,打开浏览器连接后台即可。
- Done
刷入过程说的比较抽象简要,因为网上太多了,搜一下吧~
可以更简单?
可能吧?我一门外汉研究了好久 uboot 和 kernel 编译,实在是整不明白了。小猫累了.jpg
记录一些足迹,供大佬们继续走完:
- meson: new target for amlogic S805 and S9 SoCs by ChalesYu @ openwrt
以上提交已被 coolsnowwolf 合并到 lean’s lede,但我编译好像没过,看起来还需要完善一些文件,比如设备树文件(dts)
- 编译Amlogic S805通用U-Boot关键步骤 by Couchp95
文中提到的 amlogic 源码及其依赖库均已被 aml 关闭了,这里提供两个可行的路径:
或许里面的 dtb 啥的还是有用的哈。
- 建议还有兴趣的朋友,细读 玩客云折腾记录:编译 ArmBian 系统 及其参考资料,着实学到了很多,这是个很强很热爱生活的大佬。
armbian
WS1408 闪存只有 128MB 太小了,所以没试过,简单谈谈思路。
关于 armbian,一些网友提到:
- 适配思路
用官方的 armbian-build,选择 CSC 的 odroidc1,最后就是找个 dtb的事情
个人见解:
- 网友的尝试
achaoge 在 WS1508 上的折腾笔记
https://www.right.com.cn/forum/thread-8231070-1-1.html
icebee250 在 WS1508 上的直刷教程
https://www.right.com.cn/forum/thread-4137698-1-1.html
tinylion 在 N1 上替换 dtb 的方法
https://www.right.com.cn/forum/thread-680508-1-1.html
suixin2020 在 玩客云 上适配的 armbian for s805
https://www.right.com.cn/forum/thread-4031529-1-1.html
注意,设备都不是 WS1408,情况可能会不太一样。