sviluppo-web-qa.it

Come trovo l'UUID di un filesystem

Sto eseguendo Ubuntu e voglio scoprire il UUID di un particolare filesystem (non partizione). So di poter usare e2label /dev/sda1 per scoprire l'etichetta del filesystem, ma non sembra esserci un modo simile per trovare UUID.

135
Brad Gilbert

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:

[email protected]:~$ Sudo blkid /dev/sda1
/dev/sda1: UUID="727cac18-044b-4504-87f1-a5aefa774bda" TYPE="ext3"

Mostra i dati UUID per tutte le partizioni:

[email protected]:~$ 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 più semplice da leggere: (Nota: nelle versioni più recenti, blkid -L Ha un significato diverso e blkid -o list Dovrebbe essere usato invece)

[email protected]:~$ 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:

[email protected]:~$ Sudo blkid -s UUID -o value /dev/sda1
727cac18-044b-4504-87f1-a5aefa774bda
169

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.

Il GUID UUID 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 avrà un nuovo GUID UUID. La stessa partizione può contenere un file system un giorno e un altro in un altro giorno. Esiste solo per dischi formattati GPT, ma non per dischi partizionati legacy. Di solito qui non c'è più utilità che specificare root=/dev/sda1 o 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. Parametro del kernel Linux root=UUID=87654321-4321-4321-a567-123456789012 si riferisce 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 credo siano creati da udev nello spazio utente sul mio sistema).

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

11
John S Gruber

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.

8
Tom Hale

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

/sbin/tune2fs -l /dev/sda1
5
Eddie

Il modo consigliato per farlo è fare

Sudo vol_id -u /dev/sda2

Per ulteriori informazioni sull'uso degli UUID, vedere questo articolo (dalla guida di Ubuntu, ma dovrebbe funzionare per qualsiasi distro linux usando 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.

3
Hamish Downer

Questo sembra funzionare per me:

Sudo dumpe2fs /dev/sda1 | grep UUID
3

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, elimina greps e cut, alla:

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

Output di esempio per sda1 sul mio desktop:

[[email protected] ~]$ 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: Si noti che questa soluzione, sebbene più elaborata rispetto a udev-> vol_id, richiede not 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 nel percorso per qualsiasi utente.

2

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, sostituendo sda1 con il dispositivo che desideri 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
kiri
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.

1
Eric Eberhard

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
0
Rich Adams