Ruft die UUID von / filesystem aus dem Skript ab

11

Wie kann ich die UUID eines Volumes abrufen, das das /Dateisystem enthält ? Das Beste, was ich bisher gefunden habe, ist blkid -o list. Diese Ausgabe ist jedoch für den Menschen lesbar und schwer zu analysieren. Vielleicht gibt es einen besseren Weg?

Ich brauche das, um das Konfigurationsmanagement mit systemspezifischen Vorlagen zu parametrisieren.

HINWEIS zu blkidGotcha für diejenigen, die möglicherweise die Ergebnisse meiner Frage in Zukunft wiederverwenden: blkidZwischenspeichern der Ergebnisse früherer Läufe bei /etc/blkid.tab. Das bedeutet, dass beim blkiderstmaligen Ausführen als Nicht-Root-Benutzer keine Daten zurückgegeben werden. Auch läuft blkidals Nicht-Root - Benutzer nach dem Wurzeldurchlauf wird wieder abgestanden (möglicherweise falsche) Daten.

Dmitriusan
quelle
Auf meinen eigenen Systemen ordne ich allen Partitionen lesbare, eindeutige Beschriftungen zu. Dann kann ich fast alles über sie herausfinden, indem ich ihre Beschriftungen verwende und /dev/disk/by-label... Dies funktioniert auch für Partitionen, die nicht gemountet sind. Es hat den Vorteil, Skripte schreiben zu können, die Dinge wie rsync von root zu root-bak ausführen, was weitaus weniger fehleranfällig ist als die Verwendung von 2 UUIDS, die nichts "bedeuten".
Joe

Antworten:

25

Verwendung 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

Es gibt auch verschiedene Optionen, um zu steuern, wie Informationen nachgeschlagen und wie sie angezeigt werden (einschließlich JSON-Ausgabe!). Es ist Teil des mountPakets und daher für jede Ubuntu-Installation verfügbar.

muru
quelle
Dies funktioniert hervorragend am 16.04. Es hat am 14.04 für mich nicht funktioniert. Ich musste diesen Ansatz verwenden , um die gewünschten Ergebnisse bei Trusty zu erzielen.
Elder Geek
11

Eine andere Lösung:

lsblk -nr -o UUID,MOUNTPOINT | grep -Po '.*(?= /$)'
  • -n unterdrückt den Header (nicht wirklich benötigt, aber sicherer zum Parsen)
  • -r macht Rohausgabe (macht es sicherer zu analysieren)
  • -o UUID,MOUNTPOINT Geben Sie nur die erforderlichen Informationen an
pLumo
quelle
5

Sie können den lsblkBefehl verwenden, um die UUID auszugeben, benötigen jedoch den Gerätenamen der Partition (z. B. / dev / sda2). Sie können dies erreichen, indem Sie den dfBefehl verwenden und die Ausgabe zuschneiden. Verwenden Sie die Befehlsersetzung, um den Gerätenamen anzugeben lsblk. Es scheint, dass Sie sudo benötigen, um auf die UUID zuzugreifen, obwohl die normale Ausgabe von lsblk dies nicht erfordert:

sudo lsblk -n -o UUID "$(df -P / | tail -n1 | cut -d' ' -f1)"
Arronisch
quelle
2
Das funktioniert bei mir ohne sudoam 16.04.
Eliah Kagan
Nur wenn Sie (oder ein Skript) diesen Befehl jemals zuvor als root ausgeführt haben. Auch die Ausgabe kann in diesem Fall veraltet sein (aus dem Cache)
Dmitriusan
@Dmitriusan Ich habe dies auf einem 14.04-System ausgeführt, das noch nie Root hatte lsblkoder blkidausgeführt hat, und es hat perfekt funktioniert. Wissen Sie, warum bei diesem Befehl ein Caching-Problem auftritt und nicht bei der von Rovo veröffentlichten Version? Umgeht die Rohausgabe das Caching in irgendeiner Weise?
Arronical
Ich denke, jeder Befehl, der auf die UUID von Geräten zugreift, würde Root-Zugriff erfordern (einschließlich der von Rovo veröffentlichten Version). In Bezug auf lsblk ist hier eine verwandte Frage unix.stackexchange.com/questions/210889/… (siehe die erste Antwort)
Dmitriusan
Ich bin damit einverstanden, dass sudo notwendig ist, kann aber nichts finden, was darauf hindeutet, dass lsblk auf Caching angewiesen ist. Selbst wenn ich blkidals Root ausgeführt werde und die Cache-Datei bei erstellt /dev/.blkid.tab, wird bei Nicht-Sudo-Verwendung von lsblknichts aus der UUID-Spalte angezeigt. Ich glaube nicht, dass die Gefahr einer veralteten Produktion besteht.
Arronical
4

