Монтирование файловых систем при помощи systemd

  • Автор:

systemd-mount-unit-000.pngКазалось бы, монтирование файловых систем в Linux задача простая и не требующая каких-либо доработок. Но очень часто именно в простоте таятся различные сложности и затруднения. Текущая система монтирования уходит корнями еще во времена UNIX и дошла до наших дней без серьезных изменений. Но мир с тех пор серьезно изменился, сегодня в широком ходу сетевые расположения и съемные устройства, работать с которыми классическим образом не слишком удобно. И вот тут нам на помощь снова приходит systemd, предлагая современные методы монтирования файловых систем.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Юниты монтирования

Юниты - это специальные файлы с описаниями служб, которые используются systemd для их активации. Существуют различные типы юнитов, для монтирования файловых систем предназначены юниты типа mount, их следует располагать в каталоге /etc/systemd/system. Существуют специальные правила именования таких файлов: они должны содержать путь к точке монтирования в которой все слеши, кроме начального, заменяются на дефис. Например, если точка монтирования у нас /home/user/video, то имя файла юнита должно быть home-user-video.mount.

Проблема возникает если в пути точки монтирования используется дефис, в этом случае следует заменить недопустимые символы в пути, для чего используем команду:

systemd-escape -p "/home/naf-naf/video"

Выводом команды будет:

home-naf\x2dnaf-video

Которое и следует использовать в качестве имени файла юнита. Сам юнит должен иметь обязательную секцию [Mount] с двумя обязательными параметрами, указывающими на устройство и точку монтирования. Ниже приведен минимальное содержимое такого файла:

[Unit]
Description=Fresh series

[Mount]
What=/dev/disk/by-uuid/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Where=/home/user/video

[Install]
WantedBy=multi-user.target

Секция [Unit] содержит строку с описанием сервиса, в нашем случае точки монтирования. Можете написать туда все что угодно, главное, чтобы вам потом было понятно, что в эту точку монтируется и зачем. Секция [Install] задает уровень запуска сервиса, в нашем случае это multi-user.target - многопользовательский режим без графики. Но если вам при консольном входе не нужны свежие сериалы, то можете поставить туда graphical.target, тогда устройство будет монтироваться только при графическом входе в систему.

Теперь перейдем к основной секции [Mount], опция What содержит абсолютный путь к монтируемому устройству, в простейшем случае это /dev/sda1, но мы категорически не рекомендуем монтировать устройства таким образом, особенно внешние. При удалении или добавлении новых дисковых устройств их имя может меняться, что может привести к различным нежелательным последствиям.

Правильно монтировать блочные устройства по UUID, что гарантирует подключение именно того устройства, которое мы ожидаем увидеть в данной точке монтирования. Чтобы узнать UUID воспользуйтесь командой:

blkid

или

lsblk -f

Вторая команда более информативна, так как выводит не только UUID разделов, но и их иерархию, что во многих случаях может быть полезно.

systemd-mount-unit-001.pngОпция Where указывает точку монтирования, символические ссылки не допускаются, если указанная директория не существует, то она будет создана.

Из дополнительных опций следует выделить:

  • Type= тип файловой системы, например, ext4.
  • Options= опции монтирования, перечисляются через запятую.
  • DirectoryMode= Права на директорию при ее автоматическом создании, по умолчанию 0755.
  • TimeoutSec= Таймаут монтирования устройства, если за указанное время выполнить монтирование не удалось, то устройство будет отключено.

И уже здесь видны преимущества systemd: автоматическое создание директорий для точек монтирования, тайм-аут и отключение устройства при невозможности монтирования, в аналогичной ситуации с fstab вы просто не сможете загрузить систему в нормальном режиме.

После того, как вы создали и сохранили файл юнита перечитаем конфигурацию systemd (это нужно делать после добавления каждого нового файла юнита):

systemctl daemon-reload

И попробуем смонтировать наше устройство:

