Монтирование дисков средствами Systemd.

Предисловие.

С переходом дистрибутивов Linux на Systemd, мы не редко сталкиваемся с особенностями/багами реализации в этой системе инициализации той или иной привычной нам вещи. Хоть Systemd и пытается сохранять совместимость с привычными нам способами настройки системы, но часто в итоге получается не так всё красиво, как на картинке. В данной заметке, речь пойдёт о том, как в Systemd взаимодействует с файлом /etc/fstab, почему сетевые диски, прописанные в этом файле раньше монтировались, а с приходом новой системы инициализации перестали и рассмотрим родной, для Systemd, способ монтирования дисков.

Всё ниже описанное актуально для Systemd 201 и и основанного на нём дистрибутива Alt Linux P7. Так как Systemd ещё находится в фазе активной разработки, то со временем исправят описанные баги и изменят/добавят опции или синтаксис (или уже возможно что-то изменилось, так как текущая версия Systemd — 216), но в общем информация будет полезна.

Приступим! 

Стандартная строка из /etc/fstab:

//192.168.1.10/Document /mnt/Document cifs noexec,noperm,iocharset=utf8,credentials=/etc/fileserver 0 0

До перехода на Systemd, она выполняла функцию монтирования сетевого адреса //192.168.1.10/Document в локальную директорию /mnt/Document с перечисленными опциями при загрузке ОС. В Alt Linux P7, этого не происходит благодаря давней особенности/багу Systemd — она пытается монтировать сетевой диск до того, как происходит подключение к сети. Решается это добавлением опций noauto и x-systemd.automount в указанную выше строку файла fstab. Всё бы хорошо, но тут мы встречаемся с очередной особенностью/багом Systemd — монтирование происходит 2 раза:

$ df -ha | grep Doc

systemd-1 1,9T 158G 1,7T 9% /mnt/Document

//192.168.200.10/Document 1,9T 158G 1,7T 9% /mnt/Document

В принципе, можно было бы и забить, но мы копнём глубже:

$ systemctl -a | grep Doc

mnt-Document.automount loaded active running mnt-Document.automount

mnt-Document.mount loaded active mounted /mnt/Document

mnt-Document.automount и mnt-Document.mount — генерируемые при загрузке ОС юниты Systemd, переводящие построчно файл /etc/fstab в формат, понятный Systemd. Располагаются они в директории /run/systemd/generator/. Там же располагаются юниты, отвечающие за монтирование home,swap,tmp и всего остального, что имеется у вас в fstab. Ознакомимся с содержимым юнита mnt-Document.mount:</spa n>

$ cat /run/systemd/generator/mnt-Document.mount

# Automatically generated by systemd-fstab-generator

[Unit]

SourcePath=/etc/fstab

DefaultDependencies=no

After=remote-fs-pre.target

After=network.target
After=network-online.target
Wants=network-online.target

Conflicts=umount.target

Before=umount.target

[Mount]

What=//192.168.200.10/Document

Where=/mnt/Document

Type=cifs

FsckPassNo=0

Options=noauto,x-systemd.automount,noexec,noperm,iocharset=utf8,credentials=/etc/fileserver

Как можно заметить, это та же самая строка из fstab, приведённая выше, разбавленная большим количеством лишних символов и переведённая на понятный Systemd язык. Взяв этот файл за основу, можно сделать автономный юнит, не требующий записи в fstab, который будет отвечать за монтирование нашего сетевого диска основываясь на родном формате Systemd. Всё, что нужно сделать, это:

  • Скопировать этот юнит в директорию /etc/systemd/system/ или /lib/systemd/system/ (первая — предпочтительнее).
  • Добавить в него секцию [Install] со строкой WantedBy=remote-fs.target, для того, чтобы можно было его активировать при загрузке системы, привязав к цели, стартующей после активации сетевого подключения.
  • Активировать его командой systemctl enable mnt-Document.mount.
  • Закомментировать строку отвечающую за данный сетевой диск в файле fstab.
  • Перезагрузиться.

Конечный файл выглядит так:

$ cat /etc/systemd/system/mnt-Document.mount

# Automatically generated by systemd-fstab-generator

[Unit]

SourcePath=/etc/fstab

DefaultDependencies=no

After=remote-fs-pre.target

After=network.target

Wants=network.target

After=network-online.target

Wants=network-online.target

Conflicts=umount.target

Before=umount.target

[Mount]

What=//192.168.200.10/Document

Where=/mnt/Document

Type=cifs

FsckPassNo=0

Options=noauto,x-systemd.automount,noexec,noperm,iocharset=utf8,credentials=/etc/fileserver

[Install]

WantedBy=remote-fs.target

После перезагрузки, обнаруживаем смонтированный средствами Systemd, без задействования fstab, ОДИН раз, сетевой диск. Для управления диском используются стандартные команды Systemd — systemctl start/stop/enable/disable/status mnt-Document.mount.

Таким же способом можно смонтировать например /home или любой другой раздел.

 

Автор: Yar4e