Linux

如何解決 udev 在 gentoo 啟動時未創建 /dev/hda3 的問題?

  • May 1, 2011

我的舊 gentoo 筆記型電腦似乎有 udev 問題,可能是因為我使用 更新軟體emerge、升級 udev+kernel、收到一些消息“升級 udev/kernel 後執行這些操作”並認為“我將查看螢幕輸出,閱讀這些消息並在重新啟動系統之前處理這些事情”。不幸的是,我有點著急,當然,我確實忘記查看這些消息,關閉機器,將其物理移動到現在在家中的位置並啟動,結果卻是找不到/dev/hda3.

/dev/hda3現在我已經設法通過手動創建然後繼續系統啟動來解決這個問題(如下所述),init但我需要一些關於如何一勞永逸地修復這個問題的建議(所以我不必重複每次啟動時的程序如下)。

(如果有人可以指向某個地方的 Gentoo 機器,在那裡我可以找到我已安裝的軟體包的所有安裝後消息,那麼我可以找到那些與 udev 和我應該閱讀的核心相關的說明。)

相關軟體版本:

Gentoo-hardened-kernel 2.6.36-r6(首選)和 2.6.28-r9(在關閉前使用 21 個月)。下面描述的繁瑣的手動啟動過程已經過驗證,適用於兩個核心版本。udev 軟體包是 udev-151-r4。

啟動時一切似乎都很好(機器啟動是核心,它掛載 /proc、/sys 和 /dev,啟動 udevd 並根據 uevents 填充 /dev,處理 uevents,掛載 /dev/pts)直到它“檢查根文件系統”的步驟。

它在那裡發出

Failed to open the device '/dev/hda3': No such file or directory

然後它要求我輸入 root 密碼(或 Ctrl-D 繼續)。

我輸入它,然後在 shell 中mount告訴我 thatrootfs已安裝在並且/dev/root也已安裝在/. 此外,mount抱怨/etc/mtab不可寫(例如只讀/只讀文件系統)。鑑於啟動尚未完成,所有這些對我來說都是有意義的。

這樣做ls /dev表明沒有hda, hda1, hda2orhda3設備,通常應該在那裡(我希望 udev 創建)。還值得一提的是,/dev它也不包含sda、或設備sda1,因此我們沒有看到更新的 udev 或核心改變了呼叫不同磁碟設備的約定的問題。也沒有任何目錄可以“隱藏”磁碟設備。sda2``sda3``/dev/disk

所以我的下一個可能很髒的步驟是手動創建hda,hda1和under (我偷看了我的其他 gentoo 伺服器之一hda2,以找出主要和次要編號以及適當的權限和組成員身份):hda3``/dev

`mknod /dev/hda b 3 0

mknod /dev/hda1 b 3 1

mknod /dev/hda2 b 3 2

mknod /dev/hda3 b 3 3

chmod 660 /dev/hda*

chgrp disk /dev/hda*`

不幸的是,執行 Ctrl-D 或exit在此處寫入不會繼續中斷的啟動順序,而是會啟動重新啟動(這會使機器進入/dev/hda未找到狀態),因此解決此問題路徑將無濟於事,很遺憾。

我嘗試的另一種解決方法(失敗)在哪裡按下“I”(以及嘗試“i”)一init開始並開始執行各種初始化腳本(如掛載/proc、/sys 等),但我從來沒有在引導序列到達(失敗)嘗試檢查 /dev/hda3 之前設法進入互動式引導模式。

相反,我繼續使用我的/dev/hda3設備來掛載我的作業系統文件系統:

mount -o remount -o rw /dev/hda3 /

所以,現在我對我的機器的文件系統有寫訪問權,這給了我一些解決這種情況的選項:修改配置文件,啟動各種初始化腳本和子系統等。

一件不起作用的事情改變執行級別。原因是init 3失敗並顯示錯誤消息init: /dev/initctl: No such file or directory。我再次偷看我的其他 Gentoo 伺服器,發現這是一個具有權限並屬於/dev/initctl的管道,所以我重新創建了它:600``root:root