systemctl start home-user-video.mount

Убедившись, что все работает нормально, добавим точку монтирования в автозагрузку:

systemctl enable home-user-video.mount

Если вы уже набили руку и уверены в себе, то можно совместить оба действия:

systemctl enable --now home-user-video.mount

Это автоматически выполнит монтирование и добавит юнит в автозагрузку.

Важно! Не включайте автозагрузку для сетевых и съемных носителей! Для их подключения воспользуйтесь функцией автомонтирования.

Кроме юнита монтирования в systemd есть еще один юнит для автоматического монтирования файловой системы в момент обращения к точке монтирования. Не следует путать его с автоматическим запуском юнита монтирования при загрузке системы. Данный юнит не содержит параметров монтирования и используется только в связке с mount-юнитом, его имя формируется по тем же правилам, но только с расширением .automount. Ниже типовой пример такого юнита:

[Unit]
Description=Automount Fresh series

[Automount]
Where=/home/user/video
TimeoutIdleSec=900

[Install]
WantedBy=multi-user.target

Мы не будем разбирать дополнительные секции, так как уже сделали это выше, обратимся к основной - [Automount]. К обязательным опциям относится Where, которая указывает на точку монтирования, а опция TimeoutIdleSec задает время простоя в секундах, после которого файловая система будет отмонтирована.

После создания юнита автомонтирования точно также перечитаем конфигурацию systemd и запустим его, одновременно добавив в автозагрузку:

systemctl enable --now home-user-video.automount

Но автоматического монтирования устройства не произойдет до тех пор, пока вы не обратитесь к указанной в точке монтирования директории.

Настройка зависимостей

Еще одной важной возможностью systemd является простая работа с зависимостями. В самом простом варианте мы указываем уровень запуска:

[Install]
WantedBy=multi-user.target

Это предполагает, что уже запущена сеть и все основные службы. Но могут быть ситуации, когда нужная нам файловая система подключается через VPN или iSCSI и эти службы тоже стартуют на уровне multi-user.target. В этом случае нам потребуется указать зависимости, это можно сделать разными способами.

Самый мягкий способ, это использование опции Wants, которая предполагает желательность наличия запущенного сервиса, но даже если он недоступен, юнит все равно попытается запуститься. Понятно, что в нашем случае это не подходит, если нет канала связи или не запущена служба iSCSI монтировать устройство нет никакого смысла.

Поэтому переходим к следующей опции - Requires, которая требует обязательного наличия указанной службы, в противном случае юнит запущен не будет. Эту опцию следует обязательно сочетать с опцией After, в противном случае система может попытаться запустить обе службы одновременно.

Поэтому секция [Unit] должна будет выглядеть так:

[Unit]
Description=Fresh series
Requires=openvpn@client.service
After=openvpn@client.service

Теперь монтирование файловой системы произойдет только после того, как будет поднят OpenVPN-туннель. Но есть один момент, опция Requires отвечает только за старт сервиса, не отслеживая его дальнейшее состояние и если VPN-соединение упадет, то файловая система останется смонтированной, если это критично, то следует заменить Requires на BindsTo, в этом случае при падении службы от которой зависит работа юнита, он также будет остановлен, т.е. при обрыве VPN файловая система будет размонтирована.

[Unit]
Description=Fresh series
BindsTo=openvpn@client.service
After=openvpn@client.service

Обратите внимание, что в данном случае мы продолжаем использовать опцию After, чтобы монтирование происходило строго после того, как поднимется VPN-соединение.

Монтирование внутреннего диска

После теории перейдем к практике, для монтирования внутреннего диска создайте юнит типа mount - home-user-video.mount - со следующим содержимым:

[Unit]
Description=Fresh series

[Mount]
What=/dev/disk/by-uuid/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Where=/home/user/video
Type=ext4
Options=default

[Install]
WantedBy=multi-user.target

Затем выполните:

