如果 root 只讀時掛起,如何除錯 upstart?

如果 root 只讀時掛起,如何除錯 upstart?

我正在嘗試在 14.04.2 LTS 上偵錯不成功/掛起的系統啟動(upstart)。 root 是 luks 容器中的 ext4 檔案系統。檔案系統處於乾淨狀態。

引導過程在 upstart-socket-bridge 之後停止(不一定在該特定服務之後,例如,當安裝 cups-daemon 時,它會在那之後停止)。init -v也不是很有幫助。唯一不只是記錄各種服務的啟動/停止的日誌條目是 init 之前有關 udev 的日誌條目。

Begin: Running /scripts/init-bottom ... done.
udev exit failed --rc=2

(編輯)重新安裝 root rw 最初似乎總是導致乾淨啟動,但事實是,它有點不可預測,無論哪種方式我都失敗和成功啟動。呃?

觀察:一切似乎都很好,系統只是不重新安裝根可寫或繼續引導。

問:我如何確定哪個服務會導致啟動過程卡住?


更新:透過 getty 產生第二個 shell,它可以initctl list在掛起後運行,這些是正在運行的作業

mountnfs-bootclean.sh start/running
udev start/running, process 438
upstart-udev-bridge start/running, process 432
plymouth start/running, process 122
resolvconf start/running
ssh start/running, process 767 <-- this one was manually started
mountall start/running, process 337
mountkernfs.sh start/running
mountnfs.sh start/running
bootmisc.sh start/running
upstart-socket-bridge start/running, process 745**
cryptdisks start/running
mountdevsubfs.sh start/running
mtab.sh start/running
network-interface (lo) start/running
network-interface (eth0) start/running
plymouth-ready (startup) start/running, process 315
plymouth-upstart-bridge start/running, process 316
mountall-bootclean.sh start/running
network-interface-security (network-interface/eth0) start/running
network-interface-security (network-interface/lo) start/running

更新2:

  • 重新安裝 upstart 及其所有依賴套件(很痛苦且)沒有效果。
  • 使用第二個控制台,我可以用來init 5讓卡住的系統繼續正常啟動。
  • 即使我手動重新安裝 root rw(或使用 rw 核心參數),系統現在也會卡住 - 我最初觀察到強制 root 可寫解決該問題是不正確的

解決方法:

看來是ureadaheads的錯。清洗後,5 次乾淨的靴子沒有出現任何問題。我將把這個問題(以及 100 個額外的代表)留給任何感興趣或知道原始問題答案的人:如果不是通過隨機試驗,我如何能夠弄清楚這一點。

答案1

作為參考,我嘗試過的(不成功的)調試步驟,但對其他人很有用:

  • 取得另一個可以啟動的類似 debian 的系統(例如可啟動 USB 隨身碟上的即時 ubuntu),並使用 chroot 對檢查的系統進行設定或軟體變更。使用 qemu-static 可以在具有不同架構的系統上執行此操作。
  • 安裝一個獨立的 shell,例如sash,然後更改內核命令列(在 grub 中使用 e 鍵或編輯 grub.cfg/cmdline.txt)並添加init=/bin/sash,重新引導,檢查該 shell 上的情況,然後使用exec init繼續引導
  • init與交換器一起使用-v以增加日誌記錄
  • 儘早掛載可寫入的根檔案系統(例如,在執行 init 之前將“rw”新增至核心命令列mount -o remount,rw /) - 這允許更多日誌記錄
  • 檢查/var/log/upstart
  • 在執行 init 之前在 tty2 上啟動額外的終端,例如getty -n -l /bin/bash 38400 tty2 &- 這有助於檢查系統所處的狀態(例如ps -Afiotop
  • 用於initctl list決定哪些服務處於哪個狀態

相關內容