Pobierz UUID systemu plików / ze skryptu

11

Jak mogę uzyskać identyfikator UUID woluminu zawierającego /system plików? Najlepsze, co do tej pory znalazłem, to blkid -o list. Ale ten wynik jest czytelny dla człowieka i trudny do przeanalizowania. Może jest lepszy sposób?

Potrzebuję tego, aby sparametryzować zarządzanie konfiguracją za pomocą szablonów specyficznych dla systemu.

UWAGA o blkidgotcha dla tych, którzy mogą ponownie wykorzystać wyniki mojego pytania w przyszłości: blkidzapisuje wyniki poprzednich testów w pamięci podręcznej /etc/blkid.tab. Oznacza to, że uruchomienie blkidjako użytkownik inny niż root po raz pierwszy nie zwróci żadnych danych. Ponadto uruchomienie użytkownika blkidinnego niż root po uruchomieniu roota zwróci nieaktualne (prawdopodobnie niepoprawne) dane.

Dmitriusan
źródło
We własnych systemach przypisuję czytelne, unikalne etykiety do wszystkich partycji. Następnie mogę dowiedzieć się o nich prawie wszystkiego, używając ich etykiet i /dev/disk/by-label... Działa to również w przypadku partycji, które nie są zamontowane. Ma tę zaletę, że może pisać skrypty, które wykonują takie rzeczy, jak rsync od roota do root-bak, co jest znacznie mniej podatne na błędy niż używanie 2 UUIDS, które „nic nie znaczą”.
Joe

Odpowiedzi:

25

Użyj 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

Ma także kilka opcji kontrolowania sposobu wyszukiwania informacji i sposobu ich prezentacji (w tym danych wyjściowych JSON!). Jest to część mountpakietu, więc jest dostępna w każdej instalacji Ubuntu.

muru
źródło
Działa to świetnie 16.04. Nie działało dla mnie 14.04. Musiałem zastosować to podejście, aby uzyskać pożądane wyniki na zaufanym.
Elder Geek
11

Inne rozwiązanie:

lsblk -nr -o UUID,MOUNTPOINT | grep -Po '.*(?= /$)'
  • -n pomija nagłówek (nie jest tak naprawdę potrzebny, ale bezpieczniejszy do analizy)
  • -r zapewnia nieprzetworzone dane wyjściowe (bezpieczniej parsuje)
  • -o UUID,MOUNTPOINT zawierają tylko niezbędne informacje
pLumo
źródło
5

Możesz użyć lsblkpolecenia, aby wyświetlić identyfikator UUID, ale potrzebujesz nazwy urządzenia partycji (takiej jak / dev / sda2). Możesz to zrobić za pomocą dfpolecenia i przyciąć dane wyjściowe. Użyj podstawienia polecenia, aby nadać nazwę urządzeniu lsblk. Wygląda na to, że potrzebujesz sudo, aby uzyskać dostęp do UUID, chociaż normalne wyjście lsblk tego nie wymaga:

sudo lsblk -n -o UUID "$(df -P / | tail -n1 | cut -d' ' -f1)"
Arroniczny
źródło
2
Działa to dla mnie bez sudo16.04.
Eliah Kagan
tylko jeśli ty (lub jakiś skrypt) kiedykolwiek używałeś tego polecenia jako root. Również w tym przypadku wyjście może być nieaktualne (z pamięci podręcznej)
Dmitriusan
@Dmitriusan Uruchomiłem to w systemie 14.04, który nigdy nie miał lsblkani nie blkiddziałał z poziomu roota i działał idealnie. Czy wiesz, dlaczego wystąpiłby problem z buforowaniem tego polecenia, a nie wersji opublikowanej przez Rovo? Czy surowe dane wyjściowe w jakiś sposób omijają buforowanie?
Arroniczny
Myślę, że każde polecenie uzyskujące dostęp do UUID urządzeń wymagałoby dostępu do konta root (w tym wersji opublikowanej przez Rovo). Jeśli chodzi o lsblk, oto powiązane pytanie unix.stackexchange.com/questions/210889/… (patrz pierwsza odpowiedź)
Dmitriusan
Zgadzam się, że sudo jest konieczne, ale nie mogę znaleźć niczego, co sugerowałoby, że lsblk polega na buforowaniu. Nawet jeśli uruchomię blkidjako root, tworzenie pliku pamięci podręcznej w /dev/.blkid.tab, użycie w trybie innym niż sudo lsblknie pokaże niczego z kolumny UUID. Nie sądzę, że istnieje ryzyko przestarzałej produkcji.
Arronical
4

