Warum kann ich meine Root-Fs nicht mit einer UUID angeben?


29

Mein System bootet in meiner GRUB 2-Konfiguration OK:

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

Aber wenn ich durch /dev/sda2die entsprechende UUID ersetze :

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

dann scheitert es beim booten:

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.


unknown-block(0,0)sieht für mich aus wie ein GRUB-Gerät. Ich vermute, dass GRUB diese UUID aus irgendeinem Grund nicht verwenden kann.
Strugee

@strugee, ich glaube nicht, dass GRUB versucht, die Kernel-Befehlszeile überhaupt zu interpretieren. (GRUB lädt den Kernel von sda1. Ich habe diesen Teil der Konfiguration nicht gezeigt.)
cjm

Ich bin geneigt zuzustimmen. Es ist jedoch seltsam, dass das Gerät wie ein GRUB-Gerät anstelle eines UNIX-Geräts aussieht.
Strugee

@ Gilles, die Frage bezieht sich nicht auf GRUB. Das ist zufällig der Bootloader, den ich verwende. Es ist eine Linux-Kernel-Frage.
cjm

Dies ist auch keine Frage zum Kernel - dies ist eine Frage zum Kernel init.
mikeserv

Antworten:


22

Nur zur Verdeutlichung sind UUIDs die einzige zuverlässige Möglichkeit für den Kernel, Festplatten zu identifizieren. Es gibt zwei Arten: UUID, die im Dateisystem gespeichert ist und dem Kernel beim Booten nicht zur Verfügung steht, und PARTUUID, die in der Partitionstabelle gespeichert ist und beim Booten zur Verfügung steht. Also musst du benutzen

root=PARTUUID=SSSSSSSS-PP

da /dev/sd??kann sich bei gesteckten / nicht gesteckten geräten ändern.

Vergessen Sie nicht, die Hexadezimalzahl , von der Sie erhalten , in Großbuchstaben zu schreiben !SSSSSSSS-PPblkid

Je einfacher zu bedienen

root=LABEL=
root=UUID=

arbeiten Sie nur mit einem initramfs, der diese Bezeichner abruft.

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


Darf ich erklären, wer das boot = -argument verwendet? Ich habe diese Zeile gerade für eine Archlinuxarm-Installation verwendet, die kein initrd hat und bei der ich weder boot = LABEL noch boot = UUID verwenden kann.
Ineiti

1
Du hast recht - ich habe den Boot auf root korrigiert, sorry! Hoffe, es macht jetzt mehr Sinn.
Ineiti

1
Nach meinem Verständnis (nach einem Tag in den Archlinuxarm-Foren) gibt es auf Archlinuxarm kein initrd (oder initramfs, aber kernel.org/doc/Documentation/kernel-parameters.txt nennt es initrd). Auf Ubuntu und so gebe ich zwar einen Zeiger auf initrd, aber (nach meinem Verständnis) nicht auf Archlinuxarm.
Ineiti

1
Archlinuxarm Diskussion über NO initrd: archlinuxarm.org/forum/viewtopic.php?f=23&t=6652
ineiti

1
Versuchen Sie diesen Link. Und dieser hier . Und vielleicht dieser . initramfs ist nicht das initramfs-Image - normalerweise ein komprimiertes Archiv, das ein cpioArchiv enthält, in das der Kernel /beim Booten entpackt . initramfs ist ein Dateisystem - es ist immer das erste /gemountete und von wo aus der Kernel aufruft init. Sie können die Inhalte in den Kernel kompilieren oder beim Booten entpacken - das sind die beiden Möglichkeiten.
mikeserv

16

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

Die Dokumentation erklärt, warum es zurückkommt mit unknown-block(0,0):

kernel-parameters.txt :

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

init / do_mounts.c :

/ *
 * Konvertieren Sie einen Namen in eine Gerätenummer. Wir akzeptieren folgende Varianten:
 *
 * 1) Gerätenummer in hexadezimaler Darstellung
 * 2) / dev / nfs repräsentiert Root_NFS (0xff)
 * 3) / dev / <disk_name> steht für die Gerätenummer der Festplatte
 * 4) / dev / <festplattenname> <dezimal> steht für die Gerätenummer
 * der Partition - Gerätenummer der Festplatte plus Partitionsnummer
 * 5) / dev / <disk_name> p <dezimal> - wie oben, diese Form ist
 * Wird verwendet, wenn der Name der partitionierten Festplatte auf einer Ziffer endet.
 * 6) PARTUUID = 00112233-4455-6677-8899-AABBCCDDEEFF, das die
 * eindeutige ID einer Partition, falls in der Partitionstabelle angegeben.
 * Die UUID kann entweder eine EFI / GPT-UUID sein oder sich auf ein MSDOS beziehen
 * Partition im Format SSSSSSSS-PP, wobei SSSSSSSS eine Null ist.
 * Hex-Darstellung der 32-Bit "NT-Disk-Signatur" und PP gefüllt
 * ist eine mit Nullen gefüllte hexadezimale Darstellung der auf 1 basierenden Partitionsnummer.
 * 7) PARTUUID = <UUID> / PARTNROFF = <int>, um eine Partition in Bezug auf auszuwählen
 * 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 überprüfen, ob es sich bei etwas um einen Plattennamen handelt. Wenn die Festplatte
 * name enthält Schrägstriche, die durch den Gerätenamen ersetzt werden
 * Pony.
 * /

Das letzte Bit am Ende besagt, dass, wenn es den Wert nicht verstehen kann, er zurückgibt (0,0), daher Ihr Fehler.


1
Dies ist nur teilweise richtig. Eine Partitions-UUID unterscheidet sich vollständig von der UUID des Dateisystems und PARTUUID=666c2eee-193d-42db-a490-4c444342bd4efunktioniert daher nicht. Ich konnte jedoch verwenden PARTUUID=SSSSSSSS-02(wobei SSSSSSSS die NT-Datenträgersignatur ist, die direkt vor der Fehlermeldung angezeigt wird).
cjm

6
Also denke ich, dass die wirkliche Antwort ist, dass der Kernel nicht root=UUIDnur unterstützt root=PARTUUID. Wenn Sie eine Dateisystem-UUID verwenden möchten, benötigen Sie vermutlich ein initramfs, das das Mounten von Dateisystemen über die UUID unterstützt.
cjm

@cjm meine grubStiefel ganz gerne mit root=UUID.
terdon

3
@terdon, ich wette du hast ein initramfs oder initrd. (Es könnte in Ihren Kernel
eingebunden werden,

4

Dies ist ein 5 Jahre alter Thread. Aber noch ist es imho nicht vollständig beantwortet. Es fehlt ein kleines Beispiel. Hier ist es:

In diesem Beispiel:

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

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

Holen Sie sich die PARTUUID's 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

Es ist bekannt, dass dies mit lfs8.1 (Kernel 4.12.7) funktioniert. Aber ich denke, es sollte auch mit den meisten anderen Kerneln funktionieren (alte und neue ...).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.