¿Por qué no puedo especificar mi root fs con un UUID?

¿Por qué no puedo especificar mi root fs con un UUID?

Mi sistema arranca bien con esto en mi configuración de GRUB 2:

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

Pero si lo reemplazo /dev/sda2con el UUID correspondiente:

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

entonces falla durante el arranque:

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

El UUID parece ser correcto:

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

¿Por qué no funciona? ¿Es porque no estoy usando initramfs?

Este es x86_64 Gentoo Linux con kernel 3.10.7. Estoy usando una tabla de particiones MBR sday una tabla de particiones GUID sdb.

Respuesta1

Solo para aclarar, UUIDlos correos electrónicos son la única forma confiable que tiene el kernel de identificar discos duros. Hay dos tipos: UUID, que se almacena en el sistema de archivos y no está disponible para el kernel en el momento del arranque, y PARTUUID, que se almacena en la tabla de particiones y ESTÁ disponible en el momento del arranque. Entonces tienes que usar

root=PARTUUID=SSSSSSSS-PP

como /dev/sd??puede cambiar con los dispositivos conectados/desconectados.

No olvidescapitalizar¡El número hexadecimal SSSSSSSS-PPque obtienes blkid!

Cuanto más fácil de usar

root=LABEL=
root=UUID=

solo trabaje con un initramfsque recupere estos identificadores.

Entonces, si usas un no vacío initramfs, ¡puedes tener los tres! Con un vacío initramfs, solo tienes PARTUUID.

Respuesta2

El parámetro que debes pasar para arrancar desde UUID es PARTUUID. Así debería ser root=PARTUUID=666c2eee-193d-42db-a490-4c444342bd4e.

La documentación explica por qué vuelve con unknown-block(0,0):

parámetros-del-kernel.txt:

    root= [KNL] Sistema de archivos raíz
            Vea el comentario de name_to_dev_t en init/do_mounts.c.

init/do_mounts.c:

/*
 * Convertir un nombre en número de dispositivo. Aceptamos las siguientes variantes:
 *
 * 1) el número de dispositivo en hexadecimal se representa a sí mismo
 * 2) /dev/nfs representa Root_NFS (0xff)
 * 3) /dev/<disk_name> representa el número de dispositivo del disco
 * 4) /dev/<disk_name><decimal> representa el número de dispositivo
 * de partición: número de dispositivo del disco más el número de partición
 * 5) /dev/<disk_name>p<decimal> - igual que el anterior, esa forma es
 * se utiliza cuando el nombre del disco particionado termina en un dígito.
 * 6) PARTUUID=00112233-4455-6677-8899-AABBCCDDEEFF que representa el
 * ID único de una partición si la tabla de particiones lo proporciona.
 * El UUID puede ser un UUID EFI/GPT o hacer referencia a un MSDOS
 * partición usando el formato SSSSSSSS-PP, donde SSSSSSSS es cero
 * representación hexadecimal rellena de la "firma de disco NT" de 32 bits y PP
 * es una representación hexadecimal rellena con ceros del número de partición basado en 1.
 * 7) PARTUUID=<UUID>/PARTNROFF=<int> para seleccionar una partición en relación con
 * una partición con una identificación única conocida.
 *
 * Si el nombre no pertenece a las categorías anteriores, devolvemos (0,0).
 * block_class se usa para verificar si algo es un nombre de disco. Si el disco
 * el nombre contiene barras, el nombre del dispositivo las reemplaza con
 * flequillo.
 */

El último bit al final dice que si no puede entender el valor, devuelve (0,0), de ahí su error.

Respuesta3

Este es un hilo de hace 5 años. Pero aún así, en mi humilde opinión, no está completamente respondido. Falta un pequeño ejemplo. Aquí lo tienes:

En este ejemplo:

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

...usando una partición GPT. Con MBR (partición dos) los PARTUUID son más cortos pero el procedimiento es el mismo...

obtenga los PARTUUID con 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

Se sabe que esto FUNCIONA con lfs8.1 (kernel 4.12.7), pero creo que también debería funcionar con la mayoría de los otros kernels (antiguos y nuevos...)

información relacionada