Wie finde ich die UUID eines Dateisystems?

133

Ich verwende Ubuntu und möchte das UUIDeines bestimmten Dateisystems (nicht einer Partition) herausfinden . Ich weiß, dass ich e2label /dev/sda1das Dateisystem-Label mit herausfinden kann, aber es scheint keinen ähnlichen Weg zu geben, das zu finden UUID.

Brad Gilbert
quelle
Vielen Dank für alle Antworten, ich bin sicher, ich werde sie alle unter verschiedenen Umständen verwenden.
Brad Gilbert
2
Beachten Sie, dass der Titel früher "Wie finde ich die UUID einer Partition" lautete. Diese Frage ist nur bei Verwendung einer GPT-Partitionstabelle sinnvoll. Hier ist eine Antwort auf diese Frage .
Alastair Irvine

Antworten:

164

Ein weiterer Befehl, der verfügbar sein könnte und auch recht gut funktioniert, ist 'blkid'. Es ist Teil des e2fsprogs-Pakets. Beispiele für die Verwendung:

Daten in / dev / sda1 nachschlagen:

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

Zeigen Sie die UUID-Daten für alle Partitionen an:

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

Zeigen Sie die UUID-Daten für alle Partitionen in einem besser lesbaren Format an: (Hinweis: In neueren Versionen blkid -Lhat sie eine andere Bedeutung und blkid -o listsollte stattdessen verwendet werden.)

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

Zeige nur die UUID für / dev / sda1 und sonst nichts:

topher@crucible:~$ sudo blkid -s UUID -o value /dev/sda1
727cac18-044b-4504-87f1-a5aefa774bda
Christopher Cashell
quelle
1
Auf meinem Ubuntu-Computer muss ich sudo nicht verwenden.
Brad Gilbert
blkidIch habe nur getippt und genau das bekommen, was ich wollte, aber nicht genau das, wonach ich gefragt habe. (Ich akzeptiere es trotzdem, weil ich sicher bin, dass ich es oft verwenden werde)
Brad Gilbert
3
In neueren Versionen von Ubuntu ist der entsprechende Befehl für blkid -Ljetzt blkid -o list; Die -LOption wurde geändert, -L labelum ein Gerät zu suchen, das die angegebene Bezeichnung verwendet.
ACULICH
@aculich Ich habe die Antwort so aktualisiert, dass sie die aktuelle Syntax für enthält blkid. Danke, dass du es erwähnt hast.
Christopher Cashell
2
Ausgezeichnet, ich wusste nie darüber Bescheid blkid; Ich habe es immer gerade gemacht ls -l /dev/disk/by-uuid. Auf Gentoo blkidist insys-apps/util-linux
AdmiralNemo
10

Nur für GPT-partitionierte Festplatten

Auf einem mit GPT formatierten Datenträger wird jeder Partition eine GUID zugewiesen. Dies ist eine Form der UUID, obwohl dies wahrscheinlich nicht der Fall ist, auf den sich das ursprüngliche Poster bezog. Daher ist diese Antwort für den ursprünglichen Fragesteller wahrscheinlich weniger hilfreich. Trotzdem glaube ich, dass es einen wichtigen Unterschied gibt, der beachtet werden muss.

So rufen Sie die GUID von Partition 1 auf dem mit GPT formatierten Datenträger / dev / sda sowie die Partitionsbezeichnung usw. ab:

sudo sgdisk -i 1 /dev/sda

oder alle mit:

ls -l /dev/disk/by-partuuid

Um mit dem Stammverzeichnis des Dateisystems zu booten, das sich auf einer bestimmten Partition befindet, verwenden Sie die Linux-Kernel-Parametersyntax von:

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

In diesem Fall können Sie nur den Anfang der UUID angeben - genug, um eindeutig zu sein. Dieser Parameter ist primitiver und kann vom Kernel zu einem früheren Zeitpunkt des Startvorgangs verstanden werden.


Es gibt einen Unterschied in der Semantik zwischen diesen:

Eine Festplatte enthält Partitionen, eine Partition enthält ein Dateisystem, ein Dateisystem enthält Verzeichnisse und Dateien. Für einige Setups und Betriebssysteme gibt es mehrere Ebenen.

