Назад | Перейти на главную страницу

Linux: монтирование CIFS / Samba зависает на несколько минут

У меня есть небольшая локальная сеть, в которой есть Gentoo и Windows. Я монтирую общий ресурс, созданный в окне Windows, в ящик Gentoo с помощью такой команды:

mount -t cifs -o username=WindowsUsername,password=thepassword,uid=pistos //192.168.0.103/Users /mnt/windowsbox

В большинстве случаев все просто работает, и я могу читать и писать без проблем. Однако примерно каждые несколько недель соединение или точка монтирования перестают работать или зависают, так что любой процесс, который пытается получить доступ к точке монтирования, застревает в состоянии D (ожидание диска или ввода-вывода). Эти процессы становятся невосприимчивыми к сигналам TERM и KILL. Отключение и повторное подключение Windows бокса от сети не помогает. В замороженном состоянии длится 5+ минут. Это действительно расстраивает и мешает нормальной работе, потому что замораживает диалоги «Сохранить как», ls команды и т. д. Если я выдам umount на точке монтирования он либо тоже зависает, либо сообщает, что точка монтирования используется. В конце концов, мертвое состояние разрешается само, и точка монтирования отключается, или становится возможным umount без промедления.

Я предполагаю, что это происходит, когда соединение / монтирование бездействует или когда машина Windows простаивает. Я не совсем уверен.

Почему это происходит и что я могу сделать, чтобы это предотвратить? Или как я могу по своему желанию успешно убить эти процессы D-состояния?

Возможно связанные: Крепления CIFS зависают при чтении

Не уверен, почему возникает проблема, но в качестве временного решения пытались ли вы поставить что-то вроде touch /mnt/windowsbox/keepalive.txt или echo "I am still alive." >/mnt/windowsbox/keepalive.txt запускаться через cron каждую минуту? Таким образом, соединение должно оставаться активным.

Я тоже сталкиваюсь с этим каждые несколько месяцев. sudo umount -l это мой обходной путь. https://stackoverflow.com/a/96288/2097284

Другой потенциальный ответ предполагал регулярную запись в файл на монтировании через cron. Я бы предложил вместо этого использовать программу smbclient для подключения к общему ресурсу и отключения.

Для этого я написал такой сценарий bash:

#!/bin/bash

su usernamehere -c "smbclient \\\\\\\\\\\\\\\\servernamehere\\\\\\\\sharenamehere passwordhere -c exit" >/dev/null 2>&1

Эта команда устанавливает новое соединение с общим ресурсом, а затем запускает команду выхода, немедленно завершая соединение, которое она только что установила в командной строке. Перед именем сервера должно быть 8 косых черт и 4 перед именем общего ресурса, так как обратные косые черты должны быть экранированы, а экранированные символы нужно экранировать, если они находятся внутри строки с двойными кавычками. Возможно, есть более разумный способ сделать это, но, похоже, он работает.

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