อุปกรณ์ไม่ว่างบน Umount


41

ฉันมักประสบปัญหาในการเพิ่มไดเรกทอรี:

umount / mnt / dir
umount: / mnt / dir: อุปกรณ์ไม่ว่าง

มีสาเหตุหลายประการที่ทำให้อุปกรณ์ไม่ว่าง บางครั้งมีกระบวนการทำงานที่มีการล็อคเปิดในนั้นบางครั้งมีไดเรกทอรีอื่น ๆ /mnt/dirที่ติดตั้งอยู่ด้านบนของ

คำถามของฉัน:

ขั้นตอนในการตรวจสอบว่าเหตุใดจึงไม่สามารถถอนติดตั้งไดเรกทอรีได้

ฉันรู้ว่ามีหลายเหตุผล แต่ก็โอเคถ้าคุณอธิบายวิธีแก้ปัญหาเฉพาะ

[แก้ไข]

[X] กระบวนการที่กำลังทำงานอยู่บนโวลุ่มที่เมานต์
[X] ไดรฟ์ข้อมูลอื่นติดตั้งอยู่ด้านบนของไดรฟ์ข้อมูลที่เราต้องการยกเลิกการเมานท์
[_] NFS ล็อคไดรฟ์ที่เราต้องการยกเลิกการต่อเชื่อม


คำตอบ:


75

วิธีการตรวจสอบคือfuser -vm /mnt/dirต้องรันเป็นรูท มันจะบอกคุณว่ากระบวนการใดกำลังเข้าถึงจุดเชื่อมต่อ

ทางเลือกคือlsof /mnt/dirซึ่งจะแสดงไฟล์ที่เปิดแต่ละไฟล์บนเมานต์ ทำงานที่ดีที่สุดอีกครั้งเป็น root

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

ตัวอย่าง:

Watt:~# fuser -vm /mnt/Zia/src
                     USER        PID ACCESS COMMAND
/mnt/Zia/src:        root     kernel mount /mnt/Zia/src
                     anthony   24909 ..c.. bash
                     anthony   25041 F.c.. gvim

ช่อง "เข้าถึง" จะบอกคุณถึงวิธีการเข้าถึง ในกรณีนี้เคอร์เนลมีการใช้เป็นเมานท์ (duh แต่ unmount จะตกลงกับสิ่งนี้เท่านั้น) bashมีมันเป็นไดเรกทอรีการทำงานปัจจุบัน (จะต้องไปcdยังไดเรกทอรีที่แตกต่างกันก่อนที่จะเลิกเมานท์) และ gvim ทั้งสองมีไดเรกทอรีปัจจุบันและมีไฟล์ที่เปิดอยู่ (จะต้องปิด gvim นั้น)

Watt:~# lsof /mnt/Zia/src
COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
bash    24909 anthony  cwd    DIR   0,26    12288 3527682 /mnt/Zia/src/perl (zia.vpn.home:/home/anthony/src)
gvim    25041 anthony  cwd    DIR   0,26    12288 3527682 /mnt/Zia/src/perl (zia.vpn.home:/home/anthony/src)
gvim    25041 anthony    6u   REG   0,26    16384 3526219 /mnt/Zia/src/perl/.utf8.c.swp (zia.vpn.home:/home/anthony/src)

ในเอาต์พุตนี้คุณสามารถดูไดเร็กทอรีปัจจุบันสำหรับทั้ง bash และ gvim (เป็นชนิดDIR) คุณยังสามารถดูไฟล์ gvim ที่เปิดอ่านได้

วิธีการบังคับใช้ปัญหา:

fuserมี-kตัวเลือกที่จะส่งสัญญาณ (ค่าเริ่มต้น:) SIGKILLไปยังแต่ละกระบวนการโดยใช้การเมาท์ นี่เป็นวิธีที่ค่อนข้างมีพลังในการหยุดการเมาไม่ว่าง (และแน่นอนระวังสิ่งที่คุณSIGKILL!)

umountมี-lตัวเลือกในการดำเนินการ unmount ที่ขี้เกียจ การเมาท์จะถูกลบออกจากเนมสเปซของระบบไฟล์ (ดังนั้นคุณจะไม่เห็นมัน/mnt/Zia/srcอีกต่อไปในตัวอย่าง) แต่จะยังคงเมานต์อยู่ดังนั้นโปรแกรมที่เข้าถึงมันจะสามารถทำต่อไปได้ เมื่อโปรแกรมสุดท้ายที่เข้าใช้ออกจากระบบการถอนติดตั้งจะเกิดขึ้นจริง