Die GUID-UUID und die zugehörige Bezeichnung beziehen sich auf eine Partition, nicht jedoch auf den Inhalt der Partition. Eine neue Partition auf derselben Festplatte oder eine Partition auf einer neuen Festplatte hat eine neue GUID UUID. Dieselbe Partition kann ein Dateisystem an einem Tag und ein anderes an einem anderen Tag enthalten. Es ist nur für GPT-formatierte Datenträger verfügbar, nicht jedoch für ältere partitionierte Datenträger. Normalerweise gibt es hier keinen größeren Nutzen als die Angabe von root=/dev/sda1oder root=8:1.

Die anderen aktuellen Antworten beziehen sich auf die UUID eines Dateisystems in einer enthaltenen Partition. Wenn das Dateisystem als Ganzes auf eine andere Partition oder Festplatte kopiert wird, bleibt dieser Wert gleich. Diese UUID ist nützlich, um ein verschobenes Dateisystem zu finden. Daher ist dies für die meisten Menschen wahrscheinlich relevanter. Der Linux-Kernel-Parameter root=UUID=87654321-4321-4321-a567-123456789012verweist darauf.

Ich glaube , dass der Init-Code, den ich neulich auf meinem System gesehen habe, diese Parameter in / dev / disk / by-uuid und / dev / disk / by-label übersetzt hat root=LABEL=und root=UUID=von frühen Anwendern implementiert wurde (Links, von denen ich glaube, dass sie von udev in erstellt wurden) Userspace auf meinem System).

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

John S Gruber
quelle
Die korrekte Verwendung scheint -i1oder -i 1im Gegensatz zu -i:1sgdisk 1.0.1 zu sein.
Charles Duffy
@CharlesDuffy Danke, dass du diesen Fehler gefunden hast. Ich habe die Antwort bearbeitet, um sie zu korrigieren.
John S Gruber
7

Die skriptbereinigte Methode, die auf jedem Dateisystem funktioniert, ist:

lsblk -no UUID <device-containing-FS>

Oder geben Sie den Einhängepunkt (oder eine beliebige Datei darin) an:

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

Die Ausgabe ist die UUID, die gesamte UUID und nichts anderes als die UUID.

