Как узнать UUID'ы разделов? Команды blkid и vol_id

Опубликовано:

Предисловие

В новых дистрибутивах Линукс стало модным называть разделы не по «именам», скажем, /dev/hda2, а используя UUID'ы — Уникальные Идентификаторы. Выглядят они как абсолютно нечитаемые для человека многозначные номера, да еще и шестнадцатеричные, например: UUID="5a179614-0415-48c6-a9ad-3f6ad9596619".

Удобство понимания и заполнения таких конфигурационных файлов как, скажем, /etc/fstab «значительно повысилось». Стало невозможным понять о каком разделе идет речь. Хорошо если у вас всего пять-шесть разделов, еще можно помнить, на каком своп, а на каком корень. А если разделов в три раза больше? Да если еще и постоянно удаляешь одни, и создаешь другие? Мода требует жертв.

Кому же нужны UUID'ы и для кого они действительно удобны? Сисадминам больших серверов, у которых одновременно присутствуют носители всевозможных типов, да еще и объединенные во всякие RAID'ы и прочие сиадминские заморочки. Для них, когда возникает необходимость перенести содержимое с одного носителя на другой, потом встает большая проблема правильно внести изменения в ту же /etc/fstab вручную. С UUID'ами же ядро, при помощи специальных программ, автоматически находит и размечает разделы по соответствующим носителям. Это им экономит много сил и времени.

Простым же смертным, имеющим два компьютера с тремя винчестерами на обоих, эти UUID'ы нужны как зайцу стоп-сигнал. Я лично первым делом безжалостно удаляю все эти номера из файлов /etc/fstab и /boot/grub/menu.lst. Это позволяет мне избежать головной боли при клонировании разделов, когда возникают два раздела с одинаковыми «Уникальными номерами».

Но многим почему-то нравятся UUID'ы, и они озабочены, если какой-нибудь раздел, например подкачки, вдруг прописан по «имени-отчеству». В Сети иногда встречаются такие вопли о помощи: «Мой раздел своппига не имеет UUID'а. Как мне узнать его и вписать в /etc/fstab?». Для вас, любители UUID'ов, эта статья.

Команда blkid

Программа blkid, используя библиотеку libblkid, умеет читать содержимое файлов блочных устройств типа /dev/hda2. Эти специальные файлы, находящиеся в директории /dev иначе называются нодами устройств, имеют весьма специфичную структуру, и не могут быть прочитаны обычными средствами (скажем, командой cat).

Однако программа blkid по умолчанию не считывает информацию о разделах непосредственно из соответствующих нод устройств, а считывает ее из файла /etc/blkid.tab. Этот файл зачем-то называется в мане команды blkid кэш файлом, а всем известно, что слово cache имеет множесто значений, а потому совершенно бессмысленно. Должен вас сразу предупредить, что в файле /etc/blkid.tab со временем накапливается устаревшая информация о давно несуществующих разделах, поэтому не думайте читать сам файл в поисках UUID'ов, можете жестоко обмишулиться. Пользуйтесь командой blkid с соответсвующими опциями.

Команда blkid без опций

Команда blkid без опций, запущенная с правами суперпользоателя, выведет на экран дисплея информацию, содержащуюся в файле /etc/blkid.tab:

# blkid
/dev/disk/by-id/scsi-SATA_Hitachi_HTS5416_SB344CHRJT80JD-part7: UUID="465e53f5-a682-4fde-8e0c-4c77a533aca7" TYPE="ext3" SEC_TYPE="ext2" LABEL="Common"
/dev/sda2: UUID="02E4E3A0E4E39467" LABEL="Vista" TYPE="ntfs"
/dev/sda5: UUID="5a179614-0415-48c6-a9ad-3f6ad9596619" TYPE="ext3" SEC_TYPE="ext2"
/dev/sda6: TYPE="swap"
/dev/sda7: UUID="465e53f5-a682-4fde-8e0c-4c77a533aca7" TYPE="ext3" LABEL="Common"
/dev/disk/by-uuid/5a179614-0415-48c6-a9ad-3f6ad9596619: UUID="5a179614-0415-48c6-a9ad-3f6ad9596619" TYPE="ext3" SEC_TYPE="ext2"
/dev/sda8: UUID="41825dd5-d866-45f6-bcfd-c4c9aa4de045" SEC_TYPE="ext2" TYPE="ext3" LABEL="lenny"
/dev/sda9: UUID="e6758566-4e3b-4cf0-be5e-37949b52c64f" SEC_TYPE="ext2" TYPE="ext3" LABEL="deb2"
/dev/sda1: UUID="5408E10E08E0F042" LABEL="WinRE" TYPE="ntfs"

