Perché non posso specificare il mio root fs con un UUID?


29

Il mio sistema si avvia bene con questo nella mia configurazione di GRUB 2:

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

Ma se sostituisco /dev/sda2con l'UUID corrispondente:

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

quindi non riesce durante l'avvio:

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

L'UUID sembra essere corretto:

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

Perché non funziona? È perché non sto usando un initramfs?

Questo è x86_64 Gentoo Linux con kernel 3.10.7. Sto usando una tabella delle partizioni MBR sdae una tabella delle partizioni GUID su sdb.


unknown-block(0,0)mi sembra un dispositivo GRUB. la mia ipotesi è che GRUB non possa usare quell'UUID per qualche motivo.
strugee,

@strugee, non penso affatto che GRUB tenti di interpretare la riga di comando del kernel. (GRUB sta caricando il kernel da sda1. Non ho mostrato quella parte della configurazione.)
cjm

Sono propenso ad essere d'accordo. è strano, tuttavia, che il dispositivo assomigli a un dispositivo GRUB anziché a un dispositivo UNIX.
strugee,

@Gilles, la domanda non riguarda GRUB. Questo è solo il bootloader che sto usando. È una domanda del kernel Linux.
cjm

Anche questa non è una domanda sul kernel - questa è una domanda su init.
Mikeserv,

Risposte:


22

Solo per chiarire UUIDs sono l'unico modo affidabile per il kernel di identificare i dischi rigidi. Esistono due tipi: UUID, che è archiviato nel filesystem e non è disponibile per il kernel all'avvio, e PARTUUID, che è archiviato nella tabella delle partizioni e È disponibile all'avvio. Quindi devi usare

root=PARTUUID=SSSSSSSS-PP

come /dev/sd??può cambiare con i dispositivi collegati / scollegati.

Non dimenticare di capitalizzare il numero esadecimale SSSSSSSS-PPche ottieni blkid!

Più facile da usare

root=LABEL=
root=UUID=

funziona solo con un initramfsche recupera questi identificatori.

Quindi, se usi un non vuoto initramfs, puoi avere tutti e tre! Con un vuoto initramfs, hai solo PARTUUID.


Ti dispiace spiegare chi sta usando boot = -argument allora? Ho appena usato questa linea per un'installazione Archlinuxarm che non ha initrd e dove non posso usare boot = LABEL né boot = UUID.
ineiti,

1
Hai ragione - ho corretto l'avvio a root, scusa! Spero che abbia più senso ora.
ineiti,

1
La mia comprensione (dopo un giorno sui forum di archlinuxarm) è che non esiste initrd (o initramfs, ma kernel.org/doc/Documentation/kernel-parameters.txt lo chiama initrd) su Archlinuxarm. Su Ubuntu e simili do un puntatore a initrd, ma (per quanto ne so) non su Archlinuxarm.
Ineiti,

1
Discussione Archlinuxarm su NO initrd: archlinuxarm.org/forum/viewtopic.php?f=23&t=6652
ineiti

1
Prova questo link. E questo uno. E forse questo . initramfs non è l'immagine di initramfs - che di solito è un archivio compresso contenente un cpioarchivio che il kernel decomprime /all'avvio. initramfs è un filesystem - è sempre il primo /montato e da cui il kernel chiama init. Puoi compilare il contenuto nel kernel o decomprimerlo all'avvio: queste sono le due opzioni.
Mikeserv,

16

Il parametro che devi passare per l'avvio da UUID è PARTUUID. Quindi dovrebbe essere root=PARTUUID=666c2eee-193d-42db-a490-4c444342bd4e.

La documentazione spiega perché sta tornando con unknown-block(0,0):

kernel-parametri.txt :

    root = [KNL] File system di root
            Vedi il commento di name_to_dev_t in init / do_mounts.c.

init / do_mounts.c :

/ *
 * Converti un nome in numero di dispositivo. Accettiamo le seguenti varianti:
 *
 * 1) il numero del dispositivo in esadecimale rappresenta se stesso
 * 2) / dev / nfs rappresenta Root_NFS (0xff)
 * 3) / dev / <disk_name> rappresenta il numero di dispositivo del disco
 * 4) / dev / <disk_name> <decimal> rappresenta il numero del dispositivo
 * di partizione: numero di dispositivo del disco più il numero di partizione
 * 5) / dev / <nome_disco> p <decimale> - uguale al precedente, quel modulo è
 * utilizzato quando il nome del disco del disco partizionato termina con una cifra.
 * 6) PARTUUID = 00112233-4455-6677-8899-AABBCCDDEEFF che rappresenta il
 * ID univoco di una partizione se fornito dalla tabella delle partizioni.
 * L'UUID può essere un UUID EFI / GPT o fare riferimento a un MSDOS
 * partizione usando il formato SSSSSSSS-PP, dove SSSSSSSS è zero-
 * rappresentazione esadecimale riempita della "firma del disco NT" a 32 bit e PP
 * è una rappresentazione esadecimale a riempimento zero del numero di partizione basato su 1.
 * 7) PARTUUID = <UUID> / PARTNROFF = <int> per selezionare una partizione in relazione a
 * una partizione con un ID univoco noto.
 *
 * Se il nome non rientra nelle categorie precedenti, restituiamo (0,0).
 * block_class viene utilizzato per verificare se qualcosa è un nome di disco. Se il disco
 * Il nome contiene barre, il nome del dispositivo le ha sostituite
 * frangia.
 * /

L'ultimo bit alla fine dice che se non riesce a capire il valore, restituisce (0,0), quindi l'errore.


1
Questo è solo parzialmente corretto. Un UUID di partizione è completamente diverso dall'UUID del filesystem, quindi PARTUUID=666c2eee-193d-42db-a490-4c444342bd4enon funziona. Tuttavia, sono stato in grado di utilizzare PARTUUID=SSSSSSSS-02(dove SSSSSSSS è la firma del disco NT mostrata poco prima del messaggio di errore).
cjm

6
Quindi immagino che la vera risposta sia che il kernel non supporta root=UUID, solo root=PARTUUID. Se vuoi usare un UUID per filesystem, immagino tu abbia bisogno di un initramfs in grado di gestire il montaggio di filesystem tramite UUID.
cjm

@cjm i miei grubstivali abbastanza felicemente root=UUID.
terdon

3
@terdon, scommetto che hai un initramfs o un initrd. (Potrebbe essere collegato al kernel anziché essere un file separato.)
cjm

4

Questa è una discussione di 5 anni. Ma ancora non ho una risposta completa. Manca un piccolo esempio. Ecco qui:

In questo esempio:

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

... usando una partizione GPT. Con MBR (dos partition) i PARTUUID sono più brevi ma la procedura è la stessa ...

ottieni i 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

È noto che FUNZIONA con lfs8.1 (kernel 4.12.7) Ma penso che dovrebbe funzionare anche con la maggior parte degli altri kernel (vecchi e nuovi ...)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.