Umount đệ quy sau rbind mount


13

Khi nhập chroot đôi khi cần phải gắn / sys và / dev bằng cách sử dụng -rbind thay vì -bind để đảm bảo mọi thứ ở đúng vị trí của nó khi ai đó đi tìm.

Vấn đề xảy ra khi không đếm được.

Một umount đơn giản luôn luôn thất bại; với những đứa trẻ được gắn kết cũng có vẻ như đang được sử dụng:

$ 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))

Một giải pháp khả thi khác là liệt kê các thú cưỡi từ Proc và bỏ qua từng thứ như vậy:

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

Tuy nhiên, điều này cũng thất bại vì các mount đệ quy không thực sự được đăng ký trong mtab:

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

Có lẽ giải pháp là thực hiện một trò chơi lười biếng, nhưng điều này có vẻ khá nguy hiểm với tôi.

Có cách nào tốt hơn để làm điều này mà tôi đã bỏ lỡ?


1
Bạn có chắc chắn /mnt/chroot/sys/kernel/securityđược gắn kết tại thời điểm đó? Đầu ra của là grep /sys/kernel/security /proc/mountsgì? umountkhông cần đối số của nó để được liệt kê trong /etc/mtab. Nếu bạn vượt qua nó -n, nó sẽ không mở tập tin.
Gilles 'SO- ngừng trở thành ác quỷ'

Nếu bạn nhìn kỹ vào lệnh grep của tôi để tạo xargs cho umount, tôi chỉ gửi cho nó các mount được liệt kê trong / Proc / mounts
natecornell 22/03/2016

Câu trả lời:


11

Điều này làm việc cho tôi một cách chính xác - /unix//a/264488/4319 :

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

Điều quan trọng là có hai lệnh đầu tiên là hai lệnh riêng biệt: không kết hợp --rbind--make-rslavetrong một lệnh gọi mount.

Không có --make-rslave, hành vi là không mong muốn (và không thành công):

  • umount -l cũng sẽ ảnh hưởng đến các điểm gắn kết cũ ban đầu,
  • umount -Rsẽ bị ảnh hưởng bởi các tệp bận (mở) dưới các điểm gắn kết cũ ban đầu. (Rất bất ngờ ...)

Không biết điều này đã được sửa trong phiên bản gắn kết gần đây chưa, nhưng hoàn toàn ổn khi kết hợp --rbind--make-rslavetrong cùng một lệnh gọi:mount --rbind --make-rslave /dev /mnt/test
Javi Merino

1
Mặc dù bạn có thể kết hợp hai đối số, nhưng nó làm cho nó thực hiện một mount không đệ quy thay thế. Vì vậy, nó không thực sự hoạt động như dự định.
Miral

10

Tín dụng cho Gilles cho câu trả lời này; Gilles lưu ý trong các câu hỏi nhận xét rằng công tắc '-n' bỏ qua mtab và ngắt kết nối mọi thứ được liệt kê trong / Proc / mounts.

Từ trang hướng dẫn:

-n     Unmount without writing in /etc/mtab.

Vì vậy, để trả lời câu hỏi của tôi về cách làm sáng tỏ mount --rbind, đây là lệnh đầy đủ có hiệu quả với tôi:

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

Merci, Gilles!


1
Cố gắng mount --rbind / /mnt && umount -n /mnt/dev/shm(hoặc pts), tôi nhận được umount: /mnt/dev/shm: target is busy. umount -l /mntgiết chết hệ thống (ví dụ sudo fail nói stdin không phải là một tty). Đây là trên một hệ thống Fedora được cài đặt. Tôi đoán đó là một vấn đề cũ của tôi: unix.stackexchange.com/questions/269695/ Đổi
sourcejedi

3

Kể từ produc-linux v2.23 (25 tháng 4 năm 2013), umountlệnh hỗ trợ -R, --recursivetùy chọn.

Đây là những gì trang người đàn ông nói:

Đệ quy ngắt kết nối từng thư mục được chỉ định. Đệ quy cho mỗi thư mục sẽ dừng lại nếu bất kỳ hoạt động ngắt kết nối nào trong chuỗi không thành công vì bất kỳ lý do nào. Mối quan hệ giữa các điểm được xác định bởi /proc/self/mountinfo các mục. Hệ thống tập tin phải được chỉ định bởi đường dẫn mountpoint; một đệ quy đệ quy theo tên thiết bị (hoặc UUID) không được hỗ trợ.


0

Cảm ơn vì điều đó. Tôi sử dụng điều này trong các tập lệnh của mình để ngắt kết nối toàn bộ cây chroot: (Đảm bảo đặt $ MNT tương ứng)

for dir in $(grep "$MNT" /proc/mounts | cut -f2 -d" " | sort -r)
do
    umount $dir 2> /dev/null
    (( $? )) && umount -n $dir
done
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.