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.