Итак, в современном Linux’е использование для накопителей имён «верхнего уровня», имеющих вид /dev/sda, не является обязательным, а в некоторых случаях и просто нежелательно. Однако правила менеджера устройств udev позволяют определять и другие модели идентификации накопителей. В частности, штатными средствами дисковой разметки openSUSE предусмотрены такие варианты, идентификация по:

  • метке тома (by-label),
  • идентификатору диска (by-id),
  • пути к дисковому устройству (by-path),
  • наконец, по пресловутому универсальному уникальному идентификатору, Universally Unique IDentifier (by-uuid).

Есть ещё несколько моделей идентификации накопителей, вроде by-partlabel или by-partuuid, но с примерами практического использования их я не сталкивался, и потому больше о них речи не будет.

С идентификацией по метке тома, вероятно, многие из читателей моего сочинения знакомы — этот метод использовался задолго до появления не только udev, но даже devfs. Метка (label — не путать с disk label, то есть схемой дисковой разметки) — это просто некоторое условное имя, желательно мнемонически прозрачное. Оно присваивается дисковым разделам — либо пользователем вручную при разметке, либо генерируется автоматически инсталляторами некоторых дистрибутивов. Список «помеченных» разделов в системе можно просмотреть так:

# ls -l /dev/disk/by-label

lrwxrwxrwx ... raidboot -> ../../md0
lrwxrwxrwx ... raidroot -> ../../md1

Из этого вывода легко понять, что метки (как и все остальные имена устройств, о которых речь пойдёт ниже)— это символические ссылки на на файл «верхнего уровня» (в примере — на программные RAID).

Метки тома является атрибутом раздела и не зависят от изменения имён верхнего уровня при реконфигурировании машины. Поэтому их удобно использовать для автоматического монтирования файловых систем, фигурирующих в файле /etc/fstab. Однако в системе размещения данных ZFS они не используются.

В последние годы большинство пользователей имели удовольствие ознакомиться и с идентификацией дисков и разделов по UUID — по умолчанию именно они используются для описания автоматически монтируемых файловых систем в большинстве современных дистрибутивов (но не в openSUSE).

UUID’ы представляют собой зубодробительные 128-битные числа, генерируемые для накопителей и их разделов по правилам, описываемым в библиотеке libuuid, и выглядят (в шестнадцатеричной системе счисления) примерно так:

# ls -l /dev/disk/by-uuid
итого 0
lrwxrwxrwx ... 1218e946-7f6b-4e27-beea-07fc6c06bf7a -> ../../sdc2
lrwxrwxrwx ... 2eec0b23-343f-4e3d-8507-dd042c876a60 -> ../../md0
lrwxrwxrwx ... 329f123c-17d6-4431-b4f1-583a7f59d8db -> ../../sdd1
lrwxrwxrwx ... 380c1570-d039-4ac6-ac6a-81321ea465d9 -> ../../sdc4
lrwxrwxrwx ... 9a76161d-ef7b-4a0d-afc8-c54e68857fee -> ../../sdc5
lrwxrwxrwx ... e63a68da-eb73-490b-b056-01c4945dca13 -> ../../md1
lrwxrwxrwx ... e8304d6c-a136-4c97-87d4-cb9a456af791 -> ../../sdc3

Общее количество уникальных идентификаторов исчисляется величиной 2128, что гарантирует от случайного их повторения, откуда и его название. Однако для человеческого восприятия UUID весьма сложны, и лишены всякой мнемоники. Почему их и нельзя считать самыми удобными средствами именования носителей. Кстати, в ZFS UUID’ы, по каким-то причинам, не используются.

Если с моделями именования by-label и by-uuid, как я уже говорил, мой потенциальный читатель наверняка так или иначе сталкивался, то рискну предположить, что с идентификацией by-path и by-id дела, скорее всего, не общался. Я, например, до знакомства с ZFS on Linux имел о них чисто теоретическое представление. И, более того, в Новелле тридцать первой высказал сомнение — а нужны ли вообще эти модели имён? И оказался неправ — нужны, и ещё как.