mknod /dev/initctl p chmod 600 /dev/initctl

現在init 3失敗了,但有點不同;它掛了一會兒,然後放棄了消息init: timeout opening/writing control channel /dev/initctl。這是有道理的,因為原始init程序(程序 ID 為 1)沒有/dev/initctl打開這個新創建的以供閱讀。

現在,閱讀init手冊頁我意識到發送SIGUSRinit關閉並重新打開/dev/initctl正是我需要的,所以我執行命令kill -l以獲取所有信號及其編號的列表(我看到其中SIGUSR1有數字 10)然後我發出命令

kill -10 1

make initreboot /dev/initctl,然後我重試進入執行級別 3:

init 3

現在init嘗試進入執行級別 3 並執行大量腳本。不幸的是,所有這些腳本都以ERROR: cannot run syslog-ng until sysinit completes. 所以,我重新啟動系統(它現在實際上按預期工作,因為我已經init聽過/dev/initctl:我登錄為root然後發出問題reboot),重複上述步驟(除了重新安裝/dev/hda3為可寫)直到並包括發送SIGUSR1到的點init。現在我試圖通過重新讀取文件來init恢復啟動順序,但以更溫和的方式:/etc/inittab

init q

似乎*什麼都沒發生。*因此,我將調查/etc/inittab在哪裡可以找到似乎名為sysinit. 我冒險並重新執行:

init sysinit

這次init抱怨使用消息。再次閱讀/etc/inittab,我看到該sysinit條目/sbin/rc使用參數呼叫sysinit。所以,我決定嘗試一下

/sbin/rc sysinit

現在系統重試啟動多個服務並成功! 不僅如此,當重新執行用於 mount 的 init 腳本時,/proc還會檢查它們是否已經被掛載(證明在程式碼中進行健全性檢查和錯誤檢查並在遇到時採取相應措施是多麼有價值特殊情況下)。對此感到滿意,我決定也執行entry的命令,因為該命令也缺少執行級別字母或數字。/sys``/dev``/etc/inittab``bootwait

/sbin/rc boot

同樣,啟動了一些初始化腳本,主要用於網路。沒有報告意外錯誤,所以我很高興重試執行級別 3:

init 3

一旦初始化腳本完成,機器就啟動了,我可以以 root 身份登錄(理論上,解決這個混亂的根本原因)!

我重新編譯了核心,確保既沒有設置CONFIG_SYSFS_DEPRECATED也沒有CONFIG_SYSFS_DEPRECATED_V2設置。

然而,經過幾次CONFIG_IDE未設置的重試(以及未能找到任何硬碟驅動器的核心),事實證明我必須CONFIG_IDE 設置以及在已棄用的 ATA/ATAPI 支持下發現的更多核心配置選項。再次,我在其他伺服器(具有正常工作的 /dev/hda 檢測)上偷偷摸摸,並添加了缺少的 ATA/ATAPI 相關核心選項。 我實際上添加了哪些選項我沒有記下,但這裡是在 ATA/ATAPI 下啟動的所有選項的列表: `CONFIG_IDE_GD

CONFIG_IDE_GD_ATA

CONFIG_IDE_PROC_FS

CONFIG_IDE_GENERIC

CONFIG_IDE_PCIBUS_ORDER

CONFIG_BLK_DEV_GENERIC

CONFIG_BLK_DEV_PIIX`

我還禁用了對串列 ATA 和並行 ATA 的支持。

所以現在我有一個核心可以啟動並成功找到我的/dev/hda3設備。

我知道這是一種不好的做法,依賴於已棄用的 ATA/ATAPI 核心支持而不使用更現代的 SATA/PATA 核心支持。最終我不得不遷移到 SATA/PATA。但就目前而言,我很高興(並且對我的 Linux 系統有了更多的了解)。

(如果我發布一個問題然後回答它並選擇我自己的答案作為被接受的答案,我深表歉意。希望這個答案/問題仍然是對 U&L 的有用貢獻)

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