防止根文件系统破坏,OverlayRootfs 让你的设备更安全

一、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-test
root@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-test
root@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/test
root@firefly:~# ls /home/firefly/test
/home/firefly/test
root@firefly:~# recovery reset
command: --wipe_all
update: write command to command file: done
update: write command to misc file: done
update: reboot!

重启之后:

root@firefly:~# ls /home/firefly/test
ls: 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

———————————————

商务合作:sales@t-firefly.com

技术支持:service@t-firefly.com

Firefly官网:www.t-firefly.com

开源社区:dev.t-firefly.com

这个功能终于找到关闭入口了{:4_97:}