systemctl daemon-reload
systemctl enable --now home-user-video.mount

Таким образом вы одновременно смонтируете файловую систему и добавите ее в автозагрузку.

Монтирование съемного диска

Точно также сначала создадим юнит монтирования home-user-video.mount:

[Unit]
Description=USB Fresh series

[Mount]
What=/dev/disk/by-uuid/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Where=/home/user/video
Type=ext4
Options=default
TimeoutSec=10

[Install]
WantedBy=multi-user.target

А затем одноименный юнит автомонтирования home-user-video.automount:

[Unit]
Description=Automount USB Fresh series

[Automount]
Where=/home/user/video
TimeoutIdleSec=900

[Install]
WantedBy=multi-user.target

После чего выполняем:

systemctl daemon-reload
systemctl enable --now home-user-video.automount

Теперь указанное устройство будет смонтировано при первом к нему обращении, в случае невозможности монтирования будет выдержан таймаут в 10 секунд, после чего устройство будет отключено. При неактивности в течении 900 сек (15 мин) устройство также будет размонтировано.

Монтирование NFS

Network File System (NFS) -- протокол сетевого доступа к файловым системам широко использующийся в UNIX и Linux, клиентская часть требует установки дополнительного пакета:

apt install nfs-common

Для монтирования NFS-ресурса снова создадим два юнита, сначала юнит монтирования home-user-video.mount:

[Unit]
Description=NFS Fresh series

[Mount]
What=192.168.111.151:/video
Where=/home/user/video
Type=nfs
Options=_netdev,auto
TimeoutSec=10

[Install]
WantedBy=multi-user.target

А затем юнит автомонтирования home-user-video.automount:

[Unit]
Description=Automount NFS Fresh series

[Automount]
Where=/home/user/video
TimeoutIdleSec=900

[Install]
WantedBy=multi-user.target

После чего добавим его в автозагрузку и запустим:

systemctl daemon-reload
systemctl enable --now home-user-video.automount

Монтирование SMB

SMB (Server Message Block) - популярный протокол для общего доступа к файлам и принтерам в сетях Windows и прежде, чем монтировать SMB-ресурс нам следует установить необходимые пакеты и создать специальный файл с учетными данными для аутентификации.

Начнем с установки:

apt install samba cifs-utils

Затем создадим файл данных для аутентификации /etc/samba/smbcreds и внесем в него следующие данные, которые представляют собой логин и пароль от SMB-ресурса:

username=User
password=Pa$$worD_1

Установим права, разрешающие доступ к файлу только суперпользователю:

chmod 600 /etc/samba/smbcreds

Теперь перейдем к созданию юнита монтирования home-user-video.mount:

[Unit]
Description=Automount SMB Fresh series

[Mount]
What=//FILESERVER/VIDEO
Where=/home/user/video
Type=cifs
Options=_netdev,iocharset=utf8,rw,file_mode=0777,dir_mode=0777,vers=2.0,credentials=/etc/samba/smbcreds
TimeoutSec=10

[Install]
WantedBy=multi-user.target

Из опций монтирования обращаем внимание на кодировку iocharset и версию протокола vers, здесь же указываем путь к файлу с учетными данными.

Юнит автомонтирования home-user-video.automount ничем не отличается от предыдущих вариантов:

[Unit]
Description=Automount NFS Fresh series

[Automount]
Where=/home/user/video
TimeoutIdleSec=900

[Install]
WantedBy=multi-user.target

Для включения в автозагрузку и запуска выполните:

systemctl daemon-reload
systemctl enable --now home-user-video.automount

Как видим, монтирование файловых систем через systemd совсем несложно и гораздо более удобно, нежели классическим методом, особенно когда дело касается съемных носителей и сетевых расположений.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Помогла статья? Поддержи автора и новые статьи будут выходить чаще:

Поддержи проект!

Или подпишись на наш Телеграм-канал: Подпишись на наш Telegram-канал



Loading Comments