Come trovo l'UUID di un filesystem


134

Sto eseguendo Ubuntu e voglio scoprire il UUIDfile system specifico (non la partizione). So che posso usare e2label /dev/sda1per scoprire l'etichetta del filesystem, ma non sembra esserci un modo simile per trovare il file UUID.


Grazie per tutte le risposte, sono sicuro che le userò tutte in circostanze diverse.
Brad Gilbert,

2
Si noti che il titolo era "Come trovo l'UUID di una partizione". Questa domanda ha senso solo quando si utilizza una tabella delle partizioni GPT. Ecco una risposta a questa domanda .
Alastair Irvine

Risposte:


165

Un altro comando che potrebbe essere disponibile e funziona anche abbastanza bene per questo è 'blkid'. Fa parte del pacchetto e2fsprogs. Esempi di utilizzo:

Cerca i dati su / dev / sda1:

topher@crucible:~$ sudo blkid /dev/sda1
/dev/sda1: UUID="727cac18-044b-4504-87f1-a5aefa774bda" TYPE="ext3"

Mostra i dati UUID per tutte le partizioni:

topher@crucible:~$ sudo blkid
/dev/sda1: UUID="727cac18-044b-4504-87f1-a5aefa774bda" TYPE="ext3"
/dev/sdb: UUID="467c4aa9-963d-4467-8cd0-d58caaacaff4" TYPE="ext3"

Mostra i dati UUID per tutte le partizioni in un formato di più facile lettura: (Nota: nelle versioni più recenti, blkid -Lha un significato diverso e blkid -o listdovrebbe essere usato invece)

topher@crucible:~$ sudo blkid -L
device     fs_type label    mount point    UUID
-------------------------------------------------------------------------------
/dev/sda1 ext3             /              727cac18-044b-4504-87f1-a5aefa774bda
/dev/sdc  ext3             /home          467c4aa9-963d-4467-8cd0-d58caaacaff4

Mostra solo l'UUID per / dev / sda1 e nient'altro:

topher@crucible:~$ sudo blkid -s UUID -o value /dev/sda1
727cac18-044b-4504-87f1-a5aefa774bda

1
Sul mio computer Ubuntu, non ho bisogno di usare sudo.
Brad Gilbert,

Basta digitare blkid, mi ha ottenuto esattamente quello che volevo, ma non proprio quello che ho chiesto. (Lo accetto comunque, perché sono sicuro che lo userò spesso)
Brad Gilbert,

3
Nelle versioni più recenti di Ubuntu il comando equivalente per blkid -Lè ora blkid -o list; l' -Lopzione è stata modificata per -L labelcercare un dispositivo che utilizza l'etichetta specificata.
aculich,

@aculich Ho aggiornato la risposta per includere la sintassi recente per blkid. Grazie per averlo menzionato.
Christopher Cashell,

2
Eccellente, non l'ho mai saputo blkid; L'ho sempre fatto ls -l /dev/disk/by-uuid. Su Gentoo, blkidè insys-apps/util-linux
AdmiralNemo il

10

Solo per dischi partizionati GPT

Su un disco formattato GPT a ciascuna partizione è assegnato un GUID, che è una forma di UUID, anche se probabilmente non a cui si riferiva il poster originale. Pertanto questa risposta è probabilmente meno utile all'interrogatore originale. Tuttavia credo che ci sia una distinzione importante da notare.

Per ottenere il GUID della partizione 1 su disco / dev / sda formattato GPT, nonché l'etichetta della partizione e così via:

sudo sgdisk -i 1 /dev/sda

o tutti con:

ls -l /dev/disk/by-partuuid

Per fare il boot con il root del file system su una certa partizione dovresti usare la sintassi del parametro del kernel linux di:

root=PARTUUID=87654321-4321-4321-abcd-123456789012

In questo caso puoi specificare solo l'inizio dell'UUID - abbastanza per essere unico. Questo parametro è più primitivo e può essere compreso dal kernel in precedenza nel suo processo di avvio.


C'è una differenza nella semantica tra questi:

Un disco contiene partizioni, una partizione contiene un file system, un file system contiene directory e file. Per alcuni setup e sistemi operativi ci sono più livelli.

