Вопрос или проблема
Я использую Kubuntu 22.04 на двух настольных машинах. У меня смонтированы части домашних каталогов пользователей через NFS 3 (fstab с настройками по умолчанию). Несколько месяцев назад я начал сталкиваться с проблемами при выключении и перезагрузке: процесс зависает почти точно на одну минуту при размонтировании общих ресурсов NFS (“Выполняется остановка задачи для …”). Странно, что я могу размонтировать общие ресурсы NFS перед выключением из сеанса пользователя без задержек.
Я пытался отладить проблему, что само по себе для меня является сложной задачей, и только обнаружил, что зависание, по-видимому, происходит в самом вызове umount2(). Смотрите отрывок из strace
16:22:29 umount2("/mnt/homes", 0) = 0
16:23:30 newfstatat(AT_FDCWD, "/run/mount/utab", {st_mode=S_IFREG|0644, st_size=1014, ...}, 0) = 0
Кажется, что это какая-то странная зависимость задачи systemd, потому что вставка следующей службы в последовательность загрузки [Редактировать 5] в большинстве случаев избегает зависания [/Редактировать 5] по крайней мере при перезагрузке, но не при выключении:
[Unit]
Description=умонтировать NFS-ресурсы в первую очередь при выключении
After=multi-user.target
Requires=remote-fs.target
Requires=network-online.target
[Service]
Type=idle
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/usr/bin/umount -a -t nfs
[Install]
WantedBy=shutdown.target
[Редактировать]
Должен упомянуть, что зависание происходит только в том случае, если к смонтированной файловой системе был фактически получен доступ. Если она просто смонтирована без доступа, зависания не происходит.
Вывод команды systemctl show mnt-homes.mount
Where=/mnt/homes
What=storage:/nfs/home
Options=rw,relatime,vers=3,rsize=32768,wsize=32768,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.2.10,mountvers=3,mountport=856,mountproto=udp,local_lock=none,addr=192.168.2.10
Type=nfs
TimeoutUSec=1min 30s
ControlPID=0
DirectoryMode=0755
SloppyOptions=no
LazyUnmount=no
ForceUnmount=no
ReadWriteOnly=no
Result=success
UID=[not set]
GID=[not set]
Slice=system.slice
ControlGroup=/system.slice/mnt-homes.mount
MemoryCurrent=163840
MemoryAvailable=infinity
CPUUsageNSec=9059000
TasksCurrent=0
IPIngressBytes=[no data]
IPIngressPackets=[no data]
IPEgressBytes=[no data]
IPEgressPackets=[no data]
IOReadBytes=18446744073709551615
IOReadOperations=18446744073709551615
IOWriteBytes=18446744073709551615
IOWriteOperations=18446744073709551615
Delegate=no
CPUAccounting=yes
CPUWeight=[not set]
StartupCPUWeight=[not set]
CPUShares=[not set]
StartupCPUShares=[not set]
CPUQuotaPerSecUSec=infinity
CPUQuotaPeriodUSec=infinity
IOAccounting=no
IOWeight=[not set]
StartupIOWeight=[not set]
BlockIOAccounting=no
BlockIOWeight=[not set]
StartupBlockIOWeight=[not set]
MemoryAccounting=yes
DefaultMemoryLow=0
DefaultMemoryMin=0
MemoryMin=0
MemoryLow=0
MemoryHigh=infinity
MemoryMax=infinity
MemorySwapMax=infinity
MemoryLimit=infinity
DevicePolicy=auto
TasksAccounting=yes
TasksMax=17999
IPAccounting=no
ManagedOOMSwap=auto
ManagedOOMMemoryPressure=auto
ManagedOOMMemoryPressureLimit=0
ManagedOOMPreference=none
UMask=0022
LimitCPU=infinity
LimitCPUSoft=infinity
LimitFSIZE=infinity
LimitFSIZESoft=infinity
LimitDATA=infinity
LimitDATASoft=infinity
LimitSTACK=infinity
LimitSTACKSoft=8388608
LimitCORE=infinity
LimitCORESoft=0
LimitRSS=infinity
LimitRSSSoft=infinity
LimitNOFILE=524288
LimitNOFILESoft=1024
LimitAS=infinity
LimitASSoft=infinity
LimitNPROC=59998
LimitNPROCSoft=59998
LimitMEMLOCK=65536
LimitMEMLOCKSoft=65536
LimitLOCKS=infinity
LimitLOCKSSoft=infinity
LimitSIGPENDING=59998
LimitSIGPENDINGSoft=59998
LimitMSGQUEUE=819200
LimitMSGQUEUESoft=819200
LimitNICE=0
LimitNICESoft=0
LimitRTPRIO=0
LimitRTPRIOSoft=0
LimitRTTIME=infinity
LimitRTTIMESoft=infinity
OOMScoreAdjust=0
CoredumpFilter=0x33
Nice=0
IOSchedulingClass=2
IOSchedulingPriority=4
CPUSchedulingPolicy=0
CPUSchedulingPriority=0
CPUAffinityFromNUMA=no
NUMAPolicy=n/a
TimerSlackNSec=50000
CPUSchedulingResetOnFork=no
NonBlocking=no
StandardInput=null
StandardOutput=journal
StandardError=inherit
TTYReset=no
TTYVHangup=no
TTYVTDisallocate=no
SyslogPriority=30
SyslogLevelPrefix=yes
SyslogLevel=6
SyslogFacility=3
LogLevelMax=-1
LogRateLimitIntervalUSec=0
LogRateLimitBurst=0
SecureBits=0
CapabilityBoundingSet=cap_chown cap_dac_override cap_dac_read_search cap_fowner cap_fsetid cap_kill cap_setgid cap_setuid cap_setpcap cap_linux_immutable cap_net_bind_service cap_net_broadcast cap_net_admin cap_net_raw cap_ipc_lock cap_ipc_owner cap_sys_module cap_sys_rawio cap_sys_chroot cap_sys_ptrace cap_sys_pacct cap_sys_admin cap_sys_boot cap_sys_nice cap_sys_resource cap_sys_time cap_sys_tty_config cap_mknod cap_lease cap_audit_write cap_audit_control cap_setfcap cap_mac_override cap_mac_admin cap_syslog cap_wake_alarm cap_block_suspend cap_audit_read cap_perfmon cap_bpf cap_checkpoint_restore
DynamicUser=no
RemoveIPC=no
PrivateTmp=no
PrivateDevices=no
ProtectClock=no
ProtectKernelTunables=no
ProtectKernelModules=no
ProtectKernelLogs=no
ProtectControlGroups=no
PrivateNetwork=no
PrivateUsers=no
PrivateMounts=no
PrivateIPC=no
ProtectHome=no
ProtectSystem=no
SameProcessGroup=yes
UtmpMode=init
IgnoreSIGPIPE=yes
NoNewPrivileges=no
SystemCallErrorNumber=2147483646
LockPersonality=no
RuntimeDirectoryPreserve=no
RuntimeDirectoryMode=0755
StateDirectoryMode=0755
CacheDirectoryMode=0755
LogsDirectoryMode=0755
ConfigurationDirectoryMode=0755
TimeoutCleanUSec=infinity
MemoryDenyWriteExecute=no
RestrictRealtime=no
RestrictSUIDSGID=no
RestrictNamespaces=no
MountAPIVFS=no
KeyringMode=shared
ProtectProc=default
ProcSubset=all
ProtectHostname=no
KillMode=control-group
KillSignal=15
RestartKillSignal=15
FinalKillSignal=9
SendSIGKILL=yes
SendSIGHUP=no
WatchdogSignal=6
Id=mnt-homes.mount
Names=mnt-homes.mount
Requires=system.slice -.mount
Wants=network-online.target
RequiredBy=remote-fs.target
Conflicts=umount.target
Before=umount.target remote-fs.target
After=remote-fs-pre.target network.target network-online.target systemd-journald.socket -.mount system.slice
RequiresMountsFor=/mnt
Documentation="man:fstab(5)" "man:systemd-fstab-generator(8)"
Description=/mnt/homes
LoadState=loaded
ActiveState=active
FreezerState=running
SubState=mounted
FragmentPath=/run/systemd/generator/mnt-homes.mount
SourcePath=/etc/fstab
UnitFileState=generated
UnitFilePreset=enabled
StateChangeTimestamp=Wed 2024-02-21 11:40:25 CET
StateChangeTimestampMonotonic=10080675
InactiveExitTimestamp=Wed 2024-02-21 11:40:24 CET
InactiveExitTimestampMonotonic=9881776
ActiveEnterTimestamp=Wed 2024-02-21 11:40:25 CET
ActiveEnterTimestampMonotonic=10080675
ActiveExitTimestamp=n/a
ActiveExitTimestampMonotonic=0
InactiveEnterTimestamp=n/a
InactiveEnterTimestampMonotonic=0
CanStart=yes
CanStop=yes
CanReload=yes
CanIsolate=no
CanFreeze=no
StopWhenUnneeded=no
RefuseManualStart=no
RefuseManualStop=no
AllowIsolate=no
DefaultDependencies=yes
OnSuccessJobMode=fail
OnFailureJobMode=replace
IgnoreOnIsolate=yes
NeedDaemonReload=no
JobTimeoutUSec=infinity
JobRunningTimeoutUSec=infinity
JobTimeoutAction=none
ConditionResult=yes
AssertResult=yes
ConditionTimestamp=Wed 2024-02-21 11:40:24 CET
ConditionTimestampMonotonic=9880739
AssertTimestamp=Wed 2024-02-21 11:40:24 CET
AssertTimestampMonotonic=9880739
Transient=no
Perpetual=no
StartLimitIntervalUSec=10s
StartLimitBurst=5
StartLimitAction=none
FailureAction=none
SuccessAction=none
InvocationID=2ac4fcae15e44482b6b9b47d7e72e006
CollectMode=inactive
[Редактировать 2]
В момент umount сеть все еще работает согласно systemd. Смотрите отрывок из отладки systemd:
[ 251.503803] systemd[1]: mnt-homes.mount: Изменено смонтировано -> размонтирование
[ 251.503808] systemd[1]: Размонтирование /mnt/homes...
[ 251.503892] systemd-journald[476]: Успешно отправил файловый дескриптор потока в менеджер служб.
[ 251.503940] systemd[3628]: mnt-homes.mount: Выполнение: /bin/umount /mnt/homes -c
...
[ 313.206159] systemd[1]: Получен SIGCHLD от PID 3628 (umount).
[ 313.206172] systemd[1]: Дочерний процесс 3628 (umount) завершился (код=выход, статус=0/УСПЕШНО)
[ 313.206197] systemd[1]: mnt-homes.mount: Дочерний процесс 3628 принадлежит mnt-homes.mount.
[ 313.206203] systemd[1]: mnt-homes.mount: Процесс монтирования завершился, код=выход, статус=0/УСПЕШНО (успешно)
[ 313.206206] systemd[1]: mnt-homes.mount: Деактивировано успешно.
[ 313.206232] systemd[1]: mnt-homes.mount: Изменено размонтирование -> мертво
[ 313.206344] systemd[1]: mnt-homes.mount: Задача 1748 mnt-homes.mount/stop завершена, результат=готово
[ 313.206347] systemd[1]: Размонтировано /mnt/homes.
[ 313.206376] systemd[1]: mnt-homes.mount: Использовано 18мс времени ЦП.
[ 313.206459] systemd[1]: systemd-journald.service: Получен EPOLLHUP на сохраненном дескрипторе 22 (сохраненном), закрытие.
[ 313.206475] systemd[1]: network-online.target изменен в активный -> мертв
[ 313.206477] systemd[1]: network-online.target: Задача 1843 network-online.target/stop завершена, результат=готово
[ 313.206479] systemd[1]: Остановлена цель Сеть онлайн.
[ 313.206494] systemd[1]: network.target изменен в активный -> мертв
[ 313.206496] systemd[1]: network.target: Задача 1769 network.target/stop завершена, результат=готово
[ 313.206498] systemd[1]: Остановлена цель Сеть.
[ 313.206509] systemd[1]: network-pre.target: остановка задержана, ожидая: [email protected]
[ 313.206512] systemd[1]: remote-fs-pre.target изменен в активный -> мертв
[ 313.206514] systemd[1]: remote-fs-pre.target: Задача 1886 remote-fs-pre.target/stop завершена, результат=готово
[ 313.206515] systemd[1]: Остановлена цель Подготовка для удаленных файловых систем.
[ 313.206535] systemd[1]: nfs-client.target изменен в активный -> мертв
[ 313.206537] systemd[1]: nfs-client.target: Задача 1768 nfs-client.target/stop завершена, результат=готово
[ 313.206539] systemd[1]: Остановлены цели службы клиента NFS.
[ 313.206549] systemd[1]: shutdown.target: запуск задержан, ожидая: snapd.mounts.target
[ 313.206551] systemd[1]: umount.target: запуск задержан, ожидая: run-snapd-ns.mount
[ 313.206765] systemd[1]: [email protected]: Скоро выполнится /sbin/ifdown eno1
[ 313.206956] systemd[1]: [email protected]: Forked /sbin/ifdown как 3649
[ 313.207014] systemd[1]: [email protected]: Изменено выход -> остановка
[ 313.207018] systemd[1]: Остановка ifup для eno1...
[ 313.207315] systemd[3649]: [email protected]: Выполнение: /sbin/ifdown eno1
[ 313.207315] systemd[1]: Не удалось прочитать атрибут pids.max корневого cgroup, игнорирование: Нет доступных данных
[ 313.207381] systemd[1]: networking.service: Скоро выполнится /sbin/ifdown -a --read-environment --exclude=lo
[ 313.207501] systemd[1]: networking.service: Forked /sbin/ifdown как 3650
[ 313.207557] systemd[1]: networking.service: Изменено выход -> остановка
[ 313.207562] systemd[1]: Остановка повышения сетевых интерфейсов...
...
[ 313.207806] systemd[3650]: networking.service: Выполнение: /sbin/ifdown -a --read-environment --exclude=lo
[Редактировать 3]
Это проводная сеть, и соединение остается неизменным до и после размонтирования. ip a показывает (valid_lft и preferred_lft варьируются):
1: lo: ...
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether ...
altname enp6s0
inet 192.168.2.117/24 brd 192.168.2.255 scope global dynamic eno1
valid_lft 851799sec preferred_lft 851799sec
[Редактировать 4]
Принудительное размонтирование через -f или ForceUnmount=yes не помогает.
Есть ли идеи, как это решить или хотя бы проанализировать дальше?
Нет реального решения, но, по крайней мере, это помогает с симптомами: добавление drop-in в /etc/systemd/system/mnt-homes.mount.d/override.conf
[Mount]
TimeoutSec=15
У меня та же проблема с nfs3 и Ubuntu 24.04. Я думаю, что нашел источник проблемы. systemd останавливает rpc-statd.service перед остановкой службы монтирования nfs.
Попытка сделать это в командной строке с systemctl stop rpc-statd.service
, а затем то же самое для моей nfs-службы приводит к таймауту.
Теперь мне просто нужно выяснить, как сказать systemd остановить их в другом порядке.
Ответ или решение
Проблема с зависанием системы при завершении работы, возникающая в процессе размонтирования NFS-ресурсов на Kubuntu 22.04, может быть вызвана несколькими факторами, особенно если система использует systemd
для управления сервисами и монтированием файловых систем. Давайте рассмотрим это явление подробнее и предложим возможные решения.
1. Контекст проблемы
На двух машинах с Kubuntu 22.04 у вас есть монтирование пользовательских директорий через NFS 3, которое работает корректно при обычном использовании, но зависает на этапе завершения работы, когда система пытается размонтировать эти ресурсы. Интересно, что если NFS-ресурсы размонтировать вручную перед завершением, проблема не возникает. Это может указывать на то, что проблема связана с зависимостями между сервисами systemd
во время завершения работы.
2. Возможные причины зависания
-
Зависимости между сервисами: При завершении работы
systemd
останавливает сервисы в определённом порядке. В вашем случае наблюдается, что сервисrpc-statd.service
, ответственный за управление состоянием NFS, останавливается до того, как система попытается размонтировать файловую систему. Это может приводить к возникновению таймаута, когда система ожидает завершение некоего процесса, прежде чем продолжить. -
Состояние сети: Отключение сетевого подключения перед завершением может вызвать зависание, так как NFS зависит от работы сети. Однако вы можете подтвердить, что сеть в момент размонтирования активна, что указывает на то, что проблема не связана с сетевыми настройками.
3. Как решить проблему
Изменение порядка остановки сервисов
Чтобы изменить порядок остановки сервисов в systemd
, создайте кастомный файл конфигурации для rpc-statd.service
. В данном файле вы можете указать, что rpc-statd
должен останавливаться после размонтирования файловой системы. Например, создайте файл override.conf
:
sudo mkdir -p /etc/systemd/system/rpc-statd.service.d/
sudo nano /etc/systemd/system/rpc-statd.service.d/override.conf
Внутри добавьте:
[Unit]
After=remote-fs.target
Before=umount.target
Не забудьте обновить конфигурацию systemd
:
sudo systemctl daemon-reload
Это изменение может устранить зависание, так как теперь systemd
будет ожидать завершения размонтирования файловой системы перед остановкой rpc-statd
.
Установка тайм-аута для размонтирования
Вы уже упомянули, что добавление TimeoutSec=15
в override.conf
для монтирования помогло избежать зависаний. Это хорошая временная мера, но также может быть полезно установить значение, позволяющее системе завершить размонтирование в случае длительных операций.
4. Дополнительные проверки и отладка
-
Логи
journalctl
: Используйте командуjournalctl -xe
для проверки ошибок или предупреждений, которые могут появляться в журналах во время завершения работы. Это может дать больше контекста к проблеме. -
Статистика использования ресурсов: Убедитесь, что на момент размонтирования нет активных процессов, работающих с монтированным файловым ресурсом. Можно использовать такие команды, как
lsof
для анализа открытия файлов.
5. Заключение
Проблема зависания при завершении работы системы на Kubuntu 22.04, связанная с размонтированием NFS, требует учета зависимости сервисов и управления их порядком остановки. Следуя предложенным рекомендациям, вы сможете минимизировать подобные проблемы и обеспечить более стабильную работу вашей системы. Не забывайте также следить за обновлениями системы, так как они могут включать исправления для аналогичных проблем.