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 для просмотра первых постоянных схем:
$ lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT sda ├─sda1 vfat CBB6-24F2 /boot ├─sda2 ext4 Arch Linux 0a3407de-014b-458b-b5c1-848e92a327a3 / ├─sda3 ext4 Data b411dc99-f0a0-4c87-9e05-184977be8539 /home └─sda4 swap f9fe0b69-a280-415d-a03a-a32752370dee [SWAP] mmcblk0 └─mmcblk0p1 vfat F4CA-5D75
Для GPT используйте команду blkid
. Она более удобна для скриптов, но читается труднее.
# blkid
/dev/sda1: UUID="CBB6-24F2" TYPE="vfat" PARTLABEL="EFI system partition" PARTUUID="d0d0d110-0a71-4ed6-936a-304969ea36af" /dev/sda2: LABEL="Arch Linux" UUID="0a3407de-014b-458b-b5c1-848e92a327a3" TYPE="ext4" PARTLABEL="GNU/Linux" PARTUUID="98a81274-10f7-40db-872a-03df048df366" /dev/sda3: LABEL="Data" UUID="b411dc99-f0a0-4c87-9e05-184977be8539" TYPE="ext4" PARTLABEL="Home" PARTUUID="7280201c-fc5d-40f2-a9b2-466611d3d49e" /dev/sda4: UUID="f9fe0b69-a280-415d-a03a-a32752370dee" TYPE="swap" PARTLABEL="Swap" PARTUUID="039b6c1c-7553-4455-9537-1befbc9fbc5b" /dev/mmcblk0: PTUUID="0003e1e5" PTTYPE="dos" /dev/mmcblk0p1: UUID="F4CA-5D75" TYPE="vfat" PARTUUID="0003e1e5-01"
by-label
Почти каждый тип файловой системы позволяет задать метку. Все разделы с метками есть в каталоге /dev/disk/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
swaplabel -L "новая метка" /dev/XXX
с помощью util-linux- ext2/3/4
e2label /dev/XXX "новая метка"
с помощью e2fsprogs- btrfs
btrfs filesystem label /dev/XXX "новая метка"
с помощью btrfs-progs- reiserfs
reiserfstune -l "новая метка" /dev/XXX
с помощью reiserfsprogs- jfs
jfs_tune -L "новая метка" /dev/XXX
с помощью jfsutils- xfs
xfs_admin -L "новая метка" /dev/XXX
с помощью xfsprogs- fat/vfat
fatlabel /dev/XXX "новая метка"
с помощью dosfstoolsmlabel -i /dev/XXX ::"новая метка"
с помощью mtools- exfat
tune.exfat -L "новая метка" /dev/XXX
с помощью exfatprogsexfatlabel /dev/XXX "новая метка"
с помощью exfatprogs или exfat-utils- ntfs
ntfslabel /dev/XXX "новая метка"
с помощью ntfs-3g- udf
udflabel /dev/XXX "новая метка"
с помощью udftools- crypto_LUKS (LUKS2 only)
cryptsetup config --label="новая метка" /dev/XXX
с помощью cryptsetup
Узнать метку устройства можно с помощью lsblk:
$ lsblk -dno LABEL /dev/sda2
Arch Linux
Или blkid:
# blkid -s LABEL -o value /dev/sda2
Arch Linux
- Файловая система не должна быть примонтирована при изменении метки. Для изменения метки корневой файловой системы нужно загрузиться с другого тома.
- Метки должны быть однозначными, чтобы предотвратить любые возможные конфликты.
- Метки могут содержать до 16 символов.
- Поскольку метка является свойством файловой системы, она не подходит для постоянной адресации одного устройства RAID.
- При использовании зашифрованных контейнеров с dm-crypt метки файловых систем внутри контейнеров недоступны, пока контейнер заблокирован/зашифрован.
by-uuid
UUID — это механизм присвоения каждой файловой системе уникального идентификатора. Эти идентификаторы генерируются утилитами файловой системы (например, mkfs.*
) при форматировании устройства и разработаны таким образом, что случайные совпадения разных идентификаторов маловероятны. Все файловые системы GNU/Linux (включая подкачку и LUKS-заголовки устройств с шифрованием) поддерживают UUID. Файловые системы FAT, exFAT и NTFS не поддерживают UUID, но отображаются в /dev/disk/by-uuid/
с более коротким UID (уникальным идентификатором):
$ ls -l /dev/disk/by-uuid/
total 0 lrwxrwxrwx 1 root root 10 May 27 23:31 0a3407de-014b-458b-b5c1-848e92a327a3 -> ../../sda2 lrwxrwxrwx 1 root root 10 May 27 23:31 b411dc99-f0a0-4c87-9e05-184977be8539 -> ../../sda3 lrwxrwxrwx 1 root root 10 May 27 23:31 CBB6-24F2 -> ../../sda1 lrwxrwxrwx 1 root root 10 May 27 23:31 f9fe0b69-a280-415d-a03a-a32752370dee -> ../../sda4 lrwxrwxrwx 1 root root 10 May 27 23:31 F4CA-5D75 -> ../../mmcblk0p1
Узнать UUID устройства можно с помощью lsblk:
$ lsblk -dno UUID /dev/sda1
CBB6-24F2
Или blkid:
# blkid -s UUID -o value /dev/sda1
CBB6-24F2
Преимущество использования метода UUID в том, что вероятность возникновения конфликтов гораздо меньше, чем при использовании меток. Кроме того, он генерируется автоматически при создании файловой системы. Например, он останется уникальным, даже если устройство подключено к другой системе (которая может иметь собственное устройство с такой же меткой).
Недостатком является то, что UUID затрудняют чтение длинных строк кода и нарушают форматирование во многих файлах конфигурации (например, fstab или crypttab). Кроме того, каждый раз при форматировании создаётся новый UUID, и файлы конфигурации придётся обновлять вручную.
by-id и by-path
by-id
создаёт уникальное имя по серийному номеру оборудования, by-path
по кратчайшему физическому пути (согласно sysfs). Оба содержат строки, указывающие, к какой подсистеме они принадлежат (т. е. pci-
для by-path
и ata-
для by-id
), поэтому они связаны с аппаратным обеспечением, управляющим устройством. Это подразумевает разные уровни постоянности: by-path
изменится при подключении устройства к другому порту контроллера, by-id
изменится при подключении устройства к порту аппаратного контроллера, связанного с другой подсистемой. [1] Таким образом, оба не подходят для достижения постоянного именования, устойчивого к аппаратным изменениям.
Однако оба они предоставляют важную информацию для поиска конкретного устройства в большой аппаратной инфраструктуре. Например, если вы не назначаете постоянные метки вручную (by-label
или by-partlabel
) и сохраняете каталог с использованием аппаратного порта, by-id
и by-path
можно использовать для поиска определённого устройства. [2] [3]
by-id
также создаёт ссылки World Wide Name для устройств, которые его поддерживают. В отличие от других ссылок by-id
, WWN полностью постоянны и не изменяются в зависимости от используемой подсистемы.
by-id
и by-path
могут считаться постоянными только для дисков, а не для разделов. На разделы будет ссылаться их номер в таблице разделов, который может измениться, если разделы будут переупорядочены.$ ls -l /dev/disk/by-id/
total 0 lrwxrwxrwx 1 root root 10 May 27 23:31 ata-WDC_WD2500BEVT-22ZCT0_WD-WXE908VF0470 -> ../../sda lrwxrwxrwx 1 root root 10 May 27 23:31 ata-WDC_WD2500BEVT-22ZCT0_WD-WXE908VF0470-part1 -> ../../sda1 lrwxrwxrwx 1 root root 10 May 27 23:31 ata-WDC_WD2500BEVT-22ZCT0_WD-WXE908VF0470-part2 -> ../../sda2 lrwxrwxrwx 1 root root 10 May 27 23:31 ata-WDC_WD2500BEVT-22ZCT0_WD-WXE908VF0470-part3 -> ../../sda3 lrwxrwxrwx 1 root root 10 May 27 23:31 ata-WDC_WD2500BEVT-22ZCT0_WD-WXE908VF0470-part4 -> ../../sda4 lrwxrwxrwx 1 root root 10 May 27 23:31 mmc-SD32G_0x0040006d -> ../../mmcblk0 lrwxrwxrwx 1 root root 10 May 27 23:31 mmc-SD32G_0x0040006d-part1 -> ../../mmcblk0p1 lrwxrwxrwx 1 root root 10 May 27 23:31 wwn-0x60015ee0000b237f -> ../../sda lrwxrwxrwx 1 root root 10 May 27 23:31 wwn-0x60015ee0000b237f-part1 -> ../../sda1 lrwxrwxrwx 1 root root 10 May 27 23:31 wwn-0x60015ee0000b237f-part2 -> ../../sda2 lrwxrwxrwx 1 root root 10 May 27 23:31 wwn-0x60015ee0000b237f-part3 -> ../../sda3 lrwxrwxrwx 1 root root 10 May 27 23:31 wwn-0x60015ee0000b237f-part4 -> ../../sda4
$ 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 позволяет указывать метки для разделов.
Это похоже на метки файловой системы, но метки разделов не изменяются при изменении файловой системы на разделе.
Все разделы, имеющие метки разделов, указаны в каталоге /dev/disk/by-partlabel
.
$ ls -l /dev/disk/by-partlabel/
total 0 lrwxrwxrwx 1 root root 10 May 27 23:31 EFI\x20system\x20partition -> ../../sda1 lrwxrwxrwx 1 root root 10 May 27 23:31 GNU\x2fLinux -> ../../sda2 lrwxrwxrwx 1 root root 10 May 27 23:31 Home -> ../../sda3 lrwxrwxrwx 1 root root 10 May 27 23:31 Swap -> ../../sda4
Узнать метку раздела можно с помощью lsblk:
$ lsblk -dno PARTLABEL /dev/sda1
EFI system partition
Или blkid:
# blkid -s PARTLABEL -o value /dev/sda1
EFI system partition
- Метки разделов GPT также должны быть разными, чтобы избежать конфликтов. Чтобы изменить метку раздела, вы можете использовать gdisk или cgdisk из пакета gptfdisk. Смотрите Разметка дисков#Инструменты разметки.
- Согласно спецификации, метки разделов GPT могут иметь длину до 72 символов.
by-partuuid
Каждый раздел в GPT имеет свой UUID, не привязанный к файловой системе.
MBR не поддерживает UUID разделов, но Linux[4] и программы, использующие libblkid[5] (например, udev[6]), способны генерировать псевдо-PARTUUID для разделов MBR. Формат — SSSSSSSS-PP
, где SSSSSSSS
— дополненная нулями 32-битная сигнатура диска MBR, а PP
— дополненный нулями номер раздела в шестнадцатеричной форме. В отличие от обычного PARTUUID раздела GPT, псевдо-PARTUUID MBR может измениться при изменении номера раздела.
Динамический каталог аналогичен другим методам и, как в случае с UUID файловой системы, использование UUID разделов предпочтительнее, чем меток.
$ ls -l /dev/disk/by-partuuid/
total 0 lrwxrwxrwx 1 root root 10 May 27 23:31 0003e1e5-01 -> ../../mmcblk0p1 lrwxrwxrwx 1 root root 10 May 27 23:31 039b6c1c-7553-4455-9537-1befbc9fbc5b -> ../../sda4 lrwxrwxrwx 1 root root 10 May 27 23:31 7280201c-fc5d-40f2-a9b2-466611d3d49e -> ../../sda3 lrwxrwxrwx 1 root root 10 May 27 23:31 98a81274-10f7-40db-872a-03df048df366 -> ../../sda2 lrwxrwxrwx 1 root root 10 May 27 23:31 d0d0d110-0a71-4ed6-936a-304969ea36af -> ../../sda1
Узнать UUID раздела можно с помощью lsblk:
$ lsblk -dno PARTUUID /dev/sda1
d0d0d110-0a71-4ed6-936a-304969ea36af
Или blkid:
# blkid -s PARTUUID -o value /dev/sda1
d0d0d110-0a71-4ed6-936a-304969ea36af
Постоянные имена устройств с использованием udev
Смотрите udev (Русский)#Установка постоянных имен устройств.
Использование постоянных имён
Существуют различные приложения, которые можно настроить с использованием постоянных имён. Ниже приведены некоторые примеры их настройки.
fstab
Смотрите fstab (Русский)#Определение файловой системы.
Параметры ядра
Чтобы использовать постоянные имена в параметрах ядра, должны быть выполнены следующие предварительные условия. При стандартной установке в соответствии с руководством по установке оба условия выполняются:
- Используется образ initramfs, в котором есть udev.
- Для mkinitcpio включен хук
udev
илиsystemd
в/etc/mkinitcpio.conf
.
Расположение корневой файловой системы задаётся параметром root
в командной строке ядра. Командная строка ядра настраивается из загрузчика, смотрите Параметры ядра#Настройка. Чтобы перейти к использованию постоянных имён устройств, измените те параметры, которые определяют блочные устройства, например root
и resume
, оставив остальные параметры как есть. Поддерживаются различные схемы именования:
C использованием метки и формата LABEL=
, в этом примере Arch Linux
— это метка корневой файловой системы.
root="LABEL=Arch Linux"
С использованием UUID и формата UUID=
, в этом примере 0a3407de-014b-458b-b5c1-848e92a327a3
— это UUID корневой файловой системы.
root=UUID=0a3407de-014b-458b-b5c1-848e92a327a3
С использованием id диска и пути в /dev
, в данном примере wwn-0x60015ee0000b237f-part2
— это id корневого раздела.
root=/dev/disk/by-id/wwn-0x60015ee0000b237f-part2
С использованием UUID разделов GPT и формата PARTUUID=
, в данном примере 98a81274-10f7-40db-872a-03df048df366
— это PARTUUID корневого раздела.
root=PARTUUID=98a81274-10f7-40db-872a-03df048df366
С использованием меток разделов GPT и формата PARTLABEL=
, в данном примере GNU/Linux
— это метка корневого раздела.
root="PARTLABEL=GNU/Linux"