Ottieni UUID di / filesystem dallo script


11

Come posso ottenere l'UUID di un volume che contiene il /filesystem? La cosa migliore che ho scoperto fino ad oggi è blkid -o list. Ma questo output è leggibile dall'uomo e difficile da analizzare. Forse c'è un modo migliore?

Ne ho bisogno per parametrizzare la gestione della configurazione con modelli specifici del sistema.

NOTA su blkidgotcha per coloro che potrebbero riutilizzare i risultati della mia domanda in futuro: blkidmemorizza nella cache i risultati delle precedenti esecuzioni su /etc/blkid.tab. Ciò significa che l'esecuzione blkidcome utente non root per la prima volta non restituirà alcun dato. Inoltre, l'esecuzione blkidcome utente non root dopo l'esecuzione root restituirà dati non aggiornati (probabilmente errati).


Sui miei sistemi, assegno etichette uniche leggibili dall'uomo a tutte le partizioni. Quindi posso scoprire quasi tutto su di loro usando le loro etichette e /dev/disk/by-label... Questo funziona anche per le partizioni che non sono montate. Ha il vantaggio di poter scrivere script che fanno cose come rsync da root a root-bak, che è molto meno soggetto ad errori rispetto all'utilizzo di 2 UUIDS che non "significano" nulla.
Joe,

Risposte:


25

Utilizzare findmnt:

$ findmnt /        
TARGET SOURCE       FSTYPE OPTIONS
/      /dev/md127p1 ext4   rw,relatime,stripe=256,data=ordered
$ findmnt / -o UUID
UUID
046a554b-d9f5-4b23-82e6-ffaeb98284aa
$ findmnt / -o UUID -n
046a554b-d9f5-4b23-82e6-ffaeb98284aa

Ha anche diverse opzioni per controllare come cercano le informazioni e come le presentano (incluso l'output JSON!). Fa parte del mountpacchetto, quindi disponibile su qualsiasi installazione di Ubuntu.


Funziona benissimo il 16.04. Non ha funzionato per me il 14.04. Ho dovuto usare questo approccio per ottenere i risultati desiderati su Trust.
Elder Geek,

11

Un'altra soluzione:

lsblk -nr -o UUID,MOUNTPOINT | grep -Po '.*(?= /$)'
  • -n sopprime l'intestazione (non proprio necessario, ma più sicuro per l'analisi)
  • -r rende l'output non elaborato (rende più sicuro analizzare)
  • -o UUID,MOUNTPOINT includere solo le informazioni necessarie

5

È possibile utilizzare il lsblkcomando per generare l'UUID, ma è necessario il nome del dispositivo della partizione (come / dev / sda2). Puoi ottenerlo usando il dfcomando e tagliando l'output. Utilizzare la sostituzione dei comandi per assegnare il nome del dispositivo lsblk. Sembra che tu abbia bisogno di sudo per accedere all'UUID, sebbene l'output normale di lsblk non lo richieda:

sudo lsblk -n -o UUID "$(df -P / | tail -n1 | cut -d' ' -f1)"

2
Questo funziona per me senza sudoil 16.04.
Eliah Kagan,

solo se tu (o qualche script) hai mai eseguito questo comando come root prima. Inoltre, l'output potrebbe essere stantio (dalla cache) in questo caso
Dmitriusan,

@Dmitriusan Ho eseguito questo su un sistema 14.04 che non ha mai avuto lsblko blkideseguito da root e ha funzionato perfettamente. Sai perché ci sarebbe un problema di memorizzazione nella cache con questo comando e non con la versione pubblicata da Rovo? L'output raw elude in qualche modo la memorizzazione nella cache?
Arronical

Penso che qualsiasi comando che acceda all'UUID dei dispositivi richiederebbe l'accesso root (inclusa la versione pubblicata da Rovo). Per quanto riguarda lsblk, ecco una domanda correlata unix.stackexchange.com/questions/210889/… (vedi la prima risposta)
Dmitriusan,

