如何解決 udev 在 gentoo 啟動時未創建 /dev/hda3 的問題?
我的舊 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
,hda2
orhda3
設備,通常應該在那裡(我希望 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
手冊頁我意識到發送SIGUSR
將init
關閉並重新打開/dev/initctl
。正是我需要的,所以我執行命令kill -l
以獲取所有信號及其編號的列表(我看到其中SIGUSR1
有數字 10)然後我發出命令
kill -10 1
make
init
reboot/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_GDCONFIG_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 的有用貢獻)