Fstab

UUID

Постоянные именования (persistent naming) в обозначении блочных устройств стали возможным с появлением udev и предоставляют несколько преимуществ по сравнению с наименованиями на базе Bus таких как /dev/hda1 или /dev/sda2.

Развитие Linux дистрибутивов и udev сделало более надежным опознавание аппаратных средств, но одновременно с этим поставило необходимость решения ряда новых вопросов:

Порядок подключения при наличии более чем одного контроллера SATA/SCSI или простых контроллеров IDE становится случайным. Как следствие имена одного и того же устройств вида hdx/hdy или sdx/sdy случайно чередуются после каждой загрузки.Использование постоянных именований позволяет больше не беспокоиться об этом. Для машин с контролёрами IDE (включая, например, машины со всеми жёсткими дисками SATA и только одним IDE cdrom), переход на стандартное ядро Squeeze может вызвать проблемы: с введением поддержки новой libata PATA, устройство IDE hdX станет устройством sdX. Опять же, если используется постоянное именование, этого даже не будет заметно. (postinst для пакета linux-base содержит код помогающий с переходом, но сначала имеет смысл получить представление и заранее понять как это работает.) На больших машинах, с большим количеством CPU и Fiber Channel Host Bus Adapters, FC коммутаторами с переменной нагрузкой/задержкой, контролёрами SCSI, и/или высокопроизводительными сетевыми картами, могут возникнуть проблемы с синхронизацией при работе с udev и многолучевым I/O, из за почти непредсказуемого порядка определения устройств и автоматического назначения имен в процессе загрузки. Существуют и другие причины. Но перечисленные - наиболее важны как в настоящий время, так и в ближайшем будущем. Поэтому Debian рекомендует использование схемы наименования блочных устройств с постоянными именами.

Схемы для постоянных наименований

Посредством UUIDs UUID является механизмом присвоения уникальных обозначений каждой файловой системе. Все файловые системы Linux включая swap, поддерживают UUID; файловые системы FAT и NTFS не поддерживают верный UUID, но перечислены в /dev/disk/by-uuid с уникальным идентификатором:

$ ls -l /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 10 Oct 16 10:27 2d781b26-0285-421a-b9d0-d4a0d3b55680 -> ../../sda1
lrwxrwxrwx 1 root root 10 Oct 16 10:27 31f8eb0d-612b-4805-835e-0e6d8b8c5591 -> ../../sda7
lrwxrwxrwx 1 root root 10 Oct 16 10:27 3FC2-3DDB -> ../../sda6
lrwxrwxrwx 1 root root 10 Oct 16 10:27 5090093f-e023-4a93-b2b6-8a9568dd23dc -> ../../sda2
lrwxrwxrwx 1 root root 10 Oct 16 10:27 912c7844-5430-4eea-b55c-e23f8959a8ee -> ../../sda5
lrwxrwxrwx 1 root root 10 Oct 16 10:27 B0DC1977DC193954 -> ../../sdb1
lrwxrwxrwx 1 root root 10 Oct 16 10:27 bae98338-ec29-4beb-aacf-107e44599b2e -> ../../sdb2

Как видите, разделы файловыми системами FAT и NTSF имеют короткие имена (sda6 и sdb1), но всё равно показаны в uuid. Смысл 32-х разрядных base-62 строк состоит в том, чтобы сделать вероятность совпадения идентификаторов ничтожно малой; если всё случается, что sda1 и sda2 имеют одинаковый UUID система может не загрузиться (или использовать последний найденный идентификатор как основной).

Посредством Меток (Labels)

Практически каждый тип файловой системы может иметь метку. Разделы с меткой находят в каталоге /dev/disk/by-label:

$ ls -l /dev/disk/by-label
lrwxrwxrwx 1 root root 10 Oct 16 10:27 data -> ../../sdb2
lrwxrwxrwx 1 root root 10 Oct 16 10:27 data2 -> ../../sda2
lrwxrwxrwx 1 root root 10 Oct 16 10:27 fat -> ../../sda6
lrwxrwxrwx 1 root root 10 Oct 16 10:27 home -> ../../sda7
lrwxrwxrwx 1 root root 10 Oct 16 10:27 root -> ../../sda1
lrwxrwxrwx 1 root root 10 Oct 16 10:27 swap -> ../../sda5
lrwxrwxrwx 1 root root 10 Oct 16 10:27 windows -> ../../sdb1

