Я использую 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
Только для дисков с разделами 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
Чистый скрипт способ сделать это, который работает с любым типом файловой системы:
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, поэтому все вышесказанное будет работать. Для федоры, похоже, понадобится
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 на моем рабочем столе:
[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 корневой файловой системы.
Если у кого-то есть способ получить серийный номер без необходимости быть root (как у меня) и не устанавливать «необычные» пакеты, которые отличаются в разных версиях Unix, я был бы признателен - всегда можно чему-то научиться. И я знаю, что смешиваю вещи - это UUID корневой файловой системы, а не диск.
Цель, BTW, состоит в том, чтобы сгенерировать уникальный номер для каждой машины, который нельзя изменить (например, серийный номер диска и MAC-адреса, которые когда-то были давно).
Он используется для кодирования программного обеспечения на одной машине. MAC-адрес был в порядке, пока они не разрешили им быть виртуальными ... некоторые неряшливые клиенты просто установили свой MAC-адрес на постоянный (в разных сетях, конечно) и избегали платить мне.
В AIX есть один вызов, чтобы получить один номер, который идентифицирует машину. Меня не волнует, происходят ли изменения оборудования или обновления программного обеспечения, поэтому я понятия не имею, как они это делают ... Если материнская плата меняется, то меняется номер, поэтому я думаю, что они скрывают это там. И это очень редко.
Вы можете использовать следующее, чтобы получить UUID для определенного диска,
sudo vol_id -u /dev/sda1
или вы можете использовать это, чтобы перечислить все UUID для прикрепленного носителя,
ls /dev/disk/by-uuid