Jump to content

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

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

Ссылки по теме

- fstab (Русский)
- udev (Русский)
- LVM

Эта статья описывает, как использовать постоянные имена для ваших блочных устройств. Это стало возможным благодаря введению 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` с помощью reiserfsprogsAUR
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"

Categories:

- Boot process (Русский)
- File systems (Русский)
- Hardware detection and troubleshooting (Русский)

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