reinit NFS ไคลเอนต์โดยไม่ต้องเริ่มต้นใหม่


10

ฉันทำงานบนเซิร์ฟเวอร์ของฉันซึ่งฉันส่งออกหนึ่งไดเรกทอรีโดยใช้ NFS แน่นอนว่าในช่วงหนึ่งสัปดาห์หรือมากกว่านั้นในการรีบูทเซิร์ฟเวอร์ฉันลืมไปหลายครั้งumountว่าระบบไฟล์ส่งออกในเวิร์กสเตชันของฉัน (ซึ่งติดตั้งจากการ/etc/fstabบูต) ในระหว่างที่ฉันสามารถumountหลังจากข้อเท็จจริงและจำนวนใหม่ (ฉันไม่ได้ใช้autofs):

umount -fl /data0
mount /data0

แต่มันใช้งานไม่ได้อีกต่อไป

ฉันไม่สามารถเมานท์ไดเร็กทอรีที่เอ็กซ์พอร์ตจากเซิร์ฟเวอร์บนไดเร็กทอรีอื่น (mount hangs) แต่ฉันสามารถเมานต์ nfs ที่ส่งออก dir บนเครื่องเสมือนที่ทำงานบนเวิร์กสเตชันของฉัน

สิ่งที่ฉันพยายามที่เป็นลบ ( rmmod) nfsและnfsv3โมดูล (ซึ่งจะไม่ทำงาน: 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

"แต่สองครั้งแรกนี้ทำงานได้โดยไม่มีปัญหา" ... ทำให้ฉันนึกถึงรูเล็ตรัสเซีย จะlsof -bแขวนหรือไม่
muru

@muru ใช่แล้วแฮงค์ฉันอัพเดท Q ด้วยเอาท์พุท BTW ฉันไม่เคยได้ยินใครบ่นเกี่ยวกับการแพ้กับรูเล็ตรัสเซียดังนั้นมันต้องเป็นเกมที่ชนะ ฉันมักจะคาดหวังว่าสิ่งต่าง ๆ จะไม่เคยทำงานไม่เคยครั้งหรือตลอดเวลาไม่นับจำนวนครั้งที่ X แต่บางทีสถานการณ์อาจแตกต่างกัน
Anthon

คุณใช้ distro แบบใด กระบวนการแตกต่างกันมาก
แกรม

@Graeme นี่คือ Linix Mint 17.1 (Rebecca)
Anthon

ไม่แน่ใจว่ามันทำงานกับ Ubuntu ได้อย่างไรupstartและทั้งหมด คุณอาจต้องการรีสตาร์ทบริการทั้งหมดในnfs-commonแพ็คเกจดูเหมือนว่ามีบางอย่าง จัดลำดับเรื่องที่น่าจะเป็นเช่นกันให้ลองหยุดแล้วเริ่มเรียงตามลำดับการพึ่งพา คุณอาจต้องการทำrpcbindเหมือนการหยุดครั้งสุดท้าย / เริ่มครั้งแรก ฉันเคยทำสิ่งนี้มาก่อนใน Debian แต่มันมีnfs-commonบริการที่ดีเพียงอย่างเดียว
แกรม

คำตอบ:


5

ตามที่ @PaperMonkey แนะนำไว้ในความคิดเห็นคุณอาจถูกเมาเพราะคุณใช้ตัวเลือกการเมาท์เริ่มต้นซึ่งรวมถึงการลองใหม่ตลอดไป

intrเคยเป็นวิธีที่จะทำให้การขัดจังหวะสิ่งต่าง ๆ ที่ติดอยู่บน I / O กับการเมานต์ NFS ที่หักพังได้ง่ายขึ้น แต่ตอนนี้มันเป็นแบบไม่ใช้งาน SIGKILLยังสามารถขัดจังหวะกระบวนการที่ติดอยู่บน NFS อย่างน้อยก็เพื่อnfs(5)เรียกร้อง ดู man page นั้นสำหรับตัวเลือกการเมานต์

ใช้softแทนค่าเริ่มต้นhardหากคุณต้องการให้ NFS ไม่ลองอีกครั้งอย่างถาวร

ฉันยังแนะนำให้ใช้เครื่องออโต้ สร้าง symlink ให้กับ / net / host / foo / bar ที่ไหนก็ได้ถ้าคุณต้องการ

บ่อยครั้งมันง่ายกว่าที่จะรีบูต แต่ฉันคิดว่าในทางทฤษฎีคุณควรจะสามารถkill -9(เช่นkill -KILL) กระบวนการใด ๆ ที่ติดอยู่บน NFS จากนั้น umount -f อาจใช้งานได้ เพียงระวังอย่าให้แท็บเสร็จสิ้นจะได้รับกระบวนการเพิ่มเติมที่เมาท์ NFS


ในทางทฤษฎี แต่มันยากที่จะหากระบวนการเหล่านั้นเมื่อ lsof ค้าง
kmarsh

@kmarsh: กระบวนการใด ๆ ที่อยู่ในสถานะD(Disk-sleep) ใน ps / top อาจติดอยู่บน NFS
Peter Cordes

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

4

ด้านล่างนี้เป็นรายการคำสั่งที่เรียกใช้เพื่อแก้ไขปัญหานี้ใน distro ที่ใช้ 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

1

การใช้autofsจะช่วยหลีกเลี่ยงปัญหานี้ในอนาคต ประโยชน์ที่ใหญ่ที่สุดautofsคือมันไม่พยายามเมานต์ไดเรกทอรีจนกว่าคุณจะลองใช้ซึ่งหมายความว่าคุณหลีกเลี่ยงจุดเมานต์ที่เสียหายและจะไม่พยายามเมานต์อย่างไม่มีกำหนดคุณสามารถกำหนดระยะเวลาการหมดเวลาสำหรับการยกเลิกการเมานท์ สั้น). ฉันไม่แน่ใจว่าการลองใหม่อัตโนมัติในระหว่างช่วงเวลาที่กำหนดไว้ล่วงหน้าหรือไม่