Tom Hale
quelle
1
Es ist besser als blkidin der Antwort von @ christopher-cashell, weil Sie nicht root werden müssen. Für einen Mount - Punkt oder eine Datei besser machen: lsblk -no UUID $(findmnt -n -o SOURCE --target <file>).
Marcz
@ marcz Das scheitert an BTRFS-Subvolumes: findmnt -n -o SOURCE --target ~gibt:/dev/mapper/vg_svelte-home[/@home]
Tom Hale
Right @ tom-hale, lsblk -no UUID $(findmnt -n -o SOURCE --target <file> | cut -d[ -f1)sollte das Subvolume loswerden, wenn es vorhanden ist.
Marcz
5

Der einfachste Weg, dies für ext2 / ext3 / ext4 zu tun, ist:

/sbin/tune2fs -l /dev/sda1
Eddie
quelle
3
Dies funktioniert, sofern Ihr Dateisystem als ext2, ext3 oder ext4 formatiert ist. Die meisten Dateisysteme sind eines davon, aber nicht alle. Es funktioniert auch nicht für Swap-Partitionen. Siehe meine Antwort für einen universellen Weg.
Hamish Downer
Dies führt in meinem Fall zuCouldn't find valid filesystem superblock.
Michel
3

Der empfohlene Weg, dies zu tun, ist zu tun

sudo vol_id -u /dev/sda2

Weitere Informationen zur Verwendung von UUIDs finden Sie in diesem Artikel (in der Ubuntu-Hilfe, sollte aber für jede Linux-Distribution mit UUIDs funktionieren).

Wie in den Kommentaren zu dieser Frage erwähnt, befindet sich vol_id möglicherweise nicht in Ihrem Pfad. Auf Ubuntu ist es in / sbin, so dass das oben beschriebene funktioniert. Für Fedora scheint es zu brauchen

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

Wenn andere Distributionen vol_id an anderen Stellen haben, posten Sie einen Kommentar und ich werde ihn zu dieser Antwort hinzufügen.

Hamish Downer
quelle
Dies funktioniert auf meinem Fedora 10-Laptop nicht.
Eddie
Dies ist eine viel bessere Lösung als meine. Eddie, vol_id befindet sich in / lib / udev. Misch, könntest du deine Antwort so bearbeiten, dass sie dem vollständigen Pfad vor vol_id vorangestellt wird? / lib / udev befindet sich in keiner mir bekannten Distribution standardmäßig im root-Pfad.
Mihai Limbăşan
"/ lib / udev / vol_id / dev / sda2" scheint zu funktionieren. Nur wenige Leute werden / lib / udev auf ihrem Weg haben.
Eddie
Auf meinem Ubuntu-Computer gibt es eine symbolische Verbindung von /sbin/vol_idzu/lib/udev/vol_id
Brad Gilbert
4
vol_id wurde von Ubuntu ab Karmic (9.10) entfernt, ist also nicht mehr nützlich oder relevant. Es gab eine Menge Probleme , um dorthin zu gelangen, da vol_id irgendwann als Ersatz für blkid gebaut wurde .
Alain O'Dea
3

Das scheint bei mir zu funktionieren:

sudo dumpe2fs /dev/sda1 | grep UUID
Marcus Junius Brutus
quelle
2

Angenommen, Sie möchten die UUID für sda1, können Sie Folgendes versuchen:

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

Passen Sie sda1 entsprechend an. Um die UUIDs für alle Partitionen zu erhalten, lassen Sie die Greps and Cuts wie folgt fallen:

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

Beispielausgabe für sda1 auf meinem 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

Edit: Bitte beachten Sie, dass diese Lösung, während mehr gekünstelt als die udev-> vol_id ein, ist nicht Root - Rechte benötigen, funktioniert auf jedem Post 2005 oder so Kern, und stützt sich auf Werkzeuge , die in jeder Linux - Distribution, die standardmäßig in der Pfad für jeden Benutzer.

Mihai Limbăşan
quelle
Dies funktioniert auf jedem Computer, auf dem aktuell genug devfs laufen.
Eddie
1

Sie können dies auch verwenden, um alle UUIDs zu drucken:

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

oder dieser wohl einfachere Befehl, der sda1durch das Gerät ersetzt wird, nach dem Sie suchen möchten:

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

eine Anpassung der zweiten Methode zum Drucken aller UUIDs:

find /dev/disk/by-uuid -type l -exec sh -c 'basename $(readlink {}); basename {}; echo' \;
kiri
quelle
1
ls -l /dev/disk/by-uuid | grep `lsblk | grep "/" | awk '{print $1}'` | awk '{print $9}'

Das Obige scheint auf den meisten (alles was ich gefunden habe) Linux-Systemen über viele Jahre zu funktionieren. Es kann Fehler haben, ich weiß es nicht. Ich würde es vorziehen, die Seriennummer zu bekommen, aber ... das ist die UUID des Root-Dateisystems.

Wenn jemand eine Möglichkeit hat, die Seriennummer abzurufen, ohne root sein zu müssen (wie meine) und keine "ungewöhnlichen" Pakete zu installieren, die in verschiedenen Versionen von Unix unterschiedlich sind, würde ich es begrüßen - kann immer etwas lernen. Und ich bin mir bewusst, dass ich Dinge mische - das ist die UUID des Root-Dateisystems, keine Festplatte.

Der Zweck besteht übrigens darin, eine eindeutige Nummer pro Computer zu generieren, die nicht geändert werden kann (wie eine Festplatten-Seriennummer und wie MAC-Adressen vor langer Zeit).

Es wird zum Codieren von Software auf einem einzelnen Computer verwendet. Die MAC-Adresse war in Ordnung, bis sie es erlaubten, virtuell zu sein ... einige dürftige Kunden haben einfach ihre MAC-Adresse auf eine Konstante gesetzt (in verschiedenen Netzwerken natürlich) und mich nicht bezahlt.

In AIX gibt es einen einzigen Aufruf, um eine Nummer zu erhalten, die die Maschine identifiziert. Es ist mir egal, ob die Hardware- oder Software-Änderungen vorgenommen werden, daher habe ich keine Ahnung, wie sie vorgenommen werden. Wenn sich das Motherboard ändert, ändert sich die Anzahl. Und das ist mehr als selten.

Eric Eberhard
quelle
0

Sie können Folgendes verwenden, um die UUID für ein bestimmtes Laufwerk abzurufen:

sudo vol_id -u /dev/sda1

Oder Sie können dies verwenden, um alle UUIDs für die angehängten Medien aufzulisten.

ls /dev/disk/by-uuid
Rich Adams
quelle
Ab Ubuntu 9.10 nicht mehr anwendbar, da vol_id entfernt wurde.
Alain O'Dea