Sono d'accordo che sudo sia necessario, ma non riesco a trovare nulla che suggerisca che lsblk si basi sulla memorizzazione nella cache. Anche se corro blkidcome root, creando il file cache su /dev/.blkid.tab, un uso non sudo lsblknon mostrerà nulla dalla colonna UUID. Non credo ci sia il rischio di output stantio.
Arronical

4

La migliore soluzione che sono riuscito a trovare è

blkid -o list | awk '/\/[[:space:]]+/{ print $0 }' | tr -s ' ' | cut -d ' ' -f 4

Sembra non ottimale, ma funziona.

Nota: [[: space:]] significaSpace


Questo funziona per me ma con sudo.
pa4080,

4

Regola il valore mountpointdell'attuale punto di montaggio del file system in questione:

dev="$(exec awk -v mountpoint='/' '($2 == mountpoint){ print $1; quit; }' /proc/mounts)" &&
sudo blkid -o export -- "$dev" | sed -ne 's/^UUID=//p'

1

Ecco cosa uso:

sudo tune2fs -l $(df  / | tail -1 |awk '{print $1}') |grep UUID|awk '{ print $3 }'

tune2fs è nel pacchetto e2fsprogs, che non ricordo se è installato di default.

sudo apt install e2fsprogs

se non è installato.


Ho awk: not an option: -emodificato la tua risposta per renderla funzionale. Se ho oltrepassato, non esitare a ripristinarlo. Saluti! :-)
Elder Geek,

Strano, sembra funzionare con o senza -e per me. -e è documentato nella pagina man per awk. L'ho sempre usato negli script e sono rimasto sorpreso che funzionasse bene senza di essa :) Penso che sia una vecchia abitudine UNIX. Ma avrei dovuto essere coerente nel mio uso e usato -e in entrambi i posti o in entrambi i posti per non confondere le persone.
Giovanni,

Ah, ottengo lo stesso risultato del tuo 14.04 che usi gawk. Ottengo l'errore specificato in 16.04 che sembra utilizzare mawkinvece.
Elder Geek,

È una di quelle cose / etc / alternative. / etc / alternatives / awk -> / usr / bin / gawk per me sul mio 16.04. Mawk è installato, ma non attivo in / etc / alternatives. Sul mio gnomo 17.04 punta a awk. Sulla mia nuova installazione 17.10 è mawk. Dopo aver installato gawk il collegamento punta a gawk, la disinstallazione di gawk lo restituisce a mawk.
Giovanni

:-) Sono queste lievi differenze tra programmi apparentemente simili che probabilmente hanno portato a dichiarazioni come "Less is more"
Elder Geek,

1

Testato per funzionare il 14.04 e il 16.04

Un semplice one-liner che dovrebbe sempre produrre l'UUID di un root /è

export DRIVE = $ (mount | grep '/' | awk -F "on" '{print $ 1}'); blkid $ DRIVE | taglia -d '"' -f2`

Quello che stiamo facendo qui è agganciare l'output di mount in modo che corrisponda al simbolo radice con spazi su entrambi i lati /per evitare la corrispondenza quando /viene utilizzato come simbolo di estensione del percorso, eseguendo il piping attraverso l' awkutilizzo di "on" come separatore di campo per produrre solo il nome del dispositivo e assegnazione di QUESTO alla variabile di ambiente $ DRIVE, quindi utilizzando l'output di blkid $DRIVEpiping through cut utilizzando il "separatore di campo come e selezionando solo il secondo campo che rimuove tutto il resto, lasciando solo l'UUID.

Si noti che ciò che appartiene dopo grep nel comando sopra è in realtà ' space/ space' e non '/' come appare.

Ciò ha il vantaggio di non richiedere sudoe restituirà il risultato appropriato indipendentemente da come è montata l'unità.

Sarebbe saggio assicurarsi che non si utilizzi la variabile di ambiente $ DRIVE per qualsiasi altra cosa prima di tentare questo approccio echo $DRIVErestituirà una riga vuota se non si utilizza la variabile.

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.