Найти в Дзене
Записки сисадмина

Linux. Systemd mount. Почему стоит отказаться от fstab.

Каждый раз, когда я начинаю писать очередную статью про systemd, я представляю, как более опытный админ задастся вопросом «а зачем это все, ведь уже есть ***». Ответ всегда прост. Как нет чудо-лекарства от всех болезней, так и нет чудо-решения для всех задач. Например, сколько способов монтирования дисков вы сможете придумать на лету? Все эти способы имеют право на жизнь, как и имеют свои недостатки. Когда говорят про инвестиции, советуют «не держать все яйца в одной корзине». Когда я говорю про systemd, я советую упрощать себе жизнь, попутно обучаясь новому. Давайте вспомним, как выглядит процесс монтирования из привычного всем fstab: При старте системы systemd читает /etc/fstab и создает временные unit-файлы монтирования в памяти. Имена генерируются на основе точек монтирования (например, mnt-data.mount). Systemd управляет порядком монтирования через зависимости: local-fs.target: Запускает монтирование локальных файловых систем. remote-fs.target: Для сетевых ФС (NFS, CIFS). Записи fs

Каждый раз, когда я начинаю писать очередную статью про systemd, я представляю, как более опытный админ задастся вопросом «а зачем это все, ведь уже есть ***».

Ответ всегда прост. Как нет чудо-лекарства от всех болезней, так и нет чудо-решения для всех задач.

Например, сколько способов монтирования дисков вы сможете придумать на лету?

  • Монтирование через fstab. Бессменная классика.
  • Монтирование через rc.local. Для староверов.
  • Да даже банальное монтирование скриптом по крону с проверкой.

Все эти способы имеют право на жизнь, как и имеют свои недостатки.

Когда говорят про инвестиции, советуют «не держать все яйца в одной корзине». Когда я говорю про systemd, я советую упрощать себе жизнь, попутно обучаясь новому.

Давайте вспомним, как выглядит процесс монтирования из привычного всем fstab:

  • Генерация юнитов:

При старте системы systemd читает /etc/fstab и создает временные unit-файлы монтирования в памяти. Имена генерируются на основе точек монтирования (например, mnt-data.mount).

  • Зависимости:

Systemd управляет порядком монтирования через зависимости:

local-fs.target: Запускает монтирование локальных файловых систем.

remote-fs.target: Для сетевых ФС (NFS, CIFS).

  • Автоматическое монтирование:

Записи fstab с опцией auto (или без noauto) монтируются при достижении local-fs.target/remote-fs.target.

Неожиданно для многих, fstab тоже управляется systemd, но есть нюансы.

Начнем, пожалуй, с самого банального: была ведь ситуация, когда из-за ошибки в fstab, у вас не загружалась система? Да у всех ведь было хотя бы раз. А бывало такое, что нужно перемонтировать диск с другими параметрами? А если диск сетевой? Вот в таких ситуациях мы всегда ходим по очень тонкому льду.

Не будем больше затягивать, начнем разбираться с systemd mount.

Systemd mount

Частично я эту тему уже затрагивал в статье про расширение временной директории.

  • Проверяем, что у нас примонтировано в данный момент:
  • Проверяем, что у нас также подключен диск vdb с файловой системой ext4 на разделе vdb1
-2

  • Создаем папку, куда будем подключать раздел:
mkdir -p /opt/mount/test

  • Для теста монтируем раздел и проверяем:
mount -rw /dev/vdb1 /opt/mount/test/
-3

  • Отмонтируем наш раздел, чтобы далее не было конфликтов:
umount /opt/mount/test

  • Создадим файл /etc/systemd/system/opt-mount-test.mount
-4

Важно: имя systemd.mount должно полностью совпадать с полным путем к папке монтирования, прописанном внутри.

Если мы указываем Where=/opt/mount/test, наш сервис должен называться opt-mount-test.mount.

Если мы указываем Where=/opt/mount, наш сервис должен называться opt-mount.mount.

  • Управление точками монтирования происходит через стандартные команды systemd:

systemctl start xxx.mount для монтирования

systemctl stop xxx.mount для отмонтирования

systemctl enable/disable xxx.mount для добавления/удаления автоматического монтирования при запуске

-5

И как бонус - монтирование сетевого диска через sshfs:

Создадим /etc/systemd/system/var-www.mount со следующим наполнением:

-6
[Unit]
Description=SSHFS Mount
After=network-online.target
[Mount]
What=remote_server:/path/on/remote/server
Where=/var/www
Type=fuse.sshfs
Options=_netdev,rw,allow_other,idmap=user,IdentityFile=/root/.ssh/id_rsa
TimeoutSec=60
Restart=always
[Install]
WantedBy=remote-fs.target