Не удалось перезапустить nfs-server.service: Циклический порядок транзакций

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

NFS работал более года с текущей конфигурацией, но недавно возникла следующая проблема:

Ubuntu 20.04
Kernel 5.40.0-40
NFS nfs-kernel-server/focal-updates,focal-security, теперь 1:1.3.4-2.5ubuntu3.3 amd64 [установлен]

systemctl restart nfs-server

Не удалось перезапустить nfs-server.service: Циклический порядок транзакции. См. системные журналы для получения подробной информации.
См. системные журналы и 'systemctl status nfs-server.service' для получения подробной информации.

systemctl status :

 systemctl status nfs-server
 nfs-server.service - NFS сервер и службы
 Загрузка: загружено (/lib/systemd/system/nfs-server.service; включено; предустановка производителя: включено)
 Drop-In: /run/systemd/generator/nfs-server.service.d
         └─order-with-mounts.conf
 Активно: неактивен (мертв)

 Jul 03 06:37:38 acer systemd[1]: export-3T.mount: Найден циклический порядок на nfs-server.service/start
 Jul 03 06:37:38 acer systemd[1]: export-3T.mount: Найдена зависимость от export-3T.mount/start
 Jul 03 06:37:38 acer systemd[1]: export-3T.mount: Невозможно разорвать цикл, начинающийся с export-3T.mount/start
 Jul 03 06:43:47 acer systemd[1]: export-3T.mount: Найден циклический порядок на nfs-server.service/start
 Jul 03 06:43:47 acer systemd[1]: export-3T.mount: Найдена зависимость от export-3T.mount/start
 Jul 03 06:43:47 acer systemd[1]: export-3T.mount: Невозможно разорвать цикл, начинающийся с export-3T.mount/start
 

Из журнала

systemd[1]: Запрошенная транзакция содержит нерешаемую зависимость циклического порядка: Циклический порядок транзакции. См. системные журналы для деталей>
systemd[1]: export-3T.mount: Невозможно разорвать цикл, начинающийся с export-3T.mount/start
systemd[1]: export-3T.mount: Найдена зависимость от export-3T.mount/start
systemd[1]: export-3T.mount: Найден циклический порядок на nfs-server.service/start

/etc/fstab

UUID=uid /mnt/3T ext4 по умолчанию 0 0 
/mnt/3T /export/3T nfs bind 0 0 

/etc/exports

/export/3T 10.0.0.0/24(rw,nohide,insecure,no_subtree_check,async) 

Обновление

Недавно я снова столкнулся с этой проблемой, и нижеописанное не решило ее. Я нашел «правильное» (?) решение, которое было стабильным для нас.

Решение заключается в том, чтобы не добавлять вашу точку монтирования в /etc/fstab. Вместо этого создайте systemd mount юнит для вашей точки монтирования. Полезные ссылки включают:

В вашем случае вы хотите /etc/systemd/system/mnt-3T.mount, который будет выглядеть примерно так (не тестировалось):

[Unit]
Description=3T mount
After=network.target

[Mount]
Where=/mnt/3T
Type=nfs
Options=bind

[Install]
WantedBy=multi-user.target

(Я никогда не делал привязку NFS раньше; вам, возможно, нужно будет подправить Requires= и After=, чтобы достичь желаемого порядка)

Оригинальный ответ

Это немного старо, но я вижу различные разновидности этой проблемы, описанные в нескольких местах. Для меня ключевым моментом было https://bbs.archlinux.org/viewtopic.php?id=183999 или, точнее, добавление DefaultDependencies=False в /usr/lib/systemd/system/nfs-client.target

Сообщение об ошибке удивительно ясно, но не обязательно интуитивно. systemd имеет цикл в зависимостях между юнитами. Вопрос в том, как разорвать этот цикл. Этот блог описывает проблему более подробно.

Кроме того, страницы руководства по юнитам systemd описывают стандартные зависимости. Например, страница man для target.target включает следующее:

Стандартные зависимости

