재부팅 후“Stale NFS 파일 핸들” 이상 클라이언트에서 폴더에

서버 노드에서 내 보낸 폴더에 액세스 할 수 있습니다. 그러나 재부팅 한 후 (서버와 클라이언트 모두) 더 이상 클라이언트에서 폴더에 액세스 할 수 없습니다.

서버에서

# ls /data
Folder1
Forlder2

/ etc / exports 파일에는

/data 192.168.1.0/24(rw,no_subtree_check,async,no_root_squash)

클라이언트에서

# ls /data
ls: cannot access /data: Stale NFS file handle

클라이언트 측에서 공유 폴더에 문제가 없다고 말해야하지만 재부팅 후 (서버 및 클라이언트)이 메시지가 표시됩니다.

그것을 고칠 방법이 있습니까?



답변

재부팅 순서가 중요합니다. 클라이언트 후 서버를 재부팅하면이 상황이 발생할 수 있습니다. 오래된 NFS 핸들은 클라이언트가 파일을 열었 음을 나타내지 만 서버는 더 이상 파일 핸들을 인식하지 못합니다. 경우에 따라 NFS는 시간 초과 후 데이터 구조를 정리합니다. 다른 경우에는 NFS 데이터 구조를 직접 정리하고 나중에 NFS를 다시 시작해야합니다. 이러한 구조의 위치는 다소 O / S에 따라 다릅니다.

먼저 서버와 클라이언트에서 NFS를 다시 시작하십시오. 파일 핸들이 지워질 수 있습니다.

다른 서버에서 열린 파일로 NFS 서버를 재부팅하는 것은 권장되지 않습니다. 서버에서 열린 파일을 삭제 한 경우 특히 문제가됩니다. 서버는 파일이 재부팅 될 때까지 파일을 열어 둘 수 있지만 재부팅하면 서버 측의 메모리 내 파일 핸들이 제거됩니다. 그러면 클라이언트는 더 이상 파일을 열 수 없습니다.

서버에서 사용 된 마운트를 결정하는 것은 어렵고 신뢰할 수 없습니다. 이 showmount -a옵션은 일부 활성 마운트를 표시 할 수 있지만 모든 마운트를보고하지는 않습니다. 잠긴 파일은 쉽게 식별 할 수 있지만 잠금을 활성화해야하며 파일을 잠 그려면 클라이언트 소프트웨어에 의존합니다.

lsof클라이언트에서 마운트에서 파일을 연 프로세스를 식별 할 수 있습니다 .

NFS 마운트 에서 hardintr마운트 옵션을 사용합니다 . 이 hard옵션을 사용하면 IO가 무기한 재 시도됩니다. 이 intr옵션을 사용하면 프로세스가 NFS IO가 완료되기를 기다리는 경우 종료 될 수 있습니다.


답변

내가 쓴이 스크립트를 사용해보십시오 :

#!/bin/bash
# Purpose:
# Detect Stale File handle and remove it
# Script created: July 29, 2015 by Birgit Ducarroz
# Last modification: --
#

# Detect Stale file handle and write output into a variable and then into a file
mounts=`df 2>&1 | grep 'Stale file handle' |awk '{print ""$2"" }' > NFS_stales.txt`
# Remove : ‘ and ’ characters from the output
sed -r -i 's/://' NFS_stales.txt && sed -r -i 's/‘//' NFS_stales.txt && sed -r -i 's/’//' NFS_stales.txt

# Not used: replace space by a new line
# stales=`cat NFS_stales.txt && sed -r -i ':a;N;$!ba;s/ /\n /g' NFS_stales.txt`

# read NFS_stales.txt output file line by line then unmount stale by stale.
#    IFS='' (or IFS=) prevents leading/trailing whitespace from being trimmed.
#    -r prevents backslash escapes from being interpreted.
#    || [[ -n $line ]] prevents the last line from being ignored if it doesn't end with a \n (since read returns a non-zero exit code when it encounters EOF).

while IFS='' read -r line || [[ -n "$line" ]]; do
    echo "Unmounting due to NFS Stale file handle: $line"
    umount -fl $line
done < "NFS_stales.txt"
#EOF


답변

NFS 서버에서 파일 시스템을 내보내고 다시 내 보냅니다.

exportfs -u nfs-server : / file_system exportfs nfs-server : / file_system

클라이언트에서 파일 시스템을 마운트하십시오.

mount -t nfs nfs 서버 : / filesystem / mount_point


답변

특정 경로의 lsof를 확인하고 각각의 pid를 종료하십시오. 그런 다음 파티션을 마운트 해제했다가 다시 마운트하십시오.


답변