Як знайти UUID файлової системи


133

Я запускаю Ubuntu і хочу з’ясувати UUIDпевну файлову систему (не розділ). Я знаю, що можу e2label /dev/sda1дізнатися мітку файлової системи, але, схоже, не існує подібного способу пошуку UUID.


Дякую за всі відповіді, я впевнений, що використовуватиму їх за різних обставин.
Бред Гілберт

2
Зауважте, що заголовок раніше був "Як знайти UUID розділу". Це питання має сенс лише при використанні таблиці розділів GPT. Ось відповідь на це питання .
Аластер Ірвін

Відповіді:


164

Ще одна команда, яка може бути доступною, а також працює досить добре для цього, є "blkid". Це частина пакету e2fsprogs. Приклади його використання:

Знайдіть дані про / dev / sda1:

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

Показати дані UUID для всіх розділів:

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

Показати дані UUID для всіх розділів у більш легкому для читання форматі: (Примітка: у новіших випусках blkid -Lмає інше значення і blkid -o listслід використовувати їх замість)

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

Показати лише UUID для / dev / sda1 та нічого іншого:

topher@crucible:~$ sudo blkid -s UUID -o value /dev/sda1
727cac18-044b-4504-87f1-a5aefa774bda

1
На моєму комп'ютері Ubuntu мені не потрібно використовувати sudo.
Бред Гілберт

Тільки що набравши blkid, отримав мені саме те, що я хотів, але не зовсім те, про що я просив. (Я все одно приймаю це, тому що я впевнений, що буду користуватися ним часто)
Бред Гілберт

3
У більш нових версіях Ubuntu еквівалент команди для blkid -Lтепер blkid -o list; -Lваріант був змінений , -L labelщоб подивитися пристрій , яке використовує вказану мітку.
aculich

@aculich Я оновив відповідь на включений останній синтаксис для blkid. Дякуємо, що згадали про це.
Крістофер Кашелл

2
Чудово, я ніколи про це не знав blkid; Я завжди тільки робив ls -l /dev/disk/by-uuid. On Gentoo, blkidзнаходиться вsys-apps/util-linux
AdmiralNemo

10

Лише для GPT-дисків з розділеними картками

На диску, відформатованому GPT, кожному розділу присвоюється GUID, який є формою UUID, хоча, ймовірно, не тим, про який посилався оригінальний плакат. Тому ця відповідь, мабуть, менш корисна для початкового запитувача. Проте я вважаю, що важливе відмінність слід помітити.

Щоб отримати GUID розділу 1 на форматі диска / dev / sda, відформатованого GPT, а також мітку його розділу тощо:

sudo sgdisk -i 1 /dev/sda

або все з:

ls -l /dev/disk/by-partuuid

Для завантаження з коренем файлової системи, який знаходиться на певному розділі, ви використовували б синтаксис параметра ядра Linux:

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

У цьому випадку ви можете вказати лише початок UUID - достатньо, щоб бути унікальним. Цей параметр є більш примітивним і його може зрозуміти ядро ​​раніше в процесі завантаження.


Існує різниця в семантиці між цими:

Диск містить розділи, розділ містить файлову систему, файлова система вміщує каталоги та файли. Для деяких налаштувань та операційних систем є більше шарів.

GUID UUID та пов’язана мітка стосуються розділу, але не його вмісту. Новий розділ на тому ж диску або розділ на новому диску матиме новий GUID UUID. Один і той же розділ може містити одну файлову систему одного дня, а інший - в інший день. Він існує лише для дисків у форматі GPT, але не для застарілих розділених дисків. Тут зазвичай немає кориснішої програми, ніж зазначення root=/dev/sda1або root=8:1.

Інші поточні відповіді стосуються UUID файлової системи в частині, що містить розділ. Якщо файлова система копіюється в цілому на інший розділ або жорсткий диск, це значення залишається тим самим. Цей UUID корисний для пошуку переміщеної файлової системи. Тому це, мабуть, більше стосується більшості людей. Параметр ядра Linux root=UUID=87654321-4321-4321-a567-123456789012посилається на це.

Я вірю root=LABEL=і root=UUID=реалізується в ранньому просторі користувачів, код init, який я бачив днями, в моїй системі перевів ці параметри на / dev / disk / by-uuid та / dev / disk / by-label (посилання, на мою, створені udev в користувацький простір у моїй системі).

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


Правильне використання, як видається, -i1або -i 1, на відміну від -i:1, з sgdisk 1.0.1.
Чарльз Даффі

@CharlesDuffy дякую, що виявив цю помилку. Я відредагував відповідь, щоб її виправити.
Джон С Грубер

7

Очистити сценарій способом цього, який працює на будь-якому типі файлової системи, є:

lsblk -no UUID <device-containing-FS>

Або, враховуючи точку монтажу (або будь-який файл всередині нього):

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

Вихід - це UUID, весь UUID, і нічого, крім UUID.


1
Це краще, ніж blkidу відповіді від @ christopher-cashell, тому що вам не потрібно ставати root. Для точки монтування або файлу краще зробити: lsblk -no UUID $(findmnt -n -o SOURCE --target <file>).
marcz

