재부팅하지 않고 NFS 클라이언트 다시 초기화

재부팅하지 않고 NFS 클라이언트 다시 초기화

저는 NFS를 사용하여 디렉토리를 내보낸 서버에서 작업하고 있습니다. 물론, 일주일 동안 워크스테이션의 파일 시스템(부팅 마운트에서)을 여러 번 내보내는 것을 잊었거나 서버가 재부팅되었습니다 umount. /etc/fstab그 사이에 나중에 다시 설치할 수 있었습니다 umount(저는아니요사용 autofs):

umount -fl /data0
mount /data0

그러나 이것은 더 이상 작동하지 않습니다.

할 수 없다서버에서 내보낸 디렉터리를 다른 디렉터리에 마운트했지만(마운트 중단)할 수 있는nfs는 내 워크스테이션에서 실행되는 가상 머신에 내보낸 디렉터리를 마운트합니다.

내가 시도한 것은 ( rmmod) nfsnfsv3모듈을 제거하는 것이었습니다(이것은 작동하지 않았습니다 :) Resource temporarily unavailable. lsof걸다. mount마운트된 항목이 표시되지 않습니다 nfs. 이는 "umount -l"을 여러 번 사용한 결과일 수 있지만 처음 두 번은 문제 없이 작동했습니다.

동시에 서버를 다시 시작했는데 설치할 수 없어서 아무런 효과가 없었습니다. 나도 그것을 사용했습니다 service nfs-kernel-server restart. 클라이언트 워크스테이션을 다시 시작하면 모든 것이 정상으로 돌아갈 것으로 생각됩니다.

재부팅하지 않고 이 문제를 복구하고 워크스테이션에서 nfs 클라이언트를 다시 초기화할 수 있는 방법이 있습니까?
재부팅하지 않고는 해결이 안되는데, 사용을 시작해도 이런 현상은 발생하지 않나요 autofs?

lsof -b마지막 몇 줄이 중단됩니다.

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.

이 앞 줄에는 /data0.

항목 /etc/fstab:

192.168.0.2:/data0 /data0  nfs  defaults,auto,nolock,user 0 2

답변1

@PaperMonkey가 의견에서 제안한 것처럼 영원히 다시 시도하는 것을 포함하는 기본 설치 옵션을 사용했기 때문에 문제가 발생할 수 있습니다.

intr손상된 NFS 마운트와 같은 경우 I/O를 보다 쉽게 ​​중단할 수 있는 방법이 있었지만 지금은 작동하지 않습니다. SIGKILLNFS에 멈춰 있는 프로세스를 중단하는 것이 여전히 가능하므로 이를 nfs(5)요청합니다. 설치 옵션은 이 매뉴얼 페이지를 참조하십시오.

NFS가 다시 시도하지 않도록 하려면 soft기본값 대신 사용하십시오.hard

자동 설치 프로그램을 사용하는 것도 좋습니다. 필요한 경우 어딘가에 /net/host/foo/bar에 대한 심볼릭 링크를 만들 수 있습니다.

일반적으로 재부팅하는 것이 더 쉽지만 이론적으로는 어떤 프로세스에서든 NFS에 멈출 kill -9수 있어야 한다고 생각합니다 . kill -KILL그러면 umount -f가 작동할 수 있습니다. 탭 완료로 인해 NFS 마운트에서 더 많은 프로세스가 중단되지 않도록 주의하세요.

답변2

다음은 RPM 기반 배포판에서 이 문제를 해결하기 위해 실행해야 하는 명령 목록입니다.

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

이후:

umount -f /share

답변3

이 파티에 정말 늦었다는 걸 알지만, 저도 같은 문제를 겪고 있고 위의 답변과 의견 중 일부가 도움이 되었기 때문에 요약해야겠다고 생각했습니다. 내 경우에는 를 사용하고 있었는데 autofsNFS 마운트 중 하나가 중단되고 umount -f작동하지 않고 lsof중단되었습니다. 내 NFS 마운트에서는 이 hard옵션 등을 사용합니다.

이 명령을 사용하여 I/O를 기다리는 모든 프로세스의 상태, pid 및 명령을 표시할 수 있습니다.

ps -e -os,pid,cmd | ps -e -os,pid,cmd |

이 경우 ^D는 제어 D 시퀀스가 ​​아닌 캐럿(6으로 이동) 뒤에 대문자 D가 오는 것입니다. 그런 다음 이러한 프로세스를 확인하고 중단된 파일 시스템과 관련될 수 있는 프로세스를 종료할 수 있습니다. 모든 관련 프로세스가 종료된 후 다음 명령을 사용하여 파일 시스템을 마운트 해제할 수 있습니다.

제거 -fFS

어디FS나중에 다시 마운트할 수 있는 일시 중지된 파일 시스템입니다. 이 프로세스는 사용하지 않을 때에도 도움이 될 수 있습니다 autofs. 나는 이 모든 것을 Fedora 30에서 테스트했습니다.

답변4

lsof 명령의 결과를 사용하여 클라이언트에서 오래된 파일 시스템에 대한 참조를 보유하는 프로세스를 찾고 해당 프로세스를 종료합니다.

마운트 해제 -f /data0

서버를 ping할 수 있는지 확인한 다음 드라이브를 다시 마운트하십시오. 필요한 프로세스를 다시 시작합니다.

무리

클러스터된 서버 설정을 실행하면 서버가 장애 조치를 수행해야 할 때마다 오래된 nfs 파일 핸들이 생성됩니다. 이러한 상황을 방지하려면 fsid 옵션을 사용하여 파일 시스템을 내보내야 합니다. 두 서버의 각 파일 시스템에 대한 fsid 번호는 동일해야 합니다. 파일이 복사되었는지 확인하는 것은 사용자의 몫입니다. 아래 매뉴얼 페이지의 스니펫을 참조하세요.

fsid=num|root|uuid NFS는 내보내는 모든 파일 시스템을 식별할 수 있어야 합니다. 일반적으로 파일 시스템의 UUID(파일 시스템에 그런 것이 있는 경우) 또는 파일 시스템을 보유하는 장치의 장치 번호(파일 시스템이 장치에 저장된 경우)를 사용합니다. 모든 파일 시스템이 장치에 저장되는 것은 아니며 모든 파일 시스템에 UUID가 있는 것은 아니기 때문에 NFS에 파일 시스템 식별 방법을 명시적으로 알려야 하는 경우가 있습니다. 이는 fsid= 옵션을 사용하여 수행됩니다.

NFSv4의 경우 내보낸 모든 파일 시스템의 루트인 고유한 파일 시스템이 있습니다. 이는 fsid=root 또는 fsid=0으로 지정되며 이는 정확히 동일한 의미를 갖습니다.

다른 파일 시스템은 작은 정수 또는 32개의 16진수 숫자와 구두점을 포함하는 UUID로 식별할 수 있습니다.

Linux 커널 버전 2.6.20 이하에서는 UUID 설정을 인식하지 못하므로 해당 커널에 대해 fsid 옵션을 설정해야 하는 경우 작은 정수를 사용해야 합니다. 이전 커널과 새 커널에서 동일한 구성을 사용할 수 있도록 더 작은 숫자와 UUID 설정을 지원합니다.

관련 정보