เรียกซ้ำ umount หลังจากเมานต์ rbind


13

เมื่อเข้าสู่ chroot บางครั้งจำเป็นต้องเมานต์ / sys และ / dev โดยใช้ -rbind แทน -bind เพื่อให้แน่ใจว่าทุกอย่างอยู่ในที่ที่ถูกต้องเมื่อใครบางคนกำลังมองหา

ปัญหาเกิดขึ้นเมื่อไม่ได้ต่อเชื่อม

umount ที่เรียบง่ายล้มเหลวเสมอ; ขณะที่เด็ก ๆ กำลังขี่ม้าอยู่มันก็ดูเหมือนจะใช้งาน:

$ umount /mnt/chroot/sys
umount: /mnt/chroot/sys: device is busy.
    (In some cases useful info about processes that use
     the device is found by lsof(8) or fuser(1))

อีกวิธีหนึ่งที่เป็นไปได้คือการแสดงรายการการติดตั้งจาก proc และขยายแต่ละรายการดังนี้:

$ grep /mnt/chroot/sys /proc/mounts | cut -f2 -d" " | sort -r | xargs umount

อย่างไรก็ตามสิ่งนี้ล้มเหลวเช่นกันเนื่องจากการเมาท์แบบเรียกซ้ำไม่ได้ลงทะเบียนใน mtab:

/mnt/chroot/sys/kernel/security is not mounted (according to mtab)

บางทีวิธีการแก้ปัญหาคือทำตัวขี้เกียจ แต่ดูเหมือนว่าอันตรายสำหรับฉัน

มีวิธีที่ดีกว่าในการทำสิ่งนี้ที่ฉันพลาดไปหรือไม่?


1
คุณแน่ใจหรือไม่ว่า/mnt/chroot/sys/kernel/securityติดตั้งที่จุดนั้น อะไรคือผลลัพธ์ของgrep /sys/kernel/security /proc/mounts? ไม่จำเป็นต้องมีหลักฐานที่จะระบุไว้ในumount /etc/mtabถ้าคุณผ่านมัน-nจะไม่เปิดไฟล์เลย
Gilles 'หยุดความชั่วร้าย'

หากคุณดูคำสั่ง grep ของฉันอย่างใกล้ชิดเพื่อสร้าง xargs สำหรับ umount ฉันจะส่งคำสั่ง
mount ที่

คำตอบ:


11

สิ่งนี้ใช้ได้สำหรับฉันอย่างถูกต้อง - /unix//a/264488/4319 :

mount --rbind /dev /mnt/test
mount --make-rslave /mnt/test
umount -R /mnt/test

มันเป็นสิ่งสำคัญที่จะต้องมีสองคำสั่งแรกเป็นสองคำสั่งแยกกัน: อย่ารวม--rbindและ--make-rslaveในคำขอร้องของเมานท์เดียว

หากไม่มี--make-rslaveพฤติกรรมนี้เป็นสิ่งที่ไม่พึงประสงค์ (และไม่สำเร็จ):

  • umount -l ก็จะส่งผลกระทบต่อจุดเดิม ๆ เช่นกัน
  • และumount -Rจะได้รับผลกระทบจากไฟล์ไม่ว่าง (เปิด) ภายใต้เมานต์เดิม (ไม่คาดฝันมาก ... )

ไม่ทราบว่านี้ได้รับการแก้ไขในรุ่นล่าสุดของภูเขา แต่ก็ ok ที่ดีที่สุดที่จะรวม--rbindและ--make-rslaveในเดียวกันติดภาวนา:mount --rbind --make-rslave /dev /mnt/test
Javi Merino

1
ในขณะที่คุณสามารถรวมสองข้อโต้แย้งมันทำให้มันเป็นภูเขาที่ไม่ใช่แบบเรียกซ้ำ ดังนั้นจึงไม่ได้ผลตามที่ต้องการ
Miral

10

เครดิตไปที่Gillesสำหรับคำตอบนี้ Gilles ตั้งข้อสังเกตในคำถามแสดงความคิดเห็นว่าสวิตช์ '-n' จะไม่สนใจ mtab และถอนการติดตั้งรายการใด ๆ ใน / proc / mounts

จาก manpage:

-n     Unmount without writing in /etc/mtab.

ดังนั้นเพื่อตอบคำถามของฉันเกี่ยวกับวิธีการแก้เมานท์ --rbind นี่เป็นคำสั่งเต็มรูปแบบที่เหมาะกับฉัน:

grep /mnt/chroot/sys /proc/mounts | cut -f2 -d" " | sort -r | xargs umount -n

Merci, Gilles!


1
พยายามmount --rbind / /mnt && umount -n /mnt/dev/shm(หรือจุด) umount: /mnt/dev/shm: target is busyผมได้รับ umount -l /mntฆ่าระบบ (เช่น sudo ล้มเหลวในการบอกว่า stdin ไม่ใช่ tty) นี่คือระบบ Fedora ที่ติดตั้งไว้ ฉันเดาว่ามันเป็นปัญหาเก่าของฉัน: unix.stackexchange.com/questions/269695/…
sourcejedi

3

ตั้งแต่util-linux v2.23 (25 เม.ย. 2556) umountคำสั่งรองรับ-R, --recursiveตัวเลือก

นี่คือสิ่งที่หน้าคนพูดว่า:

เลิกเมานท์ไดเรกทอรีที่ระบุซ้ำแต่ละครั้ง การเรียกใช้ซ้ำสำหรับแต่ละไดเรกทอรีจะหยุดลงหากการดำเนินการใด ๆ ที่ไม่ได้ต่อเชื่อมในเชนล้มเหลวไม่ว่าด้วยเหตุผลใด ๆ ความสัมพันธ์ระหว่างจุดเมานท์จะถูกกำหนดโดย /proc/self/mountinfo รายการ ระบบไฟล์จะต้องระบุโดยเส้นทางเมานต์; ยกเลิกการต่อเชื่อมแบบเรียกคืนด้วยชื่ออุปกรณ์ (หรือ UUID) ไม่ได้รับการสนับสนุน


0

ขอบคุณสำหรับสิ่งนั้น ฉันใช้สิ่งนี้ในสคริปต์เพื่อเลิกเมานต์ chroot-tree ทั้งหมด: (ตรวจสอบให้แน่ใจว่าได้ตั้งค่า $ MNT ตามลำดับ)

for dir in $(grep "$MNT" /proc/mounts | cut -f2 -d" " | sort -r)
do
    umount $dir 2> /dev/null
    (( $? )) && umount -n $dir
done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.