Embedded

使用只讀根文件系統是嵌入式設置的好主意嗎?

  • March 22, 2015

我的任務是在嵌入式設備上執行 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。這可以通過使用aufsunionfs來完成。我喜歡另一種方式,使用/dev/shmand mount --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

引用自:https://unix.stackexchange.com/questions/60871