Como impedir que o samba retenha um bloqueio de arquivo depois que um cliente é desconectado?

11

Aqui eu tenho um servidor Samba (Debian 5.0) que está configurado para hospedar perfis do Windows XP.

Os clientes se conectam a este servidor e trabalham em seus perfis diretamente no compartilhamento samba (o perfil não é copiado localmente).

De vez em quando, um cliente pode não desligar corretamente e, portanto, o Windows não libera os bloqueios de arquivo. Ao olhar para a tabela de bloqueio do samba, podemos ver que muitos arquivos ainda estão bloqueados, mesmo que o cliente não esteja mais conectado. No nosso caso, isso parece ocorrer com os arquivos de bloqueio criados pelo Mozilla Thunderbird e Firefox. Aqui está um exemplo da tabela de bloqueio do 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

Podemos ver que os arquivos foram abertos pelo Windows e impuseram um bloqueio DENY_ALL.

Agora, quando um cliente se reconecta a esse compartilhamento e tenta abrir esses arquivos, o samba diz que está bloqueado e nega acesso.

Existe alguma maneira de contornar essa situação ou estou perdendo alguma coisa?

Edit: Nós gostaríamos de evitar a desativação bloqueios de arquivos no servidor samba, porque não são boas razões para ter aqueles habilitados.

Jean-Francois Chevrette
fonte

Respostas:

11

as etapas abaixo me ajudaram a resolver esse problema exato em várias ocasiões:

  1. Faça login no servidor samba.
  2. Execute um "smbstatus".
  3. Encontre o pid do processo que possui o bloqueio no arquivo na terceira seção da saída.
  4. Verifique se ele corresponde ao usuário e nome do host esperados na primeira e na segunda seção da saída smbstatus.
  5. Execute "ps -ef" e veja quanto tempo o smbd com esse pid está em execução.
  6. Se estiver em execução desde antes da última reinicialização do computador, resta um smbd. Mate apenas aquele smbd. (E certifique-se de obter o caminho certo - ele deve ter um pid pai diferente de 1.)
Socceroos
fonte
Além disso, você pode achar que alguns pids smbd estão em execução há algumas horas e os arquivos bloqueados são os que você precisa. Como acima, basta matar esses processos e você deve ficar bem. Se você inadvertidamente matar o processo smbd principal, então você pode reiniciá-lo com este comando: sudo /etc/init.d/smbd restart
Socceroos
5

Dê uma olhada em:

reset on zero vc = yes / no

e veja se isso resolverá o seu problema ou não.

Na smb.confpágina do manual:

Esta opção booleana controla se uma configuração de sessão recebida deve eliminar outras conexões provenientes do mesmo IP. Isso corresponde ao comportamento padrão do Windows 2003. Definir esse parâmetro como yes torna-se necessário quando você possui uma rede irregular e o Windows decide se reconectar enquanto a conexão antiga ainda possui arquivos com os modos de compartilhamento abertos. Esses arquivos se tornam inacessíveis pela nova conexão. O cliente envia um VC zero na nova conexão e o Windows 2003 mata todas as outras conexões provenientes do mesmo IP. Dessa forma, os arquivos bloqueados são acessíveis novamente. Por favor, esteja ciente de que ativar esta opção eliminará as conexões atrás de um roteador mascarado.

Edit :
Eu apenas pensei em outra solução possível. Você pode fazer algo assim no compartilhamento em questão.

