zaLinux.ru

Постоянные имена для блочных устройств


Оглавление

1. Как сделать так, чтобы диски и USB флешки имели одинаковые имена

2. Постоянные имена блочных устройств

2.1 by-label

2.2 by-uuid

2.3 by-id

2.4 by-path

2.5 by-partlabel

2.6 by-partuuid

3. Использование постоянных имён

3.1 Постоянные имена блочных устройств можно использовать как псевдонимы /dev/sdX

3.2 Использование постоянных имён в таблице файловых систем /etc/fstab

Заключение


Как сделать так, чтобы диски и USB флешки имели одинаковые имена

Под блочными устройствами подразумеваются жёсткие диски, SSD, USB флешки и диски, а также карты памяти.

В Linux присутствуют только блочные устройства, то есть данные в них считываются и записываются блоками, в противовес символьным устройствам, в которых данные могут быть считаны или записаны отдельными символами. Файлы символьных устройств используются для небуферизованного обмена данными. В Linux, чтобы получить символьное устройство для диска, необходимо использовать «raw» (необработанный) драйвер, хотя можно получить тот же эффект, что и при открытии символьного устройства, открыв блочное устройство с помощью специфичного для Linux флага O_DIRECT.

Предыдущая информация дана только для того, чтобы вы понимали, что «диски» и «блочные устройства» это одно и то же для целей данной статьи.

Внутренние и внешние диски, а также USB флешки имеют имена вида /dev/sdX, где вместо X подставляется буква a, b, c и так далее, например: /dev/sda и /dev/sdb.

Имена устройств NVM Express (NVMe) начинаются с nvme, например, /dev/nvme0n1.

Если на вашем компьютере несколько контроллеров дисков SATA, SCSI или IDE, порядок добавления соответствующих узлов устройств является произвольным. Это может привести к тому, что имена устройств, такие как /dev/sda и /dev/sdb, будут меняться друг с другом при каждой загрузке, что приведёт к невозможности загрузки системы. Также назначение одному и тому же диску одинакового имя может иметь значение для обработке их в скриптах или при другом использовании когда важно, чтобы блочное устройство имело одинаковое имя.

Обзор блочных устройств:

lsblk -f


На самом деле Linux «из коробки» предусматривает возможность индивидуализации дисков — не требуется дополнительная настройка или установка утилит. Проблема в том, что отличить один диск от другого (особенно после форматирования) это не всегда простая задача, поэтому, с одной стороны, однозначного единственного решения нет, но с другой стороны предлагается сразу несколько вариантов, среди которых вы можете выбрать наиболее подходящий.

Суть в следующем, кроме имён вида /dev/sd* к которым привыкли большинство пользователей, имеется ещё четыре схемы постоянного наименования, все они представлены в виде ссылок в директориях:

  • /dev/disk/by-label
  • /dev/disk/by-uuid
  • /dev/disk/by-id
  • /dev/disk/by-path

Директории и файлы в /dev/disk/ создаются и уничтожаются динамически, в зависимости от того, есть ли в них устройства или нет. То есть это означает, что какие-то из этих директорий могут отсутствовать в вашей системе, либо присутствовать только после подключения определённых устройств (дисков).

Кстати, данная статья не имеет отношения к логическим томам LVM поскольку пути устройств вида /dev/ИмяГруппыТома/ИмяЛогическогоТома являются постоянными

Смотрите также: Что такое LVM и для чего он используется?

Постоянные имена блочных устройств

by-label

Почти каждый тип файловой системы может иметь 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

Достоинства данного способа уникализации диска и получения постоянного имени:

  • вы сами выбираете имя по которому сможете обращаться к диску

Недостатки:


  • метка теряется при форматировании и создании новой файловой системы
  • по умолчанию, если это не было указано при создании файловой системы, большинство дисков и разделов не имеют меток
  • метка относится к файловой системе, то есть невозможно создать метку применительно ко всему диску, если он разбит на разделы
  • невозможно создать метку для диска без файловой системы

Большинство файловых систем поддерживают настройку метки во время создания файловой системы, подробности вы сможете найти на странице man соответствующей утилиты mkfs.*. Для некоторых файловых систем можно изменить метки, ниже показано несколько методов изменения меток на популярных файловых системах:

  • swap

Использует пакет: util-linux. Команда для смены метки диска или раздела:

swaplabel -L "new label" /dev/XXX
  • ext2/3/4

Использует пакет: e2fsprogs. Команда для смены метки диска или раздела:

e2label /dev/XXX "new label"
  • btrfs

Использует пакет: btrfs-progs. Команда для смены метки диска или раздела:

btrfs filesystem label /dev/XXX "new label"
  • reiserfs

Использует пакет: reiserfsprogs. Команда для смены метки диска или раздела:

reiserfstune -l "new label" /dev/XXX
  • jfs

Использует пакет: jfsutils. Команда для смены метки диска или раздела:

jfs_tune -L "new label" /dev/XXX
  • xfs

Использует пакет: xfsprogs. Команда для смены метки диска или раздела:

xfs_admin -L "new label" /dev/XXX
  • fat/vfat

Использует пакет: dosfstools. Команда для смены метки диска или раздела:

fatlabel /dev/XXX "new label"

Использует пакет: mtools. Команда для смены метки диска или раздела:

mlabel -i /dev/XXX ::"new label"
  • exfat

Использует пакет: exfatprogs. Команда для смены метки диска или раздела:

tune.exfat -L "new label" /dev/XXX

Использует пакет: exfatprogs или exfat-utils. Команда для смены метки диска или раздела:

exfatlabel /dev/XXX "new label"
  • ntfs

Использует пакет: ntfs-3g. Команда для смены метки диска или раздела:

ntfslabel /dev/XXX "new label"
  • udf

Использует пакет: udftools. Команда для смены метки диска или раздела:

udflabel /dev/XXX "new label"
  • crypto_LUKS (только LUKS2)

Использует пакет: cryptsetup. Команда для смены метки диска или раздела:

cryptsetup config --label="new label" /dev/XXX

Метку устройства можно посмотреть с lsblk:

lsblk -dno LABEL /dev/sda2

Или с blkid:

sudo blkid -s LABEL -o value /dev/sda2

Примечания:

  • Для смены метки файловая система не должны быть смонтирована. Для корневой файловой системы этого можно достичь загрузившись с другого тома (с Live системы, например).
  • Метки должны быть разными для всех разделов чтобы избежать возможных конфликтов.
  • Метки могут быть длиной до 16 символов.
  • Поскольку метка является свойством файловой системы, она не подходит для постоянной адресации единичного устройства в RAID массиве.
  • При использовании зашифрованных контейнеров с dm-crypt метки файловых систем внутри контейнеров недоступны, пока контейнер заблокирован/зашифрован.

by-uuid

UUID — это механизм, позволяющий присвоить каждой файловой системе уникальный идентификатор. Эти идентификаторы генерируются утилитами файловой системы (например, mkfs.*) при форматировании устройства и спроектированы таким образом, что коллизии маловероятны. Все файловые системы GNU/Linux (включая заголовки swap и LUKS необработанных зашифрованных устройств) поддерживают UUID. Файловые системы FAT, exFAT и NTFS не поддерживают UUID, но всё равно перечислены в /dev/disk/by-uuid/ с более коротким UID (уникальным идентификатором):


ls -l /dev/disk/by-uuid/

UUID диска (если раздел один) можно получить с помощью lsblk:


lsblk -dno UUID /dev/sda
aad9d8d7-b1b9-435a-9e41-fc8159d2c484

Если разделов несколько, то нужно указать номер раздела:

lsblk -dno UUID /dev/nvme0n1p1
7327-B4E4

Для диска в целом отсутствует UUID если диск содержит несколько разделов. Также UUID отсутствует для дисков и разделов без файловых систем.

Преимущество использования метода UUID состоит в том, что конфликты имён гораздо менее вероятны, чем с метками. Ещё он генерируется автоматически при создании файловой системы. Например, он останется уникальным, даже если устройство подключено к другой системе (которая, возможно, может иметь устройство с такой же меткой).

Недостатком является то, что UUID является трудным для восприятия человеком и портят форматирование во многих файлах конфигурации (например, fstab или crypttab). Кроме того, каждый раз, когда том переформатируется, создаётся новый UUID, и файлы конфигурации необходимо настраивать вручную.

Совет:

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

by-id

by-id создаёт уникальное имя в зависимости от серийного номера оборудования. Содержит строку, указывающую, к какой подсистеме принадлежит устройство (например ata-, nvme-, usb- или wwn- для by-id), поэтому связан с оборудованием, управляющим устройством.

Пример by-id для USB флешки: /dev/disk/by-id/usb-Samsung_Flash_Drive_0325121050019952-0:0

Этот идентификатор будет постоянным даже если отформатировать файловую систему. Таким образом, его можно использовать для обращения к RAW (необработанным) файловым устройствам.

by-id также создаёт ссылки World Wide Name для устройств хранения, которые его поддерживают. В отличие от других ссылок по идентификатору, WWN полностью постоянны и не меняются в зависимости от используемой подсистемы.

by-id изменится, когда устройство подключено к порту аппаратного контроллера, подчинённого другой подсистеме. Имеется ввиду, что если устройство подключить как USB или как SATA, то его by-id поменяется.

by-path

by-path создаёт уникальное имя в зависимости от кратчайшего физического пути (согласно sysfs).