Я предупреждал. Тут, конечно, можно разобраться при желании, но непонятно, откуда может взяться такое желание, когда можно поступить проще. А именно запустить команду blkid с опцией -c.

Команда blkid с опцией -c

Вообще-то опция -c заставляет blkid читать не из файла blkid.tab, а из любого указанного файла. Скажем, /dev/null. Не имея никакой информации из данного файла, команда вынуждена будет прочитать информацию из нод устройств, то есть выдать нам реальную картину на текущий момент:

# blkid -c /dev/null
/dev/sda1: UUID="5408E10E08E0F042" LABEL="WinRE" TYPE="ntfs"
/dev/sda2: UUID="02E4E3A0E4E39467" LABEL="Vista" TYPE="ntfs"
/dev/sda5: UUID="5a179614-0415-48c6-a9ad-3f6ad9596619" TYPE="ext3"
/dev/sda6: TYPE="swap"
/dev/sda7: LABEL="Common" UUID="465e53f5-a682-4fde-8e0c-4c77a533aca7" TYPE="ext3"
/dev/sda8: LABEL="lenny" UUID="41825dd5-d866-45f6-bcfd-c4c9aa4de045" SEC_TYPE="ext2" TYPE="ext3"
/dev/sda9: LABEL="deb2" UUID="e6758566-4e3b-4cf0-be5e-37949b52c64f" SEC_TYPE="ext2" TYPE="ext3"

Совсем другое дело, не правда ли?

Поэтому советую сохранить старые файлы blkid.tab и blkid.tab.old под другими именами, тогда при следующей загрузке будет создан новенький чистенький файлик blkid.tab, где все будет как в выводе команды blkid -c /dev/null. Стоит после этого проверить /etc/fstab и /boot/grub/menu.lst.

Остальные опции команды крайне невыразительны и бесполезны. Чем трудиться запоминать их, проще запустить команду вовсе без опций или с опцией -c /dev/null. Тем не менее:

Опция <device>

# blkid /dev/sda5
/dev/sda5: UUID="5a179614-0415-48c6-a9ad-3f6ad9596619" TYPE="ext3" SEC_TYPE="ext2"

Выдает сведения об указанном устройстве.

Опция -t

# blkid -t TYPE=ntfs
/dev/sda2: UUID="02E4E3A0E4E39467" LABEL="Vista" TYPE="ntfs"
/dev/sda1: UUID="5408E10E08E0F042" LABEL="WinRE" TYPE="ntfs"

Найдет все устройства, отвечающие заданному критерию, будь то TYPE, LABEL, или UUID. Можно сужать круг поиска, вводя в командную строку имена интересующих устройств:

# blkid -t TYPE=ntfs /dev/sda1 /dev/sda2 /dev/sda6 /dev/sda7
/dev/sda1: UUID="5408E10E08E0F042" LABEL="WinRE" TYPE="ntfs"
/dev/sda2: UUID="02E4E3A0E4E39467" LABEL="Vista" TYPE="ntfs"

Опция -s

# blkid -s UUID /dev/sda7
/dev/sda7: UUID="465e53f5-a682-4fde-8e0c-4c77a533aca7"

Выдаст только указанный критерий нужного устройства.

Опция -o

