uruchom ponownie klienta NFS bez restartu

10

Pracuję na moim serwerze, z którego eksportuję jeden katalog za pomocą NFS. Oczywiście przez mniej więcej tydzień po ponownym uruchomieniu serwera wielokrotnie zapomniałem o umountsystemie plików eksportu na mojej stacji roboczej (który jest montowany /etc/fstabpo uruchomieniu). W międzyczasie byłem w stanie umountpo fakcie i ponownym zamontowaniu ( nie używam autofs):

umount -fl /data0
mount /data0

Ale to już nie działa.

Nie mogę zamontować wyeksportowanego katalogu z serwera w innym katalogu (mount zawiesza się), ale nie mogę zamontować wyeksportowanego katalogu na maszynie wirtualnej działającej na mojej stacji roboczej.

Próbowałem usunąć ( rmmod) moduł nfsi nfsv3(co nie działałoby Resource temporarily unavailable:). lsofzawiesza się. mountnie pokazuje niczego zamontowanego przez nfs. Wszystko to prawdopodobnie wynika z wielokrotnego użycia „umount -l”, ale pierwsze dwa razy zadziałało bez problemu.

W międzyczasie zrestartowałem serwer, po tym jak nie byłem w stanie zamontować bez tego różnicy. Ja także użyłem service nfs-kernel-server restart. Podejrzewam, że wszystko wróci do normy po ponownym uruchomieniu stacji roboczej klienta.

Czy istnieje sposób na odzyskanie tego i ponowne zainicjowanie strony klienta NFS na mojej stacji roboczej bez ponownego uruchamiania?
Jeśli nie mogę tego naprawić bez ponownego uruchomienia, czy nie powtórzy się to, jeśli zacznę używać autofs?

lsof -b zawiesza się z ostatnimi wierszami:

lsof: avoiding readlink(/run/user/1001/gvfs): -b was specified.
lsof: avoiding stat(/run/user/1001/gvfs): -b was specified.
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1001/gvfs
      Output information may be incomplete.

w wierszach poprzedzających to nie ma /data0.

Wpis w /etc/fstab:

192.168.0.2:/data0 /data0  nfs  defaults,auto,nolock,user 0 2
Anthon
źródło
„ale pierwsze dwa razy zadziałało bez problemu” ... przypomina mi rosyjską ruletkę. Czy lsof -bpowiesić?
muru
@muru Tak, zawiesza się, zaktualizowałem Q o dane wyjściowe. BTW, nigdy nie słyszałem, żeby ktoś narzekał na przegraną z rosyjską ruletką, więc musi to być wygrana wygrana. Zwykle spodziewam się, że wszystko zadziała nigdy, raz lub zawsze, nie wszyscy liczą X razy, ale może okoliczności były inne.
Anthon
Jakiej dystrybucji używasz? Proces ten jest bardzo zróżnicowany.
Graeme
@Graeme To jest Linix Mint 17.1 (Rebecca)
Anthon
Nie jestem pewien, jak to działa w Ubuntu upstarti wszystkich. Prawdopodobnie chcesz zrestartować wszystkie usługi w nfs-commonpakiecie, wygląda na to, że jest ich kilka. Kolejność prawdopodobnie również ma znaczenie, więc spróbuj zatrzymać, a następnie zacząć w kolejności zależności. Prawdopodobnie chcesz to zrobić również rpcbindjako ostatni przystanek / pierwszy start. Zrobiłem to już wcześniej na Debianie, ale ma tylko jedną fajną nfs-commonusługę.
Graeme,

Odpowiedzi:

5

Jak sugeruje @PaperMonkey w komentarzach, możesz być przykręcony, ponieważ użyłeś domyślnych opcji montowania, które obejmują próbę na zawsze.

intrkiedyś było sposobem na ułatwienie przerywania rzeczy, które utknęły na I / O na zepsutym montażu NFS, ale teraz nie ma możliwości. SIGKILLwciąż może zakłócać procesy zatrzymane na NFS, przynajmniej tak nfs(5)twierdzi. Zobacz tę stronę podręcznika, by zobaczyć opcje montowania.

Użyj softzamiast domyślnego, hardjeśli chcesz, aby NFS nie próbował ponownie na zawsze.

Polecam również korzystanie z automountera. Twórz gdzieś dowiązania symboliczne do / net / host / foo / bar, jeśli chcesz.

