web-dev-qa-db-fra.com

Pourquoi ne puis-je pas spécifier ma racine FS avec une UUID?

Mon système botte avec ceci dans mon GRUB 2 config:

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

Mais si je remplace /dev/sda2 avec l'UUID correspondant:

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

ensuite, il échoue pendant le 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-t-il pas? Est-ce parce que je n'utilise pas de initramfs?

Ceci est X86_64 Gentoo Linux avec le noyau 3.10.7. J'utilise une table de partition MBR sur sda et a GUID sur sdb.

30
cjm

Juste pour clarifier UUIDs sont le seul moyen fiable pour le noyau d'identifier des 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 IS Disponible au démarrage . Vous devez donc utiliser

root=PARTUUID=SSSSSSSS-PP

comme /dev/sd?? peut changer avec des périphériques branchés/débranchés.

N'oubliez pas de capitaliser le numéro hexadécimal SSSSSSSS-PP vous obtenez de blkid!

Plus facile à utiliser

root=LABEL=
root=UUID=

seulement travailler avec un initramfs qui récupère ces identificateurs.

Donc, si vous utilisez un _ non vide initramfs, vous pouvez avoir les trois! Avec un initramfs, vous n'avez que PARTUUID.

22
ineiti

Le paramètre que vous devez passer au démarrage d'UUID est PARTUUID. Donc, il devrait être root=PARTUUID=666c2eee-193d-42db-a490-4c444342bd4e.

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

kernel-paramètre.txt:

 racine = [KNL] Système de fichiers racine 
 Voir nom_to_dev_t Commentaire dans init/do_mounts.ca. [.____]

init/do_mounts.cons.c:

[.____]/* [.____] * Convertissez un nom en numéro de périphérique. Nous acceptons les variantes suivantes: [.____] * [.____] * 1) Le numéro de périphérique en hexadécimal représente elle-même [.____] * 2)/dev/nfs représente root_nfs (0xff) [.____]. )/dev/<nom_sk_> représente le numéro de périphérique de disque 
 * 4)/dev/<nom_sk_> <décimal> représente le numéro de périphérique [.____] * de la partition - Numéro de périphérique Plus la partition Numéro [.____] * 5)/dev/<Nom de disque> p <décimal> - Identique que ce qui précède, ce formulaire est [.____] * Utilisé lorsque le nom du disque partitionné se termine sur un chiffre. 
 * 6) Partuuid = 00112233-4455-6677-8899-Aabbccddeeff représentant le 
 * ID unique d'une partition si la table de partition le fournit. [.____] * L'UUID peut être une efi/gpt Uuid, ou se référer à une partition msdos [.____] * Utilisation du format SSSSSSSSS-PP, où SSSSSSSSSS est un zéro - 
 * Représentation hexagonale remplie de la "signature de disque NT" 32 bits et PP [ .____] * est une représentation hexagonale remplie de zéro du numéro de partition basée sur 1. [.____] * 7) Partuuid = <UUID>/Partnroff = <int> Pour sélectionner une partition par rapport à [.____] * Une partition avec un identifiant unique connu [.____] * [. ____] * t tombe 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 [.____] * Nom contient des barres obliques, le nom du périphérique les a remplacés par [.____] * Bangs. [.____] */[.____]

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

16
Patrick

C'est un fil de 5 ans. Mais il est toujours que je n'ai pas répondu complètement. Il y a un petit exemple manquant. C'est ici:

Dans cet exemple:

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

... en utilisant une partition GPT. Avec MBR (Partition DOS), les Partuuids sont plus courts, mais la procédure est la même ...

obtenez les Partuuids 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 travailler avec LFS8.1 (noyau 4.12.7) mais je pense que cela devrait fonctionner avec la plupart des autres noyaux aussi (Olders et Discer ...)

4