“ Stale NFS file handle” หลังจากรีบูต


16

บนโหนดเซิร์ฟเวอร์เป็นไปได้ที่จะเข้าถึงโฟลเดอร์ที่ส่งออก อย่างไรก็ตามหลังจากรีบูตเครื่อง (ทั้งเซิร์ฟเวอร์และไคลเอนต์) โฟลเดอร์จะไม่สามารถเข้าถึงได้จากไคลเอนต์

บนเซิร์ฟเวอร์

# 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

ฉันต้องบอกว่าไม่มีปัญหากับโฟลเดอร์ที่แชร์จากฝั่งไคลเอ็นต์ แต่หลังจากรีบูตเครื่อง (เซิร์ฟเวอร์และไคลเอนต์) ฉันเห็นข้อความนี้

มีวิธีแก้ไขไหม?

คำตอบ:


22

คำสั่งของการเรียบเป็นสิ่งสำคัญ การเริ่มต้นเซิร์ฟเวอร์ใหม่หลังจากไคลเอนต์อาจส่งผลให้สถานการณ์นี้ หมายเลขอ้างอิงเก่าของ NFS บ่งชี้ว่าไคลเอ็นต์มีไฟล์เปิดอยู่ แต่เซิร์ฟเวอร์ไม่รู้จักการจัดการไฟล์อีกต่อไป ในบางกรณี NFS จะล้างโครงสร้างข้อมูลหลังจากหมดเวลา ในกรณีอื่น ๆ คุณจะต้องทำความสะอาดโครงสร้างข้อมูล NFS ด้วยตัวคุณเองและรีสตาร์ท NFS หลังจากนั้น ที่โครงสร้างเหล่านี้ตั้งอยู่ค่อนข้าง O / S

ลองรีสตาร์ท NFS ก่อนบนเซิร์ฟเวอร์จากนั้นไคลเอนต์ นี่อาจล้างไฟล์ที่จับ

ไม่แนะนำให้รีบูตเซิร์ฟเวอร์ NFS ด้วยไฟล์ที่เปิดจากเซิร์ฟเวอร์อื่น นี่เป็นปัญหาโดยเฉพาะอย่างยิ่งถ้าลบไฟล์ที่เปิดอยู่บนเซิร์ฟเวอร์ เซิร์ฟเวอร์อาจเปิดไฟล์ไว้จนกว่าจะมีการรีบูทใหม่ แต่การรีบูตจะลบหมายเลขอ้างอิงไฟล์ในหน่วยความจำทางฝั่งเซิร์ฟเวอร์ จากนั้นไคลเอ็นต์จะไม่สามารถเปิดไฟล์ได้อีกต่อไป

การพิจารณาว่าการเมาท์ใดที่ใช้งานจากเซิร์ฟเวอร์นั้นยากและไม่น่าเชื่อถือ showmount -aตัวเลือกอาจแสดงม้าใช้งานบางอย่าง แต่อาจจะไม่รายงานทั้งหมดของพวกเขา ไฟล์ที่ถูกล็อคนั้นระบุได้ง่ายกว่า แต่ต้องการการล็อคเพื่อเปิดใช้งานและต้องอาศัยซอฟต์แวร์ไคลเอนต์เพื่อล็อคไฟล์

คุณสามารถใช้lsofกับไคลเอนต์เพื่อระบุกระบวนการที่มีไฟล์เปิดอยู่บนเมาท์

ฉันใช้hardและintrเมานต์ตัวเลือกในการเมาท์ NFS ของฉัน hardตัวเลือกที่ทำให้เกิด IO จำเป็นต้องลองไปเรื่อย ๆ intrตัวเลือกที่ช่วยให้กระบวนการจะถูกฆ่าตายถ้าพวกเขากำลังรออยู่บน NFS IO เสร็จสมบูรณ์


การใช้hard, intrเป็นคำแนะนำที่ดี อย่างไรก็ตามโปรดทราบว่า NFS จะเพิ่มการหมดเวลาเป็นสองเท่าด้วยการลองแต่ละครั้ง ดังนั้นคุณที่ดีที่สุดตั้งtimeo=1และretrans=5หรือเพื่อให้ โปรดทราบว่าสิ่งนี้จะทำให้เครียดมากบนเซิร์ฟเวอร์ NFS ของคุณหลังจากที่รีสตาร์ท NFS พยายามอย่ารีสตาร์ทบริการ NFS ของคุณบ่อยครั้ง;)
bjanssen

คำตอบของคุณถูกต้อง ฉันพบวิธีแก้ปัญหาง่ายๆอีกวิธีหนึ่ง บนโหนดที่บอกว่าตัวจัดการ NFS เก่าเพียงแค่ติดตั้งและติดตั้งโฟลเดอร์ใหม่อีกครั้ง
mahmood

4

ลองใช้สคริปต์นี้ฉันเขียนว่า:

#!/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

2

บนเซิร์ฟเวอร์ NFS UN-export และส่งออกระบบไฟล์อีกครั้ง:

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

บนไคลเอนต์เมาท์ระบบไฟล์

mount -t nfs nfs-server: / filesystem / mount_point


0

ตรวจสอบ lsof ของเส้นทางที่เฉพาะเจาะจงและฆ่า pid นั้น จากนั้นถอนการติดตั้งพาร์ติชันและติดตั้งกลับ


นี่เป็นวิธีแก้ปัญหามากกว่าวิธีแก้ไขปัญหาที่ระบุในคำถาม
asdmin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.