ฉันจะทราบได้อย่างไรว่ากระบวนการใดบ้างที่ป้องกันไม่ให้ถอดอุปกรณ์ออก


58

บางครั้งฉันต้องการยกเลิกการต่อเชื่อมอุปกรณ์ usbด้วยumount /run/media/theDriveแต่ฉันได้รับdrive is busyข้อผิดพลาด

ฉันจะทราบได้อย่างไรว่ากระบวนการหรือโปรแกรมใดกำลังใช้งานอุปกรณ์อยู่


1
upvotes เพิ่มเติมสำหรับคำถาม / คำตอบเดียวกันกับที่นี่: stackoverflow.com/questions/624154/…
Trevor Boyd Smith

คำตอบ:


57

ใช้lsof | grep /media/whateverเพื่อค้นหาสิ่งที่ใช้เมานต์

นอกจากนี้ให้พิจารณาumount -l(ขี้เกียจ umount) เพื่อป้องกันไม่ให้กระบวนการใหม่ใช้ไดรฟ์ในขณะที่คุณล้างข้อมูล


24
fuser -mv /path/to/mountpointอาจเป็นทางเลือกที่อ่านได้มากขึ้นสำหรับการค้นหากระบวนการโดยใช้ mointpoint
Riccardo Murri

@ RiccardoMurri lsof | grepทำงานได้ดีขึ้นสำหรับฉัน fuser -mvดูเหมือนว่าจะทิ้งกระบวนการที่ไม่เกี่ยวข้องมากกว่า 80 รายการ ฉันใช้เมานท์ไดเรกทอรีผูก
Ricky Boyce

1
umount -lเป็นสิ่งที่อันตราย mount -o bind โหมดไดเรกทอรีที่ว่างเปล่าอยู่ด้านบนแทนและทำความสะอาดผ่าน000 lsof +f -- /dev/device
Tom Hale

35

ส่วนใหญ่แล้วคำสั่งที่ดีที่สุดในการใช้คือlsof (“ l i s t o pen f iles”)

lsof +f -- /media/usb0

โดยที่/media/usb0จุดเชื่อมต่อของไดรฟ์ USB หรือระบบไฟล์อื่นเป็น unmount +f --บอกให้ lsof จัดการกับอาร์กิวเมนต์ที่ตามมาในฐานะจุดเชื่อมต่อ มันมักจะ แต่ไม่เสมอไปจัดการด้วยตัวเองเพื่อที่lsof /media/usb0ยังใช้งานได้ สิ่งนี้จะค้นหาไฟล์ที่เปิดอยู่ (แม้แต่ไฟล์ที่ไม่ได้ลิงก์) ไฟล์ที่แม็พหน่วยความจำไดเรกทอรีปัจจุบันและการใช้งานที่ไม่ชัดเจน คุณจะต้องเรียกใช้คำสั่งในฐานะรูทเพื่อรับข้อมูลเกี่ยวกับกระบวนการของผู้ใช้รายอื่น (และฉันคิดว่ามี unices ที่lsofจะต้องทำงานเป็นรูท)

มีการใช้งานที่ lsof จะไม่พบ; สิ่งเหล่านี้ผิดปกติในสื่อที่ถอดได้ พวกเขารวมถึง:

  • จุดเมานท์: คุณไม่สามารถยกเลิกการต่อเชื่อม/fooถ้า/foo/barเป็นจุดเมานท์
  • อุปกรณ์เชื่อมต่อ: คุณไม่สามารถถอนเมานท์ได้/fooถ้า/foo/barเป็นอุปกรณ์บล็อกที่ติดตั้งหรือไฟล์ปกติที่ติดตั้งแบบวนซ้ำหรือหากเป็นแหล่งที่มาของการเชื่อมโยง Linux
  • การส่งออก NFS: lsof จะไม่ตรวจพบว่าต้นไม้ถูกส่งออกโดยเซิร์ฟเวอร์เคอร์เนล NFS

คำสั่งอื่นที่สามารถให้บริการได้ใน pinch คือ fuser ซึ่งแสดงรายการ PID ของกระบวนการที่มีไฟล์เปิดอยู่บนอุปกรณ์เท่านั้น:

fuser -m /media/usb0

8

