Jak znaleźć identyfikator UUID systemu plików

133

Używam Ubuntu i chcę dowiedzieć się UUIDo konkretnym systemie plików (nie partycji). Wiem, że mogę użyć e2label /dev/sda1etykiety systemu plików, ale wydaje się, że nie ma podobnego sposobu na znalezienie UUID.

Brad Gilbert
źródło
Dzięki za wszystkie odpowiedzi, jestem pewien, że użyję ich wszystkich w różnych okolicznościach.
Brad Gilbert
2
Zwróć uwagę, że tytuł brzmiał „Jak znaleźć identyfikator UUID partycji”. To pytanie ma sens tylko w przypadku korzystania z tablicy partycji GPT. Oto odpowiedź na to pytanie .
Alastair Irvine

Odpowiedzi:

164

Kolejnym poleceniem, które może być dostępne i działa całkiem dobrze, jest „blkid”. Jest to część pakietu e2fsprogs. Przykłady jego użycia:

Wyszukaj dane w / dev / sda1:

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

Pokaż dane UUID dla wszystkich partycji:

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

Pokaż dane UUID dla wszystkich partycji w łatwiejszym do odczytania formacie: (Uwaga: w nowszych wersjach blkid -Lma inne znaczenie i blkid -o listnależy go użyć)

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

Pokaż tylko UUID dla / dev / sda1 i nic więcej:

topher@crucible:~$ sudo blkid -s UUID -o value /dev/sda1
727cac18-044b-4504-87f1-a5aefa774bda
Christopher Cashell
źródło
1
Na moim komputerze Ubuntu nie muszę używać sudo.
Brad Gilbert
Po prostu pisanie blkid, dostałem dokładnie to, czego chciałem, ale nie do końca to, o co prosiłem. (I tak to akceptuję, bo jestem pewien, że będę go często używać)
Brad Gilbert
3
W nowszych wersjach Ubuntu polecenie blkid -Ljest teraz równoważne blkid -o list; -Lopcja została zmieniona, aby -L labelzajrzeć do urządzenia, które wykorzystuje określonego etykietę.
aculich
@aculich Zaktualizowałem odpowiedź, uwzględniając najnowszą składnię blkid. Dzięki, że o tym wspomniałeś.
Christopher Cashell
2
Doskonale, nigdy o tym nie wiedziałem blkid; Zawsze to robiłem ls -l /dev/disk/by-uuid. Na Gentoo blkidjest wsys-apps/util-linux
AdmiralNemo
10

Tylko dla dysków partycjonowanych GPT

Na dysku sformatowanym GPT każdej partycji przypisany jest identyfikator GUID, który jest formą UUID, choć prawdopodobnie nie do tego, do którego odnosi się oryginalny plakat. Dlatego odpowiedź ta jest prawdopodobnie mniej pomocna dla pierwotnego pytającego. Niemniej jednak uważam, że należy zauważyć istotne rozróżnienie.

Aby uzyskać identyfikator GUID partycji 1 na dysku / dev / sda w formacie GPT, a także etykietę partycji i tak dalej:

sudo sgdisk -i 1 /dev/sda

lub wszystkie z:

ls -l /dev/disk/by-partuuid

Aby uruchomić system z systemem plików znajdującym się na określonej partycji, należy użyć składni parametru jądra linux:

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

W takim przypadku możesz podać tylko początek UUID - wystarczy, aby być unikalnym. Ten parametr jest bardziej prymitywny i może być zrozumiany przez jądro wcześniej w procesie uruchamiania.


Istnieje różnica w semantyce między nimi:

Dysk zawiera partycje, partycja zawiera system plików, system plików zawiera katalogi i pliki. W przypadku niektórych konfiguracji i systemów operacyjnych jest więcej warstw.