Модель именования by-path использует имена устройств, привязанные к их положению на шине PCI и включающие номер шины и канала на ней, примерно по тому же принципу, что и при использовании devfs. Практически это выглядит примерно так:

# ls -l /dev/disk/by-path
итого 0
lrwxrwxrwx ... pci-0000:00:1f.2-scsi-0:0:0:0 -> ../../sda
lrwxrwxrwx ... pci-0000:00:1f.2-scsi-0:0:0:0-part1 -> ../../sda1
lrwxrwxrwx ... pci-0000:00:1f.2-scsi-0:0:0:0-part2 -> ../../sda2
lrwxrwxrwx ... pci-0000:00:1f.2-scsi-0:0:0:0-part3 -> ../../sda3
lrwxrwxrwx ... pci-0000:00:1f.2-scsi-1:0:0:0 -> ../../sdb
lrwxrwxrwx ... pci-0000:00:1f.2-scsi-1:0:0:0-part1 -> ../../sdb1
lrwxrwxrwx ... pci-0000:00:1f.2-scsi-1:0:0:0-part2 -> ../../sdb2
lrwxrwxrwx ... pci-0000:00:1f.2-scsi-1:0:0:0-part3 -> ../../sdb3

Легко догадаться, что дисковые разделы маркируются добавлением к имени устройства суффикса part#.

Модель именования by-path идентифицирует устройства вполне однозначно, и особенно эффективна при наличии более чем одного дискового контроллера. Однако сами имена и устройств, и разделов описываются довольно сложной для восприятия последовательностью (хотя, в отличие от UUID, и не лишённой логики).

Модель идентификации by-id представляет имена носителей информации в форме, наиболее доступной для человеческого понимания. Они образованы из названия интерфейса, имени производителя, номера модели, серийного номера устройства и, при необходимости, номера раздела:

# ls -l /dev/disk/by-id                                    22:07 pts/4
итого 0
lrwxrwxrwx 1 ... ata-SanDisk_SDSSDX120GG25_120823400863 -> ../../sda
lrwxrwxrwx 1 ... ata-SanDisk_SDSSDX120GG25_120823400863-part1 -> ../../sda1
lrwxrwxrwx 1 ... ata-SanDisk_SDSSDX120GG25_120823400863-part2 -> ../../sda2
lrwxrwxrwx 1 ... ata-SanDisk_SDSSDX120GG25_120823400863-part3 -> ../../sda3
lrwxrwxrwx 1 ... ata-SanDisk_SDSSDX120GG25_120823402786 -> ../../sdb
lrwxrwxrwx 1 ... ata-SanDisk_SDSSDX120GG25_120823402786-part1 -> ../../sdb1
lrwxrwxrwx 1 ... ata-SanDisk_SDSSDX120GG25_120823402786-part2 -> ../../sdb2
lrwxrwxrwx 1 ... ata-SanDisk_SDSSDX120GG25_120823402786-part3 -> ../../sdb3

Таким образом, все компоненты имени устройства в модели by-id не определяются условиями его подключения и не вычисляются по каким-то заумным правилам, а определяются производителем и жестко прошиты в «железе». И потому эта модель является наиболее однозначной для именования устройств. А также, что немаловажно, строится по понятной человеку логике и легко воспринимается. Не случайно именно она принята по умолчанию в инсталляторе openSUSE и модуле дисковой разметки системы YaST2.

В системе размещения данных ZFS on Linux в основном применяются модели именования устройств by-id (для небольших пулов из устройств на одном контроллере) и by-path (для многодисковых пулов при нескольких контроллерах); как я уже сказал, использование имён «верхнего уровня» практикуется обычно только для целей тестирования.

Однако ZFS on Linux предлагает и собственную модель идентификации — /dev/disk/zpool, в котором именам by-path ставятся в соответствие уникальные и осмысленные «человекочитаемые» имена, дадваемые пользователем. Но до этого мы доберёмся ещё не скоро — если доберёмся вообще: модель эта рекомендуется для очень больших пулов, каковых на настольной машине ожидать трудно.


Назад | Рассказы о ZFS | Вперёд