Оглавление
1. Как сделать так, чтобы диски и USB флешки имели одинаковые имена
2. Постоянные имена блочных устройств
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'.
Смотрите также:
- Всё о монтировании: от системного администрирования до IT криминалистики
- Как в VirtualBox загрузиться с USB
Использование постоянных имён в таблице файловых систем /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.
Связанные статьи:
- Файловая система в оперативной памяти для ускорения работы с файлами и уменьшения нагрузки на диск (tmpfs) (74.4%)
- Как в Linux подключить новый диск, разметить и отформатировать разделы (64.5%)
- 8 способов определить тип файловой системы в Linux (Ext2, Ext3 или Ext4, FAT32, NTFS) (63.1%)
- Как использовать Udev для обнаружения устройств и управления ими в Linux (55.4%)
- Как проверить, использует ли компьютер BIOS или UEFI; загрузчик GRUB или systemd-boot; таблицу разделов MBR или GPT (55.4%)
- При установке пакетов лучше указывать только главный пакет или все его зависимости? (RANDOM - 15.7%)