參數(shù)一步解決)
1. 先搞清楚 dracut shell 到底在說什么手上拿到一臺舊機(jī)器要裝 CentOS 7我習(xí)慣先做兩件事拿 UltraISO 把系統(tǒng)鏡像寫進(jìn) U 盤然后把 U 盤插到目標(biāo)機(jī)器上開機(jī)進(jìn) BIOS 設(shè) U 盤為第一啟動項(xiàng)。按說這套流程十次有八次能順利進(jìn)安裝界面但偏偏有一類機(jī)器引導(dǎo)菜單選完 Install CentOS 7 之后屏幕刷刷刷滾過一堆內(nèi)核日志然后停在一個提示符前面dracut:/#很多朋友第一次見到這個界面就懵了以為系統(tǒng)壞了或者鏡像有問題。其實(shí)不是這恰恰是 Linux 的啟動流程在跟你報信內(nèi)核已經(jīng)加載完成initramfs也就是 dracut 生成的臨時根文件系統(tǒng)也跑起來了但它在指定的位置找不到安裝源沒辦法繼續(xù)往后走只能把控制權(quán)交給你讓你手動幫它找到正確的設(shè)備。換句話說進(jìn)入了 dracut是安裝過程中“根設(shè)備找不到”的典型癥狀而不是系統(tǒng)崩潰。我們要明白 CentOS 7 安裝的引導(dǎo)邏輯安裝程序anaconda在執(zhí)行時會通過啟動參數(shù)里的 inst.stage2 指定 stage2 鏡像的位置這個位置可以是一個本地磁盤分區(qū)、一個 U 盤分區(qū)的卷標(biāo)LABEL、或者一個網(wǎng)絡(luò)地址。正常情況下U 盤里的 ISO 鏡像自帶一個卷標(biāo)叫 CentOS 7 x86_64引導(dǎo)參數(shù)里會寫成inst.stage2hd:LABELCentOS\x207\x20x86_64\x20 是空格的十六進(jìn)制轉(zhuǎn)義也就是說這個 LABEL 實(shí)際上是帶空格的字符串。Anaconda 會拿著這個 LABEL 去遍歷所有塊設(shè)備找到匹配的分區(qū)掛載、解壓然后繼續(xù)安裝流程。問題就出在這個“遍歷”上不同機(jī)器、不同 USB 接口、不同 U 盤控制器內(nèi)核枚舉塊設(shè)備的順序往往不一樣。在一臺機(jī)器上 U 盤是 sdb4換一臺機(jī)器就可能變成 sdc4甚至 sdd4。再加上如果目標(biāo)機(jī)器有多個硬盤SATA 接口順序不同設(shè)備名會跟著變。當(dāng)你用 dd 方式或者某些寫入工具做啟動盤時卷標(biāo)也可能因?yàn)楣ぞ叩奶幚矸绞礁龑?dǎo)參數(shù)里預(yù)設(shè)的不一致。結(jié)果就是 anaconda 根據(jù) LABEL 找不到任何可見分區(qū)或者找到了不止一個直接放棄把問題甩給了 dracut shell。順帶說一句這個 shell 不是擺設(shè)它是一個可以直接交互的環(huán)境里面有 blkid、ls、mount 這些基礎(chǔ)命令。你完全可以在里面查設(shè)備、掛載分區(qū)、看看 ISO 里面的文件還在不在。理解了這一點(diǎn)接下來的排查思路就很清晰了讓系統(tǒng)明確地知道 U 盤是哪個設(shè)備然后重新加載安裝程序。2. 為什么同一個 U 盤換臺機(jī)器就進(jìn) dracut先別急著記命令我建議你把下面三個原因都過一遍因?yàn)閷?shí)際工作中遇到的 dracut 問題多半是這三個因素疊加的結(jié)果單獨(dú)查一個點(diǎn)往往查不出真相。2.1 設(shè)備名漂移LABEL 卻只有一個Linux 內(nèi)核在啟動時按發(fā)現(xiàn)的順序給存儲設(shè)備分配 sdX 名字。SATA 硬盤通常是 sda、sdbUSB 移動存儲按控制器枚舉順序靠后可能是 sdc、sdd、sde。老一點(diǎn)的機(jī)器 U 盤插前面板 USB 2.0 和插后面板 USB 3.0枚舉順序都不一樣。U 盤安裝的引導(dǎo)參數(shù)如果用 hd:/dev/sdb4 這種寫法在這個機(jī)器上有效換一臺就沒用了。所以 anaconda 的引導(dǎo)參數(shù)優(yōu)先使用 LABEL 或 UUID因?yàn)樗鼈兏O(shè)備插在哪個接口無關(guān)。但 LABEL 也有前提U 盤分區(qū)表里確實(shí)存在這個卷標(biāo)而且卷標(biāo)文本跟引導(dǎo)參數(shù)完全一致。我用一個案例說明問題某臺實(shí)驗(yàn)室電腦SATA 口接了兩塊機(jī)械盤U 盤插 USB 2.0 口。寫盤工具是 UltraISO默認(rèn)寫入方式。啟動后 dracut shell 里執(zhí)行 blkidU 盤顯示為 /dev/sdc4卷標(biāo)是 CentOS 7 x86_64。按說卷標(biāo)是對的但 anaconda 就是沒找到。后來發(fā)現(xiàn)原因是這臺機(jī)器的主板在 UEFI 模式下啟動了引導(dǎo)程序而 UltraISO 默認(rèn)寫入的是 MBR 引導(dǎo)記錄U 盤里同時存在一個小的 EFI 分區(qū)導(dǎo)致內(nèi)核同時識別出兩個卷標(biāo)相同的分區(qū)。anaconda 匹配到多個結(jié)果干脆報錯。2.2 寫入工具的隱藏差異這是最容易被忽略的一點(diǎn)。UltraISO 提供幾種“寫入方式”默認(rèn)是 USB-HDD本質(zhì)上是在 U 盤上建立一個可引導(dǎo)的分區(qū)并把 ISO 里的引導(dǎo)文件解開放進(jìn)去。這種方式兼容性其實(shí)可以但有些老主板對 USB-HDD 生成的引導(dǎo)扇區(qū)支持不好而且 UltraISO 在處理包含 EFI 目錄的鏡像時偶爾會把分區(qū)結(jié)構(gòu)調(diào)整成讓內(nèi)核困惑的樣子。如果你用 Rufus默認(rèn)選項(xiàng)是“以 ISO 鏡像模式寫入”Rufus 會擴(kuò)展鏡像里的 EFI 引導(dǎo)文件而不是做純粹的整盤寫入。大部分情況下可以正常啟動但同樣有少數(shù)機(jī)型會出現(xiàn) dracut尤其是那些 BIOS 年代久遠(yuǎn)、對 USB 啟動支持不完整的機(jī)器。真正穩(wěn)妥的寫入姿勢是Rufus 選擇“以 DD 鏡像模式寫入”或者在 Linux 下執(zhí)行sudo dd if/path/to/CentOS-7-x86_64-Minimal-2009.iso of/dev/sdX bs4M statusprogress注意這里的 of 是整塊設(shè)備比如 /dev/sdb不是 /dev/sdb1。dd 把 ISO 原樣逐字節(jié)寫進(jìn) U 盤相當(dāng)于做一張“物理克隆盤”。這種盤在絕大多數(shù) BIOS/UEFI 下都能啟動因?yàn)樗褪且环萃暾墓獗P鏡像引導(dǎo)邏輯和原版光盤完全一致。2.3 卷標(biāo)被改掉了有的朋友喜歡給 U 盤取個自己的名字比如“系統(tǒng)盤”或者“CENTOS”裝系統(tǒng)前忘了改回來。如果你用的是精簡版鏡像或者某些第三方整合版卷標(biāo)可能被作者改成一個自定義字符串。那么引導(dǎo)參數(shù)里的 hd:LABELCentOS\x207\x20x86_64 永遠(yuǎn)匹配不上dracut 就會一直卡在 shell 里。遇到這種情況最直接的驗(yàn)證方式就是進(jìn) dracut shell然后執(zhí)行 blkiddracut:/# blkid看輸出里有沒有 FAT32 或 iso9660 類型的設(shè)備以及它的 LABEL 是什么。如果 LABEL 顯示為空或者跟 CentOS 7 x86_64 不一樣問題就清楚了。3. 真正有效的解決辦法按步驟來我強(qiáng)烈建議你放棄“換一個寫盤工具再試一次”的碰運(yùn)氣心態(tài)而是學(xué)會在 dracut shell 現(xiàn)場確認(rèn)設(shè)備再去改引導(dǎo)參數(shù)。這套方法不管 U 盤是哪個設(shè)備名也不管卷標(biāo)有沒有被改壞都能到達(dá)安裝界面。3.1 第一步在 dracut shell 里摸清 U 盤真身啟動到 dracut shell 后先跑兩條命令看看現(xiàn)狀dracut:/# ls /dev dracut:/# blkidblkid 的輸出一般長這樣/dev/sda1: LABEL/boot UUID... TYPExfs /dev/sdb4: LABELCentOS 7 x86_64 UUID... TYPEiso9660如果你的 U 盤是 /dev/sdb4卷標(biāo)是 CentOS 7 x86_64那問題多半出在引導(dǎo)參數(shù)解析上而不是設(shè)備缺失。如果 U 盤設(shè)備名是 /dev/sdc4你也在輸出里找到它了就可以直接記住這個設(shè)備名一會兒手動指定。如果 U 盤介質(zhì)本身沒有被識別blkid 輸出里完全看不到 U 盤分區(qū)那就先別改引導(dǎo)參數(shù)先檢查是不是 U 盤接口接觸不良、U 盤主控和內(nèi)核不兼容或者鏡像寫壞了。換一個 USB 口、重新插拔一次回到 dracut shell 再執(zhí)行 blkid。3.2 第二步重啟并編輯安裝引導(dǎo)項(xiàng)這一步是整個方案的核心??吹较聢D類似界面時實(shí)際上是一個帶高亮條目的 GRUB 菜單列出了 Install CentOS 7、Test this media 等選項(xiàng)不要急著回車。把光標(biāo)移到第一項(xiàng)然后按鍵盤上的 Tab 鍵BIOS 方式或者按 e 鍵UEFI 方式進(jìn)入引導(dǎo)參數(shù)編輯界面。不同機(jī)器、不同鏡像版本的按鍵略有差別但 CentOS 7 官方鏡像的引導(dǎo)器一般是 GRUB2支持 e 鍵編輯。按 e 之后你會看到類似這樣的內(nèi)容set roothd0,msdos1 linux /images/pxboot/vmlinuz inst.stage2hd:LABELCentOS\x207\x20x86_64 quiet initrd /images/pxboot/initrd.img對于 BIOS 啟動模式重點(diǎn)是 linux 那行后面的 inst.stage2 參數(shù)。對于 UEFI 模式這行可能寫成 linuxefi操作前先把 linuxefi 改成 linux否則某些環(huán)境里 Shell 直接執(zhí)行修改過的命令行會不生效。最粗暴有效的方式把 inst.stage2 整段刪掉靠自己手動指定設(shè)備。改完之后這一行看起來是linux /images/pxboot/vmlinuz quiet注意把 inst.stage2 后面跟的參數(shù)全部去掉只留下 quiet 或者直接連 quiet 都去掉這樣 anaconda 會進(jìn)入交互模式在啟動過程中重新向你詢問安裝源的位置你可以在那時把 U 盤手動指給它。3.3 第三步手動指定設(shè)備或卷標(biāo)如果你不想靠交互詢問那就直接寫死。在 linux 或 linuxefi 這行的結(jié)尾把 inst.stage2hd:LABELCentOS\x207\x20x86_64 替換成你自己確認(rèn)過的參數(shù)。方法一指定設(shè)備名inst.stage2hd:/dev/sdb4方法二指定卷標(biāo)注意轉(zhuǎn)義inst.stage2hd:LABELCentOS\x207\x20x86_64方法三指定 UUID最穩(wěn)不會因?yàn)椴蹇诓煌僫nst.stage2hd:UUID你的UUID字符串UUID 字符串從 blkid 輸出里復(fù)制注意只保留 UUID 那一段不加引號。指定 UUID 的好處很明顯無論 U 盤被識別成 sdb 還是 sdc無論卷標(biāo)有沒有空格轉(zhuǎn)義問題只要 UUID 對得上anaconda 就能 100% 找到。改完參數(shù)后按 CtrlX 或 F10 啟動。正常的話你會看到安裝程序開始讀取鏡像稍等片刻進(jìn)入圖形安裝界面。3.4 第四步針對 UEFI 機(jī)器的補(bǔ)充操作UEFI 環(huán)境下經(jīng)常會遇到兩個額外問題。第一個是分區(qū)類型。如果 U 盤是 dd 模式寫入的它會變成一個包含 iso9660 分區(qū)的混合盤UEFI 固件可能不認(rèn)識這種分區(qū)上嵌套的 EFI 引導(dǎo)。此時你需要確保主板 BIOS 設(shè)置里開啟了“Legacy/CSM Support”傳統(tǒng)支持并且把啟動模式設(shè)置成“UEFI 優(yōu)先”或者“Legacy 優(yōu)先”而不是純 UEFI。不同廠商叫法不一樣有的叫“CSM”有的叫“Compatibility Support Module”找到并開啟它,再試一次。第二個是安全啟動Secure Boot。部分品牌機(jī)默認(rèn)開啟安全啟動而 CentOS 7 的 shim 引導(dǎo)器在 UEFI 下能過安全啟動但前提是你的鏡像日期版本較新grub 配置沒被改動。如果編輯了引導(dǎo)參數(shù)安全啟動下的 GRUB 可能會拒絕加載。最省事的辦法是臨時關(guān)閉 Secure Boot裝完系統(tǒng)之后再裝對應(yīng)廠商的簽名密鑰再開起來或者干脆保持關(guān)閉。4. 實(shí)操記錄一次從 dracut 到安裝完成的完整過程我拿一個之前反復(fù)出現(xiàn)過 dracut 的案例拆解給你看。這臺機(jī)器配置很普通某品牌舊主機(jī)主板支持 UEFI默認(rèn)是純 UEFI 模式一塊 500G 機(jī)械盤U 盤是某雜牌 32G USB 3.0。鏡像用的是 CentOS-7-x86_64-Minimal-2009.iso寫入工具是 Rufus但用的是默認(rèn)的 ISO 模式。第一次啟動GRUB 菜單出來選擇 Install CentOS 7。幾秒鐘后進(jìn)入 dracut shellblkid 輸出/dev/sda1: LABELCentOS 7 x86_64 TYPEiso9660 /dev/sdb1: LABELCentOS 7 x86_64 TYPEiso9660看到兩個 LABEL 一模一樣當(dāng)時我就笑了典型的 UEFI 環(huán)境下 U 盤被識別出兩個分區(qū)一個是 ISO 的 El Torito 啟動分區(qū)另一個是 EFI 分區(qū)。anaconda 拿同一個 LABEL 匹配到兩個設(shè)備直接沒法選。解決辦法是在 GRUB 里直接指定 UUID。我先在 dracut shell 里執(zhí)行 blkid把對應(yīng) iso9660 分區(qū)的 UUID 抄下來然后重啟在 GRUB 編輯界面那一行改成linux /images/pxboot/vmlinuz inst.stage2hd:UUID2020-01-01-11-22-33-00 quiet initrd /images/pxboot/initrd.imgCtrlX 啟動后安裝程序正常讀取鏡像后面全程順暢。裝完后我總結(jié)了一下這個案例的本質(zhì)不是設(shè)備名漂移而是 U 盤被識別成兩個分區(qū)導(dǎo)致 LABEL 匹配歧義。UUID 是唯一的所以直接繞開了歧義。還有一次是另一臺機(jī)器U 盤插前面板 USB 2.0 口dracut 里 blkid 只能看到 sda1 一個硬盤分區(qū)U 盤完全不顯示。排查下來發(fā)現(xiàn)是那個 U 盤主控芯片在 USB 2.0 下供電不足內(nèi)核沒能完成初始化。換到后面板 USB 口blkid 立刻看到 U 盤。所以遇到 U 盤完全不識別的情況先換 USB 口試試比改任何參數(shù)都有效。4.1 常用參數(shù)速查表場景推薦做法注意事項(xiàng)LABEL 能匹配保留 inst.stage2hd:LABELCentOS\x207\x20x86_64確保卷標(biāo)沒被改設(shè)備名明確且唯一inst.stage2hd:/dev/sdb4換 USB 口后需要重查多個分區(qū)卷標(biāo)重復(fù)改用 UUID 指定從 blkid 復(fù)制完整 UUIDUEFI 下 linuxefi 無效改成 linux否則編輯不會生效完全找不到 U 盤換 USB 口 / 換寫盤方式先排除硬件因素5. 再補(bǔ)充幾個容易踩的坑5.1 老電腦的 BIOS 兼容問題如果主板年齡超過五六年而且不支持 UEFIU 盤使用 GPT 分區(qū)表或者做成 UEFI 可引導(dǎo)的混合盤BIOS 啟動時可能直接在引導(dǎo)階段就卡死根本到不了 GRUB 菜單。這種情況下dd 模式寫入往往能救回來因?yàn)?dd 出來的盤在 MBR 部分保留了 ISO 的引導(dǎo)代碼BIOS 能夠識別。另一個老機(jī)器常見的問題是BIOS 必須設(shè)置 U 盤為第一啟動設(shè)備有些主板還要把“Hard Disk Boot Priority”里面的 U 盤前置否則 U 盤雖然插著BIOS 卻從硬盤啟動那你看到的可能是一堆硬盤上的亂碼提示或者直接黑屏不會進(jìn) dracut。5.2 Test this media before installation 的坑CentOS 7 的 GRUB 菜單里有一項(xiàng) Test this media before installation很多人會選它來驗(yàn)證鏡像。這個檢查過程其實(shí)比較耗時而且如果你的 U 盤是高速大容量盤測試可能需要十幾分鐘。問題是有些拷貝操作會把介質(zhì)校驗(yàn)結(jié)果寫入一個隱藏文件下一次再用同一個 U 盤啟動時GRUB 可能會直接跳過校驗(yàn)直接用上次的結(jié)果。如果上次拷貝是壞的那就會導(dǎo)致 anaconda 讀取到不完整的 stage2表現(xiàn)也是 dracut 或后續(xù)安裝報錯。我的習(xí)慣是如果懷疑鏡像損壞直接在 Linux 環(huán)境下執(zhí)行 sha256sum 比對官方校驗(yàn)值而不依賴這個 Test this media 選項(xiàng)。5.3 鏡像源的選擇CentOS 7 已經(jīng)進(jìn)入 EOL 維護(hù)階段官方源已經(jīng)歸檔但網(wǎng)絡(luò)源依然可用。如果你在安裝過程中出現(xiàn)“設(shè)置軟件源失敗”或者安裝過程中斷不要跟 dracut 混淆。dracut 是在啟動引導(dǎo)階段軟件源失敗是在安裝程序里兩者癥狀完全不同。另外網(wǎng)上很多第三方鏡像站提供 CentOS 7 ISO 下載使用前務(wù)必核對 SHA256。之前遇到過某個第三方站點(diǎn)的鏡像里被嵌了額外腳本裝完系統(tǒng)之后多了一個開機(jī)自啟任務(wù)排查了很久才發(fā)現(xiàn)是鏡像層面的問題。從那之后我只從官方歸檔目錄和少數(shù)信任的鏡像站下載系統(tǒng)鏡像寫盤前還會再抄一遍校驗(yàn)值。5.4 寫盤工具的對比工具推薦模式優(yōu)點(diǎn)缺點(diǎn)RufusDD 鏡像模式跨平臺、寫盤快、UEFI/BIOS 兼容好Windows 下需要額外安裝UltraISOUSB-HDD / 整盤寫入老牌、圖形化對部分 UEFI 機(jī)器兼容差dd 命令整盤寫入最穩(wěn)、無附加邏輯需要 Linux/macOS 環(huán)境Ventoy正常安裝多鏡像引導(dǎo)、不用重復(fù)寫盤個別內(nèi)核版本兼容性問題Ventoy 本身也不錯它把鏡像文件直接拷進(jìn) U 盤就能引導(dǎo)適合常備多系統(tǒng)鏡像的場景。但如果你遇到 dracut 問題而且 U 盤是 Ventoy 做的排查思路要變一變Ventoy 會在引導(dǎo)時傳遞一個包含路徑的參數(shù)某些 ISO 在 Ventoy 下因?yàn)槁窂睫D(zhuǎn)義問題也會進(jìn)入 dracut。解決方法是把鏡像放在 U 盤根目錄不要放在中文路徑或帶特殊字符的目錄下或者切換 Ventoy 的“兼容模式”。6. 幾個可以救命的小技巧6.1 備份一下每次改完的啟動參數(shù)很多朋友在 GRUB 界面改了參數(shù)裝完系統(tǒng)重啟就忘了。下次換臺機(jī)器又要重新摸索。我一般在能正常安裝之后會把那臺機(jī)器上有效的啟動參數(shù)拍一張照片存入筆記。真實(shí)場景下同一批采購的同型號機(jī)器U 盤引導(dǎo)參數(shù)幾乎完全通用。6.2 使用 dd 寫入之后U 盤容量變小這個是新手常見疑惑dd 把 ISO 全盤寫入后U 盤在電腦里顯示容量只有鏡像大小比如 4GB 的鏡像寫進(jìn) 32GB 的 U 盤Windows 下看到的就是一個 4GB 的光盤分區(qū)剩下的空間變成了未分配。這是正?,F(xiàn)象不是 U 盤壞了。想要恢復(fù)容量用磁盤管理工具刪除所有分區(qū)重新建一個 FAT32 主分區(qū)就好。6.3 安裝介質(zhì)本身沒問題但 U 盤文件系統(tǒng)格式導(dǎo)致卡住如果你是自己做“懶人包”式的啟動盤把 ISO 解開放進(jìn) FAT32 分區(qū)再用 GRUB 手動引導(dǎo)那要注意 CentOS 7 的鏡像里有幾個文件超過 4GB 嗎嚴(yán)格說 Minimal 版沒有但 DVD 版可能有 squashfs.img 接近 7GBFAT32 不支持超過 4GB 的單個文件解開放置的方案直接失效。所以做 CentOS 7 啟動盤要么 dd 整盤寫入要么直接扔 Ventoy。千萬別手動解壓 DVD 鏡像到 FAT32 U 盤。7. 關(guān)于 dracut 問題我們還能提前做什么進(jìn)入 dracut 其實(shí)不算真正的故障它是系統(tǒng)留給我們的一扇后門用來在啟動早期糾正錯誤。只要你理解了“安裝程序需要找到 stage2 鏡像”這一根主線絕大部分情況都能手動救回來。我個人在實(shí)機(jī)維護(hù)中習(xí)慣在 U 盤上貼一個標(biāo)簽備注寫盤工具、寫入模式、鏡像版本、校驗(yàn)值。這樣半年后重新拿出來用一看標(biāo)簽就知道這個盤是 Rufus DD 模式寫入的 CentOS 7.9 鏡像不至于還要插上電腦重新 blkid 猜半天。另外如果你經(jīng)常幫別人裝系統(tǒng)建議手頭常備兩個不同品牌的 U 盤一個 8GB 專門用 dd 寫入 CentOS 7一個 32GB 專門做 Ventoy 多系統(tǒng)盤。遇到 U 盤引導(dǎo)兼容性問題時先換盤很多時候能排除“U 盤主控和機(jī)器 USB 控制器不兼容”這一層因素。我有一次排查了快一個小時改了各種引導(dǎo)參數(shù)都進(jìn)不了安裝界面最后換了一個 USB 2.0 的老 U 盤一次成功。U 盤主控芯片的兼容性是網(wǎng)上教程幾乎不會提到的隱藏變量。實(shí)際操作中我最常用到的組合是Rufus 的 DD 模式寫入官方 Minimal ISO遇到 dracut 就進(jìn) shell 用 blkid 查 UUID然后重啟編輯引導(dǎo)參數(shù)改成 inst.stage2hd:UUIDxxxx。這套組合到目前為止還沒有遇到過救不回來的情況。如果你運(yùn)氣不好blkid 里連 U 盤都看不到那就別再折騰參數(shù)了硬件層面的問題換盤、換口、換寫入方式三步排查下來基本都能解決。