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";
-
Linux
+關注
關注
87文章
11320瀏覽量
209845 -
根文件系統
+關注
關注
0文章
26瀏覽量
12000
發布評論請先 登錄
相關推薦
評論