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

Как запретить самбе удерживать блокировку файла после отключения клиента?

Здесь у меня есть сервер 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.

Теперь, когда клиент повторно подключается к этому общему ресурсу и пытается открыть эти файлы, самба сообщает, что они заблокированы, и запрещает доступ.

Есть ли способ обойти эту ситуацию, или я что-то упускаю?

Редактировать: Мы хотели бы избежать отключения блокировки файлов на сервере самбы, потому что там являются веские причины для их включения.

следующие шаги помогли мне решить эту проблему в нескольких случаях:

  1. Войдите на сервер самбы.
  2. Запустите smbstatus.
  3. Найдите pid процесса, который заблокировал файл, в третьем разделе выходных данных.
  4. Убедитесь, что он соответствует ожидаемому пользователю и имени хоста в первом и втором разделах вывода smbstatus.
  5. Запустите «ps -ef» и посмотрите, как долго работает smbd с этим pid.
  6. Если он работал до последней перезагрузки компьютера, это оставшийся smbd. УБИЙТЕ ТОЛЬКО ТОГО ОДНОГО кого-то. (И убедитесь, что вы выбрали правильный - это должен быть тот, у которого родительский pid не равен 1.)

Посмотри на:

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

По умолчанию нет.

Источник