為什麼我不能使用 UUID 指定我的根檔案系統?

為什麼我不能使用 UUID 指定我的根檔案系統?

我的系統在 GRUB 2 配置中可以正常啟動:

linux   /bzImage root=/dev/sda2 init=/usr/lib/systemd/systemd ro

但如果我替換/dev/sda2為相應的UUID:

linux   /bzImage root=UUID=666c2eee-193d-42db-a490-4c444342bd4e init=/usr/lib/systemd/systemd ro

然後在啟動過程中失敗:

kernel panic - not syncing: VFS: unable to mount root fs on unknown-block(0,0)

UUID 似乎是正確的:

# blkid
/dev/sda1: UUID="97ac3744-39de-4d6d-9a81-e3a3ea08a8bb" TYPE="ext2" 
/dev/sda2: UUID="666c2eee-193d-42db-a490-4c444342bd4e" TYPE="ext4" 

為什麼不起作用?是因為我沒有使用 initramfs 嗎?

這是 x86_64 Gentoo Linux,核心為 3.10.7。我在 上使用 MBR 分區表sda,在 上使用 GUID 分區表sdb

答案1

只是為了澄清UUIDs 是核心識別硬碟的唯一可靠方法。有兩種類型:UUID,儲存在檔案系統中,在啟動時核心不可用;PARTUUID,儲存在分割表中,啟動時可用。所以你必須使用

root=PARTUUID=SSSSSSSS-PP

可能/dev/sd??會隨著設備的插入/拔出而改變。

別忘了大寫SSSSSSSS-PP您從中獲得的十六進制數blkid

越容易使用

root=LABEL=
root=UUID=

僅適用於initramfs取得這些識別符的 。

因此,如果您使用非空initramfs,則可以同時擁有這三個!有了空initramfs,你就只剩下PARTUUID

答案2

從 UUID 啟動時必須傳遞的參數是PARTUUID。應該如此root=PARTUUID=666c2eee-193d-42db-a490-4c444342bd4e

該文件解釋了為什麼它會返回unknown-block(0,0)

核心參數.txt:

    root= [KNL] 根檔案系統
            請參閱 init/do_mounts.c 中的 name_to_dev_t 註解。

初始化/do_mounts.c:

/*
 * 將名稱轉換為設備編號。我們接受以下變體:
 *
 * 1) 設備號碼以十六進位表示其本身
 * 2) /dev/nfs 代表 Root_NFS (0xff)
 * 3) /dev/<disk_name>表示磁碟的裝置號
 * 4) /dev/<disk_name><decimal> 表示裝置號
 * 分割區 - 磁碟的裝置號碼加上分割區號
 * 5) /dev/<disk_name>p<decimal> - 與上方相同,形式為
 * 當分割磁碟的磁碟名稱以數字結尾時使用。
 * 6) PARTUUID=00112233-4455-6677-8899-AABBCCDDEEFF 代表
 * 分割區的唯一 ID(如果分割表提供)。
 * UUID 可以是 EFI/GPT UUID,也可以是 MSDOS
 * 使用 SSSSSSSS-PP 格式進行分割區,其中 SSSSSSSS 是零
 * 32位元「NT磁碟簽章」的填充十六進位表示,以及PP
 * 是從 1 開始的分區號碼的零填充十六進位表示法。
 * 7) PARTUUID=<UUID>/PARTNROFF=<int> 選擇與下列相關的分割區
 * 具有已知唯一 ID 的分割區。
 *
 * 如果名稱不屬於上述類別,我們回傳(0,0)。
 * block_class 用來檢查某物是否為磁碟名稱。如果磁碟
 * 名稱包含斜杠,設備名稱已將其替換為
 *瀏海。
 */

末尾的最後一位表示,如果它無法理解該值,它將返回(0,0),因此會出現錯誤。

答案3

這是一個 5 年前的貼文。但恕我直言,它仍然沒有完全回答。缺少一個小例子。這裡是:

在這個例子中:

/dev/sda3 = /
/dev/sda2 = swap

...使用 GPT 分割區。對於 MBR(dos 分區),PARTUUID 更短,但過程是相同的...

使用 blkid 取得 PARTUUID:

blkid -s PARTUUID -o value /dev/sda3 # root
77fd7830-faa2-4e99-a48b-337ad9eded28
blkid -s PARTUUID -o value /dev/sda2 # swap
5b63167a-6fd2-4e72-948c-90832372956c

/boot/grub/grub.cfg:

search --no-floppy --part-uuid --set=root 77fd7830-faa2-4e99-a48b-337ad9eded28

menuentry "GNU/Linux, KERNEL 4.12.7-lfs-8.1" {
  linux /boot/vmlinuz-4.12.7-lfs-8.1 root=PARTUUID=77fd7830-faa2-4e99-a48b-337ad9eded28 net.ifnames=0 ipv6.disable=1 ro rootwait rootfstype=ext4
}

/etc/fstab/:

PARTUUID=77fd7830-faa2-4e99-a48b-337ad9eded28 / ext4 noatime,nodiratime,errors=remount-ro 0 1
PARTUUID=5b63167a-6fd2-4e72-948c-90832372956c swap swap pri=1 0 0

眾所周知,這可以與 lfs8.1(內核 4.12.7)一起使用,但我認為它也應該與大多數其他內核一起使用(較舊的和較新的...)

相關內容