คุณสามารถใช้lsofอย่างที่ Peter พูดหรือถ้าคุณแน่ใจว่าคุณต้องการฆ่าสิ่งเหล่านั้นทั้งหมดและเลิกเมานท์คุณอาจทำสิ่งต่อไปนี้:

fuser -Mk /mnt/path
umount /mnt/path

1
หากคุณกำลังจะทำเช่นนี้ดูการใช้-Mเพื่อความปลอดภัย
Tom Hale

@TomHale คุณอาจต้องการทำให้ชัดเจนว่า-Mควรใช้คำสั่งใดกับ
HSchmale

1
fuser: -M, --ismountpoint Request will be fulfilled only if NAME specifies a mountpoint. This is an invaluable seatbelt which prevents you from killing the machine if NAME happens to not be a filesystem.
Tom Hale

6

เปิดไฟล์

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

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

สำหรับการติดตั้งลูปแบ็ค ( ขอบคุณ Stephen Kitt ) ให้ตรวจสอบผลลัพธ์ของ:

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

สำหรับกระบวนการฆ่าที่มีinode ที่ไม่ระบุชื่อดู: แสดงรายการ inotify watches (ชื่อพา ธ , PID) ในปัจจุบัน

inotify นาฬิกา (Linux)

ความคิดเห็นนี้อธิบายถึงสาเหตุที่inotify ไม่ควรป้องกันการยกเลิกการต่อเชื่อม แต่หมายเหตุนี้อธิบายถึงสถานการณ์ที่จะ :

unmount สามารถวางvx_softcnt_flush()สาย การแฮงค์เกิดขึ้นเนื่องจาก inotify watches เพิ่มi_countตัวแปรและทำให้ค่าv_os_hold valueยังคงอยู่ในระดับสูงจนกระทั่ง inotify watcher ปล่อยการพัก


มีอีกคนหนึ่งที่เมาท์ย้อนกลับเป็น: ถ้าคุณติดระบบไฟล์แล้วติดตั้งไฟล์บนระบบไฟล์ที่ใช้ย้อนกลับติดคุณจะไม่สามารถที่จะยกเลิกการต่อเชื่อมระบบไฟล์แรก lsofแต่ไม่มีอะไรที่จะแสดงขึ้นใน
Stephen Kitt

ไชโย เพิ่มไปยังMountpointsส่วน
Tom Hale

5

หากคุณใช้ GNOME การยกเลิกการต่อเชื่อมผ่าน Nautilus จะแสดงข้อความที่ระบุว่ากระบวนการใดที่ยังใช้งานไดรฟ์อยู่และไฟล์ที่ใช้อยู่

ข้อความแสดงแทน


1

สำหรับ OpenBSD (อย่างน้อย):

$ fstat /mnt/mountpoint

ตัวอย่างเช่น (ใช้doasเพื่อรันfstatเป็นรูทอย่างที่เราเห็นกระบวนการของเราเองเท่านั้น):

$ doas fstat /usr/ports
USER     CMD          PID   FD MOUNT        INUM MODE         R/W    SZ|DV NAME
_pbuild  make       15172   wd /usr/ports  3923598  drwxrwxr-x     r     1536 /usr/ports/
_pbuild  make       40034   wd /usr/ports  3923598  drwxrwxr-x     r     1536 /usr/ports/

ในกรณีนี้ฉันจะไม่สามารถยกเลิกการต่อเชื่อม/usr/portsจนกว่าผู้ใช้_pbuildจะเสร็จสิ้นการรันทั้งสองmakeกระบวนการ


-2

นี่เป็นข้อผิดพลาดทั่วไป: คุณเป็นผู้ใช้คนอื่น (ทั้งรูทหรือผู้ใช้รายอื่น) เปลี่ยนเป็นไดเรกทอรีของอุปกรณ์ที่เมาท์แล้วออกจากระบบในฐานะผู้ใช้รายนั้น เมื่อคุณลืมว่าคุณออกจากไดเรกทอรีคุณสามารถลองและค้นหาจนกว่าคุณจะตาบอด lsofจะแสดงเชลล์ซึ่งไดเรกทอรีปัจจุบันใช้อุปกรณ์นั้น คุณอาจต้องการ su ในฐานะผู้ใช้นั้นอีกครั้งเพื่อเปลี่ยนไดเรกทอรีของคุณ


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