Warum kann ich mein Root-Dateisystem nicht mit einer UUID angeben?

Warum kann ich mein Root-Dateisystem nicht mit einer UUID angeben?

Mein System startet ordnungsgemäß mit Folgendem in meiner GRUB 2-Konfiguration:

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

Aber wenn ich /dev/sda2durch die entsprechende UUID ersetze:

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

dann schlägt es beim Booten fehl:

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

Die UUID scheint korrekt zu sein:

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

Warum funktioniert es nicht? Liegt es daran, dass ich kein Initramfs verwende?

Dies ist x86_64 Gentoo Linux mit Kernel 3.10.7. Ich verwende eine MBR-Partitionstabelle auf sdaund eine GUID-Partitionstabelle auf sdb.

Antwort1

Nur zur Klarstellung: UUIDs sind die einzige zuverlässige Möglichkeit für den Kernel, Festplatten zu identifizieren. Es gibt zwei Typen: UUID, das im Dateisystem gespeichert ist und dem Kernel beim Booten nicht zur Verfügung steht, und PARTUUID, das in der Partitionstabelle gespeichert ist und beim Booten verfügbar IST. Sie müssen also

root=PARTUUID=SSSSSSSS-PP

da sich dies /dev/sd??bei angeschlossenen/nicht angeschlossenen Geräten ändern kann.

Vergessen Sie nichtprofitierendie Hexadezimalzahl, SSSSSSSS-PPdie Sie von erhalten blkid!

Je einfacher zu bedienen

root=LABEL=
root=UUID=

Arbeiten Sie nur mit einem initramfs, das diese Kennungen abruft.

Wenn Sie also ein nicht leeres verwenden initramfs, können Sie alle drei haben! Mit einem leeren initramfshaben Sie nur PARTUUID.

Antwort2

Der Parameter, den Sie zum Booten von UUID übergeben müssen, ist PARTUUID. Es sollte also sein root=PARTUUID=666c2eee-193d-42db-a490-4c444342bd4e.

In der Dokumentation wird der Grund für die Rückgabe wie folgt erklärt unknown-block(0,0):

kernel-parameters.txt:

    root= [KNL] Root-Dateisystem
            Siehe Kommentar name_to_dev_t in init/do_mounts.c.

init/do_mounts.c:

/*
 * Wandeln Sie einen Namen in eine Gerätenummer um. Wir akzeptieren folgende Varianten:
 *
 * 1) Die Gerätenummer stellt sich selbst in Hexadezimalzahlen dar
 * 2) /dev/nfs steht für Root_NFS (0xff)
 * 3) /dev/<disk_name> stellt die Gerätenummer der Festplatte dar
 * 4) /dev/<disk_name><decimal> steht für die Gerätenummer
 * der Partition - Gerätenummer der Festplatte plus Partitionsnummer
 * 5) /dev/<disk_name>p<decimal> - wie oben, diese Form ist
 * wird verwendet, wenn der Datenträgername des partitionierten Datenträgers mit einer Ziffer endet.
 * 6) PARTUUID=00112233-4455-6677-8899-AABBCCDDEEFF steht für die
 * eindeutige ID einer Partition, sofern diese in der Partitionstabelle angegeben ist.
 * Die UUID kann entweder eine EFI/GPT UUID sein oder sich auf eine MSDOS beziehen
 * Partition im Format SSSSSSSS-PP, wobei SSSSSSSS eine Null ist.
 * ausgefüllte Hex-Darstellung der 32-Bit „NT-Disk-Signatur“ und PP
 * ist eine mit Nullen aufgefüllte Hex-Darstellung der 1-basierten Partitionsnummer.
 * 7) PARTUUID=<UUID>/PARTNROFF=<int> zur Auswahl einer Partition in Bezug auf
 * eine Partition mit einer bekannten eindeutigen ID.
 *
 * Wenn der Name nicht in die oben genannten Kategorien fällt, geben wir (0,0) zurück.
 * block_class wird verwendet, um zu prüfen, ob es sich um einen Datenträgernamen handelt. Wenn der Datenträger
 * Name enthält Schrägstriche, im Gerätenamen werden diese ersetzt durch
 * Pony.
 */

Der letzte Teil am Ende besagt, dass es zurückgibt, wenn der Wert nicht verstanden werden kann, (0,0)daher Ihr Fehler.

Antwort3

Dies ist ein 5 Jahre alter Thread. Aber er ist meiner Meinung nach immer noch nicht vollständig beantwortet. Es fehlt ein kleines Beispiel. Hier ist es:

In diesem Beispiel:

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

...mit einer GPT-Partition. Bei MBR (DOS-Partition) sind die PARTUUIDs kürzer, aber das Verfahren ist das gleiche ...

Holen Sie sich die PARTUUIDs mit blkid:

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

Dies FUNKTIONIERT nachweislich mit lfs8.1 (Kernel 4.12.7), aber ich denke, es sollte auch mit den meisten anderen Kerneln funktionieren (ältere und neuere ...)

verwandte Informationen