@marcz Що не вдається в підпунктах btrfs: findmnt -n -o SOURCE --target ~дає:/dev/mapper/vg_svelte-home[/@home]
Том Хейл

Право @ tom-hale lsblk -no UUID $(findmnt -n -o SOURCE --target <file> | cut -d[ -f1)має позбутися підпункту, коли він присутній.
marcz

5

Найпростіший спосіб зробити це для ext2 / ext3 / ext4:

/sbin/tune2fs -l /dev/sda1

3
Це буде працювати за умови, що ваша файлова система відформатована як ext2, ext3 або ext4. Більшість файлових систем є однією з них, але не всі. Він також не працюватиме для підкачування розділів. Дивіться мою відповідь на універсальний спосіб.
Хаміш Даунер

Це призводить до моєї справиCouldn't find valid filesystem superblock.
Мішель

3

Рекомендований спосіб це зробити

sudo vol_id -u /dev/sda2

Докладніше про використання UUID див. У цій статті (з довідки ubuntu, але має працювати для будь-якого дистрибутива linux за допомогою UUID).

Як зазначається в коментарях до цього питання, vol_id може не бути на вашому шляху. У ubuntu він знаходиться в / sbin, тому вищезгадане буде працювати. Для Fedora це, здається, потрібно

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

Якщо в інших дистрибутивах є vol_id в інших місцях, тоді опублікуйте коментар, і я додам його до цієї відповіді.


Це не працює на моєму ноутбуці Fedora 10.
Едді

Це набагато краще рішення, ніж моє. Едді, vol_id знаходиться в / lib / udev. Міш, ти міг би відредагувати свою відповідь, щоб вказати повний шлях перед vol_id? / lib / udev за замовчуванням не перебуває в кореневому шляху для будь-якого розповсюдження, про яке я знаю.
Міхай Лімбашан

"/ lib / udev / vol_id / dev / sda2", здається, працює. Мало хто буде мати / lib / udev на своєму шляху.
Едді

На моєму комп'ютері Ubuntu є символічне посилання від /sbin/vol_idдо/lib/udev/vol_id
Бред Гілберт

4
vol_id був скинутий з Ubuntu станом на Karmic (9.10), тому вже не корисний чи актуальний. Це пройшло через безліч суперечок, щоб потрапити туди, оскільки vol_id був в одній точці побудований для заміни blkid .
Ален О'Дея


2

Припустимо, що ви хочете UUID для sda1, ви можете спробувати щось подібне:

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

Відповідно відрегулюйте sda1. Щоб отримати UUID для всіх розділів, опустіть розрізи та скорочення, a la:

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

Зразок виводу для sda1 на моєму робочому столі:

[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

Редагувати: Зауважте, що це рішення, хоч і більше надумане, ніж таке udev-> vol_id, не потребує привілеїв кореня, працюватиме на будь-якому ядрі після 2005 року або близько того, і покладається на інструменти, наявні в будь-якому дистрибутиві Linux, які за замовчуванням є у шлях для будь-якого користувача.


Це буде працювати на будь-якому комп’ютері, на якому працює досить недавній програму devfs.
Едді

1

Ви також можете використовувати це для друку всіх UUID:

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

або це, мабуть, простіша команда, замінивши sda1пристрій, який ви хочете шукати:

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

адаптація другого методу для друку всіх UUID:

find /dev/disk/by-uuid -type l -exec sh -c 'basename $(readlink {}); basename {}; echo' \;

1
ls -l /dev/disk/by-uuid | grep `lsblk | grep "/" | awk '{print $1}'` | awk '{print $9}'

Вищезазначене, здається, працює на більшості (усіх, що я знайшов) систем Linux протягом багатьох років. У нього можуть бути недоліки, я не знаю. Я вважаю за краще отримати серійний номер, але ... це UUID кореневої файлової системи.

Якщо хтось має спосіб отримати серійний номер, не потребуючи корінця (як у мене) і не встановлюючи "незвичайні" пакети, різні в різних версіях Unix, я би вдячний - завжди можна чомусь навчитися. І я знаю, що я змішую речі - це UUID кореневої файлової системи, а не диск.

Мета, BTW, - генерувати унікальне число на машині, яке неможливо змінити (як серійний номер диска та подібні MAC адреси колись давно).

Він використовується для кодування програмного забезпечення на одній машині. MAC-адреса була чудовою, поки вони не дозволили їм бути віртуальними ... деякі примхливі клієнти просто встановили свою MAC-адресу на постійну (в різних мережах звичайно) і не ухилялися платити мені.

В AIX є один виклик, щоб отримати один номер, який ідентифікує апарат. Байдуже, чи відбуваються зміни обладнання або оновлення програмного забезпечення, тому я поняття не маю, як вони це роблять ... Якщо змінюється материнська плата, то число змінюється, тому я думаю, що вони там її приховують. І це поза рідкістю.


0

Щоб отримати UUID для певного накопичувача, ви можете скористатись наступним,

sudo vol_id -u /dev/sda1

або ви можете скористатись цим, щоб перерахувати всі UUID для доданого носія,

ls /dev/disk/by-uuid

З Ubuntu 9.10 більше не застосовується, оскільки vol_id видалено.
Ален О'Дея
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.