veto oplock files = /*.lock/

Isso apenas impediria bloqueios em arquivos .lock.

3dinfluence
fonte
0

Algumas pessoas muito inteligentes do Samba decidiram remover essa opção e não há substituto para ela.

Até agora, para compatibilidade com PMEs, pois esse é realmente o comportamento padrão de vitória.

A menos que um usuário seja versado na linha de comando do linux e como eliminar arquivos / processos abertos, você deve reiniciar o SMBD ou o próprio servidor para limpar isso.

Maravilhosamente feito, Samba.org.

Michael
fonte
Você tem uma citação para isso?
BE77Y 2/17/17
Você vai ter que olhar um pouco para chegar lá, mas: lists.samba.org/archive/samba-technical/2011-July/078621.html (mostrar o processo de pensamento e rachaduras implorando para não ser removidos) listas .samba.org / archive / samba-technical / 2008-October /… (mostra que o parâmetro foi removido em 4.0)
Michael
A partir de 2019, no Debian 9 - Samba 4.5.12, a reset on zero vcopção ainda está listada no manual e também é exibida por testparm. Então, ele está de volta ou realmente não havia sido removido.
mivk
0

Eu estava com um problema semelhante, um cliente travou ao copiar um arquivo grande e o arquivo foi bloqueado após a reinicialização. Felizmente, isso não acontece com muita frequência, mas ainda assim é muito chato ter que matar o processo de samba. reset on zero vcparecia ser apenas a solução, mas supostamente foi removida do Samba4, embora a Versão 4.7.6 no Fedora (27) ainda a possua (possivelmente corrigida pelo RH). De qualquer forma, não ajudará muito, como a página de manual agora diz que só funciona com SMB1 (que não deve mais ser usado) e não faz nada nas conexões SMB2 e SMB3, a única maneira de lidar com isso é mencionada em o tópico vinculado por Micheal . Eu não sei a lógica por trás da remoção e o que há de tão ruimreset on zero vc, Consideraria usar o tempo limite do tcp para esse fim mais como um hack. De qualquer forma, algo razoável poderia ser, por exemplo,

socket options = TCP_NODELAY SO_KEEPALIVE TCP_KEEPIDLE=30 TCP_KEEPCNT=3 TCP_KEEPINTVL=3

Isso interromperá a conexão cerca de 40 segundos (30 + 3 * 3) após a última comunicação, o que geralmente é mais do que suficiente para perceber uma falha e reiniciar (dado que a pilha tcp do servidor é inteligente o suficiente para fechar a conexão quando o cliente rejeita seus pacotes keepalive após a reinicialização).

Observe que isso aumenta a carga na sua rede, mas duvido que seja perceptível mesmo com muitos clientes.

Jakob
fonte
Você sabe se isso ajuda no bizarro problema do encadeamento de zumbis do cliente Windows10 "ninguém nogroup"? Muitos dos meus clientes Windows10 em vários sites começaram a deixar centenas (ocasionalmente milhares) de threads zumbis atribuídos a "ninguém nogroup" até que o processo do manipulador seja interrompido / desativado. Normalmente, a configuração deadtime = 10seria clara, mas com os bloqueios de arquivo persistentes nas conexões SMB3_11 para sempre, isso não terá efeito, pois o tempo morto não será verificado enquanto os bloqueios de arquivo de um PID ainda existirem. Extremamente frustrante.
Zxq9
Nunca ouvi falar ou experimentei o problema que você descreve. deadtimenão faz nada se seus clientes tiverem arquivos abertos, então a pergunta seria: quais arquivos eles mantêm abertos. Mas essa é provavelmente uma questão totalmente diferente da discutida aqui, então você deve abrir uma nova pergunta para isso. Minha socket optionssugestão ajuda apenas com conexões que não estão fechadas corretamente (porque os clientes travam, uma interrupção na rede etc.), mas provavelmente não se seus clientes WX se conectarem ao servidor sem nenhuma ação adicional ou usando algum tipo de sessão anônima (o que nobody.nogroupsugere )
Jakob
Parece haver uma pergunta sobre esse problema, mas sem uma solução real. Parece que pode ser um problema de samba que pode ser corrigido em uma versão mais recente.
Jakob
Existem algumas menções a isso na lista de discussão, nenhuma solução real apresentada em qualquer lugar e nenhuma versão que eu tentei (em todas as ramificações atuais, exceto a 4.9) corrige o problema. É apenas com clientes Windows10. A coisa ninguém: nogroup é desconcertante, pois o convidado é desativado globalmente, nenhum compartilhamento os aceita e o PID das entradas de ninguém é sempre o mesmo que uma única entrada válida com um nome de usuário válido. Então, você vê 12345 someuser somegroup...em uma entrada, em seguida, 800 12345 nobody nogroup ...entradas, mas apenas um punhado de bloqueios de arquivos (não 800). Muito estranho. Afeta três dos meus sites clientes agora.
Zxq9
Isso só se torna uma restrição de recurso em sites de alta atividade, e é por isso que acho que ele recebe tão pouca atenção. Na maioria das vezes não há um problema, então as pessoas simplesmente não percebem e isso meio que se esclarece sempre que os clientes realmente fecham sua conexão.
Zxq9
0

Você pode desativar os bloqueios por compartilhamento com o seguinte:

[acctdata]
oplocks = False
level2 oplocks = False

O tipo de bloqueio padrão é Nível1. Os bloqueios de nível 2 são ativados por compartilhamento no arquivo smb.conf. Como alternativa, você pode desativar os bloqueios por arquivo no compartilhamento:

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

Se você estiver enfrentando problemas com os bloqueios, como é aparente nas entradas de log do Samba, convém jogar com segurança e desativar os bloqueios e os bloqueios de nível 2.

Desativando bloqueios do kernel Os oplocks do kernel são um parâmetro smb.conf que notifica o Samba (se o kernel UNIX tiver a capacidade de enviar uma interrupção no bloqueio do cliente Windows) quando um processo UNIX estiver tentando abrir o arquivo em cache. Esse parâmetro aborda o compartilhamento de arquivos entre o UNIX e o Windows com os oplocks ativados no servidor Samba: o processo UNIX pode abrir o arquivo bloqueado (em cache) pelo cliente Windows e o processo smbd não envia uma interrupção de bloqueio, o que expõe o arquivo a o risco de corrupção de dados. Se o kernel do UNIX tiver a capacidade de enviar uma interrupção de bloqueio, o parâmetro kernel oplocks permitirá que o Samba envie a interrupção de bloqueio. Os oplocks do kernel são ativados por servidor no arquivo smb.conf.

kernel oplocks = yes

O padrão é não.

Fonte

ajcg
fonte