Как ведет себя RequiresMountsFor в systemd для несуществующего каталога?

Вопрос или проблема

Опция 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 будет следующим:

  1. Проверка монтирования: systemd проверяет каждый префикс указанного пути для нахождения соответствующего .mount юнита. В данном случае он начнет с /etc/this/path/does/not/exist и будет проверять, существует ли .mount юнит для него. Если даже один из префиксов (например, /etc или /) имеет соответствующий .mount юнит, то зависимости от этого юнита будут созданы.

  2. Пропуск отсутствующих путей: Если не существует .mount юнита для указанного пути, то systemd пропустит этот путь без каких-либо ошибок или предупреждений. Важно отметить, что дальнейшей проверки наличия каталога с таким путем не происходит. В этой ситуации, если будет найден только путь /etc, то он будет использован как зависимость.

Исход юнита при монтировании

Когда /etc будет смонтировано, начнется следующий этап:

  1. Запуск юнита: После успешного монтирования /etc, если необходимый .mount юнит для этой точки монтирования существует, то зависимый юнит будет запущен. В противном случае, если путь к несуществующей директории указан в RequiresMountsFor=, но не является частью успешно смонтированной файловой системы, это не приведет к ошибке уже во время старта.

  2. Отсутствие проверки на существование: systemd не выполняет проверку существования самих файлов и директорий, указанных в RequiresMountsFor=. Если вы хотите избежать запуска юнита, если определенная директория отсутствует, вам необходимо использовать опции ConditionPathExists= или AssertPathExists=.

Заключение

RequiresMountsFor= создает зависимости на уровне файловой системы, позволяя вам управлять последовательностью монтирования, однако, если указанный путь не существует, это не повлияет на успешное монтирование родительских директорий. Важно учитывать это поведение при настройке юнитов systemd, особенно в ситуациях, где requried paths могут изменяться или быть временно недоступны.

Для более надежного контроля лучше использовать комбинацию RequiresMountsFor= с условиями существования директорий, чтобы гарантировать корректное поведение системы.

Эта информация будет полезна для понимания и настройки юнитов systemd, что способствует более стабильной работе систем, в зависимости от специфики вашего окружения и требований сервисов.

Оцените материал
Добавить комментарий

Капча загружается...