Por que não posso especificar minha raiz fs com um UUID?

24

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

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

Mas se eu substituir /dev/sda2 pelo UUID correspondente:

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

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 do Gentoo Linux com o kernel 3.10.7. Estou usando uma tabela de partições MBR em sda e uma tabela de partição GUID em sdb .

    
por cjm 06.10.2013 / 05:44

2 respostas

16

Só para esclarecer que UUID s é 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 IS 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 SSSSSSSS-PP obtido de blkid !

Quanto mais fácil de usar

root=LABEL=
root=UUID=

só funciona com um initramfs que busca esses identificadores.

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

    
por 22.08.2014 / 00:37
14

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

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

kernel-parameters.txt :

    root=       [KNL] Root filesystem
            See name_to_dev_t comment in init/do_mounts.c.

init / do_mounts.c :

/*
 *  Convert a name into device number.  We accept the following variants:
 *
 *  1) device number in hexadecimal represents itself
 *  2) /dev/nfs represents Root_NFS (0xff)
 *  3) /dev/<disk_name> represents the device number of disk
 *  4) /dev/<disk_name><decimal> represents the device number
 *         of partition - device number of disk plus the partition number
 *  5) /dev/<disk_name>p<decimal> - same as the above, that form is
 *     used when disk name of partitioned disk ends on a digit.
 *  6) PARTUUID=00112233-4455-6677-8899-AABBCCDDEEFF representing the
 *     unique id of a partition if the partition table provides it.
 *     The UUID may be either an EFI/GPT UUID, or refer to an MSDOS
 *     partition using the format SSSSSSSS-PP, where SSSSSSSS is a zero-
 *     filled hex representation of the 32-bit "NT disk signature", and PP
 *     is a zero-filled hex representation of the 1-based partition number.
 *  7) PARTUUID=<UUID>/PARTNROFF=<int> to select a partition in relation to
 *     a partition with a known unique id.
 *
 *  If name doesn't have fall into the categories above, we return (0,0).
 *  block_class is used to check if something is a disk name. If the disk
 *  name contains slashes, the device name has them replaced with
 *  bangs.
 */

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

    
por 06.10.2013 / 07:21

Tags