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

29

Meu sistema inicializa OK 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 isso não funciona? É porque eu não estou usando um initramfs?

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

cjm
fonte
unknown-block(0,0)parece um dispositivo GRUB para mim. Meu palpite é que o GRUB não pode usar esse UUID por algum motivo.
strugee
@ Strugee, não acho que o GRUB tente interpretar a linha de comando do kernel. (GRUB está a carregar o kernel a partir sda1Eu não mostram que parte da configuração..)
CJM
Estou inclinado a concordar. é estranho, no entanto, que o dispositivo se pareça com um dispositivo GRUB em vez de um dispositivo UNIX.
strugee
@Gilles, a questão não é sobre o GRUB. Por acaso esse é o gerenciador de inicialização que estou usando. É uma questão de kernel do Linux.
Cjm 07/10
Esta também não é uma pergunta sobre o kernel - é uma questão sobre init.
mikeserv

Respostas:

22

Apenas para esclarecer, UUIDs são a única maneira confiável para 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ções 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 de capitalizar o número hexadecimal de onde SSSSSSSS-PPvocê recebe blkid!

Quanto mais fácil de usar

root=LABEL=
root=UUID=

trabalhe apenas com um initramfsque busque esses identificadores.

Portanto, se você usar um não vazio initramfs, poderá ter todos os três! Com um vazio initramfs, você só tem PARTUUID.

ineiti
fonte
Importa-se de explicar quem está usando o argumento boot =-então? Eu apenas usei esta linha para uma instalação do Archlinuxarm que não possui o initrd e onde não posso usar boot = LABEL nem boot = UUID.
Ineiti
1
Você está certo - eu corrigi a inicialização para fazer o root, desculpe! Espero que faça mais sentido agora.
Ineiti
1
Meu entendimento (depois de um dia nos fóruns do archlinuxarm) é que não existe initrd (ou initramfs, mas o kernel.org/doc/Documentation/kernel-parameters.txt o chama initrd) no Archlinuxarm. No Ubuntu e tal, eu dou um ponteiro para o initrd, mas (quanto ao meu entendimento) não no Archlinuxarm.
Ineiti
1
Discussão do Archlinuxarm sobre NO initrd: archlinuxarm.org/forum/viewtopic.php?f=23&t=6652
ineiti
1
Experimente este link. E esse aqui . E talvez este . initramfs não é a imagem initramfs - que geralmente é um arquivo compactado que contém um cpioarquivo que o kernel descompacta /na inicialização. O initramfs é um sistema de arquivos - é sempre o primeiro /montado e de onde o kernel chama init. Você pode compilar o conteúdo no kernel ou descompactá-lo na inicialização - essas são as duas opções.
mikeserv
16

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

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

kernel-parameters.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 de dispositivo. Aceitamos as seguintes variantes:
 *
 * 1) o número do dispositivo em hexadecimal representa a si próprio
 * 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
 * of partition - número do dispositivo do disco mais o número da partição
 * 5) / dev / <disk_name> p <decimal> - igual ao acima, esse formulário é
 * 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ções fornecer.
 * O UUID pode ser um UFI de EFI / GPT ou se referir a um MSDOS
 * partição usando o formato SSSSSSSS-PP, em que SSSSSSSS é um zero
 * representação hexadecimal preenchida da "assinatura de disco NT" de 32 bits e PP
 * é uma representação hexadecimal com número zero 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 enquadra nas categorias acima, retornamos (0,0).
 * block_class é usado para verificar se algo é um nome de disco. Se o disco
 * name contém barras, o nome do dispositivo as substitui por
 * bate.
 * /

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

Patrick
fonte
1
Isso está apenas parcialmente correto. Um UUID de partição é completamente diferente do UUID do sistema de arquivos, portanto PARTUUID=666c2eee-193d-42db-a490-4c444342bd4e, não funciona. No entanto, eu pude usar PARTUUID=SSSSSSSS-02(onde SSSSSSSS é a assinatura de disco do NT mostrada logo antes da mensagem de erro).
Cjm # 6/13
6
Então eu acho que a resposta real é que o kernel não suporta root=UUIDapenas root=PARTUUID. Se você deseja usar um UUID de sistema de arquivos, acho que precisa de um initramfs que possa lidar com a montagem de sistemas de arquivos por UUID.
Cjm # 6/13
@ cjm minhas grubbotas muito felizes com root=UUID.
terdon
3
@terdon, aposto que você tem um initramfs ou initrd. (Pode ser ligado no seu kernel em vez de ser um arquivo separado.)
CJM
4

Este é um tópico de 5 anos. Mas ainda não está totalmente respondido. Há um pequeno exemplo que falta. Aqui está:

Neste exemplo:

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

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

obtenha os PARTUUID's 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

Isso é conhecido por TRABALHAR com lfs8.1 (kernel 4.12.7) Mas acho que também deve funcionar com a maioria dos outros kernels (antigos e novos ...)

Michael HG Schmidt
fonte