Os clientes Windows não atualizarão o arquivo samba do Linux localmente se estiverem lendo o arquivo em intervalos <= 10 segundos

8

Se eu tiver um cliente Windows que leia um arquivo em um compartilhamento Linux smb em um intervalo <= 10 segundos, o cliente Windows mostrará informações incorretas (armazenadas em cache?) Desse arquivo.

Eu reproduzi isso em vários sistemas.

Exemplo de etapas para reproduzir:

1) configure o compartilhamento linux samba - neste exemplo, usando o Debian e instalando o samba. exemplo:

sudo mkdir /test
sudo chmod 777 /test

Além do smb.conf:

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

2) Mapeie este diretório como uma unidade em um cliente Windows (este teste usará L :)

3) crie um arquivo com algum texto no servidor samba

nano /test/test.txt
ORIGINAL

4) crie um arquivo em lote simples na máquina Windows para visualizar o arquivo a cada 5 segundos:

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

5) execute o arquivo em lote, ele deve mostrar ORIGINAL a cada 5 segundos.

6) no servidor linux, altere o conteúdo do arquivo

nano /test/test.txt
CHANGED

7) veja o arquivo em lotes em execução no Windows, ele ainda dirá "ORIGINAL" a cada cinco segundos, e não "ALTERADO" como o arquivo real possui.

8) encerre o arquivo em lotes e aguarde ~ 15 segundos, OU altere o tempo limite para algo> 10 segundos e ele será atualizado corretamente.

Espero ter explicado e descrito como testar isso suficientemente.

Alguém pode reproduzir esse comportamento e / ou sugerir como corrigir isso?

.

.

.

NOTAS:

Cliente Linux> Host SMB Linux mostra o conteúdo adequado do arquivo.

Cliente Windows> Host SMB do Windows mostra o conteúdo adequado do arquivo.

É especificamente Windows SM> Linux SMB Host que não mostra o conteúdo adequado do arquivo em um intervalo de atualização de <= 10 segundos.

Todos os sabores do Windows que eu testei (Win7, Win10, Server2016) exibem o mesmo comportamento.

Também testei protocolos diferentes no meu compartilhamento de samba 'NT1, SMB2, SMB3' e eles não alteram o comportamento.

NOTA: Acredito que esse é provavelmente um problema do Windows, mas não recebo nenhuma resposta no technet ou no superusuário em uma semana. Isso deve ser bastante fácil de testar, alguém pode confirmar esse comportamento ou declarar o contrário?

R. StackUser
fonte
Oi! Talvez o cliente do Windows esteja armazenando em cache o arquivo. Você já tentou configurar um servidor de arquivos do Windows para ver se ele se comporta da mesma forma. Eu sei que você precisa de janelas, mas estou apenas brincando. Melhor solução de sempre: desinstalar o Windows.
Ncomputers
Eu testei isso no Server 2016 com a função Servidor de Arquivos instalada. O mesmo comportamento ocorre.
R. StackUser
Ok, talvez próximo passo seria testar desabilitar o cache no lado do servidor e no lado do cliente ...
ncomputers

Respostas:

8

Os valores padrão para as configurações relevantes são:

  • oplocks = yes
  • kernel oplocks = no

(Veja a documentação do samba smb.conf )


Você pode desativar os bloqueios, conforme outra resposta .

Alternativamente, se você estiver executando um Linux O / S com um kernel moderno (2.4 ou mais recente), você pode deixar oplocks = yese em vez adicionar uma linha para smb.confhabilitar o oplocks do kernel. Conforme a seção de oplocks (S) do kernel na documentação:

O suporte a oplocks do kernel permite que os bloqueios do Samba sejam interrompidos sempre que um processo UNIX local ou operação NFS acessa um arquivo que o smbd (8) bloqueou. Isso permite consistência completa dos dados entre SMB / CIFS, NFS e acesso a arquivos locais

Quando oplockse kernel oplocksambos estão ativados, você deve obter um bom desempenho (do cache) e invalidação do cache quando os arquivos forem atualizados.

Para habilitar os bloqueios do kernel, adicione esta linha ao seu arquivo de configuração do Samba:

kernel oplocks = yes
Sarja
fonte
1
Na primeira parte da sua resposta, você enfatiza que oplocksdeve ser desativado. Na segunda parte, a citação diz habilitá-los junto com kernel oplocks. Seria correto sugerir que seu exemplo final deveria ter não apenas kernel oplocks = yesmas também oplocks = yes?
roaima 10/02/19
@roaima, a configuração padrão é: oplocks = yese kernel oplocks = no. Portanto, não há necessidade de adicionar oplocks = yes; só precisamos especificar o kernel oplocksvalor.
Serge
2
Eu estava pensando que talvez, já que a primeira parte da sua pergunta sugira desativá-la, valeria a pena conectá-la na sua proposta final.
roaima 10/02/19