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

134

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

Брэд Гилберт
источник
Спасибо за все ответы, я уверен, что буду использовать их все в разных обстоятельствах.
Брэд Гилберт
2
Обратите внимание, что заголовок был «Как найти UUID раздела». Этот вопрос имеет смысл только при использовании таблицы разделов GPT. Вот ответ на этот вопрос .
Аластер Ирвин

Ответы:

165

Еще одна команда, которая может быть доступна, но для этого также достаточно хорошо работает, это 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. На Gentoo, blkidнаходится вsys-apps/util-linux
AdmiralNemo
10

Только для разделенных 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#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>).
марта 18:18
@marcz, который терпит неудачу на btrfs subvolumes: findmnt -n -o SOURCE --target ~дает:/dev/mapper/vg_svelte-home[/@home]
Том Хейл
Right @ tom-hale, lsblk -no UUID $(findmnt -n -o SOURCE --target <file> | cut -d[ -f1)должен избавиться от подобъема при его наличии.
18:00
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 не находится в пути root по умолчанию ни в одном из известных мне дистрибутивов.
Михай Лимбашан
"/ 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 .
Ален О'Ди
3

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

sudo dumpe2fs /dev/sda1 | grep UUID
Маркус Юний Брут
источник
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 для всех разделов, удалите greps и cuts, а ля:

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

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

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

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

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

Эрик Эберхард
источник
0

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

sudo vol_id -u /dev/sda1

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

ls /dev/disk/by-uuid
Рич Адамс
источник
Больше не применяется с Ubuntu 9.10, так как vol_id был удален.
Ален О'Ди