Por que não consigo especificar meu root fs com um UUID?

Por que não consigo especificar meu root fs com um UUID?

Meu sistema inicializa bem com isso na minha configuração do GRUB 2:

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

Mas se eu substituir /dev/sda2pelo UUID correspondente:

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

então ele falha durante a inicialização:

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

O UUID parece estar correto:

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

Por que não funciona? É porque não estou usando um initramfs?

Este é o Gentoo Linux x86_64 com kernel 3.10.7. Estou usando uma tabela de partição MBR sdae uma tabela de partição GUID em sdb.

Responder1

Só para esclarecer, UUIDs são a única maneira confiável de o kernel identificar discos rígidos. Existem dois tipos: UUID, que é armazenado no sistema de arquivos e não está disponível para o kernel no momento da inicialização, e PARTUUID, que é armazenado na tabela de partição e ESTÁ disponível no momento da inicialização. Então você tem que usar

root=PARTUUID=SSSSSSSS-PP

como /dev/sd??pode mudar com dispositivos conectados/desconectados.

Não se esqueça decapitalizaro número hexadecimal SSSSSSSS-PPque você obtém blkid!

Quanto mais fácil de usar

root=LABEL=
root=UUID=

só funciona com um initramfsque busca esses identificadores.

Então, se você usar um non-empty initramfs, poderá ter todos os três! Com um vazio initramfs, você só tem PARTUUID.

Responder2

O parâmetro que você deve passar para inicializar a partir do UUID é PARTUUID. Assim deveria ser root=PARTUUID=666c2eee-193d-42db-a490-4c444342bd4e.

A documentação explica por que está voltando com unknown-block(0,0):

parâmetros do kernel.txt:

    root= [KNL] Sistema de arquivos raiz
            Veja o comentário name_to_dev_t em init/do_mounts.c.

init/do_mounts.c:

/*
 * Converta um nome em número do dispositivo. Aceitamos as seguintes variantes:
 *
 * 1) o número do dispositivo em hexadecimal representa a si mesmo
 * 2) /dev/nfs representa Root_NFS (0xff)
 * 3) /dev/<disk_name> representa o número do dispositivo do disco
 * 4) /dev/<disk_name><decimal> representa o número do dispositivo
 * da partição - número do dispositivo do disco mais o número da partição
 * 5) /dev/<disk_name>p<decimal> - igual ao acima, esse formato é
 * usado quando o nome do disco particionado termina em um dígito.
 * 6) PARTUUID=00112233-4455-6677-8899-AABBCCDDEEFF representando o
 * id exclusivo de uma partição se a tabela de partição fornecer.
 * O UUID pode ser um UUID EFI/GPT ou referir-se a um MSDOS
 * partição usando o formato SSSSSSSS-PP, onde SSSSSSSS é um zero-
 * representação hexadecimal preenchida da "assinatura de disco NT" de 32 bits e PP
 * é uma representação hexadecimal preenchida com zero do número da partição baseada em 1.
 * 7) PARTUUID=<UUID>/PARTNROFF=<int> para selecionar uma partição em relação a
 * uma partição com um ID exclusivo conhecido.
 *
 * Se o nome não se enquadrar nas categorias acima, retornamos (0,0).
 * block_class é usado para verificar se algo é um nome de disco. Se o disco
 * o nome contém barras, o nome do dispositivo as substitui por
 * franja.
 */

O último bit no final diz que se não conseguir entender o valor, ele retornará (0,0), daí o seu erro.

Responder3

Este é um tópico de 5 anos. Mas ainda assim não foi totalmente respondido. Falta um pequeno exemplo. Aqui está:

Neste exemplo:

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

...usando uma partição GPT. Com MBR (partição DOS) os PARTUUID's são mais curtos mas o procedimento é o mesmo...

obtenha os PARTUUIDs com 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

Sabe-se que isso FUNCIONA com lfs8.1 (kernel 4.12.7). Mas acho que também deve funcionar com a maioria dos outros kernels (antigos e mais recentes ...)

informação relacionada