Значение by-path для файлового устройства поменяется если переключить его из одного гнезда в другое. При этом для одного гнезда значение by-path остаётся постоянным.

by-partlabel

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

Метки разделов 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:

sudo blkid -s PARTLABEL -o value /dev/sda1
EFI system partition

Примечания:

  • Метки разделов GPT также должны быть разными, чтобы избежать конфликтов. Чтобы изменить метку раздела, вы можете использовать gdisk или версию cgdisk для ncurses. Оба доступны в пакете gptfdisk.
  • Согласно спецификации, метки разделов GPT могут иметь длину до 72 символов.
  • Значение by-partlabel будет сброшено при удалении разметки GPT.

by-partuuid

Как и метки разделов GPT, UUID разделов GPT определяются в записи раздела на дисках GPT.

MBR не поддерживает UUID разделов, но Linux и программное обеспечение, использующее libblkid (например, udev), способны генерировать псевдо PARTUUID для разделов MBR. Форматом является SSSSSSSS-PP, где SSSSSSSS — это 32-битная подпись диска MBR с нулевым заполнением, а PP — номер раздела с нулевым заполнением в шестнадцатеричной форме. В отличие от обычного PARTUUID раздела GPT, псевдо PARTUUID MBR может измениться при изменении номера раздела.

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:

sudo blkid -s PARTUUID -o value /dev/sda1
d0d0d110-0a71-4ed6-936a-304969ea36af

Использование постоянных имён

Постоянные имена блочных устройств можно использовать как псевдонимы /dev/sdX

Постоянные имена вы можете использовать точно также как и имена /dev/sdX. То есть в программах по работе с блочными устройствами, такими как mount, umount, fdisk, gdisk, VBoxManage и другими вы можете использовать одно из постоянных имён вместо имени /dev/sdX.

Пример размонтирования диска по его by-id:

sudo umount '/dev/disk/by-id/usb-Samsung_Flash_Drive_0325121050019952-0:0-part2'

Пример получения информации о разделах диска по его by-id:

fdisk -l '/dev/disk/by-id/usb-Samsung_Flash_Drive_0325121050019952-0:0'

Пример создания файла виртуального диска, указывающее на реальный диск по его by-id:

VBoxManage internalcommands createrawvmdk -filename flash.vmdk -rawdisk '/dev/disk/by-id/usb-Samsung_Flash_Drive_0325121050019952-0:0'

Обратите внимание, что недостаточно указать только идентификатор, например usb-Samsung_Flash_Drive_0325121050019952-0:0, необходимо указать полное имя вида /dev/disk/by-*, например '/dev/disk/by-id/usb-Samsung_Flash_Drive_0325121050019952-0:0'.

Смотрите также:

Использование постоянных имён в таблице файловых систем /etc/fstab

В файле /etc/fstab также можно использовать постоянные имена дисковых устройств, но нужно явно указывать, какой именно псевдоним диска используется.

Вместо имени устройства можно указать LABEL=МЕТКА или UUID=ИДЕНТИФИКАТОР. Это рекомендуемый метод, поскольку имена устройств часто совпадают с порядком обнаружения оборудования и могут измениться при добавлении или удалении других дисков. Например, «LABEL=Boot» или «UUID=3e6be9de-8139-11d1-9106-a43f08d823a6». (Используйте инструмент, специфичный для файловой системы, например e2label, xfs_admin или fatlabel, чтобы установить МЕТКУ в файловых системах).

Также можно использовать ARTUUID= и PARTLABEL=. Эти идентификаторы разделов поддерживаются, например, для таблицы разделов GUID (GPT).

Пример файла /etc/fstab с использованием UUID (в комментариях указаны привычные имена дисковых устройств):

# /dev/nvme0n1p2
UUID=01e4d4f5-698f-4dc2-987b-270499457f48	/         	ext4      	rw,relatime	0 1

# /dev/nvme0n1p1
UUID=7327-B4E4      	/boot     	vfat      	rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro	0 2
/dev/sda   /mnt/disk_d  ext4    rw,relatime 0   2

# /dev/sdc1 1.5 ТБ внешний USB
UUID=26FC3023FC2FEC2D	/mnt/disk_e	ntfs	noauto,nofail,rw,utf8	0	0

Обратите внимание, что не нужно указывать полное имя вида /dev/disk/by-*.

Заключение

Итак, для большинства применений не требующих форматирования и создания новых файловых систем подходят постоянные имена (псевдонимы) из директорий /dev/disk/by-label и /dev/disk/by-uuid.

Если вам нужно использовать диск как RAW (необработанное) устройство, то есть не полагаясь на его файловые системы, то подойдёт псевдонимы из директории /dev/disk/by-id.


Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *