Здесь у меня есть сервер Samba (Debian 5.0), настроенный для размещения профилей Windows XP.
Клиенты подключаются к этому серверу и работают со своими профилями непосредственно на общей папке samba (профиль не копируется локально).
Время от времени клиент может не завершиться должным образом, и поэтому Windows не снимает блокировки файлов. Глядя на таблицу блокировок самбы, мы видим, что многие файлы все еще заблокированы, даже если клиент больше не подключен. В нашем случае, похоже, это происходит с файлами блокировки, созданными Mozilla Thunderbird и Firefox. Вот пример таблицы блокировки самбы:
# smbstatus -L | grep DENY_ALL | head -n5
Pid Uid DenyMode Access R/W Oplock SharePath Name Time
--------------------------------------------------------------------------------------------------
15494 10345 DENY_ALL 0x3019f RDWR EXCLUSIVE+BATCH /home/CORP/user1 app.profile/user1.thunderbird/parent.lock Mon Nov 22 07:12:45 2010
18040 10454 DENY_ALL 0x3019f RDWR EXCLUSIVE+BATCH /home/CORP/user2 app.profile/user2.thunderbird/parent.lock Mon Nov 22 11:20:45 2010
26466 10056 DENY_ALL 0x3019f RDWR EXCLUSIVE+BATCH /home/CORP/user3 app.profile/user3.firefox/parent.lock Mon Nov 22 08:48:23 2010
Мы видим, что файлы были открыты Windows и наложена блокировка DENY_ALL.
Теперь, когда клиент повторно подключается к этому общему ресурсу и пытается открыть эти файлы, самба сообщает, что они заблокированы, и запрещает доступ.
Есть ли способ обойти эту ситуацию, или я что-то упускаю?
Редактировать: Мы хотели бы избежать отключения блокировки файлов на сервере самбы, потому что там являются веские причины для их включения.
следующие шаги помогли мне решить эту проблему в нескольких случаях:
Посмотри на:
reset on zero vc = yes / no
и посмотрите, решит ли это вашу проблему или нет.
Из smb.conf
страница руководства:
Этот логический параметр определяет, должна ли установка входящего сеанса уничтожать другие соединения, поступающие с того же IP-адреса. Это соответствует поведению Windows 2003 по умолчанию. Установка этого параметра на «да» становится необходимой, когда у вас нестабильная сеть и Windows решает восстановить соединение, в то время как в старом соединении все еще есть файлы с открытыми режимами общего доступа. Эти файлы становятся недоступными при новом подключении. Клиент отправляет нулевой VC на новое соединение, и Windows 2003 уничтожает все другие соединения, поступающие с того же IP. Таким образом заблокированные файлы снова становятся доступными. Имейте в виду, что включение этой опции уничтожит соединения за маскирующим маршрутизатором.
редактировать:
Я просто подумал над другим возможным решением. Вы можете сделать что-то подобное с рассматриваемой общей папкой.
veto oplock files = /*.lock/
Это просто предотвратит блокировку файлов .lock.
Некоторые очень умные люди в Samba решили убрать эту опцию, и замены ей нет.
Итак, пока что для совместимости с SMB, поскольку это действительно выигрышное поведение по умолчанию.
Если пользователь не разбирается в командной строке Linux и в том, как уничтожать открытые файлы / процессы, вам необходимо перезапустить SMBD или сам сервер, чтобы очистить это.
Замечательно сделано, Samba.org.
У меня была аналогичная проблема, клиент вылетел при копировании большого файла, и файл был заблокирован после перезагрузки. К счастью, это случается не очень часто, но все же довольно неприятно убивать процесс самбы. reset on zero vc
Казалось, что это всего лишь решение, но оно предположительно удалено из Samba4, хотя в версии 4.7.6 в Fedora (27) оно все еще есть (возможно, исправлено RH). В любом случае это не сильно поможет, поскольку теперь на странице руководства говорится, что он работает только с SMB1 (который больше не должен использоваться) и ничего не делает с соединениями SMB2 и SMB3, единственный способ справиться с этим - упомянутый в теме, на которую ссылается Майкл. Я не знаю причин удаления и что в этом плохого reset on zero vc
, Я бы подумал об использовании тайм-аута tcp для этой цели, больше как взлома. В любом случае что-то разумное могло быть, например
socket options = TCP_NODELAY SO_KEEPALIVE TCP_KEEPIDLE=30 TCP_KEEPCNT=3 TCP_KEEPINTVL=3
Это убьет соединение примерно через 40 секунд (30 + 3 * 3) после последнего сеанса связи, что обычно более чем достаточно, чтобы заметить сбой и перезагрузку (учитывая, что стек tcp сервера достаточно умен, чтобы закрыть соединение, когда клиент отклоняет свои пакеты keepalive после перезагрузки).
Обратите внимание, что это увеличивает нагрузку на вашу сеть, но я сомневаюсь, что это даже заметно даже при большом количестве клиентов.
Вы можете отключить нестандартные блокировки для каждого ресурса следующими способами:
[acctdata]
oplocks = False
level2 oplocks = False
Тип дополнительной блокировки по умолчанию - Level1. Необязательные блокировки уровня 2 включаются для каждого ресурса в файле smb.conf. В качестве альтернативы вы можете отключить oplocks для каждого файла в общей папке:
veto oplock files = /*.mdb/*.MDB/*.dbf/*.DBF/
Если у вас возникли проблемы с нестандартными блокировками, как видно из записей журнала Samba, вы можете перестраховаться и отключить дополнительные блокировки и блокировки второго уровня.
Отключение Oplocks ядра Необязательные блокировки ядра - это параметр smb.conf, который уведомляет Samba (если ядро UNIX имеет возможность отправить клиенту Windows прерывание oplock), когда процесс UNIX пытается открыть файл, который кэшируется. Этот параметр относится к совместному использованию файлов между UNIX и Windows с включенными блокировками на сервере Samba: процесс UNIX может открыть файл, который заблокирован (кэширован) клиентом Windows, а процесс smbd не будет отправлять прерывание блокировки, которое открывает доступ к файлу. риск повреждения данных. Если ядро UNIX имеет возможность отправлять прерывание непрочной блокировки, то параметр ядра oplocks позволяет Samba отправлять прерывание непрочной блокировки. Необязательные блокировки ядра включаются для каждого сервера в файле smb.conf.
kernel oplocks = yes
По умолчанию нет.