Я запускаю Ubuntu і хочу з’ясувати UUID
певну файлову систему (не розділ). Я знаю, що можу e2label /dev/sda1
дізнатися мітку файлової системи, але, схоже, не існує подібного способу пошуку UUID
.
Я запускаю Ubuntu і хочу з’ясувати UUID
певну файлову систему (не розділ). Я знаю, що можу e2label /dev/sda1
дізнатися мітку файлової системи, але, схоже, не існує подібного способу пошуку UUID
.
Відповіді:
Ще одна команда, яка може бути доступною, а також працює досить добре для цього, є "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
blkid
, отримав мені саме те, що я хотів, але не зовсім те, про що я просив. (Я все одно приймаю це, тому що я впевнений, що буду користуватися ним часто)
blkid -L
тепер blkid -o list
; -L
варіант був змінений , -L label
щоб подивитися пристрій , яке використовує вказану мітку.
blkid
. Дякуємо, що згадали про це.
blkid
; Я завжди тільки робив ls -l /dev/disk/by-uuid
. On Gentoo, blkid
знаходиться вsys-apps/util-linux
Лише для 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.
Очистити сценарій способом цього, який працює на будь-якому типі файлової системи, є:
lsblk -no UUID <device-containing-FS>
Або, враховуючи точку монтажу (або будь-який файл всередині нього):
lsblk -no UUID $(df -P <file> | awk 'END{print $1}')
Вихід - це UUID, весь UUID, і нічого, крім UUID.
blkid
у відповіді від @ christopher-cashell, тому що вам не потрібно ставати root. Для точки монтування або файлу краще зробити: lsblk -no UUID $(findmnt -n -o SOURCE --target <file>)
.
findmnt -n -o SOURCE --target ~
дає:/dev/mapper/vg_svelte-home[/@home]
lsblk -no UUID $(findmnt -n -o SOURCE --target <file> | cut -d[ -f1)
має позбутися підпункту, коли він присутній.
Найпростіший спосіб зробити це для ext2 / ext3 / ext4:
/sbin/tune2fs -l /dev/sda1
Couldn't find valid filesystem superblock.
Рекомендований спосіб це зробити
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 в інших місцях, тоді опублікуйте коментар, і я додам його до цієї відповіді.
/sbin/vol_id
до/lib/udev/vol_id
Це, здається, працює для мене:
sudo dumpe2fs /dev/sda1 | grep UUID
Припустимо, що ви хочете 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, які за замовчуванням є у шлях для будь-якого користувача.
Ви також можете використовувати це для друку всіх 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' \;
ls -l /dev/disk/by-uuid | grep `lsblk | grep "/" | awk '{print $1}'` | awk '{print $9}'
Вищезазначене, здається, працює на більшості (усіх, що я знайшов) систем Linux протягом багатьох років. У нього можуть бути недоліки, я не знаю. Я вважаю за краще отримати серійний номер, але ... це UUID кореневої файлової системи.
Якщо хтось має спосіб отримати серійний номер, не потребуючи корінця (як у мене) і не встановлюючи "незвичайні" пакети, різні в різних версіях Unix, я би вдячний - завжди можна чомусь навчитися. І я знаю, що я змішую речі - це UUID кореневої файлової системи, а не диск.
Мета, BTW, - генерувати унікальне число на машині, яке неможливо змінити (як серійний номер диска та подібні MAC адреси колись давно).
Він використовується для кодування програмного забезпечення на одній машині. MAC-адреса була чудовою, поки вони не дозволили їм бути віртуальними ... деякі примхливі клієнти просто встановили свою MAC-адресу на постійну (в різних мережах звичайно) і не ухилялися платити мені.
В AIX є один виклик, щоб отримати один номер, який ідентифікує апарат. Байдуже, чи відбуваються зміни обладнання або оновлення програмного забезпечення, тому я поняття не маю, як вони це роблять ... Якщо змінюється материнська плата, то число змінюється, тому я думаю, що вони там її приховують. І це поза рідкістю.
Щоб отримати UUID для певного накопичувача, ви можете скористатись наступним,
sudo vol_id -u /dev/sda1
або ви можете скористатись цим, щоб перерахувати всі UUID для доданого носія,
ls /dev/disk/by-uuid