Linux: montaż CIFS / Samba zawiesza się na kilka minut

26

Mam małą sieć lokalną, która ma pudełko Gentoo i Windows. Zamontowuję udział pochodzący z pudełka Windows na pudełku Gentoo za pomocą polecenia:

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

Przez większość czasu wszystko po prostu działa, a ja mogę czytać i pisać bez problemów. Jednak co kilka tygodni połączenie lub punkt montowania wydaje się być martwy lub zawiesza się, tak że każdy proces, który próbuje uzyskać dostęp do punktu montowania, blokuje się w stanie D (dysk lub oczekiwanie we / wy). Procesy te stają się nieprzepuszczalne dla sygnałów TERM i KILL. Odłączanie i ponowne podłączanie systemu Windows z sieci nie pomaga. Stan zamrożenia trwa 5+ minut. Jest to naprawdę frustrujące i przeszkadza w normalnej pracy, ponieważ zawiesza okna dialogowe Zapisz jako, lspolecenia itp. Jeśli wydam znak umountna punkcie montowania, albo się zawiesza, albo zgłasza, że ​​punkt montowania jest w użyciu. W końcu stan martwy sam się rozwiązuje, a punkt montowania zostaje odmontowany lub staje się to możliwe umountbez opóźnienia.

Domyślam się, że dzieje się tak, gdy połączenie / mocowanie przestało działać lub gdy komputer z systemem Windows był bezczynny. Nie jestem do końca pewien.

Dlaczego tak się dzieje i co mogę zrobić, aby temu zapobiec? Lub w jaki sposób mogę z powodzeniem zabić te procesy stanu D do woli?

Możliwe powiązanie: mocowania CIFS zawieszają się podczas odczytu

Pistacje
źródło
1
Czy między tymi dwoma komputerami są używane jakieś zapory ogniowe?
Schrute,
@ Schrute: Zakładam, że wszystkie wartości domyślne są w Linuksie (iptables?) I system Windows jest uruchomiony. Myślisz, że zapory ogniowe przekroczą limit czasu połączeń? Nigdy o tym nie słyszałem.
Pistos
Myślę, że może to być problem z linuksem. Widziałem podobny problem - nie z cifs i Windows - ale z zamontowanym udziałem nfs. Zapisywanie nie było możliwe - myślę, że z powodu zawieszenia procesu podczas uzyskiwania dostępu do nieistniejącego serwera NFS. Zwykle dzieje się tak, gdy serwer się zawiesił.
cornelinux
1
Radzę skonfigurować przechwytywanie sieci z buforem pierścieniowym na komputerze z systemem Linux (tj. Tcpdump -i eth0 -C 5 -W 10 -s 0 -v -w /tmp/cifs.pcap host 192.168.0.103 - Uruchomiłbym również pod ekranem, aby zapobiec przerwaniu procesu po rozłączeniu). Gdy wystąpi problem, zatrzymaj śledzenie po kilku sekundach, a powinieneś przynajmniej być w stanie ustalić, która strona powoduje problem podczas przeglądania śledzenia pakietów (tj. Serwer przestaje odpowiadać, sesja zostaje rozłączona itp.).
GeekyDeaks
1
@Pistos - Wireshark jest twoim przyjacielem! Ślady mogą wyglądać na mylące, ale wireshark rozszyfruje ramki, aby pomóc. Najpierw chcesz wyeliminować podstawy, takie jak serwer lub klient upuszczający sesję (pakiety FIN), a następnie przejść do innych, na przykład serwer przestaje odpowiadać itp. Jeśli masz czas, w 2013 r. Na CIFS odbył się film z rekinami ( youtube.com/watch ? v = XbvFXSPig-w ), ale jest raczej długi :)
GeekyDeaks

Odpowiedzi:

11

Nie jestem pewien, dlaczego problem się pojawia, ale jako obejście tego problemu próbujesz co jakiś czas umieścić coś podobnego touch /mnt/windowsbox/keepalive.txtlub echo "I am still alive." >/mnt/windowsbox/keepalive.txturuchomić przez cron? W ten sposób połączenie powinno pozostać aktywne.

Janne Pikkarainen
źródło
Dobry pomysł. Umieściłem to na miejscu i zobaczę, co się stanie.
Pistos
2
Wydaje się, że to rozwiązało problem, powinienem wspomnieć.
Pistos
Świetnie to słyszeć!
Janne Pikkarainen,
1
zgodnie z odpowiedzią @ Pat można to było przyciąć z pulsu co minutę do pulsu co 5 minut (300 sekund), co byłoby */5 * * * *w harmonogramie crontab
woodvi
Używam tego na razie. W ciągu 3 dni miałem trzy oddzielne maszyny Ubuntu Server 16 LTS (dwie fizyczne, jedna maszyna wirtualna) porzuciły połączenia SMB po kilku godzinach ponownego uruchomienia. Podczas uruchamiania połączenie SMB jest montowane bez problemu, ale ostatecznie przestaje odpowiadać.
user38537
5

Ja też spotykam się z tym co kilka miesięcy. sudo umount -ljest moje obejście. /programming//a/96288/2097284

Camille Goudeseune
źródło
0

Inna potencjalna odpowiedź sugerowała zapisywanie do pliku na wierzchowcu w regularnych odstępach czasu za pośrednictwem crona. Zamiast tego sugerowałbym użycie programu smbclient do połączenia z udziałem i rozłączenia.

Napisałem taki skrypt bash, aby to osiągnąć:

#!/bin/bash

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

Ta komenda nawiązuje nowe połączenie z udziałem, a następnie uruchamia komendę exit, natychmiast zamykając połączenie, które właśnie utworzyła w wierszu komend. Powinno być 8 ukośników przed nazwą serwera i 4 przed nazwą udziału, ponieważ odwrotne ukośniki muszą być poprzedzone znakami ucieczki, a zmiany znaczenia muszą być poprzedzone ciągiem podwójnym. Być może jest na to mądrzejszy sposób, ale wydaje się, że to działa.

Być może istnieje sposób, aby uczynić to jeszcze bardziej niezawodnym, utrzymując połączenie otwarte przez kilka minut na raz, ale to trochę poza moją ligą.

RedScourge
źródło
Ciekawa propozycja. Dałbym temu szansę, gdybym nie odniósł jeszcze sukcesu z innym rozwiązaniem.
Pistos
Nie rozumiem, jak to byłoby pomocne? Rozwiązaniem Janne byłoby utrzymanie połączenia nawiązanego przez klienta cifs przy życiu, podczas gdy stworzyłoby to nowe, niezwiązane połączenie z smbclientem - więc jak mogłoby to pomóc?
flungo
1
FYI, smbclient obsługuje ukośniki do przodu, jeśli chcesz ich używać zamiast ukośników odwrotnych, więc //servername/sharnamejest to znacznie łatwiejsze w miejscach, w których potrzebujesz dużo ucieczki.
Steve Friedl