มีสาเหตุหนึ่งที่แก้ไขได้สุดท้ายของการ unmount ที่ล้มเหลวและนั่นคือเซิร์ฟเวอร์ NFS ที่กำลังจะล่ม ที่นี่คุณสามารถใช้umount -fแต่คุณเสี่ยงต่อการสูญเสียข้อมูลถ้าคุณทำเช่นนั้น (ไคลเอ็นต์อาจมีการเขียนแคชที่ยังไม่ได้รับการยืนยันจากเซิร์ฟเวอร์และการเขียนเหล่านั้นจะถูกยกเลิกอย่างไรก็ตามแอปได้รับการแจ้งว่าการเขียนสำเร็จแล้ว)


4
ทราบว่าfuser -kเป็นอย่างมากที่มีความเสี่ยงที่คุณจะทำมันเป็นรากและถ้าคุณไม่ได้มากแน่ใจว่ากระบวนการที่จะต้องถูกฆ่าปิดที่คุณสามารถทำเสียหายที่งดงามอย่างแท้จริงที่มีคำสั่งประมาท ...
Shadur

1
@Shadur หวังว่าคุณจะได้ใช้มันโดยไม่มี-kตัวเลือกดังนั้นคุณจะรู้ว่ากระบวนการใดที่คุณกำลังจะฆ่า แต่ฉันจะเพิ่มคำเตือน
derobert

1
fuser -vmแสดงให้เห็นว่า "kernel mount" ต้องทำแทนของคู่มือsystemctl stop opt.mount umount
lkraav

2
ด้วยเหตุผลบางอย่าง umount -f ใช้งานไม่ได้สำหรับฉัน แต่การเรียกใช้ umount -l ทำงานได้อย่างสมบูรณ์แบบ
Firze

ขอบคุณสำหรับหมายเหตุเกี่ยวกับumount -fและ NFS ปัญหาของฉันคือ NFS ที่เกี่ยวข้องกับที่เครื่อง dev ของฉันเปลี่ยน IP และฉันไม่สามารถลบส่วนแบ่งได้
Eric

19

คุณควรใช้:

sudo umount -l <path>

7
⁺¹ฉันไม่รู้เลยว่าคนโง่ ๆ สามารถลงคะแนนได้อย่างไร -lเป็นว่าตัวเลือกที่จะใช้เมื่อแม้-fไม่ได้ทำงาน
สวัสดีแองเจิล

@ Hi-Angel เพราะนี่ไม่ใช่สิ่งที่ OP ถาม
xhienne

@xheinne stack exchange ไม่ได้เป็นเพียงการตอบคำถามเช่นบอต stupeed คำตอบนี้มีประโยชน์ หลายคนมาจากการค้นหาของ Google ด้วย ฉันพบว่ามีประโยชน์นี้เป็นการส่วนตัว op shoudl ยอมรับคำตอบซึ่งเขาพบว่ามีความเกี่ยวข้องนั่นคือสาเหตุที่ปุ่มยอมรับมี
user1735921

6

อีกเล่มหนึ่งติดตั้งอยู่ด้านบนของโวลุ่มที่เราต้องการยกเลิกการต่อเชื่อม:

mountคำสั่งช่วยให้คุณทราบปริมาณทั้งหมดที่ติดตั้งถ้า invoqued โดยไม่ขัดแย้งหรือตัวเลือก (ยกเว้น-v) คุณสามารถมีรายการจุดเมานท์ที่ใช้งานได้โดยเพิ่ม perl เล็กน้อย:

mount | perl -pe 's/.*on (\S+) type.*/\1/'

จากนั้นเพียงแค่ทำการ mointpoint ที่คุณต้องการถอนการติดตั้งและคุณจะรู้ว่ามีการติดตั้งระบบไฟล์มากกว่านี้

mount | perl -pe 's/.*on (\S+) type.*/\1/' | grep '/mnt/dir/'

แล้วคุณมีสองโซลูชั่น ยกเลิกการต่อเชื่อมระบบไฟล์หรือย้ายไฟล์ด้วยmount --move olddir newdir(เคอร์เนล> 2.5.1)


1
ใช่ขอบคุณ. / etc / mtab และ / proc / mounts ก็เป็นไปได้เช่นกัน

อ่าถูกต้องฉันมักจะลืมสิ่งเหล่านั้น สมมติว่าการพิมพ์ "mount" ต้องใช้อักขระน้อยลง (แต่ต้องใช้ทรัพยากรมากขึ้นในการประมวลผล)
mveroone