Identyfikator UUID GUID i powiązana etykieta odnoszą się do partycji, ale nie do jej zawartości. Nowa partycja na tym samym dysku lub partycja na nowym dysku będzie miała nowy identyfikator GUID UUID. Ta sama partycja może pomieścić jeden system plików jednego dnia, a drugi w innym dniu. Istnieje tylko dla dysków sformatowanych GPT, ale nie dla starszych dysków partycjonowanych. Zwykle nie ma tu więcej narzędzi niż określenie root=/dev/sda1lub root=8:1.

Pozostałe aktualne odpowiedzi odnoszą się do UUID systemu plików w niektórych partycjach zawierających. Jeśli system plików zostanie skopiowany jako całość na inną partycję lub dysk twardy, ta wartość pozostanie taka sama. Ten identyfikator UUID jest przydatny do znajdowania przeniesionego systemu plików. Dlatego jest to prawdopodobnie bardziej odpowiednie dla większości ludzi. root=UUID=87654321-4321-4321-a567-123456789012Odnosi się do tego parametr jądra Linux .

Wierzę root=LABEL=i root=UUID=są wdrażane przez wczesną przestrzeń użytkownika, kod init, który widziałem innego dnia w moim systemie, przetłumaczył te parametry na / dev / disk / by-uuid i / dev / disk / by-label (linki, które moim zdaniem są tworzone przez udev w przestrzeń użytkownika w moim systemie).

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

John S Gruber
źródło
Prawidłowe użycie wydaje się być -i1lub -i 1, w przeciwieństwie do -i:1sgdisk 1.0.1.
Charles Duffy
@CharlesDuffy dzięki za znalezienie tego błędu. Zredagowałem odpowiedź, aby ją poprawić.
John S Gruber,
7

Sposobem na wyczyszczenie skryptu, który działa na dowolnym systemie plików, jest:

lsblk -no UUID <device-containing-FS>

Lub, biorąc pod uwagę punkt montowania (lub dowolny plik w nim):

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

Dane wyjściowe to UUID, cały UUID i tylko UUID.