L'UUID GUID e l'etichetta associata si riferiscono a una partizione, ma non al contenuto della partizione. Una nuova partizione sullo stesso disco o una partizione su un nuovo disco avranno un nuovo UUID GUID. La stessa partizione potrebbe contenere un file system un giorno e l'altro in un giorno diverso. Esiste solo per dischi formattati GPT, ma non per dischi partizionati legacy. Di solito non c'è più utilità qui che specificare root=/dev/sda1o root=8:1.

Le altre risposte correnti si riferiscono all'UUID di un file system in alcune partizioni contenenti. Se il file system viene copiato, nel suo insieme, in un'altra partizione o disco rigido, tale valore rimane invariato. Questo UUID è utile per trovare un file system spostato. Pertanto, questo è probabilmente più pertinente per la maggior parte delle persone. Il parametro del kernel Linux root=UUID=87654321-4321-4321-a567-123456789012fa riferimento a questo.

Credo root=LABEL=e root=UUID=sono implementati dai primi utenti, il codice di inizializzazione che ho visto l'altro giorno sul mio sistema ha tradotto questi parametri in / dev / disk / by-uuid e / dev / disk / by-label (i collegamenti che credo siano creati da udev in userspace sul mio sistema).

[1] http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/init/do_mounts.c#n183


L'uso corretto sembra essere -i1o -i 1, al contrario -i:1, con sgdisk 1.0.1.
Charles Duffy,

@CharlesDuffy grazie per aver trovato quell'errore. Ho modificato la risposta per correggerla.
John S Gruber,

7

Il modo più pulito per fare ciò che funziona su qualsiasi tipo di filesystem è:

lsblk -no UUID <device-containing-FS>

Oppure, dato il mountpoint (o qualsiasi file al suo interno):

lsblk -no UUID $(df -P <file> | awk 'END{print $1}')

L'output è l'UUID, l'intero UUID e nient'altro che l'UUID.


1
È meglio che blkidnella risposta di @ christopher-cashell, perché non è necessario diventare root. Per un punto di montaggio o un file di meglio a fare: lsblk -no UUID $(findmnt -n -o SOURCE --target <file>).
marcz,

@marcz Che fallisce sui sottovolumi btrfs: findmnt -n -o SOURCE --target ~dà:/dev/mapper/vg_svelte-home[/@home]
Tom Hale il