Позволяет выбирать формат вывода из трех возможных: value (значение критерия), device (устройство), или full (полный). Например:

# blkid -o value
465e53f5-a682-4fde-8e0c-4c77a533aca7
ext3
ext2
Common
02E4E3A0E4E39467
Vista
ntfs
5a179614-0415-48c6-a9ad-3f6ad9596619
ext3
ext2
swap
465e53f5-a682-4fde-8e0c-4c77a533aca7
ext3
Common
5a179614-0415-48c6-a9ad-3f6ad9596619
ext3
ext2
41825dd5-d866-45f6-bcfd-c4c9aa4de045
ext2
ext3
lenny
e6758566-4e3b-4cf0-be5e-37949b52c64f
ext2
ext3
deb2
5408E10E08E0F042
WinRE
ntfs

Опция -l

Применяется вместе с опцией поиска -t. Но из всего найденного выдаст сведения только об одном устройстве. Обычно это первое прочитанное в файле /etc/blkid.tab устройство.

# blkid -lt TYPE=ntfs
/dev/sda2: UUID="02E4E3A0E4E39467" LABEL="Vista" TYPE="ntfs"

Опция -g

В мане сказано, что убирает мусор в каком-то кэше blkid. Если имеется в виду файл /etc/blkid.tab, то не работает.

Опция -w

Записывает данные в указанный вами файл, вместо файла /etc/blkid.tab.

По моему, проще переадресовать в файл «file» вывод команды.

# blkid -c /dev/null > file

Опция -h

Выводит помощь.

Опция -v

Выводит версию программы.

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

Самая очевидная — заглянуть в директорию /dev:

# ls /dev/disk
by-id  by-label  by-path  by-uuid

Там четыре субдиректории, одна из которых by-uuid. Посмотрим:

# ls /dev/disk/by-uuid
02E4E3A0E4E39467                      5408E10E08E0F042
41825dd5-d866-45f6-bcfd-c4c9aa4de045  5a179614-0415-48c6-a9ad-3f6ad9596619
465e53f5-a682-4fde-8e0c-4c77a533aca7  e6758566-4e3b-4cf0-be5e-37949b52c64f

Вот поди, догадайся, что к чему относится! Нет, это не метод.

Команда vol_id

Существует еще команда vol_id. Она настолько простая, и ман к ней так понятно написан, что разобраться с ней не составит труда. Например:

# vol_id /dev/sda2
ID_FS_USAGE=filesystem
ID_FS_TYPE=ntfs
ID_FS_VERSION=3.1
ID_FS_UUID=02E4E3A0E4E39467
ID_FS_UUID_ENC=02E4E3A0E4E39467
ID_FS_LABEL=Vista
ID_FS_LABEL_ENC=Vista
ID_FS_LABEL_SAFE=Vista

Или еще пример:

# vol_id --uuid /dev/sda5
5a179614-0415-48c6-a9ad-3f6ad9596619

Хорошая и удобная команда, жаль, что не во всех дистрибутивах встречается.

Заключение

На сладкое я приберег самое интересное: кто же присваивает устройствам UUID'ы? Где записаны эти самые идентификаторы?

Если говорить о разделах жесткого диска, то UUID'ы присваиваются им в процессе создания файловой системы (некоторые утверждают, что они вычисляются из характеристик раздела), и записываются где-нибудь в суперблоках. Во всяком случае, еще не отформатированный раздел не имеет UUID'а. А при клонировании раздела командой dd, раздел, в который устанавливают клон, меняет свой UUID на идентификатор клона.

При загрузке компьютера, программа udev записывает UUID раздела в его ноду — файл блочного устройства в директории /dev. В доступной пользователю части файловой системы, UUID'ы разделов можно найти в файле /etc/blkid.tab, но информация эта может оказаться устаревшей.

Нравится мне это или нет, но UUID'ы прочно вошли в повседневный быт линуксоида. И нет в них никакой мистики.

Понравилась статья, расскажи о ней друзьям, нажми кнопку!