解釋 “No working init found.” 啟動掛起資訊

作者:

Andreas Mohr <andi at lisas period de> Cristian Souza <cristianmsbr at gmail period com>

本文件提供了一些導致載入 init 二進位制檔案失敗的高階原因(大致按照執行順序排列)。

  1. 無法掛載根檔案系統:設定 “debug” 核心引數(在啟動載入程式配置檔案或 CONFIG_CMDLINE 中)以獲取更詳細的核心訊息。

  2. init 二進位制檔案在根檔案系統中不存在:確保您具有正確的根檔案系統型別(並且 root= 核心引數指向正確的分割槽),所需的驅動程式(例如儲存硬體(例如 SCSI 或 USB!)和檔案系統(ext3、jffs2 等))已內建(或者作為模組,由 initrd 預載入)。

  3. 控制檯裝置損壞:可能 console= setup 中存在衝突 --> 初始控制檯不可用。例如,由於序列 IRQ 問題(例如缺少基於中斷的配置),某些序列控制檯不可靠。嘗試使用不同的 console= device 或例如 netconsole=

  4. 二進位制檔案存在但依賴項不可用:例如,init 二進位制檔案所需的庫依賴項(例如 /lib/ld-linux.so.2)丟失或損壞。使用 readelf -d <INIT>|grep NEEDED 查詢需要哪些庫。

  5. 二進位制檔案無法載入:確保二進位制檔案的架構與您的硬體匹配。例如,i386 與 x86_64 不匹配,或者嘗試在 ARM 硬體上載入 x86。如果您嘗試在此處載入非二進位制檔案(shell 指令碼?),則應確保指令碼在其 shebang 標頭行 (#!/...) 中指定一個完全正常工作的直譯器(包括其庫依賴項)。在處理指令碼之前,最好先測試一個簡單的非指令碼二進位制檔案,例如 /bin/sh 並確認其成功執行。要了解更多資訊,請將程式碼新增到 init/main.c 以顯示 kernel_execve() 的返回值。

每當您發現新的失敗原因時,請擴充套件此說明(畢竟載入 init 二進位制檔案是一個關鍵且困難的過渡步驟,需要儘可能地使其輕鬆),然後向 LKML 提交補丁。進一步的 TODO

  • 透過一個 struct 陣列來實現各種 run_init_process() 呼叫,該陣列可以儲存 kernel_execve() 結果值,並在失敗時透過迭代所有結果來記錄所有內容(非常重要的可用性修復)。

  • 嘗試使實現本身更具幫助性,例如,透過在受影響的位置提供額外的錯誤訊息。