Так как в качестве меток используются повторяющиеся имена, нужно быть предельно внимательным, чтобы избежать путаницы; также учитывать тот факт, что при перезагрузке устройства USB/firewire подключены могут быть по-разному.

Обозначение метки может изменяться следующими командами:

Type	Command	Notes
EXT3:	e2label /dev/XXX <label>	также верно и для EXT2/EXT4
FAT/VFAT:	dosfslabel /dev/XXX <label>	bug #506786 в Lenny; или mlabel в утилитах mtools
JFS:	jfs_tune -L <label> /dev/XXX
NTFS:	ntfslabel /dev/XXX <label>	или изменить из-под Windows
ReiserFS:	reiserfstune -l <label> /dev/XXX
swap:	mkswap -L <label> /dev/XXX	также см. ниже для swapoff /swapon команд
XFS:	xfs_admin -L <label> /dev/XXX

Посредством Hardware ID

by-id создает уникальное имя на основе апаратного серийного номера. Они предназначены чтобы быть неизменными для данной аппаратной конфигурации.

# ls -l /dev/disk/by-id/
итого 0
drwxr-xr-x 2 root root 440 фев 1 17:19 .
drwxr-xr-x 5 root root 100 ноя 24 20:22 ..
lrwxrwxrwx 1 root root 9 фев 1 17:19 ata-SAMSUNG_HD204UI_S2H7J9FZC03394 -> ../../sdb
lrwxrwxrwx 1 root root 10 фев 1 17:19 ata-SAMSUNG_HD204UI_S2H7J9FZC03394-part1 -> ../../sdb1
lrwxrwxrwx 1 root root 16 ноя 21 01:17 cciss-3600508b10010463956563832464f0003 -> ../../cciss/c0d1
lrwxrwxrwx 1 root root 18 фев 1 17:14 cciss-3600508b10010463956563832464f0003-part1 -> ../../cciss/c0d1p1
lrwxrwxrwx 1 root root 18 ноя 21 01:17 cciss-3600508b10010463956563832464f0003-part2 -> ../../cciss/c0d1p2
lrwxrwxrwx 1 root root 18 ноя 21 01:17 cciss-3600508b10010463956563832464f0003-part5 -> ../../cciss/c0d1p5
lrwxrwxrwx 1 root root 16 дек 20 03:44 cciss-3600508b10010463956563832464f0005 -> ../../cciss/c0d0
lrwxrwxrwx 1 root root 18 ноя 21 01:17 cciss-3600508b10010463956563832464f0005-part1 -> ../../cciss/c0d0p1
lrwxrwxrwx 1 root root 18 ноя 21 01:17 cciss-3600508b10010463956563832464f0005-part2 -> ../../cciss/c0d0p2
lrwxrwxrwx 1 root root 18 ноя 21 01:17 cciss-3600508b10010463956563832464f0005-part5 -> ../../cciss/c0d0p5
lrwxrwxrwx 1 root root 9 фев 1 17:19 wwn-0x50024e9203f46cb7 -> ../../sdb
lrwxrwxrwx 1 root root 10 фев 1 17:19 wwn-0x50024e9203f46cb7-part1 -> ../../sdb1
lrwxrwxrwx 1 root root 16 ноя 21 01:17 wwn-0x600508b10010463956563832464f0003 -> ../../cciss/c0d1
lrwxrwxrwx 1 root root 18 фев 1 17:14 wwn-0x600508b10010463956563832464f0003-part1 -> ../../cciss/c0d1p1
lrwxrwxrwx 1 root root 18 ноя 21 01:17 wwn-0x600508b10010463956563832464f0003-part2 -> ../../cciss/c0d1p2
lrwxrwxrwx 1 root root 18 ноя 21 01:17 wwn-0x600508b10010463956563832464f0003-part5 -> ../../cciss/c0d1p5
lrwxrwxrwx 1 root root 16 дек 20 03:44 wwn-0x600508b10010463956563832464f0005 -> ../../cciss/c0d0
lrwxrwxrwx 1 root root 18 ноя 21 01:17 wwn-0x600508b10010463956563832464f0005-part1 -> ../../cciss/c0d0p1
lrwxrwxrwx 1 root root 18 ноя 21 01:17 wwn-0x600508b10010463956563832464f0005-part2 -> ../../cciss/c0d0p2
lrwxrwxrwx 1 root root 18 ноя 21 01:17 wwn-0x600508b10010463956563832464f0005-part5 -> ../../cciss/c0d0p5

