Pourquoi ne puis-je pas spécifier mon fs racine avec un UUID?

29

Mon système démarre correctement avec cela dans ma configuration GRUB 2:

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

Mais si je remplace /dev/sda2par l'UUID correspondant:

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

puis il échoue au démarrage:

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

L'UUID semble être correct:

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

Pourquoi ça ne marche pas? Est-ce parce que je n'utilise pas d'initramfs?

Il s'agit de Gentoo Linux x86_64 avec le noyau 3.10.7. J'utilise une table de partition MBR sdaet une table de partition GUID sdb.

cjm
la source
unknown-block(0,0)ressemble à un appareil GRUB pour moi. je suppose que GRUB ne peut pas utiliser cet UUID pour une raison quelconque.
strugee
@strugee, je ne pense pas du tout que GRUB essaie d'interpréter la ligne de commande du noyau. (GRUB charge le noyau depuis sda1. Je n'ai pas montré cette partie de la configuration.)
cjm
Je suis enclin à être d'accord. il est étrange, cependant, que le périphérique ressemble à un périphérique GRUB au lieu d'un périphérique UNIX.
strugee
@Gilles, la question ne concerne pas GRUB. Il se trouve que c'est le chargeur de démarrage que j'utilise. C'est une question sur le noyau Linux.
cjm
Ce n'est pas non plus une question sur le noyau - c'est une question sur init.
mikeserv

Réponses:

22

Juste pour clarifier, les UUIDs sont le seul moyen fiable pour le noyau d'identifier les disques durs. Il existe deux types: UUID, qui est stocké dans le système de fichiers et n'est pas disponible pour le noyau au démarrage, et PARTUUID, qui est stocké dans la table de partition et EST disponible au démarrage. Vous devez donc utiliser

root=PARTUUID=SSSSSSSS-PP

comme cela /dev/sd??peut changer avec les appareils branchés / débranchés.

N'oubliez pas de mettre en majuscule le nombre hexadécimal que SSSSSSSS-PPvous obtenez blkid!

Le plus simple à utiliser

root=LABEL=
root=UUID=

ne fonctionne qu'avec un initramfsqui récupère ces identifiants.

Donc, si vous utilisez un non-vide initramfs, vous pouvez avoir les trois! Avec un vide initramfs, vous avez seulement PARTUUID.

ineiti
la source
N'oubliez pas d'expliquer qui utilise alors l'argument boot =-? Je viens d'utiliser cette ligne pour une installation Archlinuxarm qui n'a pas initrd, et où je ne peux pas utiliser boot = LABEL ni boot = UUID.
ineiti
1
Vous avez raison - j'ai corrigé le démarrage à la racine, désolé! J'espère que cela a plus de sens maintenant.
ineiti
1
Ma compréhension (après un jour sur les forums de archlinuxarm) est qu'il n'y a pas d'initrd (ou initramfs, mais kernel.org/doc/Documentation/kernel-parameters.txt l' appelle initrd) sur Archlinuxarm. Sur Ubuntu et autres, je donne un pointeur vers initrd, mais (selon ma compréhension) pas sur Archlinuxarm.
ineiti
1
Discussion d'Archlinuxarm sur NO initrd: archlinuxarm.org/forum/viewtopic.php?f=23&t=6652
ineiti
1
Essayez ce lien. Et celui- là. Et peut - être celui- ci. initramfs n'est pas l'image initramfs - qui est généralement une archive compressée contenant une cpioarchive que le noyau décompresse /au démarrage. initramfs est un système de fichiers - c'est toujours le premier /monté et d'où le noyau appelle init. Vous pouvez compiler le contenu dans le noyau ou le décompresser au démarrage - ce sont les deux options.
mikeserv
16

Le paramètre que vous devez passer pour démarrer à partir de l'UUID est PARTUUID. Il devrait en être ainsi root=PARTUUID=666c2eee-193d-42db-a490-4c444342bd4e.

La documentation explique pourquoi elle revient avec unknown-block(0,0):

kernel-parameters.txt :

    root = [KNL] Système de fichiers racine
            Voir le commentaire name_to_dev_t dans init / do_mounts.c.

init / do_mounts.c :

/ *
 * Convertissez un nom en numéro d'appareil. Nous acceptons les variantes suivantes:
 *
 * 1) le numéro d'appareil en hexadécimal se représente
 * 2) / dev / nfs représente Root_NFS (0xff)
 * 3) / dev / <disk_name> représente le numéro de périphérique du disque
 * 4) / dev / <disk_name> <decimal> représente le numéro de périphérique
 * de partition - numéro de périphérique du disque plus le numéro de partition
 * 5) / dev / <disk_name> p <decimal> - identique à ce qui précède, ce formulaire est
 * utilisé lorsque le nom du disque du disque partitionné se termine sur un chiffre.
 * 6) PARTUUID = 00112233-4455-6677-8899-AABBCCDDEEFF représentant le
 * identifiant unique d'une partition si la table de partition le fournit.
 * L'UUID peut être un UUID EFI / GPT ou faire référence à un MSDOS
 * partition utilisant le format SSSSSSSS-PP, où SSSSSSSS est un zéro
 * représentation hexadécimale remplie de la "signature de disque NT" 32 bits, et PP
 * est une représentation hexadécimale remplie de zéro du numéro de partition basé sur 1.
 * 7) PARTUUID = <UUID> / PARTNROFF = <int> pour sélectionner une partition par rapport à
 * une partition avec un identifiant unique connu.
 *
 * Si le nom ne tombe pas dans les catégories ci-dessus, nous retournons (0,0).
 * block_class est utilisé pour vérifier si quelque chose est un nom de disque. Si le disque
 * le nom contient des barres obliques, le nom de l'appareil les remplace par
 * frange.
 * /

Le dernier bit à la fin indique que s'il ne peut pas comprendre la valeur, il revient (0,0), d'où votre erreur.

Patrick
la source
1
Ce n'est que partiellement correct. Un UUID de partition est complètement différent de l'UUID du système de fichiers, donc PARTUUID=666c2eee-193d-42db-a490-4c444342bd4ene fonctionne pas. Cependant, j'ai pu utiliser PARTUUID=SSSSSSSS-02(où SSSSSSSS est la signature de disque NT affichée juste avant le message d'erreur).
cjm
6
Je suppose donc que la vraie réponse est que le noyau ne prend pas en charge root=UUID, seulement root=PARTUUID. Si vous voulez utiliser un UUID de système de fichiers, je suppose que vous avez besoin d'un initramfs qui peut gérer le montage de systèmes de fichiers par UUID.
cjm
@cjm mes grubbottes avec bonheur root=UUID.
terdon
3
@terdon, je parie que vous avez un initramfs ou initrd. (Il pourrait être lié à votre noyau au lieu d'être un fichier séparé.)
cjm
4

Il s'agit d'un fil de 5 ans. Mais il n'est toujours pas pleinement répondu. Il manque un petit exemple. C'est ici:

Dans cet exemple:

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

... en utilisant une partition GPT. Avec le MBR (partition dos) les PARTUUID sont plus courts mais la procédure est la même ...

récupérez les PARTUUID avec 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

Ceci est connu pour FONCTIONNER avec lfs8.1 (noyau 4.12.7) Mais je pense que cela devrait aussi fonctionner avec la plupart des autres noyaux (anciens et nouveaux ...)

Michael HG Schmidt
la source