Linux: montagem CIFS / Samba trava por alguns minutos


26

Eu tenho uma pequena rede local que possui uma caixa do Gentoo e uma caixa do Windows. Montei um compartilhamento originário da caixa do Windows na caixa do Gentoo com um comando como:

mount -t cifs -o username=WindowsUsername,password=thepassword,uid=pistos //192.168.0.103/Users /mnt/windowsbox

Na maioria das vezes, tudo funciona e eu posso ler e escrever sem problemas. No entanto, a cada poucas semanas, a conexão ou o ponto de montagem parece ficar inoperante ou paralisado, de modo que qualquer processo que tente acessar o ponto de montagem fique preso no estado D (disco ou espera de E / S). Esses processos tornam-se impermeáveis ​​aos sinais TERM e KILL. Desconectar e reconectar a caixa do Windows da rede não ajuda. O estado congelado dura mais de 5 minutos. É realmente frustrante e atrapalha o trabalho normal, porque congela os diálogos, lscomandos e etc. do Save As . Se eu emitir um umountno ponto de montagem, ele trava também ou relata que o ponto de montagem está em uso. Eventualmente, o estado morto se resolve e o ponto de montagem é desmontado, ou torna-se possível umountsem demora.

Meu palpite é que isso acontece quando a conexão / montagem fica ociosa ou quando a máquina Windows está ociosa. Eu não tenho tanta certeza.

Por que isso está acontecendo e o que posso fazer para evitá-lo? Ou como posso matar com êxito esses processos de estado D à vontade?

Possivelmente relacionado: montagens CIFS aguardam leitura


1
Há algum tipo de firewall em uso entre as duas máquinas?
21414 Schrute

@ Schrute: Suponho que quaisquer padrões estão no Linux (iptables?) E o Windows está sendo executado. Você acha que os firewalls estão expirando as conexões? Eu nunca tinha ouvido falar disso.
Pistos

Eu acho que isso pode ser um problema da caixa do linux. Vi um problema semelhante - não com cifs e Windows - mas com um compartilhamento nfs montado. Não foi possível salvar - acho que devido a algum processo interrompido ao acessar o servidor nfs inexistente. Isso geralmente acontecia quando o servidor travava.
Cornelinux 21/08/2014

1
Meu conselho é configurar uma captura de rede de buffer de anel na máquina Linux (ou seja, tcpdump -i eth0 -C 5 -W 10 -s 0 -v -w /tmp/cifs.pcap host 192.168.0.103 - eu também executaria na tela para impedir que o processo seja encerrado quando você desconectar). Quando o problema ocorrer, pare o rastreamento após alguns segundos e você deve pelo menos poder determinar qual lado está causando o problema ao revisar o rastreamento de pacotes (ou seja, o servidor para de responder, a sessão é desconectada etc.).
GeekyDeaks 27/08/14

1
@Pistos - Wireshark é seu amigo! Os traços podem parecer confusos, mas o wireshark decodificará os quadros para ajudar. Você quer eliminar primeiro o básico, como o servidor ou cliente deixar cair a sessão (pacotes FIN), em seguida, avançar para os outros como servidor pára de responder etc. Se você tiver tempo havia um vídeo sharkfest em CIFS em 2013 ( youtube.com/watch ? v = XbvFXSPig-w ), mas é bastante longo :)
GeekyDeaks

Respostas:


11

Não sei por que o problema está acontecendo, mas como solução alternativa, você tentou colocar algo como touch /mnt/windowsbox/keepalive.txtou echo "I am still alive." >/mnt/windowsbox/keepalive.txtser executado via cron a cada minuto? Dessa forma, a conexão deve permanecer ativa.


Boa ideia. Eu coloquei isso no lugar e vou ver o que acontece.
Pistos 26/08/14

2
Isso parece ter resolvido o problema, devo mencionar.
Pistos

Ótimo ouvir isso!
Janne Pikkarainen

1
como por @ resposta de Pat, pode-se cortar isso de um batimento cardíaco cada minuto para um batimento cardíaco cada 5 minutos (300 segundos), o que seria */5 * * * *no cronograma crontab
woodvi

Estou usando isso por enquanto. Dentro de três dias, eu tinha três máquinas LTS Ubuntu Server 16 separadas (duas físicas, uma VM) eliminando suas conexões SMB depois de algumas horas após a reinicialização. Na inicialização, a conexão SMB é montada sem problemas, mas eventualmente deixa de responder.
User38537


0

Outra resposta em potencial sugeriu a gravação em um arquivo na montagem em um intervalo regular via cron. Em vez disso, sugiro o uso do programa smbclient para conectar-se ao compartilhamento e desconectar.

Eu escrevi um script bash como este para fazer isso:

#!/bin/bash

su usernamehere -c "smbclient \\\\\\\\\\\\\\\\servernamehere\\\\\\\\sharenamehere passwordhere -c exit" >/dev/null 2>&1

Este comando faz uma nova conexão com o compartilhamento e executa o comando exit, desligando imediatamente a conexão que acabou de estabelecer na linha de comando. Deve haver 8 barras antes do nome do servidor e 4 antes do nome do compartilhamento, pois as barras invertidas precisam ser escapadas e as escapadas precisam ser escapadas quando dentro de uma cadeia de caracteres entre aspas duplas. Talvez haja uma maneira mais inteligente de fazer isso, mas isso parece funcionar.

Talvez haja uma maneira de tornar isso ainda mais confiável, mantendo a conexão aberta por vários minutos de cada vez, mas isso é um pouco fora do meu alcance.


Proposta interessante. Eu teria tentado se ainda não tivesse sucesso com a outra solução.
Pistos

Não vejo como isso seria útil? A solução de Janne seria manter viva a conexão estabelecida pelo cliente CIFS, enquanto isso criaria uma conexão nova e não relacionada com o smbclient - então, como isso ajudaria?
Flungo

1
Para sua informação, o smbclient suporta barras para frente se você quiser usá-las em vez de barras invertidas, por isso //servername/sharnameé muito mais fácil em locais onde você precisa escapar muito.
Steve Friedl
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.