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.


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.


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.


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 ...)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.