arm盒子快速移植OpenWrt rootfs

为了让不在OpenWrt项目支持列表中的ARM机器快速使用OpenWrt,可以用替换rootfs的简易方法进行移植。

首先,确保你的ARM盒子有能正常使用的Linux系统,并且最好有良好的社区支持,可以去armbian寻找有开源支持的开发板。
以下SoC的开源支持比较良好,多数情况下可以用上主线内核:

  • Rockchip
    • RK3328/RK3368/RK3399 系列
  • amlogic
    • s905/s912/s922 系列
  • sunxi
    • h2/h3/h5 系列
  • marvell
    • armada a3700 系列

移植OpenWrt的rootfs过程中,需要特别注意的是必须保证原有系统内与内核有关的东西(包括内核模块)不能有任何丢失。多数固件的Linux内核镜像、dtb和uboot的部分变量都是直接存放到rootfs里面的,在替换的时候一定要把这些文件完整保留。

注意:替换rootfs后,机器实际使用的内核与openwrt中由opkg管理的内核(包含内核模块)没有任何关系,因此如果要增删内核模块的话不能使用opkg进行管理。

具体流程:

  1. 准备好Linux环境,可以用虚拟机或实体机,不能用wsl

  2. 下载armvirt的通用rootfs,以OpenWrt 18.06.4为例

  3. 判断固件的分区类型

    • 对于amlogic的固件,一般有2个分区:第一分区为FAT32分区,用于存放内核镜像、dtb、uboot变量和脚本;第二分区为ext4分区,用作真正的rootfs。替换的时候必须保留FAT32分区的所有内容以及ext4分区内的/lib/modules/lib/firmware
    • 对于rockchip或sunxi的sd卡固件,一般只有1个ext4分区作为rootfs,此分区内使用/boot文件夹用于存放内核、dtb、uboot变量和脚本。在替换的时候,必须保留此分区内的/lib/modules/lib/firmware以及/boot。此类固件的bootloader存放在ext4分区前未分配的空间中。
  4. 准备好你要修改的固件,注意修改的固件的rootfs分区必须是可写入的文件系统(如ext4),否则不能操作。

    • 对于从SD卡启动的机器,将固件用etcher写入SD卡,然后在你的Linux环境下挂载好SD卡,继续下一步操作。
    • 对于提供emmc刷机固件的机器,需要用loop挂载镜像,具体操作如下:
# 创建挂载目录
mkdir -p /mnt/rootfs

# 查看固件的分区表
sfdisk -J /path/to/firmware
#
# 以amlogic的双分区(FAT32+EXT4)固件为例:
# {
#    "partitiontable": {
#       "label":"dos",
#       "id":"0x1028b956",
#       "device":"/path/to/firmware",
#       "unit":"sectors",
#       "partitions": [
#          {"node":"/path/to/firmware1", "start":8192, "size":262144, "type":"e"},
#          {"node":"/path/to/firmware2", "start":270336, "size":30694112, "type":"83"}
#       ]
#    }
# }
# 可以看到rootfs为第二分区,并且偏移量为270336 blocks,所以偏移的字节数为270336*512

# 带偏移量挂载
sudo mount -o loop,offset=$((270336*512)) /path/to/firmware /mnt/rootfs
  1. 处理/lib/modules
    一般来说Linux发行版的/lib/modules目录结构都是这样的:
/lib/modules/<内核版本号>/
├── kernel
│   ├── arch
│   ├── crypto
│   ├── drivers
│   ├── fs
│   ├── lib
│   ├── mm
│   ├── net
│   ├── security
│   ├── sound
│   └── virt
├── modules.alias
├── modules.alias.bin
├── modules.builtin
├── modules.builtin.bin
├── modules.dep
├── modules.dep.bin
├── modules.devname
├── modules.order
├── modules.softdep
├── modules.symbols
└── modules.symbols.bin

而OpenWrt的/lib/modules/<内核版本号>下面直接存放kernel目录下的所有模块,所以需要我们手工移动一下,具体操作如下:

# root挂载的目录一般需要root权限,可以用sudo或者切换成root用户操作
# 进入rootfs的挂载点
cd /path/to/rootfs

# 进入内核模块目录
cd ./lib/modules/<内核版本号>/

# 删除当前目录下的所有文件,但不删除kernel目录
sudo rm -f * 2>/dev/null

# 找出kernel目录下面的所有ko并移动到当前目录下
sudo mv $(find kernel -type f) .

# 删除空的kernel文件夹
sudo rm -r kernel
  1. 备份文件并解压OpenWrt的rootfs
    如果该镜像的内核镜像、dtb或uboot脚本等文件在rootfs里面的话,需要先备份出来。对于不同板子和不同固件,这一步的操作都不同,下面以armbian为例:
# 创建一个临时目录用于存放备份文件
mkdir -p /tmp/backup

# 进入rootfs的挂载点
cd /path/to/rootfs

# 对于把内核、dtb或uboot变量放在/boot目录的固件,例如sunxi和rockchip,需要将整个/boot目录备份出来
cp -ra ./boot /tmp/backup/boot

# 备份/lib/modules和/lib/firmware
cp -ra ./lib/modules /tmp/backup/
cp -ra ./lib/firmware /tmp/backup/

# 备份后删除当前rootfs下的所有文件
sudo rm -rf *

# 将OpenWrt的rootfs解压出来
sudo tar -xvf /path/to/openwrt/rootfs.tar.gz

# 删除OpenWrt rootfs里自带的/boot目录
sudo rm -rf ./boot

# 恢复刚才备份的目录
sudo mv -f /tmp/backup/boot .
sudo mv -f /tmp/backup/modules/<内核版本号> ./lib/modules
sudo mv -f /tmp/backup/firmware ./lib/firmware
  1. 修改rootfs
  • 启用串口的getty:对于串口设备名是ttyS0的内核,/etc/inittab里已经包含,所以无需修改,而其它串口设备名就需要手动添加,具体如下:
# 进入rootfs的挂载点
cd /path/to/rootfs

# 对于amlogic的内核,串口设备名为ttyAML0
echo "ttyAML0::askfirst:/usr/libexec/login.sh" |sudo tee -a ./etc/inittab

# 对于rockchip的bsp内核,串口设备名为ttyFIQ0
echo "ttyFIQ0::askfirst:/usr/libexec/login.sh" |sudo tee -a ./etc/inittab

# 对于marvell armada的bsp内核,串口设备名为ttyMV0
echo "ttyMV0::askfirst:/usr/libexec/login.sh" |sudo tee -a ./etc/inittab
  1. rootfs修改完成,卸载文件系统
sync
cd / && sudo umount /path/to/rootfs
  1. 启动修改后的固件,进入OpenWrt之后检查以下命令能否正常工作:
iptables -L
ip6tables -L
ip route

如果你的内核版本大于4.18,且iptables抛出以下错误:

root@OpenWrt:~# iptables -L
iptables v1.6.2: can't initialize iptables table `filter': No child process

那么说明原内核启用了bpfilter,这可能需要重新编译整个内核,请参考这篇文章:https://www.jianshu.com/p/48e2f3e6caeb

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342