Często łatwiej jest po prostu zrestartować komputer, ale myślę, że teoretycznie powinieneś być w stanie kill -9(tj. kill -KILL) Dowolne procesy, które utknęły w systemie plików NFS. NASTĘPNIE umount -f może działać. Tylko uważaj, aby nie dopuścić do tego, aby uzupełnianie tabulatorami blokowało więcej procesów na montażu NFS.

Peter Cordes
źródło
Teoretycznie, ale trudno jest znaleźć te procesy, gdy lsof zawiesza się.
kmarsh
@kmarsh: każdy proces w stanie D(uśpienie dysku) w ps / top prawdopodobnie utknął na NFS.
Peter Cordes,
1
Należy pamiętać, że w przypadku używania „miękkiego” zamiast „twardego” istnieje możliwość utraty danych za każdym razem, gdy serwer NFS jest tymczasowo niedostępny.
Marki555,
4

Poniżej znajduje się lista poleceń, które należy uruchomić, aby rozwiązać ten problem w dystrybucji opartej na RPM.

service rpcbind stop
service nfslock stop
rm -rf /var/lib/nfs/statd/sm/*
rm -rf /var/lib/nfs/statd/sm.bak/*

Po tym:

umount -f /share
zombi_man
źródło
1

Używanie autofspomoże uniknąć tego problemu w przyszłości. Największą korzyścią autofsjest to, że nie próbuje on zamontować katalogu, dopóki nie spróbujesz go użyć, co oznacza, że ​​unikniesz zepsutych punktów montowania i że nie będzie próbował się montować w nieskończoność, możesz ustawić limit czasu dla odmontowania (co zwykle jest krótki). Nie jestem pewien, czy automount ponawia próbę w ogóle w tym okresie przedterminowym, ale tak czy inaczej normalnie ustawiam limit czasu automount na zaledwie kilka sekund.

Aby rozwiązać problem bez ponownego uruchamiania, możesz być w stanie umount -aporadzić sobie z (odmontuj wszystko wymienione w / etc / fstab) mount -a(zamontuj wszystko w / etc / fstab), ale ja, chyba że katalog, który utraciłeś zawiera katalog domowy, który „ najlepiej oszczędzać pracę w innym miejscu i po prostu restartować.

Centyman
źródło
0

Użyj wyników polecenia lsof, aby znaleźć procesy na kliencie przechowujące odwołania do przestarzałego systemu plików i zabić te procesy.

umount -f / data0

upewnij się, że możesz pingować serwer, a następnie ponownie zainstalować dysk. Uruchom ponownie żądane procesy.

Klastry

Uwaga: jeśli uruchomisz konfigurację serwera klastra, za każdym razem, gdy serwer będzie musiał przełączyć się w tryb failover, otrzymasz przestarzały uchwyt pliku NFS. Aby tego uniknąć, należy wyeksportować systemy plików za pomocą opcji fsid. Numer fsid powinien być taki sam dla każdego odpowiedniego systemu plików na dwóch serwerach. Zapewnienie replikacji plików zależy od Ciebie. Zobacz fragment ze strony podręcznika poniżej:

fsid = num | root | uuid NFS musi być w stanie zidentyfikować każdy eksportowany system plików. Zwykle użyje UUID dla systemu plików (jeśli system plików ma coś takiego) lub numeru urządzenia urządzenia przechowującego system plików (jeśli system plików jest przechowywany na urządzeniu). Ponieważ nie wszystkie systemy plików są przechowywane na urządzeniach i nie wszystkie systemy plików mają identyfikatory UUID, czasami konieczne jest jawne poinformowanie NFS, jak zidentyfikować system plików. Odbywa się to za pomocą opcji fsid =.

W przypadku NFSv4 istnieje wyróżniony system plików, który jest katalogiem głównym wszystkich eksportowanych systemów plików. Jest to określone za pomocą fsid = root lub fsid = 0, które oznaczają dokładnie to samo.

Inne systemy plików można zidentyfikować za pomocą małej liczby całkowitej lub identyfikatora UUID, który powinien zawierać 32 cyfry szesnastkowe i dowolną interpunkcję.

Jądra Linuksa w wersji 2.6.20 i wcześniejszych nie rozumieją ustawienia UUID, więc należy użyć małej liczby całkowitej, jeśli dla takich jąder należy ustawić opcję fsid. Obsługiwane jest ustawienie zarówno małej liczby, jak i identyfikatora UUID, dzięki czemu można skonfigurować tę samą konfigurację do pracy zarówno na starych, jak i nowych jądrach.

UDude
źródło
Powiedział już, że lsof się zawiesza.
kmarsh