Right @ tom-hale, lsblk -no UUID $(findmnt -n -o SOURCE --target <file> | cut -d[ -f1)dovrebbe sbarazzarsi del sottovolume quando presente.
marcz,

5

Il modo più semplice per farlo per ext2 / ext3 / ext4 è:

/sbin/tune2fs -l /dev/sda1

3
Funzionerà a condizione che il tuo filesystem sia formattato come ext2, ext3 o ext4. La maggior parte dei filesystem sono uno di questi, ma non tutti. Inoltre non funzionerà per le partizioni di swap. Vedi la mia risposta per un modo universale.
Hamish Downer,

Ciò si traduce nel mio caso inCouldn't find valid filesystem superblock.
Michel,

3

Il modo consigliato per farlo è quello di farlo

sudo vol_id -u /dev/sda2

Per ulteriori informazioni sull'uso degli UUID, consultare questo articolo (dalla guida di Ubuntu, ma dovrebbe funzionare per qualsiasi distro linux che utilizza gli UUID).

Come notato nei commenti a questa domanda, vol_id potrebbe non essere sul tuo percorso. Su Ubuntu è in / sbin, quindi quanto sopra funzionerà. Per fedora sembra aver bisogno

sudo /lib/udev/vol_id -u /dev/sda2

Se altre distribuzioni hanno vol_id in altri posti, pubblica un commento e lo aggiungerò a questa risposta.


Questo non funziona sul mio laptop Fedora 10.
Eddie,

Questa è una soluzione molto migliore della mia. Eddie, vol_id si trova in / lib / udev. mish, potresti modificare la tua risposta per aggiungere il prefisso al percorso completo di fronte a vol_id? / lib / udev non è nel percorso di root per impostazione predefinita su qualsiasi distribuzione di cui sia a conoscenza.
Mihai Limbăşan,

"/ lib / udev / vol_id / dev / sda2" sembra funzionare. Poche persone avranno / lib / udev nel loro percorso.
Eddie,

Sul mio computer Ubuntu c'è un collegamento simbolico da /sbin/vol_ida/lib/udev/vol_id
Brad Gilbert,

4
vol_id è stato eliminato da Ubuntu a partire da Karmic (9.10), quindi non è più utile o rilevante. Ha attraversato molte contorsioni per arrivarci poiché vol_id è stato costruito ad un certo punto per sostituire blkid .
Alain O'Dea,


2

Supponendo che desideri l'UUID per sda1, potresti provare qualcosa del genere:

for v in /dev/disk/by-uuid/* ; do echo "`readlink $v`: $v" | grep ../sda1 | cut -d\: -f2 | cut -d/ -f5 ; done

Regola sda1 di conseguenza. Per ottenere gli UUID per tutte le partizioni, rilascia greps e tagli, alla:

for v in /dev/disk/by-uuid/* ; do echo "`readlink $v`: $v" ; done

Output di esempio per sda1 sul mio desktop:

[mihailim@home ~]$ for v in /dev/disk/by-uuid/* ; do echo "`readlink $v`: $v" | grep ../sdb3 | cut -d\: -f2 | cut -d/ -f5 ; done
dc8c49f1-e2dc-46bc-ba02-013f26c85f70

Modifica: Notare che questa soluzione, sebbene più elaborata di quella udev-> vol_id, non richiede i privilegi di root, funzionerà su qualsiasi kernel post-2005 o giù di lì e si basa su strumenti presenti in qualsiasi distribuzione Linux che sono di default in il percorso per qualsiasi utente.


Questo funzionerà su qualsiasi computer che esegue un devfs abbastanza recente.
Eddie,

1

Puoi anche usarlo per stampare tutti gli UUID:

for disk in /dev/disk/by-uuid/*; do 
    basename "$(readlink "$disk")"
    basename "$disk"
    echo
done

o questo comando probabilmente più semplice, sostituendolo sda1con il dispositivo che si desidera cercare:

disk=sda1
find /dev/disk/by-uuid -type l -exec sh -c "readlink {} | grep -o $disk && basename {}" \;

un adattamento del secondo metodo per stampare tutti gli UUID:

find /dev/disk/by-uuid -type l -exec sh -c 'basename $(readlink {}); basename {}; echo' \;

1
ls -l /dev/disk/by-uuid | grep `lsblk | grep "/" | awk '{print $1}'` | awk '{print $9}'

Quanto sopra sembra funzionare sulla maggior parte dei sistemi Linux (tutto quello che ho trovato) per molti anni. Potrebbe avere dei difetti, non lo so. Preferirei ottenere il numero seriale ma ... questo è l'UUID del filesystem di root.

Se qualcuno ha un modo per ottenere il numero seriale senza la necessità di essere root (come lo è il mio) e non installare pacchetti "insoliti" che sono diversi nelle diverse versioni di Unix, lo apprezzerei - sempre può imparare qualcosa. E sono consapevole che sto mescolando cose: è l'UUID del file system radice, non un disco.

Lo scopo, BTW, è quello di generare un numero univoco per macchina che non può essere modificato (come un numero di serie del disco e come gli indirizzi MAC una volta erano molto tempo fa).

Viene utilizzato per la codifica del software su una singola macchina. L'indirizzo MAC andava bene fino a quando non permettevano loro di essere virtuali ... alcuni clienti squallidi hanno semplicemente impostato il loro indirizzo MAC su una costante (su reti diverse ovviamente) ed evitato di pagarmi.

In AIX c'è una sola chiamata per ottenere un numero che identifica la macchina. Non importa se si verificano modifiche hardware o aggiornamenti software, quindi non ho idea di come lo facciano ... Se la scheda madre cambia, quindi il numero cambia, quindi penso che lo nascondano lì. E questo è oltre il raro.


0

Puoi utilizzare quanto segue per ottenere l'UUID per una determinata unità,

sudo vol_id -u /dev/sda1

oppure puoi utilizzarlo per elencare tutti gli UUID per il supporto collegato,

ls /dev/disk/by-uuid

Non più applicabile a partire da Ubuntu 9.10 poiché vol_id è stato rimosso.
Alain O'Dea,
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.