ในการแก้ไขปัญหาโดยไม่ต้องเริ่มต้นใหม่คุณอาจจะสามารถรับได้ด้วยumount -a(ยกเลิกการต่อเชื่อมทั้งหมดที่กล่าวถึงใน / etc / fstab) mount -a(เมาท์ทั้งหมดใน / etc / fstab) แต่ฉันได้ยกเว้นไดเรกทอรีที่คุณทำหายไป เป็นการดีที่สุดที่จะบันทึกงานที่อื่นและเพียงรีบูตเครื่อง


0

ใช้ผลลัพธ์ของคำสั่ง lsof เพื่อค้นหากระบวนการบนไคลเอ็นต์ที่เก็บการอ้างอิงไปยังระบบไฟล์เก่าและฆ่ากระบวนการเหล่านั้น

umount -f / data0

มั่นใจได้ว่าคุณสามารถ ping เซิร์ฟเวอร์จากนั้นติดตั้งไดรฟ์ใหม่ รีสตาร์ทกระบวนการที่ต้องการ

เครือข่ายวิสาหกิจ

หมายเหตุถ้าคุณเรียกใช้การตั้งค่าเซิร์ฟเวอร์คลัสเตอร์คุณจะได้รับไฟล์ stale nfs จัดการทุกครั้งที่เซิร์ฟเวอร์ต้องล้มเหลว เพื่อหลีกเลี่ยงการที่คุณควรส่งออกระบบไฟล์ของคุณโดยใช้ตัวเลือก fsid หมายเลขสำหรับ fsid ควรเหมือนกันสำหรับระบบไฟล์แต่ละระบบบนเซิร์ฟเวอร์สองเครื่อง มันขึ้นอยู่กับคุณที่จะรับรองการจำลองแบบของไฟล์ที่เกิดขึ้น ดูตัวอย่างจากหน้าคนด้านล่าง:

fsid = num | root | uuid NFS ต้องสามารถระบุแต่ละระบบไฟล์ที่ส่งออกได้ โดยปกติจะใช้ UUID สำหรับระบบไฟล์ (หากระบบไฟล์มีสิ่งต่าง ๆ ) หรือหมายเลขอุปกรณ์ของอุปกรณ์ที่ถือระบบไฟล์ (หากระบบไฟล์ถูกเก็บไว้ในอุปกรณ์) เนื่องจากระบบไฟล์ทั้งหมดไม่ได้จัดเก็บไว้ในอุปกรณ์และระบบไฟล์บางระบบมี UUID บางครั้งจึงจำเป็นต้องบอก NFS อย่างชัดเจนถึงวิธีระบุระบบไฟล์ เสร็จสิ้นด้วยตัวเลือก fsid =

สำหรับ NFSv4 มีระบบไฟล์ที่แตกต่างซึ่งเป็นรากของระบบไฟล์ที่ส่งออกทั้งหมด สิ่งนี้ถูกระบุด้วย fsid = root หรือ fsid = 0 ซึ่งทั้งคู่หมายถึงสิ่งเดียวกัน

ระบบไฟล์อื่นสามารถระบุได้ด้วยจำนวนเต็มขนาดเล็กหรือ UUID ซึ่งควรมีเลขฐานสิบหก 32 หลักและเครื่องหมายวรรคตอนโดยพลการ

Linux kernels เวอร์ชัน 2.6.20 และก่อนหน้านี้ไม่เข้าใจการตั้งค่า UUID ดังนั้นจึงต้องใช้จำนวนเต็มเล็กน้อยหากจำเป็นต้องตั้งค่าตัวเลือก fsid สำหรับเมล็ดดังกล่าว สนับสนุนการตั้งค่าทั้งจำนวนเล็กน้อยและ UUID ดังนั้นการกำหนดค่าเดียวกันสามารถทำงานกับเมล็ดเก่าและใหม่ได้


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