Вопрос или проблема
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 юнит для вашей точки монтирования. Полезные ссылки включают:
- https://dev.to/adarshkkumar/mount-a-volume-using-systemd-1h2f
- https://tekneed.com/how-to-mount-volumes-using-systemd-unit-file/
- https://forum.manjaro.org/t/root-tip-systemd-mount-unit-samples/1191
В вашем случае вы хотите /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.
Решения проблемы
-
Использование 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
-
Настройка зависимостей в unit-файлах:
Если вы используете другие unit-файлы или службы, убедитесь, что их зависимости правильно настроены и не создают циклических ссылок. -
Отключение стандартных зависимостей:
Для некоторых специфических случаев может помочь отключение стандартных зависимостей для целевых unit-файлов, добавив строчкуDefaultDependencies=no
в соответствующий файл сервисаnfs-client.target
.
Заключение
Проблема с циклическими зависимостями в systemd
при перезапуске службы nfs-server
в Ubuntu может быть решена путем корректной настройки зависимостей и монтирования через unit-файлы. Рекомендуется протестировать предложенные решения и, в случае их неэффективности, провести более глубокий анализ конкретных зависимостей в вашей системе. """