Die beste Lösung, die ich gefunden habe, ist

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

Fühlt sich nicht optimal an, funktioniert aber.

Hinweis: [[: Leerzeichen:]] bedeutetSpace

Dmitriusan
quelle
Das funktioniert bei mir aber mit sudo.
pa4080
4

Passen Sie den Wert von mountpointan den aktuellen Einhängepunkt des betreffenden Dateisystems an:

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

Folgendes verwende ich:

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

tune2fs befindet sich im e2fsprogs-Paket, an das ich mich nicht erinnern kann, wenn es standardmäßig installiert ist.

sudo apt install e2fsprogs

wenn es nicht installiert ist.

John
quelle
Ich awk: not an option: -ehabe Ihre Antwort bearbeitet, um sie funktionsfähig zu machen. Wenn ich überschritten habe, können Sie es gerne zurückrollen. Prost! :-)
Elder Geek
Seltsam, es scheint mit oder ohne das -e für mich zu funktionieren. -e ist in der Manpage für awk dokumentiert. Ich habe es immer in Skripten verwendet und war überrascht, dass es ohne es gut funktioniert hat :) Ich denke, -e ist eine alte UNIX-Gewohnheit. Aber ich hätte in meiner Verwendung konsequent sein und -e entweder an beiden Orten oder an keinem Ort verwenden sollen, um die Leute nicht zu verwirren.
John
Ah, ich bekomme das gleiche Ergebnis wie Sie unter 14.04, das verwendet gawk. Ich erhalte den unter 16.04 angegebenen Fehler, der mawkstattdessen zu verwenden scheint .
Elder Geek
Es ist eines dieser / etc / alternativen Dinge. / etc / alternatives / awk -> / usr / bin / gawk für mich am 16.04. Mawk ist installiert, aber in / etc / alternatives nicht aktiv. Auf meinem 17.04 Gnom zeigt es auf awk. Bei meiner Neuinstallation 17.10 ist es mawk. Nach der Installation von gawk zeigt der Link auf gawk. Wenn Sie gawk deinstallieren, wird es an mawk zurückgegeben.
John
:-) Es sind diese kleinen Unterschiede zwischen vermeintlich ähnlichen Programmen, die wahrscheinlich zu Aussagen wie "Weniger ist mehr" geführt haben
Elder Geek
1

Getestet für die Arbeit am 14.04 und 16.04

Ein einfacher Einzeiler, der immer die UUID einer Wurzel erzeugen sollte, /ist

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

Was wir hier tun, ist, die Ausgabe von mount so zu erfassen, dass sie mit dem Stammsymbol mit Leerzeichen auf beiden Seiten /übereinstimmt, um eine Übereinstimmung zu vermeiden, wenn /sie als Pfaderweiterungssymbol verwendet wird. Dabei wird awk"on" als Feldtrennzeichen verwendet, um nur das auszugeben Gerätename und Zuweisen von THAT zur Umgebungsvariablen $ DRIVE, dann Verwenden der Ausgabe von blkid $DRIVEPiped Through Cut unter Verwendung von "als Feldtrennzeichen und Auswählen nur des zweiten Felds, das alles andere entfernt, wobei nur die UUID übrig bleibt.

Beachten Sie, dass das, was im obigen Befehl nach grep gehört, tatsächlich ' space/ space' und nicht '/' ist, wie es erscheint.

Dies hat den Vorteil, dass es nicht erforderlich ist sudound unabhängig von der Montage des Laufwerks das entsprechende Ergebnis zurückgibt.

Es ist ratsam, sicherzustellen, dass Sie die Umgebungsvariable $ DRIVE nicht für andere Zwecke verwenden, bevor Sie diesen Ansatz versuchen. echo $DRIVEWenn Sie die Variable nicht verwenden, wird eine leere Zeile zurückgegeben.

Elder Geek
quelle