1
ฉันมีอุปกรณ์เก็บข้อมูล USB ภายนอก "ถาวร" ติดตั้งอยู่ในไดเรกทอรีบางอย่างบนแล็ปท็อปของฉันบางครั้งสายเคเบิลอาจถูกตัดการเชื่อมต่อโดยไม่ได้ตั้งใจ มันเป็นความเจ็บปวดครั้งใหญ่ในการติดตั้งอุปกรณ์ใหม่ในไดเรกทอรี (เพราะ "อุปกรณ์ไม่ว่าง") จนกว่าฉันจะอ่านคำตอบนี้ ตอนนี้ฉันรู้ว่าใช้ Mount --move olddir newdir ขอบคุณ
Silvio Levy

3

เปิดไฟล์

กระบวนการที่เปิดไฟล์เป็นตัวการผิดปกติ แสดงพวกเขา:

lsof +f -- <mountpoint or device>

มีข้อได้เปรียบในการใช้ /dev/<device>มากกว่า/mountpoint: จุดเมานท์จะหายไปหลังจากumount -lหรืออาจซ่อนโดยการเมาท์แบบซ้อนทับ

fuserยังสามารถใช้ แต่ในใจของฉันlsofมีผลลัพธ์ที่มีประโยชน์มากขึ้น อย่างไรก็ตามfuserมีประโยชน์เมื่อพูดถึงการฆ่ากระบวนการที่ทำให้เกิดละครของคุณเพื่อให้คุณสามารถดำเนินชีวิตต่อไปได้

รายการไฟล์บน<mountpoint>(ดูข้อแม้ด้านบน):

fuser -vmM <mountpoint>

ฆ่าเฉพาะกระบวนการที่เปิดไฟล์เพื่อการเขียนเท่านั้น:

fuser -vmMkiw <mountpoint>

หลังจากติดตั้งใหม่แบบอ่านอย่างเดียว ( mount -o remount,ro <mountpoint>) แล้วจะปลอดภัย (r) เพื่อฆ่ากระบวนการที่เหลือทั้งหมด:

fuser -vmMk <mountpoint>

mountpoints

ผู้ร้ายสามารถเป็นเคอร์เนลได้ ระบบไฟล์อื่นที่เมาท์บนระบบไฟล์ที่คุณพยายามumountจะทำให้เกิดความเศร้าโศก ตรวจสอบกับ:

mount | grep <mountpoint>/

สำหรับการเมานต์ย้อนกลับตรวจสอบผลลัพธ์ของ:

losetup -la

inodes นิรนาม (Linux)

inodes นิรนามสามารถสร้างได้โดย:

  • ไฟล์ชั่วคราว ( openพร้อมO_TMPFILE)
  • inotifyนาฬิกา
  • [eventfd]
  • [eventpoll]
  • [timerfd]

เหล่านี้เป็นชนิดที่เข้าใจยากที่สุดของโปเกมอนและปรากฏในlsof's TYPEคอลัมน์เป็นa_inode(ซึ่งไม่มีเอกสารใน lsofหน้าคน )

พวกเขาจะไม่ปรากฏในlsof +f -- /dev/<device>ดังนั้นคุณจะต้อง:

lsof | grep a_inode

สำหรับการฆ่ากระบวนการถือ inodes ที่ไม่ระบุชื่อโปรดดูที่: รายการปัจจุบันนาฬิกา inotify (ชื่อพา ธ PID)


1

คำถามวิธีตรวจสอบว่า NFS เข้าถึงไดเรกทอรีที่กำลังจะยกเลิกการต่อเชื่อมหรือไม่นั้นยังไม่ได้รับคำตอบ

สิ่งที่ฉันมีเพียงแค่นี้:

ตรวจสอบว่า nfsd กำลังทำงานอยู่:

pidof nfsd

แสดงไดเรกทอรีที่เมาท์โดยไคลเอนต์:

showmount -a

และshowmountอาร์กิวเมนต์ w / o จะแสดงเฉพาะโฮสต์ไคลเอ็นต์แม้ว่าจะอยู่นอกบรรทัด ฉันคิดว่านี่เป็นพฤติกรรมพิเศษของ NFS


1

สำหรับฉันปัญหาคือว่าฉันเข้าสู่ระบบมากกว่าหนึ่งครั้ง (ผ่าน ssh) และหนึ่งในการเข้าสู่ระบบที่ฉันได้รับคำสั่งที่ pwd อยู่ในโฟลเดอร์ที่อยู่ภายใต้จุดเมานท์

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