Посредством sysfs Paths

by-path создает единственное обозначение на основе самого короткого физического пути (по sysfs). Оба вышеупомянутых метода содержат строки символов, которые снимают показания, к какой подсистеме они принадлежат, и таким образом не подходят, для решения выше упомянутых проблем и здесь в дальнейшем не обсуждаются.

Подготовка для постоянных именований

Для просмотра вновь созданных, или любых других доступных для монтирования разделов жесткого диска выполните:

$ ls -lR /dev/disk

также есть более удобная команда blkid (которая находится в /sbin, но не требует привилегий root) дающая более удобный вывод:

$ /sbin/blkid
/dev/sda1: LABEL=Root UUID="87f2b245-6ab3-4021-bf07-d069b4d387a1" TYPE="ext3"
/dev/sda2: TYPE="swap"
/dev/sda3: LABEL=Home UUID="a6f7a63f-71ac-4361-b49a-39d62b06f18a" TYPE="ext3"

Как видно, раздел swap здесь не имеет UUID или label; инсталлер Debian Lenny использует версию partman которая не делает раздел swap. Тем не менее, разделу подкачки может быть дано "постоянное имя" через mkswap.

Назначение постоянных имен для раздела Swap Сначала, необходимо чётко убедиться в том, что раздел подкачки определён верно (см. /proc/swaps)! Затем (от имени суперпользователя - root) отмонтировать существующий раздел подкачки, пересоздать его (тут можно добавить также и метку), и вновь примонтировать/запустить, примерно таким образом:

# swapoff /dev/sda2
# mkswap -L Swap /dev/sda2
Setting up swapspace version 1, size = 1998737 kB
LABEL=Swap, UUID=7cdfeb21-613b-4588-abb5-9d4049854e9a
# swapon /dev/sda2
Результат можно проверить от имени обычного пользователя:
$ /sbin/blkid
/dev/sda1: LABEL=Root UUID="87f2b245-6ab3-4021-bf07-d069b4d387a1" TYPE="ext3"
/dev/sda2: LABEL=Swap UUID="7cdfeb21-613b-4588-abb5-9d4049854e9a" TYPE="swap"
/dev/sda3: LABEL=Home UUID="a6f7a63f-71ac-4361-b49a-39d62b06f18a" TYPE="ext3"
$ free
total used free shared buffers cached
Mem: 33017956 298700 32719256 0 17060 148668
-/+ buffers/cache: 132972 32884984
Swap: 1951888 0 1951888

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

Выбрав-таки наиболее удобный способ именования устройств, можно приступить к использованию постоянных именований в системе:

В fstab Включение постоянных имён в /etc/fstab легко: для каждой файловой системы в файле fstab нужно заменить имя устройства в первом столбце (где указано что-то вроде /dev/sda7) на постоянное имя. Это делается путём замены соответствующих путей в /dev/disk, примерно так:

/dev/disk/by-label/home

или

/dev/disk/by-uuid/31f8eb0d-612b-4805-835e-0e6d8b8c5591

Тем не менее, вместо задания явных путей в /dev/disk, обычно рекомендуется использовать ключевые слова LABEL=<label> или UUID=<uuid> для монтирования файловых систем, например:

LABEL=home

или

UUID=31f8eb0d-612b-4805-835e-0e6d8b8c5591