嵌入式 Linux 如何對抗意外斷電導致的系統分區損壞?
最近想在樹莓派上弄一套街機模擬器接電視用無線手柄玩。碰到一個系統健壯性問題,家電產品應該能夠對抗粗暴斷電,不能因為用戶忘記正常關機,幾次以後就把系統分區的 ext4 給弄掛掉,導致系統出問題。之前有人在樹莓派上安裝 lakka 模擬器系統,非正常關機十多次以後,出現系統分區損壞需要重新刷系統的問題。
以樹莓派為例,有無標準做法把樹莓派官方系統弄成只讀的呢?同時如何安排其他 /var /run swap 等幾個分區以何種方式掛載?以前遊戲機根本不怕斷電,只有在存檔或者改配置時提醒你 「請不要斷電」, 樹莓派的 linux 能否做到這點?
能否給點具體操作的指令?
可移步
Protect your Raspberry PI SD card, use Read-Only filesystem
可以參考OpenWrt這類家用Linux路由器的做法.
OpenWrt路由器只讀掛載系統分區/dev/root能夠避免突然斷電導致的分區損壞.
以小米路由器mini(128MB內存)為例,看看它的掛載:
root@XiaoQiang:/data# mount
rootfs on / type rootfs (rw)
/dev/root on / type squashfs (ro,relatime)
proc on /proc type proc (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
tmpfs on /tmp type tmpfs (rw,nosuid,nodev,relatime,size=62408k)
tmpfs on /dev type tmpfs (rw,relatime,size=512k,mode=755)
devpts on /dev/pts type devpts (rw,relatime,mode=600)
tmpfs on /extdisks type tmpfs (rw,nosuid,nodev,relatime,size=62408k)
/dev/mtdblock7 on /data type jffs2 (rw,relatime)
/dev/mtdblock7 on /etc type jffs2 (rw,relatime)
none on /dev/cgroup/mem type cgroup (rw,relatime,memory)
none on /dev/cgroup/net_cls type cgroup (rw,relatime,net_cls)
tmpfs on /userdisk/sysapihttpd type tmpfs (rw,nosuid,nodev,relatime,size=62408k)
/dev/sda1 on /extdisks/sda1 type tfat (rw,noatime,uid=0,gid=0,umask=0000,allow_utime=0022,codepage=437,iocharset=utf8,shortname=winnt,min_prealloc_size=64k,max_prealloc_size=7585764,readahead=1M,fail_safe,hidden=show,errors=continue)
/dev/root on /mnt type squashfs (ro,relatime)
/dev/mtdblock7 on /mnt type jffs2 (rw,noatime)
root@XiaoQiang:~# df -h
Filesystem Size Used Available Use% Mounted on
rootfs 11.0M 11.0M 0 100% /
/dev/root 11.0M 11.0M 0 100% / (OpenWrt的/dev/root為只讀掛載)
tmpfs 60.9M 3.2M 57.8M 5% /tmp
tmpfs 512.0K 0 512.0K 0% /dev
tmpfs 60.9M 3.2M 57.8M 5% /extdisks
/dev/mtdblock7 1.0M 756.0K 268.0K 74% /data (沒有"Read-only file system"提示,可以寫入)
/dev/mtdblock7 1.0M 756.0K 268.0K 74% /etc
tmpfs 60.9M 3.2M 57.8M 5% /userdisk/sysapihttpd
/dev/sda1 7.2G 83.7M 7.2G 1% /extdisks/sda1 (插入路由的U盤)
/dev/root 1.0M 756.0K 268.0K 74% /mnt
/dev/mtdblock7 1.0M 756.0K 268.0K 74% /mnt
類似openwrt的「透明掛載」不知是否可行
只讀很容易啊。mount 的時候 ro 就行了。寫入可以靠 aufs 等等聯合掛載到另一個地方上。如果分區損壞,也是寫入分區那邊掛掉,系統本身 ro 不用考慮損壞的問題。遇到問題格式化了寫入分區恢復初始狀態就行了。另外,系統分區如果只讀,還可以用一些壓縮分區提升空間使用效率的。
存檔的分區,可以用 mount 的 sync 參數做同步掛載。再不放心寫入的時候 mount 成 rw ,寫完了再 remount 成 ro 。只要是 ro 狀態,就不會再有寫入問題了。
所以說這東西得是家中常備
只讀不能根本解決問題啊,最好還是做個備份區(不能在同一個扇區上),必要的時候主備區做同步,這樣掉電掛掉一個區還有另一個恢復
應該是有個電容可以支持幾毫秒,然後利用這個時間flush。
樹莓派暫時沒太了解,Linux通電電機器一般都用yaffs系統,可讀寫,自帶ecc,由於緩存少,不會影響意外斷電。只讀文件系統也有一堆,可以自行更換,例如 cramfs等
帶個電容可行么?
系統分區用livecd+只讀掛載,數據分區無解
推薦閱讀:
※樹莓派專用屏幕支持什麼系統?
※樹莓派需要散熱片嗎?
※Ruff 和樹莓派的區別是什麼?
※用手機如何遠程控制樹莓派?
※Windows 10 IoT 上面可以安裝一般的windows軟體嗎?
TAG:Linux | 嵌入式系統 | 樹莓派RaspberryPi |