Tom Hale
źródło
1
To lepsze niż blkidw odpowiedzi z @ christopher-cashell, ponieważ nie musisz się rootować. Przez punkt montowania lub pliku lepiej zrobić: lsblk -no UUID $(findmnt -n -o SOURCE --target <file>).
marcz
@marcz To nie działa w podwoluminach btrfs: findmnt -n -o SOURCE --target ~daje:/dev/mapper/vg_svelte-home[/@home]
Tom Hale
Right @ tom-hale, lsblk -no UUID $(findmnt -n -o SOURCE --target <file> | cut -d[ -f1)powinien pozbyć się podobjętości, gdy jest obecny.
marcz
5

Najłatwiejszym sposobem na to w przypadku ext2 / ext3 / ext4 jest:

/sbin/tune2fs -l /dev/sda1
Eddie
źródło
3
Działa to pod warunkiem, że twój system plików jest sformatowany jako ext2, ext3 lub ext4. Większość systemów plików to jeden z nich, ale nie wszystkie. Nie działa również w przypadku partycji wymiany. Zobacz moją odpowiedź na uniwersalny sposób.
Hamish Downer
To powoduje w moim przypadkuCouldn't find valid filesystem superblock.
Michela
3

Zalecany sposób to zrobić

sudo vol_id -u /dev/sda2

Aby uzyskać więcej informacji na temat używania UUID, zobacz ten artykuł (z pomocy Ubuntu, ale powinien działać dla każdej dystrybucji Linuksa używającej UUID).

Jak zauważono w komentarzach do tego pytania, vol_id może nie znajdować się na twojej drodze. Na Ubuntu jest w / sbin, więc powyższe będzie działać. W przypadku fedory wydaje się, że potrzebuje

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

Jeśli inne dystrybucje mają vol_id w innych miejscach, opublikuj komentarz, a ja dodam go do tej odpowiedzi.

Hamish Downer
źródło
To nie działa na moim laptopie Fedora 10.
Eddie
To jest znacznie lepsze rozwiązanie niż moje. Eddie, vol_id znajduje się w / lib / udev. mish, czy mógłbyś edytować swoją odpowiedź, aby prefiksować pełną ścieżkę przed vol_id? / lib / udev domyślnie nie znajduje się w ścieżce roota w żadnej znanej mi dystrybucji.
Mihai Limbăşan
Wydaje się, że „/ lib / udev / vol_id / dev / sda2” działa. Niewiele osób będzie miało / lib / udev na swojej drodze.
Eddie
Na moim komputerze Ubuntu znajduje się dowiązanie symboliczne /sbin/vol_iddo/lib/udev/vol_id
Brad Gilbert
4
vol_id został usunięty z Ubuntu z Karmic (9.10), więc nie jest już przydatny ani istotny. Dostał się przez wiele skręceń, aby się tam dostać, ponieważ vol_id został w pewnym momencie zbudowany, aby zastąpić blkid .
Alain O'Dea,
3

Wydaje mi się, że to działa:

sudo dumpe2fs /dev/sda1 | grep UUID
Marcus Junius Brutus
źródło
2

Zakładając, że chcesz mieć UUID dla sda1, możesz spróbować czegoś takiego:

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

Dostosuj odpowiednio sda1. Aby uzyskać UUID dla wszystkich partycji, upuść greps i cięcia, a la:

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

Przykładowe dane wyjściowe dla sda1 na moim pulpicie:

[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

Edycja: Należy pamiętać, że to rozwiązanie, choć bardziej wymyślne niż udev-> vol_id, nie wymaga uprawnień roota, będzie działać na dowolnym jądrze po 2005 roku i opiera się na narzędziach obecnych w dowolnej dystrybucji Linuksa, która jest domyślnie w ścieżka dla dowolnego użytkownika.

Mihai Limbăşan
źródło
Działa to na każdym komputerze z wystarczającą ilością ostatnich devfs.
Eddie
1

Możesz także użyć tego do wydrukowania wszystkich UUID:

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

lub to prawdopodobnie łatwiejsze polecenie, zastępując sda1urządzenie, które chcesz wyszukać:

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

adaptacja drugiej metody drukowania wszystkich UUID:

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

Powyższe wydaje się działać na większości (wszystkich, jakie znalazłem) systemów Linux na wiele lat. To może mieć wady, nie wiem. Wolałbym uzyskać numer seryjny, ale ... to jest UUID głównego systemu plików.

Jeśli ktoś ma sposób na uzyskanie numeru seryjnego bez konieczności rootowania (tak jak mój) i nie instalowania „nietypowych” pakietów różniących się w różnych wersjach Uniksa, doceniłbym to - zawsze mogę się czegoś nauczyć. I wiem, że mieszam różne rzeczy - to UUID głównego systemu plików, a nie dysk.

BTW ma na celu wygenerowanie unikalnego numeru na maszynę, którego nie można zmodyfikować (np. Numer seryjny dysku i adresy MAC dawno temu).

Służy do kodowania oprogramowania na jednym komputerze. Adres MAC był w porządku, dopóki nie pozwolili im być wirtualnymi ... niektórzy sprytni klienci po prostu ustawili swój adres MAC na stały (oczywiście w różnych sieciach) i unikali płacenia mi.

W systemie AIX jest jedno wywołanie, aby uzyskać jeden numer identyfikujący maszynę. Nie ma znaczenia, czy nastąpią zmiany sprzętu lub aktualizacji oprogramowania, więc nie mam pojęcia, jak to robią ... Jeśli zmieni się płyta główna, to zmieni się liczba, więc myślę, że tam ją ukrywają. I to jest niezwykle rzadkie.

Eric Eberhard
źródło
0

Aby uzyskać identyfikator UUID dla określonego dysku, możesz użyć następujących elementów,

sudo vol_id -u /dev/sda1

lub możesz użyć tego, aby wyświetlić wszystkie UUID dla podłączonego nośnika,

ls /dev/disk/by-uuid
Rich Adams
źródło
Nie dotyczy już wersji Ubuntu 9.10, ponieważ vol_id został usunięty.
Alain O'Dea,