🐧 Как установить порядок монтирования файловых систем в современных дистрибутивах Linux

Автор: | Август 5, 2022

В предыдущей статье мы говорили о файле /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.

см. также:

 

Поделитесь статьей:

Добавить комментарий

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