Persistent block device naming (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Persistent block device naming. Дата последней синхронизации: 9 января 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Эта статья описывает, как использовать постоянные имена для ваших блочных устройств. Это стало возможным благодаря введению 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 "новая метка" с помощью dosfstools
mlabel -i /dev/XXX ::"новая метка" с помощью mtools
exfat
tune.exfat -L "новая метка" /dev/XXX с помощью exfatprogs
exfatlabel /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, и файлы конфигурации придётся обновлять вручную.

Совет: Если вашему разделу подкачки не назначен UUID, нужно будет сбросить его с помощью mkswap.

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

Примечание: Этот метод касается только дисков с таблицей разделов GUID (GPT).

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"