背景
我有一個新系統,我花了很多時間配置軟體以執行各種服務,然後發現驅動器可能不穩定。所以我決定更換磁碟,保留新磁碟的內容。
系統磁碟也有一個問題kernel
,我似乎無法修復(我遵循了所有grub
指示,但預設情況下它不會正確啟動kernel
,除非您手動選擇正確的方向)。因此,我認為最好的方法是簡單地Fedora Server
在新磁碟上進行新安裝,這樣就可以解決啟動問題。
發生了什麼事
新磁碟要大得多,因此我在安裝過程中對它進行了稍微不同的分割區。然後,我卸下了驅動器,並將新舊系統磁碟放入附近的另一台伺服器中。出於謹慎考慮,我保留了fstab
新系統磁碟中的 ,因為我知道它有分割區UUIDs
。
有很多方法可以移動東西,我決定在新系統磁碟上有一個乾淨的根分割區。我想dd
也許可以做到這一點,但我習慣在分區大小相同的情況下使用它,並且有點不確定,所以我只是用gparted
.然後我使用普通的作業系統工具來移動這些檔案。然後,我剪切並貼上了新安裝中的內容,並將其插入到我正在修復的伺服器中的UUID
非常非庫存中。fstab
一切順利。
然後我嘗試啟動系統。它發布,然後進入grub
引導程序,它自動選擇正確的內核,然後就開始了! ……直到它沒有!
它必須「顯示普利茅斯啟動畫面」或類似的東西,暫停,然後從自稱的東西發出很多超時警告dracut
。從這裡,我用手機拍了一張螢幕截圖。它說:
Warning: Could not boot.
Starting Dracut Emergency Shell...
Warning: /dev/disk/by-uuid/<a uuid> does not exist
Generating "/run/initramfs/rdsosreport.txt"
journalctl
接下來是使用並可能保存rdsosreport.txt
錯誤報告的建議。
確認!怎麼辦?我到處搜尋這個Warning [...] does not exist
和dracut emergency shell
上面引用的東西。沒什麼!
答案1
更新 fstab
需要/etc/fstab
使用分區的正確 UUID 更新文件
更新密碼表
如果您先前的分割區已加密,您需要從其中刪除該條目/etc/crypttab
如果您的新分割區已加密,您需要在/etc/crypttab
重新生成initramfs
更新/etc/fstab
和/etc/crypttab
檔案後,您需要使用 dracut 更新 initramfs 映像。
您可以透過執行以下命令從 dracut 緊急 shell 更新 dracut 映像
# dracut --hostonly --regenerate-all --force
參考
答案2
訊息:
Warning: /dev/disk/by-uuid/<uuid> does not exist
是一個主要線索。
事實證明,根分區UUID
儲存在grub2
現代 Fedora 伺服器/boot
分區部分的兩個位置。但在這種情況下,其實有三個UUID
問題。
根分區(“/”)的重新格式化實際上改變了UUID
.UUID
因此,必須先發現新事物,然後將其放入正確的位置。有很多方法可以找到,UUIDs
但執行此操作的一個命令列工具是blkid
- 如本例所示:
# blkid
/dev/sda1: UUID="64bbac09-1a12-4bea-8873-212ffb56f2a8" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="primary" PARTUUID="8a09913a-fdb2-42a0-98e3-6b89e16374d2"
UUIDs
請注意,對於每個分割區,此工具顯示兩個分割區;你想要其中的第一個。另請注意,非特權用戶無法運行blkid
.
以下是根分區UUID
需要位於的三個位置:
- 在
/etc/fstab
描述根分割區掛載的行中,並且; - 在
/boot/grub2.cfg
設定內核選項就行了。找到它的最快方法是尋找前者(UUID
如果您還擁有它)。或尋找"set kernelopts="root=UUID="
, 和; - 位於
/boot/grub2/grubenv
與文件中引用的行類似的行上/boot/grub2.cfg
。尋找:kernelopts=root=UUID=
請記住僅更改一個新的 UUID,而其他所有內容均保持原樣。也許在編輯之前先備份文件,以防萬一!