Добрый день дорогой читатель, данное повествование не является
истиной в последней инстанции, это некая инструкция (хотя написана больше в справочном формате) по написанию Unit'ов монтирования файловых систем для системы инициализации SystemD (в основном для собственного пользования) на Arch Linux с пояснениями и все возможными мыслями. Действия справедливы и к другим дистрибутивам на вышеупомянутой системе инициализации.
Mount unit в systemd - это файл конфигурации (обычно с расширением .mount), который описывает, как монтировать файловую систему в указанную директорию. Systemd автоматически генерирует такие unit'ы для записей в /etc/fstab, но можно создавать собственные для ручного управления монтированием (например, для динамических устройств или специфических настроек). Это полезно для автоматизации монтирования дисков, разделов или сетевых ресурсов при загрузке системы или по требованию.
Mount unit'ы управляются через те же команды что и сервисы (.service). Они интегрируются с другими unit'ами (например, зависимостями от сервисов).
Расположение Mount Unit
- /etc/systemd/system/ - пользовательские
- /run/systemd/generator/ - генерируется на основе /etc/fstab Имя файла должно соответствовать пути монтирования: например, для /mnt/data будет mnt-data.mount (замените / на -, и удалите ведущий -).
Структура Mount Unit аналогична Service Unit за исключением второй секции:
- [Unit]: Общие настройки (описание, зависимости).
- [Mount]: Специфические директивы монтирования.
- [Install]: Для активации при загрузке.
Секции [Unit] и [Install] одинаковы как у unit типа .service заострять на них внимание не будем.
Секция [Mount]
Ниже приведён список основных директив, которые можно использовать в разделе [Mount] systemd unit типа .mount. Эти директивы определяют, как именно будет происходить монтирование файловой системы. Перейдем к директивам:
- What= - Устройство или ресурс, который нужно смонтировать. Это может быть путь к устройству, UUID, LABEL, сетевой ресурс и т.п. Обязательная директива, указывает источник.
Например: /dev/sdb1, UUID=1234-ABCD, server:/export - Where= - Точка монтирования - директория, куда будет монтироваться файловая система. Обязательная директива, указывает точку монтирования.
Например: /mnt/data - Type= - Тип файловой системы (файловая система, которую нужно смонтировать). Если не указан, systemd пытается определить автоматически.
Например: ext4, btrfs, nfs, tmpfs - Options= - Опции монтирования, аналогичные тем, что указываются в команде mount или в /etc/fstab. Можно указывать несколько опций через запятую, обратите внимание после запятых пробелов нет.
Например: defaults,noatime,ro,noexec - DirectoryMode= - Права доступа к точке монтирования, если systemd создаёт директорию автоматически. Формат восьмеричный (октальный). Полезно при автоматическом создании точки монтирования (systemd создаёт директорию, если она отсутствует).
Например: 0755, 0700 - TimeoutSec= - Время ожидания (в секундах) монтирования перед ошибкой. По умолчанию 90 секунд.
Например: 30 - PassNo= - Порядок проверки файловой системы при загрузке (аналогично полю fs_passno в fstab). Влияет на порядок проверки в fsck.
Например: 1, 2 - TimeoutIdleSec= - Время ожидания бездействия перед размонтированием (для автоматического размонтирования).
Например: 10min
Предположим надо с монтирования раздела /dev/sdb1 с файловой системой ext4 в директорию /mnt/data, Если надо монтировать при загрузке системы то самый простой вариант это добавить соответствующую запись в /etc/fstab, будет выглядеть примерно так:
/dev/sdb1 /mnt/data ext4 defaults 0 0
Напомню, при монтировании рекомендуется использовать UUID устройства, а не имя, то есть запись будет выглядеть примерно так
UUID=... /mnt/data ext4 defaults 0 0
на основании этой записи будет автоматически сформирован соответствующий юнит который будет находится в /run/systemd/generator/ с соответствующим именем mnt-data.mount. Что бы посмотреть можно выполнить команду
systemctl list-units --type=mount
либо же если другие требования, например в системе есть юнит-сервис (.service) которому для запуска требуется предварительно при монтировать с помощью юнита-монтирования (.mount) файловую систему какого либо блочного устройства (/dev/sdb1). Немного отошли от основного повествования, вернемся к написанию юнита (.mount)
для этого создадим mount unit
sudo nano /etc/systemd/system/mnt-data.mount
и приступим к его заполнению
[Unit] # тут будут общие настройки описание, зависимости
Description=Mount /dev/sdb1 to /mnt/data # Краткое описание юнита что бы было понятно при просмотре с помощью команды systemctl list-units --type=mount
After=local-fs-pre.target # наш юнит будет запускаться после запуска группы юнитов входящих в юнит local-fs-pre.target. Для сетевых монтирований (NFS) добавьте группу юнитов network.target`.
Requires=local-fs-pre.target # Жесткая зависимость от группы юнитов входящих в стостав юнита local-fs-pre.target должен быть запущен, если не запущен то в первую очередь systemd попытается его(local-fs-pre.target) запустить.
[Mount]
What=/dev/sdb1 # То что надо смонтировать так же тут может быть UUID. Если сетевой NFS то What=server:/share.
Where=/mnt/data # куда надо смонтировать
Type=ext4 # то что монтируем имеет фс ext4. Сетевой NFS: nfs
Options=defaults,noatime # при монтировании раздела будем использовать опции. Для Btrfs/других ФС: В Options добавьте специфические, например compress=zstd для Btrfs.
DirectoryMode=0755 # Права доступа к точке монтирования
TimeoutSec=30 # Если в течении 30 секунд не выполнено монтирование юнит сообщит об ощибке
[Install]
WantedBy=multi-user.target # наш юнит запустится только после группы юнитов входящих в multi-user.target то бишь при входе в многопользовательский режим
после сохранения используются те же команды что и для service unit
sudo systemctl daemon-reload # Перезагрузка systemd
sudo systemctl enable mnt-data.mount # Автозапуск при загрузке
sudo systemctl start mnt-data.mount # Монтировать сразу
проверить статус юнита можно аналогичным способом
sudo systemctl status mnt-data.mount
или проверить по точкам монтирования
mount | grep /mnt/data # Подтвердить монтирование
За основу взята документация по systemd, а так же информация с форумов по данной тематике, информация других пользователей размещенная на просторах всемирной паутины и собственные наработки.
За сим откланиваюсь...