Я использую Ubuntu и хочу узнать UUID
конкретной файловой системы (не раздела). Я знаю, что могу использовать e2label /dev/sda1
, чтобы узнать метку файловой системы, но, похоже, нет аналогичного способа найти UUID
.
Еще одна команда, которая может быть доступна, но для этого также хорошо работает, это 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
Только для разделенных 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
Сценарий-чистый способ сделать это, который работает на любой тип файловой системы:
lsblk -no UUID <device-containing-FS>
Или, учитывая точку монтирования (или любой файл внутри нее):
lsblk -no UUID $(df -P <file> | awk 'END{print $1}')
Выходными данными является UUID, весь UUID и ничего, кроме UUID.
Самый простой способ сделать это для ext2/ext3/ext4:
/sbin/tune2fs -l /dev/sda1
Рекомендуемый способ сделать это -
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 в других местах, тогда оставьте комментарий, и я добавлю его в этот ответ.
Кажется, это работает для меня:
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 для всех разделов, удалите 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, который по умолчанию находится в пути для любого пользователя.
Вы также можете использовать это для печати всех 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 корневой файловой системы.
Если у кого-то есть способ получить серийный номер без необходимости иметь права root (как у меня) и не устанавливать "необычные" пакеты, которые отличаются в разных версиях Unix, я был бы признателен - всегда может чему-то научиться. И я знаю, что я смешиваю вещи - это UUID корневой файловой системы, а не диск.
Кстати, целью является создание уникального номера для каждой машины, который не может быть изменен (например, серийный номер диска и как MAC-адреса, когда-то давно).
Он используется для кодирования программного обеспечения на одной машине. MAC-адрес был в порядке, пока они не позволили им быть виртуальными ... некоторые неряшливые клиенты просто установили свой MAC-адрес на постоянный (в разных сетях, конечно) и избегали платить мне.
В AIX есть один вызов, чтобы получить один номер, который идентифицирует машину. Это не волнует, происходят ли аппаратные изменения или обновления программного обеспечения, поэтому я понятия не имею, как они это делают ... Если меняется материнская плата, то меняется число, поэтому я думаю, что они скрывают это там. И это за редкость.
Вы можете использовать следующее, чтобы получить UUID для конкретного диска,
Sudo vol_id -u /dev/sda1
или вы можете использовать это, чтобы перечислить все UUID для подключенного носителя,
ls /dev/disk/by-uuid