Automount: каталог монтируется не вовремя или отваливается
Unit вида .automount монтирует ресурс при первом обращении к каталогу и отмонтирует его после простоя. Это удобно для редко используемых сетевых ресурсов, но создаёт два неожиданных эффекта: задержку на первом обращении и разрыв после простоя.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Ресурс отмонтируется во время работы службы
TimeoutIdleSec=отмонтирует каталог после простоя. Если служба обращается к нему редко, между обращениями монтирование может исчезнуть, и очередная операция упадёт. -
Первое обращение занимает секунды
Монтирование выполняется в момент обращения. Для сетевого ресурса это ощутимая задержка, которая выглядит как подвисание службы.
-
Включён
.mountвместо.automountВ автозапуск нужно ставить именно automount-unit. Если включён mount-unit, ресурс монтируется при загрузке, и смысл автомонтирования теряется.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Все точки автомонтирования и их состояния.
systemctl list-units --type=automount --no-pagerИстория монтирований и отмонтирований: видно, как часто ресурс отваливается.
journalctl -u mnt-share.mount -u mnt-share.automount --no-pager | tail -30Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
TimeoutIdleSec=отмонтирует каталог после простоя. Если служба обращается к нему редко, между обращениями монтирование может исчезнуть, и очередная операция упадёт.
- Как проверить
-
Посмотрите значение таймаута простоя и историю монтирований.
systemctl cat mnt-share.automount | grep -i idle journalctl -u mnt-share.mount --no-pager | tail -20
- Как исправить
-
Увеличьте
TimeoutIdleSec=или откажитесь от автомонтирования в пользу обычного.mountс зависимостьюRequiresMountsFor=.
- Почему происходит
- Монтирование выполняется в момент обращения. Для сетевого ресурса это ощутимая задержка, которая выглядит как подвисание службы.
- Как проверить
-
Измерьте время первого обращения.
sudo systemctl stop mnt-share.mount; time ls /mnt/share >/dev/null
- Как исправить
- Для служб, чувствительных к задержкам, монтируйте ресурс заранее обычным mount-unit.
.mount вместо .automount- Почему происходит
- В автозапуск нужно ставить именно automount-unit. Если включён mount-unit, ресурс монтируется при загрузке, и смысл автомонтирования теряется.
- Как проверить
-
Посмотрите состояния обоих unit.
systemctl is-enabled mnt-share.automount mnt-share.mount
- Как исправить
-
Включите automount и отключите mount:
systemctl enable --now mnt-share.automount.
Пример вывода
Ресурс отмонтирован после простоя и снова смонтирован при обращении. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
systemd[1]: mnt-share.automount: Got automount request for /mnt/share, triggered by 9120 (myapp)
systemd[1]: Mounting mnt-share.mount - Shared files...
systemd[1]: Mounted mnt-share.mount - Shared files.
systemd[1]: mnt-share.mount: Unmounting due to idle timeout (60s).
Связанные ошибки
- Mount process exited, code=exited, status=32: не найдено устройство Монтирование не проходит: устройство или UUID не найдены, неверная файловая система, недоступен сетевой ресурс. Код 32 от команды mount.
- Target is busy: точка монтирования занята Не удаётся отмонтировать: target is busy. Как найти процессы, которые держат точку монтирования, и корректно освободить её.
- Сетевой каталог подвисает: жёсткое монтирование NFS Обращение к каталогу NFS блокируется намертво: жёсткое монтирование без таймаутов. Как настроить устойчиво.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Broken pipe в журнале службы Запись в закрытый канал или соединение: клиент отключился, обработчик завершился, конвейер разорван.
- Cannot assign requested address при привязке Ошибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
- Connection reset by peer в журнале службы Соединение сброшено другой стороной: обрыв клиента, перезапуск сервера, промежуточное устройство.
Источники
-
systemd.automount(5)
TimeoutIdleSec= и порядок работы автомонтирования. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено с TimeoutIdleSec=60 на сетевом ресурсе.