¿Por qué no puedo especificar mi raíz fs con un UUID?


29

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 un initramfs?

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


unknown-block(0,0)me parece un dispositivo GRUB. Supongo que GRUB no puede usar ese UUID por alguna razón.
Strugee

@strugee, no creo que GRUB intente interpretar la línea de comando del núcleo en absoluto. (GRUB está cargando el kernel sda1. No mostré esa parte de la configuración.)
cjm

Me inclino a estar de acuerdo. Sin embargo, es extraño que el dispositivo se vea como un dispositivo GRUB en lugar de un dispositivo UNIX.
Strugee

@Gilles, la pregunta no es sobre GRUB. Simplemente es el gestor de arranque que estoy usando. Es una pregunta del kernel de Linux.
cjm

Esta tampoco es una pregunta sobre el núcleo, sino una pregunta sobre init.
mikeserv

Respuestas:


22

Solo para aclarar, los UUIDs son la única forma confiable para que el núcleo identifique los discos duros. Hay dos tipos: UUID, que está almacenado en el sistema de archivos y no está disponible para el núcleo en el momento del arranque, y PARTUUID, que está almacenado 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 dispositivos conectados / desconectados.

¡No olvides poner en mayúscula el número hexadecimal SSSSSSSS-PPque obtienes blkid!

Cuanto más fácil de usar

root=LABEL=
root=UUID=

solo funciona con un initramfsque obtenga estos identificadores.

Por lo tanto, si usa un no vacío initramfs, ¡puede tener los tres! Con un vacío initramfs, solo tienes PARTUUID.


¿Te importaría explicar quién está usando el argumento boot = -argument? Acabo de usar esta línea para una instalación de Archlinuxarm que no tiene initrd, y donde no puedo usar boot = LABEL ni boot = UUID.
ineiti

1
Tienes razón: he corregido el arranque a raíz, lo siento. Espero que tenga más sentido ahora.
ineiti

1
Entiendo (después de un día en los foros de archlinuxarm) es que no hay initrd (o initramfs, pero kernel.org/doc/Documentation/kernel-parameters.txt lo llama initrd) en Archlinuxarm. En Ubuntu y tal, doy un puntero a initrd, pero (en mi opinión) no en Archlinuxarm.
ineiti

1
Archlinuxarm discusión acerca NO INITRD: archlinuxarm.org/forum/viewtopic.php?f=23&t=6652
ineiti

1
Prueba este enlace. Y este uno. Y tal vez este . initramfs no es la imagen initramfs, que generalmente es un archivo comprimido que contiene un cpioarchivo que el kernel desempaqueta /en el arranque. initramfs es un sistema de archivos: siempre es el primero /montado y desde donde llama el núcleo init. Puede compilar los contenidos en el núcleo o desempaquetarlos en el arranque; esas son las dos opciones.
mikeserv

16

El parámetro que debe 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):

kernel-parameters.txt :

    root = [KNL] Sistema de archivos raíz
            Vea el comentario 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, ese formulario es
 * utilizado cuando el nombre del disco particionado termina en un dígito.
 * 6) PARTUUID = 00112233-4455-6677-8899-AABBCCDDEEFF que representa el
 * Identificación única de una partición si la tabla de particiones lo proporciona.
 * El UUID puede ser un UUID EFI / GPT o referirse a un MSDOS
 * partición usando el formato SSSSSSSS-PP, donde SSSSSSSS es un cero-
 * representación hexadecimal llena de la "firma de disco NT" de 32 bits y PP
 * es una representación hexadecimal llena de cero 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 reemplazó por
 * flequillo.
 * /

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


1
Esto es solo parcialmente correcto. Un UUID de partición es completamente diferente del UUID del sistema de archivos, por lo PARTUUID=666c2eee-193d-42db-a490-4c444342bd4eque no funciona. Sin embargo, pude usar PARTUUID=SSSSSSSS-02(donde SSSSSSSS es la firma del disco NT que se muestra justo antes del mensaje de error).
cjm

66
Entonces, supongo que la respuesta real es que el núcleo no es compatible root=UUID, solo root=PARTUUID. Si desea utilizar un UUID de sistema de archivos, creo que necesita un initramfs que pueda manejar el montaje de sistemas de archivos por UUID.
cjm

@cjm mis grubbotas muy felices con root=UUID.
terdon

3
@terdon, apuesto a que tienes un initramfs o initrd. (Podría estar vinculado a su núcleo en lugar de ser un archivo separado.)
cjm

4

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

En este ejemplo:

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

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

obtener 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 debería funcionar también con la mayoría de los otros núcleos (antiguos y nuevos ...)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.