Як не допустити, щоб Samba тримала блокування файлів після відключення клієнта?


11

Тут у мене є сервер Samba (Debian 5.0), налаштований для розміщення профілів Windows XP.

Клієнти підключаються до цього сервера і працюють над своїми профілями безпосередньо на спільній частці samba (профіль не копіюється локально).

Раз у раз клієнт може не працювати належним чином, і тому Windows не звільняє файлові блокування. Переглядаючи таблицю блокування samba, ми можемо побачити, що багато файлів все ще заблоковані, хоча клієнт більше не підключений. У нашому випадку це, мабуть, відбувається із замковими файлами, створеними Mozilla Thunderbird та Firefox. Ось приклад блокування таблиці samba:

# 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.

Тепер, коли клієнт знову підключається до цієї спільної доступу та намагається відкрити ці файли, samba каже, що вони заблоковані та забороняє доступ.

Чи є спосіб вирішити цю ситуацію чи я щось пропускаю?

Редагувати: Ми хотіли б уникнути відключення блокування файлів на сервері samba, оскільки є вагомі причини, щоб їх було включено.

Відповіді:


11

наведені нижче кроки допомогли мені вирішити цю точну проблему неодноразово:

  1. Вхід на сервер samba.
  2. Запустіть "smbstatus".
  3. У третьому розділі виводу знайдіть pid процесу, який має блокування у файлі.
  4. Переконайтеся, що воно відповідає очікуваному користувачеві та імені хоста в першому та другому розділах виводу smbstatus.
  5. Запустіть "ps -ef" і подивіться, як довго працює smbd з цим pid.
  6. Якщо він працює з моменту останнього перезавантаження комп'ютера, це ліворуч над smbd. Вбийте ДІЙСЬКИЙ ОДИН smbd. (І переконайтеся, що ви отримаєте потрібний - він повинен мати батьківський під, який не дорівнює 1.)

Крім того, ви можете виявити, що деякі smbd-піде працює кілька годин, а файли, які вони заблоковані, - це ті, що вам потрібні. Як зазначено вище, просто вбийте ці процеси, і вам слід добре. Якщо ви ненавмисно вбили основний процес smbd, ви можете перезапустити його за допомогою цієї команди: sudo /etc/init.d/smbd restart
Socceroos

5

Подивіться на:

reset on zero vc = yes / no

і подивіться, чи це виправить вашу проблему чи ні.

На smb.confчоловіковій сторінці:

Ця булева опція контролює, чи має вбудована сесія налаштовувати інші з'єднання, що надходять із того ж IP-адреси. Це відповідає поведінці Windows 2003 за замовчуванням. Якщо встановити цей параметр так, це стає необхідним, коли у вас невміла мережа і Windows вирішує знову підключитися, поки у старому з’єднанні все ще відкриті файли з режимами спільного доступу. Ці файли стають недоступними через нове з'єднання. Клієнт надсилає нульовий ПК на новому з'єднанні, а Windows 2003 вбиває всі інші з'єднання, що надходять з того ж IP-адреси. Таким чином заблоковані файли знову стануть доступними. Будь ласка, майте на увазі, що включення цієї опції знищить з'єднання за маршрутизатором, що маскується.

Редагувати :
Я щойно продумав інше можливе рішення. Ви можете зробити щось подібне на відповідній акції.

