Persistent block device naming (Русский)
Эта статья описывает, как использовать постоянные имена для ваших блочных устройств. Это стало возможным благодаря введению udev и имеет переимущества перед именами, основанными на используемых шинах. Если на вашем компьютере несколько контроллеров дисков SATA, SCSI или IDE, порядок добавления устройств может быть любым. Это может привести к тому, что устройства наподобие /dev/sda
и /dev/sdb
будут меняться местами при каждой загрузке, что может привести к невозможности загрузки системы, панике ядра или исчезновению блочного устройства. Использование постоянных имён решает подобные проблемы.
- Постоянные имена имеют ограничения, которые выходят за рамки данной статьи. Например, в то время как mkinitcpio может поддерживать метод, systemd может налагать свои собственные ограничения (например, FS#42884) на имена, которые он может обрабатывать во время загрузки.
- Эта статья не относится к LVM, так как пути
/dev/VolumeGroupName/LogicalVolumeName
являются постоянными.
Методы постоянного именования
Есть четыре схемы создания постоянных имён: by-label, by-uuid, by-id и by-path. Для дисков, использующих таблицу разделов GUID (GPT), также доступны by-partlabel и by-partuuid. Также можно задать #Постоянные имена устройств с использованием udev.
Подкаталоги внутри /dev/disk/
создаются и удаляются автоматически в соответствии с подключенными в данный момент устройствами.
В следующих разделах описываются различные методы постоянного именования и способы их использования.
Можно использовать команду lsblk для просмотра первых постоянных схем:
Для GPT используйте команду . Она более удобна для скриптов, но читается труднее.
by-label
Почти каждый тип файловой системы позволяет задать метку. Все разделы с метками есть в каталоге .
$ ls -l /dev/disk/by-label
total 0 lrwxrwxrwx 1 root root 10 May 27 23:31 Data -> ../../sda3 lrwxrwxrwx 1 root root 10 May 27 23:31 Arch\x20Linux -> ../../sda2
Большинство файловых систем поддерживают установку метки при создании файловой системы; смотрите справочные страницы соответствующих утилит mkfs.*
. Для некоторых файловых систем также возможно изменение меток. Ниже приведены некоторые методы изменения меток в распространённых файловых системах:
- swap
- с помощью
- ext2/3/4
- с помощью
- btrfs
- с помощью
- reiserfs
- с помощью
- jfs
- с помощью jfsutils
- xfs
xfs_admin -L "новая метка" /dev/XXX
с помощью- fat/vfat
- с помощью
- с помощью
- exfat
- с помощью
- с помощью или
- ntfs
ntfslabel /dev/XXX "новая метка"
с помощью ntfs-3g- udf
- с помощью
- crypto_LUKS (LUKS2 only)
- с помощью
Узнать метку устройства можно с помощью lsblk:
Или blkid:
by-uuid
UUID — это механизм присвоения каждой файловой системе уникального идентификатора. Эти идентификаторы генерируются утилитами файловой системы (например, mkfs.*
) при форматировании устройства и разработаны таким образом, что случайные совпадения разных идентификаторов маловероятны. Все файловые системы GNU/Linux (включая подкачку и LUKS-заголовки устройств с шифрованием) поддерживают UUID. Файловые системы FAT, exFAT и NTFS не поддерживают UUID, но отображаются в с более коротким UID (уникальным идентификатором):
Узнать UUID устройства можно с помощью lsblk:
$ lsblk -dno UUID /dev/sda1
CBB6-24F2
Или blkid:
Преимущество использования метода UUID в том, что вероятность возникновения конфликтов гораздо меньше, чем при использовании меток. Кроме того, он генерируется автоматически при создании файловой системы. Например, он останется уникальным, даже если устройство подключено к другой системе (которая может иметь собственное устройство с такой же меткой).
Недостатком является то, что UUID затрудняют чтение длинных строк кода и нарушают форматирование во многих файлах конфигурации (например, fstab или crypttab). Кроме того, каждый раз при форматировании создаётся новый UUID, и файлы конфигурации придётся обновлять вручную.
by-id и by-path
создаёт уникальное имя по серийному номеру оборудования,by-path
по кратчайшему физическому пути (согласно sysfs). Оба содержат строки, указывающие, к какой подсистеме они принадлежат (т. е. дляby-path
и для ), поэтому они связаны с аппаратным обеспечением, управляющим устройством. Это подразумевает разные уровни постоянности:by-path
изменится при подключении устройства к другому порту контроллера, изменится при подключении устройства к порту аппаратного контроллера, связанного с другой подсистемой. Таким образом, оба не подходят для достижения постоянного именования, устойчивого к аппаратным изменениям.
Однако оба они предоставляют важную информацию для поиска конкретного устройства в большой аппаратной инфраструктуре. Например, если вы не назначаете постоянные метки вручную ( или ) и сохраняете каталог с использованием аппаратного порта, и by-path
можно использовать для поиска определённого устройства.
также создаёт ссылки World Wide Name для устройств, которые его поддерживают. В отличие от других ссылок , WWN полностью постоянны и не изменяются в зависимости от используемой подсистемы.
$ ls -l /dev/disk/by-path/
total 0 lrwxrwxrwx 1 root root 10 May 27 23:31 pci-0000:00:1f.2-ata-1 -> ../../sda lrwxrwxrwx 1 root root 10 May 27 23:31 pci-0000:00:1f.2-ata-1-part1 -> ../../sda1 lrwxrwxrwx 1 root root 10 May 27 23:31 pci-0000:00:1f.2-ata-1-part2 -> ../../sda2 lrwxrwxrwx 1 root root 10 May 27 23:31 pci-0000:00:1f.2-ata-1-part3 -> ../../sda3 lrwxrwxrwx 1 root root 10 May 27 23:31 pci-0000:00:1f.2-ata-1-part4 -> ../../sda4 lrwxrwxrwx 1 root root 10 May 27 23:31 pci-0000:07:00.0-platform-rtsx_pci_sdmmc.0 -> ../../mmcblk0 lrwxrwxrwx 1 root root 10 May 27 23:31 pci-0000:07:00.0-platform-rtsx_pci_sdmmc.0-part1 -> ../../mmcblk0p1
by-partlabel
GPT позволяет указывать метки для разделов.
Это похоже на метки файловой системы, но метки разделов не изменяются при изменении файловой системы на разделе.
Все разделы, имеющие метки разделов, указаны в каталоге .
Узнать метку раздела можно с помощью lsblk:
Или blkid:
by-partuuid
Каждый раздел в GPT имеет свой UUID, не привязанный к файловой системе.
MBR не поддерживает UUID разделов, но Linux и программы, использующие libblkid (например, udev), способны генерировать псевдо-PARTUUID для разделов MBR. Формат — , где SSSSSSSS
— дополненная нулями 32-битная сигнатура диска MBR, а — дополненный нулями номер раздела в шестнадцатеричной форме. В отличие от обычного PARTUUID раздела GPT, псевдо-PARTUUID MBR может измениться при изменении номера раздела.
Динамический каталог аналогичен другим методам и, как в случае с UUID файловой системы, использование UUID разделов предпочтительнее, чем меток.
Узнать UUID раздела можно с помощью lsblk:
$ lsblk -dno PARTUUID /dev/sda1
d0d0d110-0a71-4ed6-936a-304969ea36af
Или blkid:
Постоянные имена устройств с использованием udev
Смотрите udev (Русский)#Установка постоянных имен устройств.
Использование постоянных имён
Существуют различные приложения, которые можно настроить с использованием постоянных имён. Ниже приведены некоторые примеры их настройки.
fstab
Параметры ядра
Чтобы использовать постоянные имена в параметрах ядра, должны быть выполнены следующие предварительные условия. При стандартной установке в соответствии с руководством по установке оба условия выполняются:
- Используется образ initramfs, в котором есть udev.
- Для mkinitcpio включен хук или в .
Расположение корневой файловой системы задаётся параметром в командной строке ядра. Командная строка ядра настраивается из загрузчика, смотрите Параметры ядра#Настройка. Чтобы перейти к использованию постоянных имён устройств, измените те параметры, которые определяют блочные устройства, например и , оставив остальные параметры как есть. Поддерживаются различные схемы именования:
C использованием метки и формата LABEL=
, в этом примере — это метка корневой файловой системы.
root="LABEL=Arch Linux"
С использованием UUID и формата , в этом примере 0a3407de-014b-458b-b5c1-848e92a327a3
— это UUID корневой файловой системы.
root=UUID=0a3407de-014b-458b-b5c1-848e92a327a3
С использованием id диска и пути в , в данном примере — это id корневого раздела.
root=/dev/disk/by-id/wwn-0x60015ee0000b237f-part2
С использованием UUID разделов GPT и формата , в данном примере — это PARTUUID корневого раздела.
root=PARTUUID=98a81274-10f7-40db-872a-03df048df366
С использованием меток разделов GPT и формата , в данном примере — это метка корневого раздела.
root="PARTLABEL=GNU/Linux"