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

Файлы Windows на сервере SMB / CIFS не имеют автоматической блокировки чтения

Я помню, как в прошлом работал с различными системами, что поведение по умолчанию для многих клиентов SMB Windows, записывающих в общий ресурс NetApp, заключается в том, что открытые файлы автоматически блокируют чтение. Другие программы (например, выполняющие резервное копирование) получат ошибку при попытке прочитать этот открытый файл.

Теперь у кого-то есть рабочий процесс, основанный на этом поведении, и это не кажется правдой. Я могу открыть документ Word или dd файл на монтировании CIFS linux, и пока он открыт, я могу прочитать все это из другого клиента CIFS.

Предполагая, что я не представлял себе такое поведение, есть ли способ его воссоздать? Я пробовал netapp с включенным SMB2 и без него, а также с включенными блокировками и без них. Я пробовал файлеры с разными версиями OnTap. Я не вижу в Linux параметров монтирования, которые могли бы повлиять на поведение. Ни одна из этих конфигураций по умолчанию не дает мне запретить чтение.

Цель: разрешить клиентам писать в общий ресурс SMB, но запретить доступ для чтения другим клиентам, пока файл не будет закрыт.

Из документация самбы:

Строго говоря, SMB-сервер должен проверять блокировку перед каждым вызовом чтения и записи файла. К сожалению, из-за того, как работает fcntl (), это может быть медленным и может перегрузить rpc.lockd. В этом почти всегда нет необходимости, поскольку предполагается, что клиенты независимо друг от друга совершают вызовы блокировки перед чтением и записью, если для них важна блокировка. По умолчанию Samba выполняет блокирующие вызовы только по явному запросу клиента, но если вы установите strict locking = yes, он будет выполнять вызовы проверки блокировки при каждом вызове чтения и записи.

Второй класс блокировки - это режимы отказа. Они устанавливаются приложением при открытии файла, чтобы определить, какие типы доступа следует разрешить одновременно с его открытием. Клиент может запросить DENY_NONE, DENY_READ, DENY_WRITE или DENY_ALL. Также существуют специальные режимы совместимости, называемые DENY_FCB и DENY_DOS.

Короче говоря, вы можете попробовать использовать strict locking = yes и посмотрите, есть ли какие-то различия. В любом случае, истинным решением было бы позволить процессу производителя / писателя открыть файл в правильном режиме: DENY_ALL

Это поведение контролируется smb oplock или арендой. Это определяется на стороне клиента. Другими словами. Это зависит от вашего приложения. Все это сделано из предположения, что ontap полностью соответствует спецификациям smb (что на 90% верно).