veto oplock files = /*.lock/

Це просто запобіжить запуску файлів .lock.


0

Деякі дуже розумні люди у Samba вирішили зняти цю опцію, і її немає заміни.

Поки що для сумісності SMB тоді, оскільки це дійсно виграшна поведінка за замовчуванням.

Якщо користувач не розбирається в командному рядку Linux і як знищити відкриті файли / процеси, вам доведеться перезапустити SMBD або сам сервер, щоб очистити це.

Чудово зроблено, Samba.org.


У вас є цитування на це?
BE77Y

Вам доведеться подивитися на декілька, щоб потрапити туди, але: list.samba.org/archive/samba-technical/2011-July/078621.html (покажіть процес думки та голови, які благають, щоб його не було видалено) списки .samba.org / archive / samba-tehničний / 2008-жовтень /… (показує, що параметр було видалено в 4.0)
Michael

Станом на 2019 рік, у Debian 9 - Samba 4.5.12 reset on zero vcопція все ще перерахована в керівництві, а також відображається за допомогою testparm. Тож воно повернулося назад, або його справді не зняли.
mivk

0

Я зіткнувся з подібною проблемою, клієнт вийшов з ладу під час копіювання великого файлу, а файл був заблокований після перезавантаження. На щастя, це трапляється не дуже часто, але все-таки досить прикро драматично вбивати процес самби. reset on zero vcздавалося, що це просто рішення, але його, мабуть, видалено з Samba4, хоча версія 4.7.6 у Fedora (27) все ще має його (можливо, зафіксовано RH). Так чи інакше це не допоможе, як каже сторінка man, що вона працює лише з 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 сервера досить розумний, щоб закрити з'єднання, коли клієнт відхиляє свої пакети збереження після перезавантаження).

Зауважте, що це збільшує навантаження на вашу мережу, але я сумніваюся, що це помітно навіть у багатьох клієнтів.


Чи знаєте ви, чи допомагає це при химерній проблемі із зомбі-потоком "нікого не згрупувати" клієнта Windows10? Багато моїх клієнтів Windows10 на кількох сайтах почали залишати сотні (зрідка тисячі) ниток зомбі, які привласнюються до "нікого не згрупувати", поки їхній обробник не буде вбито / не виходить на пенсію. Зазвичай встановлення deadtime = 10або так буде очистити його, але якщо фіксація файлів затримується на підключеннях SMB3_11 назавжди, це не має ефекту, оскільки затримка не перевірятиметься, поки файлові блоки для PID все ще існують. Надзвичайно засмучує.
zxq9

Я ніколи не чув і не стикався з описаною вами проблемою. deadtimeнічого не робить, якщо у ваших клієнтів відкриті файли, тож запитання буде, які файли вони відкрити. Але це, мабуть, зовсім інше питання, ніж обговорене тут, тож для цього слід відкрити нове питання. Моя socket optionsпропозиція допомагає лише при неправильно закритих з'єднаннях (через те, що клієнти виходять з ладу, відключення мережі тощо), але, мабуть, ні, якщо ваші клієнти WX просто підключаються до сервера без будь-яких подальших дій або використання якогось анонімного сеансу (що nobody.nogroupговорить про те, що ).
Якоб

Здається, є одне питання щодо цієї проблеми, але без реального рішення. Здається, це могла бути проблема самби, яку можна було б виправити в більш новій версії.
Якоб

Про це є досить багато згадок у списку розсилки, жодного реального рішення не представлено ніде, і жодна версія, яку я спробував (кожна поточна гілка, але 4.9), не усуває проблему. Це лише з клієнтами Windows10. Річ «Ніхто: ніггруп» викликає здивування, оскільки гість відключений у всьому світі, жодна акція не приймає їх, а ПІД запису, який ніхто не вводить, завжди такий самий, як один дійсний запис із дійсним іменем користувача. Таким чином, ви бачите 12345 someuser somegroup...на одному записі, то 800 12345 nobody nogroup ...записів, але лише кілька замок файлів (а не 800). Дуже дивно. Зараз впливає на 3 моїх клієнтських сайтів.
zxq9

Це стає лише обмеженням ресурсів на сайтах з високою активністю, саме тому я думаю, що йому приділяється так мало уваги. У більшості випадків це не проблема, тому люди просто не помічають цього, і це своєрідно очищається, коли клієнти насправді закривають зв'язок.
zxq9

0

Ви можете вимкнути oplocks на основі акції за допомогою наступного:

[acctdata]
oplocks = False
level2 oplocks = False

Типовим типом оплокування є рівень 1. Оплоки рівня 2 увімкнено на основі акції у файлі smb.conf. Ви також можете вимкнути оплокси на основі файлу в межах спільного доступу:

veto oplock files = /*.mdb/*.MDB/*.dbf/*.DBF/

Якщо у вас виникли проблеми з oplocks, як це видно з записів журналу Samba, можливо, ви захочете відтворити його в безпечному режимі та вимкнути oplocks та Level2.

Вимкнення Oplocks Kernel oplocks Kerme - це параметр smb.conf, який сповіщає Samba (якщо ядро ​​UNIX має можливість надсилати клієнтові Windows про перерву вимкнення), коли UNIX-процес намагається відкрити кешований файл. Цей параметр стосується спільного використання файлів між UNIX та Windows з включеними оплоками на сервері Samba: процес UNIX може відкрити файл, який закривається (кешований) клієнтом Windows, і процес smbd не надішле розрив облокування, який відкриває файл ризик корупції даних. Якщо ядро ​​UNIX має можливість надсилати перерву замикання, то параметр замикання ядра дозволяє Samba надсилати перерву облокування. Оплови блоку ядра вмикаються на кожному сервері у файлі smb.conf.

kernel oplocks = yes

За замовчуванням немає.

Джерело

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.