使用只讀根文件系統是嵌入式設置的好主意嗎?
我的任務是在嵌入式設備上執行 Linux 作為作業系統。
目標具有 x86 處理器和 8 GB CompactFlash 設備用於儲存。
我已經設法使用 buildroot 來創建核心映像和交叉編譯工具。我已將 CF 設備分區為一個小的 FAT 分區,核心映像以及
syslinux
引導配置和一個ext3
文件系統駐留在其中,我已將 buildroot 生成的根文件系統解壓縮到其中。
syslinux
通過將根目錄設置為我的 buildroot 文件系統所在的 CF ext3 分區,系統成功啟動。我的問題集中在面對即時(和頻繁)斷電時需要穩健性,因為在斷電後成功啟動設備至關重要。我已經讀過將根文件系統安裝為只讀是確保數據完整性的一種方式。這對我來說是明智的做法嗎?
我還閱讀了有關將根文件系統載入到 RAM 以實現相同目的的可能性,但還不知道如何做到這一點。
是否有實現這一目標的首選方式,如果有,我繼續進行的最佳方式是什麼?
新答案 (2015-03-22)
(注意:這個答案比以前更簡單,但不是更安全。我的第一個答案更強大,因為您可以在權限標誌之前通過fs 掛載選項將文件保持為只讀。因此,在沒有寫入權限的情況下強制寫入文件是行不通的完全沒有。)
是的,在Debian下,有一個包:fsprotect(首頁)。
它使用
aufs
(預設情況下,但可以使用其他unionfs
工具)允許實時會話更改,但預設情況下在 RAM 中,因此在重新啟動時會忘記所有內容。您可以通過簡單地執行來安裝它們:
apt-get install fsprotect
完成後,來自線上文件:
之後:
- 編輯
/boot/grub/menu.lst
或/etc/default/grub2
或/etc/lilo.conf
添加“fsprotect=1G
”到核心參數。- 根據需要修改1G。
- 應用更改(即執行
update-grub
)- 如果
/etc/default/fsprotect
要保護除/
.- 重啟
您可能還想用密碼保護 grub 引導載入程序或禁止對其進行任何更改。
從那裡開始,如果某些文件受到保護以防止更改,例如
chmod ugo-w myfile
如果您使用範例
vi myfile
並嘗試使用命令在其上進行書寫:w!
,這將起作用並且您myfile
已經改變了。您可以重新啟動以檢索未修改myfile
的 .我的以下第一個解決方案甚至不可能做到這一點:
舊(第一個)答案:
是的,這是一個強大的解決方案,但功能強大!
使 r/o 可用
你必須在rw中掛載一些目錄,比如
/var
,/etc
也許/home
。這可以通過使用aufs或unionfs來完成。我喜歡另一種方式,使用/dev/shm
andmount --bind
:cp -a /var /dev/shm/ mount --bind /dev/shm/var /var
您之前可以在 a 中移動所有在正常操作中不需要更改的目錄,而不是
static-var
在 /var 中創建符號連結:mkdir /static-var mkdir /static-var/cache mkdir /static-var/lib mv /var/lib/dpkg /static-var/lib/dpkg ln -s /static-var/lib/dpkg /var/lib/dpkg mv /var/cache/apt /static-var/cache/apt ln -s /static-var/cache/apt /var/cache/apt ... # an so on
因此,當在 ro 中重新掛載時,複製
/var
不會/dev/shm
佔用太多空間,因為大多數文件都被移動到了/static-var
,並且只有符號連結會被複製到 ram 中。更好地做到這一點的更好方法是進行完整的電源循環,一天的完整工作並精細執行如下命令:
find / -type f -o -type f -mtime -1
因此,您將看到哪些文件需要位於讀寫分區上。
日誌記錄
由於在此主機中不存在可寫的靜態記憶體,因此為了儲存歷史記錄和其他日誌,您必須配置遠端
syslog
伺服器。echo >/etc/syslog.conf '*.* @mySyslogServer.localdomain'
這樣,如果您的系統因任何原因中斷,之前的所有內容都會被記錄下來。
升級
當執行一些
mount --bind
正在使用的,為了在系統正在使用時進行這樣的升級(不需要執行init 1
,以減少停機時間),更簡單的方法是重新建構一個乾淨的根,能夠進行升級:在讀寫模式下重新掛載“/”後:
mount -o remount,rw / for mpnt in /{,proc,sys,dev{,/pts}};do mount --bind $mnpt /$mnt$mpnt; done chroot /mnt apt-get update && apt-get dist-upgrade exit umount /mnt/{dev{/pts,},proc,sys,} sync mount -o remount,ro /
現在:
shutdown -r now