Вопрос или проблема
Опция RequiresMountsFor=
в файле юнита systemd требует, чтобы монтирование для указанных путей было выполнено до того, как юнит будет запущен.
Насколько я могу судить, аргументы могут быть как точкой монтирования, так и любой директорией под этой точкой монтирования. Например, если файлы зон для BIND находятся в /etc/bind
, а /etc
находится на своей файловой системе, то как RequiresMountsFor=/etc
, так и RequiresMountsFor=/etc/bind
приведут к желаемому результату: BIND не запустится, пока /etc
не будет смонтировано, и, следовательно, /etc/bind
будет недоступно.
Теперь мне интересно, что произойдет, если RequiresMountsFor=
укажет на несуществующий путь. Например, если fstab
имеет записи для /
и /etc
, но ничего под /etc
, и RequiresMountsFor=/etc/this/path/does/not/exist
ссылается на путь, который не существует в /etc
.
Вызывает ли это ожидание юнита монтирования /etc
(так как это последняя точка монтирования в пути)? Если да, то начнется ли в конечном итоге юнит, когда /etc
будет смонтировано, или он потерпит неудачу, потому что /etc/this/path/does/not/exist
не найден?
Это может стать актуальным в случаях, когда юниты принимают параметры, такие как [email protected]
, который имеет RequiresMountsFor=/etc/postgresql/%I /var/lib/postgresql/%I
. Если файлы данных для одного кластера перемещены, второй путь не будет указывать никуда, если юнит будет вызван для этого кластера.
RequiresMountsFor=
является прямым переводом на Requires=
для соответствующих юнитов .mount, при этом systemd проверяет каждое возможное префикс (/
, /etc
, /etc/postgresql
, …) на существование соответствующего юнита .mount
и добавляет его в зависимости Requires; префиксы, которые не соответствуют юниту .mount, пропускаются.
Другой проверки, помимо этого, нет, в частности, нет перевода на условия юнитов. Если вам нужно проверить существование пути, используйте ConditionPathExists=
или AssertPathExists=
.
Ответ или решение
Поведение RequiresMountsFor
в systemd для несуществующей директории
Опция RequiresMountsFor=
в файлах unit (юнитов) systemd играет ключевую роль в управлении зависимостями между монтированием файловых систем и запуском сервисов. Давайте подробно рассмотрим ее поведение в случае, когда указан путь к несуществующей директории, и какие выводы можно из этого сделать.
Описание RequiresMountsFor=
RequiresMountsFor=
требует, чтобы монтирование для указанных путей было выполнено перед запуском юнита. Это означает, что systemd проверяет наличие соответствующих точек монтирования и создает зависимости от них. Например, если у вас есть юнит для сервиса BIND, который использует файлы в директории /etc/bind
, то использование RequiresMountsFor=/etc
или RequiresMountsFor=/etc/bind
гарантирует, что оба пути не будут доступны до тех пор, пока /etc
не будет смонтировано.
Путь к несуществующей директории
Когда вы указываете RequiresMountsFor=/etc/this/path/does/not/exist
, которая явно не существует, поведение systemd будет следующим:
-
Проверка монтирования: systemd проверяет каждый префикс указанного пути для нахождения соответствующего
.mount
юнита. В данном случае он начнет с/etc/this/path/does/not/exist
и будет проверять, существует ли.mount
юнит для него. Если даже один из префиксов (например,/etc
или/
) имеет соответствующий .mount юнит, то зависимости от этого юнита будут созданы. -
Пропуск отсутствующих путей: Если не существует
.mount
юнита для указанного пути, то systemd пропустит этот путь без каких-либо ошибок или предупреждений. Важно отметить, что дальнейшей проверки наличия каталога с таким путем не происходит. В этой ситуации, если будет найден только путь/etc
, то он будет использован как зависимость.
Исход юнита при монтировании
Когда /etc
будет смонтировано, начнется следующий этап:
-
Запуск юнита: После успешного монтирования
/etc
, если необходимый.mount
юнит для этой точки монтирования существует, то зависимый юнит будет запущен. В противном случае, если путь к несуществующей директории указан вRequiresMountsFor=
, но не является частью успешно смонтированной файловой системы, это не приведет к ошибке уже во время старта. -
Отсутствие проверки на существование: systemd не выполняет проверку существования самих файлов и директорий, указанных в
RequiresMountsFor=
. Если вы хотите избежать запуска юнита, если определенная директория отсутствует, вам необходимо использовать опцииConditionPathExists=
илиAssertPathExists=
.
Заключение
RequiresMountsFor=
создает зависимости на уровне файловой системы, позволяя вам управлять последовательностью монтирования, однако, если указанный путь не существует, это не повлияет на успешное монтирование родительских директорий. Важно учитывать это поведение при настройке юнитов systemd, особенно в ситуациях, где requried paths могут изменяться или быть временно недоступны.
Для более надежного контроля лучше использовать комбинацию RequiresMountsFor=
с условиями существования директорий, чтобы гарантировать корректное поведение системы.
Эта информация будет полезна для понимания и настройки юнитов systemd, что способствует более стабильной работе систем, в зависимости от специфики вашего окружения и требований сервисов.