Настраиваем зависимость между службами systemd в Debian GNU/Linux 9 на примере зависимости NFS Server от QUADStor Storage Virtualization

В процессе настройки разных сервисов в Debian GNU/Linux 9 'Stretch' может возникнуть необходимость создания зависимостей между службами systemd. В этой заметке мы рассмотрим создание такой зависимости на примере двух служб – NFS Server (nfs-server.service) и QUADStor Storage Virtualization (quadstor.service).

В нашем примере имеется конфигурация сервера, на котором сначала должна запускаться служба quadstor.service, а уже после её полной инициализации и появления в системе виртуального диска с дедупликацией должна запускаться служба nfs-server.service, которая в свою очередь транслирует виртуальный диск в сеть по протоколу NFS. Проблема заключается в том, что на запуск службы quadstor.service уходит некоторое время, а служба nfs-server.service успевает запуститься раньше, что в дальнейшем приводит к тому, что требуемая NFS-шара не поднимается. Решим эту проблему с помощью создания зависимости между соответствующими службами systemd таким образом, чтобы служба nfs-server.service не запускалась до тех пор, пока не запущена служба quadstor.service.

Для начала, давайте посмотрим информацию о состоянии обоих служб

# systemctl status nfs-server.service
# systemctl status quadstor.service

Как видим, основные конфигурационные данные служб systemd расположены в файлах /lib/systemd/system/nfs-server.service и /lib/systemd/system/quadstor.service. Однако напрямую править эти файлы – неправильно, так как сделанные таким образом изменения могут быть утеряны после последующих обновлений соответствующих пакетов. Более корректный способ -  создание специального override-файла для той службы, поведение, которой мы хотим изменить. В нашем примере требуется внести изменения в конфигурацию службы nfs-server.service. Для этого в служебном каталоге /etc/systemd/system/ нужно создать подкаталог с именем в формате <имя службы>.service.d и в нём разместить файл с именем override.conf. Такой файл можно создать вручную, но лучше доверить это команде systemctl edit, которая автоматически создаст нужный подкаталог и файл:

# systemctl edit nfs-server.service

При выполнении этой команды файл переопределений override.conf будет создан и открыт на редактирование. Внесём в этот файл только те параметры, которые мы хотим изменить в текущей конфигурации службы. В нашем примере в раздел [Unit] добавляются параметры Requires и After, в которых указывается имя службы, от которой будет зависеть запуск службы nfs-server.service

Завершаем редактирование файла и выходим с сохранением. После этого мы обнаружим, что автоматически создался файл override.conf в каталоге /etc/systemd/system/nfs-server.service.d

Если требуется, чтобы система перечитала конфигурацию всех служб с учётом нашей правки, можем выполнить команду:

# systemctl daemon-reload

Хотя выполнение этой команды должно выполняться в системе автоматически после завершения сессии правки, вызванной командой systemctl edit.

Чтобы посмотреть все конфигурационные файлы, относящиеся к нашей службе, можем выполнить команду

# systemctl cat nfs-server.service

Чтобы убедиться в том, что текущая конфигурация интересующей нас службы nfs-server учитывает созданную нами зависимость от службы quadstor, можем выполнить команду:

# systemctl list-dependencies nfs-server.service

Теперь, чтобы проверить работу настроенной нами зависимости между службами, перезагружаем сервер. Так как служба quadstor.service требует некоторого времени на запуск, то мы сможем в реальном режиме времени понаблюдать за тем, как ведут себя обе службы после загрузки системы.

Для наглядности запустим в разных консолях команду, отображающую текущее состояние обоих служб:

# watch systemctl status nfs-server.service

..и..

# watch systemctl status quadstor.service

На данный момент служба quadstor.service находится в состоянии запуска, а служба nfs-server.service остаётся при этом неактивной.

Дождёмся, когда запустится служба quadstor.service и удостоверимся в том, что сразу после этого будет произведён запуск службы nfs-server.service:

Как видим, желаемый результат достигнут.

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