OverlayRootfs 介绍
OverlayRootfs 是指利用 OverlayFS 技术创建的根文件系统(root filesystem)。OverlayFS 是一种联合文件系统(UnionFS),允许将多个文件系统层合并成一个单一的视图,在 Linux 系统中广泛应用。使用 OverlayRootfs 的设备可以很轻松的实现:根文件系统写保护、恢复出厂设置功能。
根文件系统写保护
使能 OverlayRootfs 的 Firefly 设备 Rootfs 分区会被挂载到 /root-ro只读保护(Lower layer),所有的用户修改都是写入到 Userdata 分区的 /userdata/rootfs_overlay(Upper layer),不会写入到 Rootfs 分区,确保 Rootfs 分区数据只读而不会被破坏。OverlayRootfs 会把 /root-ro 和 /userdata/rootfs_overlay 合并成一个单一的视图,用户在使用上是无感的。
示例说明:
通常 Linux 设备如果频繁的硬件断电重启,可能会造成读写分区的损坏,从而无法正常开机。Firefly 使能 OverlayRootfs 的设备,真实读写是 userdata 分区,即使硬件断电导致 userdata 分区损坏设备依然能以只读的形式启动根文件系统,用户依然可以控制设备做一些分区恢复、数据保存的操作。下面是人为的破坏 userdata 后依然可以以只读的方式开机:
可以创建或者删除一个文件来测试 OverlayRootfs,真实数据是写入到了 /userdata/rootfs_overlay 上。
# 创建一个文件,可以在 /userdata/rootfs_overlay/ 下相同目录找到root@firefly:~# touch /usr/local/bin/firefly-testroot@firefly:~# ls /userdata/rootfs_overlay/usr/local/bin/firefly-test/userdata/rootfs_overlay/usr/local/bin/firefly-test
# 删除 /userdata/rootfs_overlay/ 下对应文件,真实文件系统中的相应文件也会被修改root@firefly:~# rm -rf /userdata/rootfs_overlay/usr/local/bin/firefly-testroot@firefly:~# ls /usr/local/bin/disable_ModemManager.sh docker-compose ec200.sh quectel-CM restart_plank.sh
由于 rootfs 分区是只读而且不会被修改的,所以使用 df -h 可以看到 rootfs 分区可用空间不大这是正常的,用户真正写入的是 userdata 分区。
恢复出厂设置
执行“recovery reset”系统会自动擦除 userdata 分区,让设备文件系统恢复到刚刚烧录完成的状态。
# 创建一个文件验证功能,执行 recovery reset 恢复出厂设置。root@firefly:~# touch /home/firefly/testroot@firefly:~# ls /home/firefly/test/home/firefly/testroot@firefly:~# recovery resetcommand: --wipe_allupdate: write command to command file: doneupdate: write command to misc file: doneupdate: reboot!
# 重启之后root@firefly:~# ls /home/firefly/testls: cannot access '/home/firefly/test': No such file or directory
关闭OverlayRootfs功能
部分场景可能需要关闭 OverlayRootfs,如:快速启动、A&B 系统等,可以通过修改 kernel 启动参数来使能/关闭 OverlayRootfs 功能。如 RK3576:
# 修改 kernel 的 dts chosen 节点。kernel/arch/arm64/boot/dts/rockchip/rk3576-linux.dtsi
chosen: chosen {// 关闭 OverlayRootfs 功能//bootargs = "earlycon=uart8250,mmio32,0x2ad40000 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rw rootwait rcupdate.rcu_expedited=1 rcu_nocbs=all";// 使能 OverlayRootfs 功能bootargs = "earlycon=uart8250,mmio32,0x2ad40000 console=ttyFIQ0 root=PARTLABEL=rootfs rootfstype=ext4 ro rootwait overlayroot=device:dev=PARTLABEL=userdata,fstype=ext4,mkfs=1 rcupdate.rcu_expedited=1 rcu_nocbs=all net.ifnames=0";
全部0条评论
快来发表一下你的评论吧 !