Systemd

Linux 何時可以使用只讀根文件系統啟動

  • April 29, 2018

我正在使用 u-boot 作為引導載入程序和 systemd 初始化系統的嵌入式 Linux。這些工具僅限於標準的busybox。

在分析一些問題時,我發現根文件系統是只讀的,這導致了問題。原因是一些服務和程序依賴於一個可寫的root fs,導致故障。

經過一段時間的研究,我發現根文件系統只有在電源故障時才只讀。(當遇到一些錯誤時,主機會觸發電源回收。)我懷疑當 root fs 嘗試寫入某些關鍵文件或更新某些服務/程序時,在電源故障時會在文件系統上設置一個錯誤標誌。在下次啟動時,fsck 讀取標誌並將根目錄掛載/重新掛載為只讀,或者 fsck 強制進入某種恢復模式(我不知道是否存在任何恢復模式)。

我的假設正確嗎?如果是這樣,那麼在錯誤時在 FS 上設置的 fs 標誌是什麼?如何防止 root 作為 RO 引導?

筆記:

  1. 根文件系統使用“errors=continue”掛載。因此,如果 fsck 讀取超級塊以重新掛載選項,它應該忽略錯誤並重新掛載為 RW。
  2. 我試圖重現該案例,在執行 dd 命令時關閉電源,但始終無法重現。

附加問題:哪個 udev/systemd 魔法掛載了根 fs?

在啟動時,您應該檢查文件系統以查看系統是否正確關閉或崩潰,並在後一種情況下執行必要的恢復操作。在現代日誌文件系統上,這通常意味著可以自動完成的簡單快速的日誌恢復操作。

根文件系統檢查和掛載通常由 initramfs/initrd 完成,但在嵌入式系統上,您可能擁有也可能沒有。

如果您不使用 initramfs,那麼傳統的方法是讓核心始終以只讀方式安裝根文件系統(使用引導選項root=/dev/<whatever> ro,然後啟動腳本將首先fsck在其上執行(假設它是必要的)使用的文件系統類型),然後在執行任何其他操作之前將根文件系統重新掛載到讀/寫模式。

如果 initramfs 沒有檢查根文件系統(可能是因為它沒有被使用),那麼用於在根文件系統上執行文件系統檢查的標準 systemd 服務名為systemd-fsck-root.service. 檢查後,我找不到負責使用 systemd 重新掛載根文件系統的服務的名稱。

如果引導時根文件系統檢查需要修改根文件系統,它通常會在之後觸發另一次重新引導,因為修改可能會影響核心已經讀取並正在記憶體的內容,並且在對磁碟由fsck.

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