it-swarm-ru.tech

Как мне найти UUID файловой системы

Я использую Ubuntu и хочу узнать UUID конкретной файловой системы (не раздела). Я знаю, что могу использовать e2label /dev/sda1, чтобы узнать метку файловой системы, но, похоже, нет аналогичного способа найти UUID.

135
Brad Gilbert

Еще одна команда, которая может быть доступна, но для этого также хорошо работает, это blkid. Это часть пакета e2fsprogs. Примеры его использования:

Посмотрите данные на/dev/sda1:

[email protected]:~$ Sudo blkid /dev/sda1
/dev/sda1: UUID="727cac18-044b-4504-87f1-a5aefa774bda" TYPE="ext3"

Показать данные UUID для всех разделов:

[email protected]:~$ 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 следует использовать вместо)

[email protected]:~$ 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 и ничего больше:

[email protected]:~$ Sudo blkid -s UUID -o value /dev/sda1
727cac18-044b-4504-87f1-a5aefa774bda
169
Christopher Cashell

Только для разделенных GPT дисков

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

Чтобы получить GUID раздела 1 на отформатированном GPT диске/dev/sda, а также его метку раздела и т.д.:

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= реализованы в раннем пользовательском пространстве, код инициализации, который я видел на днях в моей системе, преобразовал эти параметры в/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#n18

11
John S Gruber

Сценарий-чистый способ сделать это, который работает на любой тип файловой системы:

lsblk -no UUID <device-containing-FS>

Или, учитывая точку монтирования (или любой файл внутри нее):

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

Выходными данными является UUID, весь UUID и ничего, кроме UUID.

8
Tom Hale

Самый простой способ сделать это для ext2/ext3/ext4:

/sbin/tune2fs -l /dev/sda1
5
Eddie

Рекомендуемый способ сделать это -

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 в других местах, тогда оставьте комментарий, и я добавлю его в этот ответ.

3
Hamish Downer

Кажется, это работает для меня:

Sudo dumpe2fs /dev/sda1 | grep UUID
3
Marcus Junius Brutus

Предполагая, что вы хотите 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 для всех разделов, удалите greps и cuts, а ля:

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

Пример вывода для sda1 на моем рабочем столе:

[[email protected] ~]$ 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, но не требует привилегий root, будет работать на любом ядре после 2005 года и полагаться на инструменты, присутствующие в любом Дистрибутив Linux, который по умолчанию находится в пути для любого пользователя.

2
Mihai Limbăşan

Вы также можете использовать это для печати всех 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
kiri
ls -l /dev/disk/by-uuid | grep `lsblk | grep "/" | awk '{print $1}'` | awk '{print $9}'

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

Если у кого-то есть способ получить серийный номер без необходимости иметь права root (как у меня) и не устанавливать "необычные" пакеты, которые отличаются в разных версиях Unix, я был бы признателен - всегда может чему-то научиться. И я знаю, что я смешиваю вещи - это UUID корневой файловой системы, а не диск.

Кстати, целью является создание уникального номера для каждой машины, который не может быть изменен (например, серийный номер диска и как MAC-адреса, когда-то давно).

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

В AIX есть один вызов, чтобы получить один номер, который идентифицирует машину. Это не волнует, происходят ли аппаратные изменения или обновления программного обеспечения, поэтому я понятия не имею, как они это делают ... Если меняется материнская плата, то меняется число, поэтому я думаю, что они скрывают это там. И это за редкость.

1
Eric Eberhard

Вы можете использовать следующее, чтобы получить UUID для конкретного диска,

Sudo vol_id -u /dev/sda1

или вы можете использовать это, чтобы перечислить все UUID для подключенного носителя,

ls /dev/disk/by-uuid
0
Rich Adams