首页 > 编程知识 正文

rootfs文件,openwrt软路由

时间:2023-05-06 07:24:02 阅读:38899 作者:1493

要使不在OpenWrt项目支持列表中的ARM计算机能够快速使用OpenWrt,可以用替换rootfs的简单方法进行移植。

首先,确保您的ARM案例中有正常使用的Linux系统,并且有良好的社区支持。 你可以去armbian找有开源支持的开发板。

以下对SoC的开源支持比较好,经常可以使用主线内核。

罗克克芯片

RK3328/RK3368/RK3399系列

amlogic

s905/s912/s922系列

孙溪

h2/h3/h5系列

马韦尔

armada a3700系列

移植OpenWrt的rootfs时,需要特别注意的是,必须确保原始系统中与内核相关的内容(包括内核模块)不会丢失。 大多数固件的一些Linux内核镜像、dtb和uboot变量直接存储在rootfs中,因此在更换时必须完全保留这些文件。

注:替换rootfs后,计算机实际使用的内核与openwrt中由opkg管理的内核(包括内核模块)没有任何关系,因此添加或删除内核模块时不能使用opkg进行管理

具体流程:

您可以准备Linux环境以使用虚拟机或物理机。 wsl不可用

判断固件的分区类型

对于amlogic固件,通常有两个分区。 第一个分区是FAT32分区,用于存储内核镜像、dtb、uboot变量和脚本。 第二个分区是ext4分区,用作真正的rootfs。 替换时,必须保留FAT32分区的所有内容以及ext4分区中的/lib/modules和/lib/firmware

对于rockchip或sunxi卡固件,通常只有一个ext4分区用作rootfs,/boot关闭器用于在此分区中存储内核、dtb、uboot变量和脚本更换时,必须保留此分区中的/lib/modules、/lib/firmware和/boot。 此类固件的bootloader存储在ext4分区之前未分配的空间中。

准备要修改的固件。 请注意,要修改的固件的rootfs分区必须是可写文件系统,如ext4,才能操作。

对于从SD卡引导的计算机,请使用etcher将固件写入SD卡,在Linux环境中装载SD卡,然后继续执行以下操作:

在提供emmc刷新固件的计算机上,必须按照以下步骤在loop上装载镜像:

#创建装载目录

mkdir -p /mnt/rootfs

#查看固件分区表

sfdisk -J /path/to/firmware

#

#以amlogic双分区(FAT32 EXT4)固件为例。

# {

# '分区表' : {

# 'label':'dos ',

# 'id':'0x1028b956 ',

# '设备' : ' /路径/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块,因此偏移量的字节数为270336*512

#带偏移的安装

sudo mount -o loop,offset=$((270336*512 ) ) )/path/to/firmware /mnt/rootfs

处理/lib/modules

通常,Linux发行版的/lib/modules目录结构如下:

/lib/modules//

kernel

()阿基

() crypto

()驱动器

() fs

() lib

()毫米

()网络

() security

()声音

()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

备份文件并解压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

修改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

rootfs修改完成,卸载文件系统

sync

cd / && sudo umount /path/to/rootfs

启动修改后的固件,进入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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。