Systemd
關機程序說明
“Linux 工作原理”一書說,一般的關閉過程(獨立於 init 系統)是這樣的:
- init 要求每個程序乾淨地關閉。
- 如果一個程序在一段時間後沒有響應,init 會殺死它,首先嘗試一個 TERM 信號。
- 如果 TERM 信號不起作用,init 會對任何落後者使用 KILL 信號。
- 系統將系統文件鎖定到位並為關機做其他準備。
- 系統解除安裝除根以外的所有文件系統。
- 系統以只讀方式重新掛載根文件系統。
- 系統使用同步程序將所有緩衝數據寫入文件系統。
- 最後一步是通過 reboot(2) 系統呼叫告訴核心重新啟動或停止。這可以通過 init 或輔助程序(例如重新啟動、暫停或斷電)來完成。
如果文件系統是只讀的,如何同步寫入其緩衝區?
你感到驚訝是對的:這個順序沒有意義。如果一本書以這種方式呈現,那就是草率和誤導。
解除安裝文件系統或以只讀方式安裝它會將所有數據寫入磁碟。當
umount
命令或mount -o remount,ro
返回時,所有數據都寫入磁碟,sync
無事可做。之前呼叫沒有意義sync
(數據無論如何都會被 umount 操作寫入),之後呼叫也沒有意義(它不會做任何事情)。我認為這在一些古老的 Unix 系統中是不正確的,你必須在解除安裝
sync
之前呼叫。之後呼叫它仍然沒有意義。如果您超越文件系統,可能會出現
sync
某些情況。例如,我認為在 Linux 上sync
可以確保將 RAID 陣列的元數據寫入磁碟。即使在沒有任何文件系統以讀寫方式安裝的情況下,這也很有用。