Najlepszym rozwiązaniem, jakie udało mi się wymyślić, jest

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

Wydaje się nieoptymalny, ale działa.

Uwaga: [[: spacja:]] oznaczaSpace

Dmitriusan
źródło
To działa dla mnie, ale z sudo.
pa4080
4

Dostosuj wartość mountpointdo bieżącego punktu podłączenia danego systemu plików:

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

Oto, czego używam:

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

tune2fs znajduje się w pakiecie e2fsprogs, którego nie pamiętam, jeśli jest domyślnie zainstalowany.

sudo apt install e2fsprogs

jeśli nie jest zainstalowany.

Jan
źródło
Rozumiem, awk: not an option: -eże zredagowałem twoją odpowiedź, aby była funkcjonalna. Jeśli przekroczyłem próg, możesz go wycofać. Twoje zdrowie! :-)
Starszy Geek
Dziwne, wydaje mi się, że działa z lub bez -e dla mnie. -e jest udokumentowane na stronie man dla awk. Zawsze używałem go w skryptach i byłem zaskoczony, że działał bez niego :) Myślę, że -e to stary nawyk UNIX. Ale powinienem być konsekwentny w użyciu i używać -e w obu miejscach lub w żadnym z nich, aby nie mylić ludzi.
Jan
Ach, otrzymuję taki sam wynik jak ty poniżej 14.04, który używa gawk. Otrzymuję błąd określony w 16.04, który wydaje się używać mawkzamiast tego.
Elder Geek
Jest to jedna z tych / etc / alternatives rzeczy. / etc / alternatives / awk -> / usr / bin / gawk dla mnie na moim 16.04. Mawk jest zainstalowany, ale nie jest aktywny w / etc / alternatives. Na moim gnomie 17.04 wskazuje na awk. Na mojej świeżej instalacji 17.10 to mawk. Po zainstalowaniu gawk link prowadzi do gawk, odinstalowanie gawk przywraca go do mawk.
Jan
:-) To te niewielkie różnice między podobno podobnymi programami, które prawdopodobnie doprowadziły do ​​stwierdzeń typu „Mniej znaczy więcej”
Starszy Geek
1

Testowany do pracy w dniach 14.04 i 16.04

Prostym jednowierszowym, który zawsze powinien generować UUID rdzenia /jest

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

To, co robimy tutaj, polega na przeplataniu wyniku montowania, aby dopasować symbol główny ze spacjami po obu stronach, /aby uniknąć dopasowania, gdy /jest używany jako symbol rozszerzenia ścieżki, potokując to za awkpomocą „on” jako separatora pól, aby wyświetlać tylko nazwę urządzenia i przypisanie TO do zmiennej środowiskowej $ DRIVE, a następnie użycie danych wyjściowych blkid $DRIVEpotoku przez przecięcie za pomocą "jako separatora pól i wybranie tylko drugiego pola, które usuwa wszystkie pozostałe, pozostawiając tylko UUID.

Zauważ, że to, co należy po grep w powyższym poleceniu, to tak naprawdę „ space/ space”, a nie „/”, jak się wydaje.

Ma to tę zaletę, że nie wymaga sudoi zwraca odpowiedni wynik niezależnie od sposobu montażu napędu.

Mądrze byłoby upewnić się, że nie używasz zmiennej środowiskowej $ DRIVE do niczego innego, zanim spróbujesz tego podejścia echo $DRIVEzwróci pustą linię, jeśli nie używasz zmiennej.

Starszy Geek
źródło