หลีกเลี่ยงการ umount -l
umount -l
ในช่วงเวลาของการเขียนคำตอบบนลงมติขอแนะนำให้ใช้
umount -l
เป็นอันตรายหรือที่ดีที่สุดที่ไม่ปลอดภัย สรุป:
- ไม่ได้เลิกเมานท์อุปกรณ์จริง ๆ เพียงแค่ลบระบบไฟล์ออกจากเนมสเปซ เขียนไปยังไฟล์ที่เปิดสามารถดำเนินการต่อ
- มันอาจทำให้ระบบไฟล์ btrfs เสียหายได้
หลีกเลี่ยง / ทางเลือก
พฤติกรรมที่มีประโยชน์ของการumount -l
ซ่อนระบบไฟล์จากการเข้าถึงโดยชื่อพา ธสัมบูรณ์ซึ่งจะช่วยลดการใช้งาน moutpoint เพิ่มเติม
พฤติกรรมเดียวกันนี้สามารถทำได้โดยการติดตั้งไดเรกทอรีว่างที่มีสิทธิ์000
ในการยกเลิกการเมานท์ไดเรกทอรี
จากนั้นการเข้าถึงชื่อไฟล์ใหม่ในด้านล่างจุดเมานท์นั้นจะเข้าสู่ไดเรกทอรีที่ทับซ้อนกันใหม่โดยไม่มีการอนุญาตศูนย์ - ตัวบล็อกใหม่ของ unmount จะถูกป้องกัน
ก่อนอื่นให้ลอง remount,ro
ความสำเร็จที่ไม่ได้ติดตั้งที่สำคัญที่จะปลดล็อคคือการติดตั้งใหม่แบบอ่านอย่างเดียว เมื่อคุณได้รับremount,ro
ป้ายแสดงว่าคุณรู้ว่า:
- ข้อมูลที่ค้างอยู่ทั้งหมดถูกเขียนลงดิสก์
- ความพยายามในการเขียนในอนาคตทั้งหมดจะล้มเหลว
- ข้อมูลอยู่ในสถานะที่สอดคล้องกันหากคุณจำเป็นต้องถอดอุปกรณ์ออก
mount -o remount,ro /dev/device
รับประกันว่าจะล้มเหลวหากมีไฟล์ที่เปิดสำหรับการเขียนดังนั้นลองตรงนั้น คุณอาจจะรู้สึกโชคดีพังค์!
หากคุณโชคไม่ดีให้มุ่งเน้นเฉพาะกระบวนการที่เปิดไฟล์สำหรับการเขียนเท่านั้น :
lsof +f -- /dev/<devicename> | awk 'NR==1 || $4~/[0-9]+[uw -]/'
จากนั้นคุณควรจะสามารถติดตั้งอุปกรณ์แบบอ่านอย่างเดียวและให้แน่ใจว่าสถานะที่สอดคล้องกัน
ถ้าคุณไม่สามารถ remount อ่านอย่างเดียว ณ จุดนี้การตรวจสอบบางส่วนของสาเหตุที่เป็นไปได้อื่น ๆ ที่ระบุไว้ที่นี่
ความสำเร็จแบบอ่านอย่างเดียวอีกครั้งปลดล็อค unlock
ขอแสดงความยินดีขณะนี้ข้อมูลของคุณบน mountpoint สอดคล้องกันและได้รับการปกป้องจากการเขียนในอนาคต
ทำไมถึงfuser
ด้อยกว่าlsof
ทำไมไม่ใช้ใช้fuser
ก่อนหน้า? คุณสามารถมี แต่ fuser
ทำงานกับไดเรกทอรีไม่ใช่อุปกรณ์ดังนั้นหากคุณต้องการลบจุดเมานท์จากพื้นที่ชื่อไฟล์และยังคงใช้อยู่fuser
คุณจะต้อง:
- ทำซ้ำจุดเมานท์ชั่วคราวกับ
mount -o bind /media/hdd /mnt
ตำแหน่งอื่น
- ซ่อนจุดเมานท์ดั้งเดิมและบล็อกเนมสเปซ:
นี่คือวิธี:
null_dir=$(sudo mktemp --directory --tmpdir empty.XXXXX")
sudo chmod 000 "$null_dir"
# A request to remount,ro will fail on a `-o bind,ro` duplicate if there are
# still files open for writing on the original as each mounted instance is
# checked. https://unix.stackexchange.com/a/386570/143394
# So, avoid remount, and bind mount instead:
sudo mount -o bind,ro "$original" "$original_duplicate"
# Don't propagate/mirror the empty directory just about hide the original
sudo mount --make-private "$original_duplicate"
# Hide the original mountpoint
sudo mount -o bind,ro "$null_dir" "$original"
จากนั้นคุณจะมี:
- เนมสเปซดั้งเดิมถูกซ่อน (ไม่สามารถเปิดไฟล์ได้อีกต่อไปปัญหาจะไม่แย่ลง)
- ผูกติดซ้ำไดเรกทอรี (เมื่อเทียบกับอุปกรณ์)
fuser
ที่จะเรียกใช้
นี่ซับซ้อนกว่า[1]แต่ให้คุณใช้:
fuser -vmMkiw <mountpoint>
ซึ่งจะขอให้โต้ตอบฆ่ากระบวนการด้วยไฟล์ที่เปิดสำหรับการเขียน แน่นอนคุณสามารถทำได้โดยไม่ต้องซ่อนจุดเมานท์เลยก็ได้ แต่การเลียนแบบข้างต้นumount -l
ไม่มีอันตรายใด ๆ
-w
สวิตช์ข้อกำหนดด้านการเขียนกระบวนการและ-i
มีการโต้ตอบดังนั้นหลังจากที่อ่านอย่างเดียว remount ถ้าคุณมันรีบร้อนแล้วคุณสามารถใช้:
fuser -vmMk <mountpoint>
เพื่อฆ่ากระบวนการที่เหลือทั้งหมดด้วยไฟล์ที่เปิดอยู่ใต้จุดเมานท์
หวังว่า ณ จุดนี้คุณสามารถยกเลิกการต่อเชื่อมอุปกรณ์ได้ (คุณจะต้องเรียกใช้umount
บนจุดเมานท์สองครั้งหากคุณผูกเมาท์000
ไดเร็กทอรีโหมดไว้ด้านบน)
หรือใช้:
fuser -vmMki <mountpoint>
เพื่อฆ่ากระบวนการแบบอ่านอย่างเดียวที่เหลืออยู่แบบบล็อกการ unmount
บ้าฉันยังได้รับtarget is busy
!
ไฟล์ที่เปิดไม่ได้เป็นตัวบล็อก unmount เท่านั้น ดูที่นี่และที่นี่สำหรับสาเหตุอื่นและการแก้ไขของพวกเขา
แม้ว่าคุณจะมี gremlin ที่ซุ่มซ่อนอยู่ซึ่งทำให้คุณไม่สามารถถอดอุปกรณ์ได้อย่างสมบูรณ์ แต่อย่างน้อยคุณก็มีระบบไฟล์ของคุณอยู่ในสถานะที่สอดคล้องกัน
จากนั้นคุณสามารถใช้lsof +f -- /dev/device
เพื่อแสดงรายการกระบวนการทั้งหมดด้วยไฟล์ที่เปิดอยู่บนอุปกรณ์ที่มีระบบไฟล์และจากนั้นฆ่าพวกเขา
[1] มันน้อยซับซ้อนกับการใช้mount --move
แต่ที่ต้องใช้ซึ่งมีผลกระทบmount --make-private /parent-mount-point
โดยทั่วไปหากเมานต์เมาท์อยู่ภายใต้/
ระบบไฟล์คุณต้องหลีกเลี่ยงสิ่งนี้