Клиенты Windows не будут обновлять файл самбы Linux локально, если чтение файла с интервалом <= 10 секунд


8

Если у меня Windows-клиент читает файл в общей папке Linux smb с интервалом <= 10 секунд, Windows-клиент будет показывать неверную (кэшированную?) Информацию об этом файле.

Я воспроизвел это на нескольких системах.

Пример шагов для воспроизведения:

1) настроить общий доступ к Linux в samba - для этого примера используйте Debian и установите samba. пример:

sudo mkdir /test
sudo chmod 777 /test

дополнение smb.conf:

[test]    
read only = no    
locking = no    
path = /test/    
guest ok = yes

2) Сопоставьте этот каталог как диск в клиенте Windows (этот тест будет использовать L :)

3) создать файл с текстом на сервере samba

nano /test/test.txt
ORIGINAL

4) создать простой пакетный файл на машине Windows, чтобы просматривать файл каждые 5 секунд:

copy con test.bat
@echo off
cls
:1
type L:\test.txt
timeout 5
goto 1

5) запустить пакетный файл, он должен показывать ОРИГИНАЛ каждые 5 секунд.

6) на сервере Linux измените содержимое файла

nano /test/test.txt
CHANGED

7) просматривать запущенный пакетный файл в Windows, он будет по-прежнему говорить «ОРИГИНАЛ» каждые пять секунд, а не «ИЗМЕНЕНО», как в реальном файле.

8) прервите пакетный файл и подождите ~ 15 секунд, ИЛИ измените время ожидания на что-то> 10 секунд, и оно будет обновлено должным образом.

Надеюсь, я объяснил и обрисовал в общих чертах, как проверить это достаточно.

Может кто-нибудь воспроизвести это поведение и / или предложить, как это исправить?

,

,

,

НОТЫ:

Linux Client> Linux SMB Host показывает правильное содержимое файла.

Windows Client> Windows SMB Host показывает правильное содержимое файла.

В частности, это Windows Client> Linux SMB Host, который не показывает правильное содержимое файла с интервалом обновления <= 10 секунд.

Все версии Windows, которые я тестировал (Win7, Win10, Server2016), демонстрируют одинаковое поведение.

Я также протестировал различные протоколы на моей общей папке samba «NT1, SMB2, SMB3», и они не меняют поведение.

ПРИМЕЧАНИЕ. Я полагаю, что это, скорее всего, проблема с Windows, но я не получил ни одного ответа ни по technet, ни по superuser в течение недели. Это должно быть довольно легко проверить, кто-нибудь может подтвердить это поведение или заявить иначе?


Привет! Может быть, клиент Windows кеширует файл. Вы пытались настроить файловый сервер Windows, чтобы увидеть, если он ведет себя так же. Я знаю, что вам нужны окна, но я просто шучу. Лучшее решение: удалить Windows.
ncomputers

Я проверил это на сервере 2016 с установленной ролью файлового сервера. Такое же поведение происходит.
R. StackUser

Хорошо, возможно, следующим шагом будет тестирование отключения кэширования на стороне сервера и на стороне клиента ...
ncomputers

Ответы:


8

Значения по умолчанию для соответствующих настроек:

  • oplocks = yes
  • kernel oplocks = no

(См. Документацию Samba smb.conf )


Вы можете отключить оплоки, как в другом ответе .

В качестве альтернативы, если вы используете операционную систему Linux с современным ядром (2.4 или новее), вы можете оставить oplocks = yesи вместо этого добавить строку, smb.confчтобы включить оплокировку ядра. Согласно разделу ядра (S) в документации:

Поддержка блокировок ядра позволяет прерывать блокировку Samba всякий раз, когда локальный процесс UNIX или операция NFS обращается к файлу, который был заблокирован smbd (8). Это обеспечивает полную согласованность данных между SMB / CIFS, NFS и локальным доступом к файлам.

Когда oplocksи kernel oplocksоба включены, вы должны получить хорошую производительность (от кэширования) и аннулирование кэша при обновлении файлов.

Чтобы включить оплокировку ядра, добавьте эту строку в файл конфигурации Samba:

kernel oplocks = yes

1
В первой части вашего ответа вы подчеркиваете, что oplocksдолжны быть отключены. Во второй части цитата говорит включить их вместе с kernel oplocks. Было бы правильно предположить, что ваш последний пример должен иметь не только, kernel oplocks = yesно и oplocks = yes?
Ройма

@roaima, конфигурация по умолчанию: oplocks = yesи kernel oplocks = no. Таким образом, нет необходимости добавлять oplocks = yes; нам просто нужно указать kernel oplocksзначение.
Серж

2
Я просто думал, что, возможно, поскольку первая часть вашего вопроса предлагает отключить его, стоило бы включить это в ваше окончательное предложение.
19

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.