Следующие зависимости добавляются, если не установлено DefaultDependencies=no:

  • Целевые юниты автоматически дополнят все настроенные зависимости типа Wants= или Requires= зависимостями типа After=, если не установлено DefaultDependencies=no в указанных юнитах. Обратите внимание, что Wants= или Requires= должны быть определены в самом целевом юните — если вы, например, определите Wants=some.target в some.service, автоматическая сортировка не будет добавлена.

В случае NFS я не могу точно сказать, что вызывает цикл между NFS сервером и NFS клиентом, но могу сказать эмпирически, что когда я отключил DefaultDependencies в nfs-client.target, моя проблема исчезла. Цикл разорван.

Ответ или решение

Возникновение ошибки «Failed to restart nfs-server.service: Transaction order is cyclic» в системе Ubuntu 20.04 с установленным NFS (Network File System) указывает на наличие циклической зависимости между сервисами, что препятствует нормальному перезапуску NFS-сервера. Давайте разберем проблему, ее причины и возможные решения.

Контекст проблемы

Вы работаете с сервером NFS, который успешно функционировал более года, но недавно вы столкнулись с циклической зависимостью, мешающей перезапуску службы. По вашим данным, вы используете следующие компоненты:

  • Операционная система: Ubuntu 20.04
  • Ядро: 5.40.0-40
  • Служба NFS: nfs-kernel-server (версия 1:1.3.4-2.5ubuntu3.3)

При попытке перезапустить службу командой systemctl restart nfs-server вы получаете сообщение об ошибке, указывающее на наличие циклического порядка транзакций.

Причины возникновения циклической зависимости

Циклическая зависимость может возникать из-за неправильной конфигурации зависимостей между сервисами. В вашем случае ошибка связана с тем, что служба nfs-server зависит от точки монтирования, которая, в свою очередь, имеет зависимость от самой службы nfs-server. Это создает замкнутый круг, который systemd не может разрешить. Пример из журналов показывает, что проблема связана с export-3T.mount, импортирующим вашу файловую систему.

Анализ конфигурации

В конфигурациях вашего файла /etc/fstab и /etc/exports указаны следующие параметры:

  • /etc/fstab:

    UUID=uid /mnt/3T ext4 defaults 0 0 
    /mnt/3T /export/3T nfs bind 0 0 
  • /etc/exports:

    /export/3T 10.0.0.0/24(rw,nohide,insecure,no_subtree_check,async)

Здесь монтирование /mnt/3T передается службе nfs-server. Это может быть причиной возникновения зависимости между точки монтирования и самой службой NFS.

Решения проблемы

  1. Использование Unit файлов для монтирования:
    Вместо указания монтирования в /etc/fstab, рекомендуется создать unit-файл для монтирования в systemd. Это позволит явным образом определить зависимость от других компонентов системы и избежать циклических зависимостей.

    Пример создания unit-файла /etc/systemd/system/mnt-3T.mount:

    [Unit]
    Description=3T mount
    After=network.target
    
    [Mount]
    Where=/mnt/3T
    Type=none
    Options=bind
    
    [Install]
    WantedBy=multi-user.target

    Таким образом, после создания файла необходимо активировать его:

    systemctl daemon-reload
    systemctl start mnt-3T.mount
  2. Настройка зависимостей в unit-файлах:
    Если вы используете другие unit-файлы или службы, убедитесь, что их зависимости правильно настроены и не создают циклических ссылок.

  3. Отключение стандартных зависимостей:
    Для некоторых специфических случаев может помочь отключение стандартных зависимостей для целевых unit-файлов, добавив строчку DefaultDependencies=no в соответствующий файл сервиса nfs-client.target.

Заключение

Проблема с циклическими зависимостями в systemd при перезапуске службы nfs-server в Ubuntu может быть решена путем корректной настройки зависимостей и монтирования через unit-файлы. Рекомендуется протестировать предложенные решения и, в случае их неэффективности, провести более глубокий анализ конкретных зависимостей в вашей системе. """

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

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