В предыдущей статье мы говорили о файле /etc/fstab и о том, как он используется для объявления файловых систем, которые должны быть смонтированы при загрузке.
В эпоху до появления Systemd файловая система монтировалась в порядке, указанном в файле /etc/fstab; в современных дистрибутивах Linux для ускорения загрузки файловая система монтируется параллельно.
Systemd управляет монтированием файловых систем с помощью специально разработанных блоков, автоматически генерируемых из записей /etc/fstab.
По этим причинам для установления зависимости между двумя файловыми системами и, следовательно, для установления правильного порядка их монтирования необходимо использовать другую стратегию.
В этом руководстве мы рассмотрим, как установить явную зависимость между двумя файловыми системами и задать порядок их монтирования в современных дистрибутивах Linux.
Блоки “монтирования” Systemd
Systemd – это система инициализации, принятая практически во всех основных дистрибутивах Linux.
Systemd делает гораздо больше, чем просто управление инициализацией системы в традиционном смысле.
В современных дистрибутивах Linux она также управляет монтированием файловой системы с помощью блоков “mount”, которые похожи на блоки “service”, используемые для управления службами.
Традиционный способ задать, какие файловые системы должны монтироваться при загрузке, заключался в использовании файла fstab.
Хотя этот метод все еще работает, под капотом записи fstab преобразуются в блоки монтирования systemd-fstab-generator и “хранятся” в каталоге /run/systemd/generator.
Анатомия блока монтирования
Блоки монтирования имеют суффикс “.mount” и должны быть названы в честь точки монтирования, которой они управляют.
Например, блок, используемый для монтирования файловой системы, которая должна быть смонтирована в каталоге /home, должен иметь имя “home.mount”.
Рассмотрим пример создания блоков монтирования на основе записей в fstab.
В файле /etc/fstab я настроил монтирование файловой системы в каталоге /home:
/dev/sda3 /home ext4 defaults 1 2
В данном примере файловая система была создана на разделе /dev/sda3.
Это файловая система “ext4”, настроенная для монтирования в /home с параметрами “по умолчанию”.
Ниже показан соответствующий блок “.mount”, сгенерированный systemd-fstab-generator как /run/systemd/generator/home.mount:
# Automatically generated by systemd-fstab-generator [Unit] Documentation=man:fstab(5) man:systemd-fstab-generator(8) SourcePath=/etc/fstab Before=local-fs.target Requires=systemd-fsck@dev-sda3.service After=systemd-fsck@dev-sda3.service After=blockdev@dev-sda3.target [Mount] What=/dev/sda3 Where=/home Type=ext4
Первое, что мы видим в файле, это комментарий, в котором говорится, что блок был сгенерирован автоматически systemd-fstab-generator.
Мы можем заметить, что блок состоит из двух разделов: [Unit] и [Mount].
[Unit] содержит общую информацию о блоке: она является общей для всех типов блоков systemd.
Ключевое слово Documentation используется для ссылки на документацию, связанную с блоком (в данном случае на man-страницу fstab и system-fstab-generator).
Ключевое слово SourcePath вместо этого используется для ссылки на источник, из которого был сгенерирован блок, которым в данном случае является файл /etc/fstab.
Ключевые слова Before, After и Requires используются для установления зависимостей блоков и их порядка. Например, с помощью Before=local-fs.target устанавливается, что прежде чем система сможет добраться до “local-fs.target”, блок должен быть выполнен (ключевое слово After работает наоборот: чтобы блок был запущен, упомянутые блоки должны быть полностью запущены).
[Mount] специфична для блоков “.mount”.
В этом случае она содержит три ключевых слова: What, Where и Type.
Первое ключевое слово используется для ссылки на полный путь ресурса, который должен быть смонтирован, второе принимает в качестве значения абсолютный путь точки монтирования, куда должен быть смонтирован ресурс; третье используется для указания типа файловой системы.
Установка зависимостей и порядка монтирования в /etc/fstab
В каких случаях мы можем захотеть установить зависимость между двумя файловыми системами?
Предположим, у нас есть файловая система, которую мы монтируем в каталоге /home, и другая, содержащая данные конкретного пользователя, которую мы хотим смонтировать в подкаталоге его дома (например: /home/egdoc/data).
Такая установка устанавливает “зависимость” между двумя файловыми системами, поскольку для успешного монтирования второй необходимо, чтобы первая уже была смонтирована.
В данном случае, поскольку вторая точка монтирования находится под первой, мы не должны делать ничего особенного.
Systemd достаточно умна, чтобы установить зависимость между двумя файловыми системами, поэтому в файле fstab мы просто напишем:
/dev/sda3 /home ext4 defaults 1 2 /dev/sda4 /home/egdoc/data ext4 defaults 1 2
Что если мы хотим явно установить зависимость между двумя файловыми системами с “неродными” точками монтирования?
Для решения этой задачи мы должны использовать опцию x-systemd.requires-mounts-for.
Эта опция принимает абсолютный путь в качестве значения и устанавливает зависимость между файловой системой, для которой она используется, и файловой системой, используемой для точки монтирования, переданной в качестве значения.
Рассмотрим пример.
Предположим, по какой-то причине мы хотим, чтобы файловая система, смонтированная на /home, монтировалась после той, что смонтирована на /boot (которая, как мы предполагаем ниже, находится на разделе /dev/sda2). В файле /etc/fstab мы напишем:
/dev/sda2 /boot ext4 defaults 1 2 /dev/sda3 /home ext4 defaults,x-systemd.requires-mounts-for=/boot 1 2
Чтобы узлы монтирования systemd были восстановлены немедленно, мы можем выполнить команду:
$ sudo systemctl daemon-reload
На данный момент, если мы посмотрим на блок /run/systemd/generator/home.mount, мы увидим, что опция RequiresMountsFor=/boot была включена в строфу [Unit]:
# Automatically generated by systemd-fstab-generator [Unit] Documentation=man:fstab(5) man:systemd-fstab-generator(8) SourcePath=/etc/fstab RequiresMountsFor=/boot Before=local-fs.target Requires=systemd-fsck@dev-sda3.service After=systemd-fsck@dev-sda3.service After=blockdev@dev-sda3.target [Mount] What=/dev/sda3 Where=/home Type=ext4 Options=defaults,x-systemd.requires-mounts-for=/boot
Заключение
В настоящее время почти каждый крупный дистрибутив Linux (не без противоречий) принял Systemd в качестве системы инициализации.
Один из самых больших упреков в адрес Systemd заключается в том, что он делает гораздо больше, чем просто управляет инициализацией системы.
В данном случае мы увидели, как она управляет также монтированием файловых систем при загрузке, с помощью специальных блоков, которые могут быть написаны с нуля или сгенерированы автоматически из традиционного файла /etc/fstab.
Поскольку монтирование файловой системы при загрузке происходит не последовательно, в этом руководстве мы рассмотрели, как объявить зависимость между двумя файловыми системами и установить их правильный порядок монтирования с помощью опции x-systemd.requires-mounts-for.
см. также:
- Как проверить файл fstab в Linux
- 🐧 Команда Blkid на Linux для поиска подробной информации об устройствах
- 🐧 Как определить тип файловой системы точки монтирования
- 🐧 Как преобразовать каталог в раздел в Linux
- 🐧 Как изменить или переименовать точку монтирования на Linux
- 🐧 Как добавить swap на серверах Linux (CentOS/RHEL) на лету
- 🐧 Как удалить раздел диска с помощью команды Parted