Umount rekursif setelah rbind mount

13

Saat memasukkan chroot terkadang diperlukan untuk me-mount / sys dan / dev menggunakan -rbind bukan -bind untuk memastikan semuanya ada di tempat yang benar ketika seseorang mencari.

Masalahnya muncul saat melepas pemasangan.

Umount sederhana selalu gagal; dengan anak-anak yang dipasang juga tampaknya sedang digunakan:

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

Solusi lain yang mungkin adalah dengan mendaftar mount dari proc, dan umount masing-masing seperti:

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

Namun ini gagal juga karena tunggangan rekursif sebenarnya tidak terdaftar di mtab:

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

Mungkin solusinya adalah melakukan umount yang malas, tetapi ini tampaknya cukup berbahaya bagi saya.

Apakah ada cara yang lebih baik untuk melakukan ini yang saya lewatkan?

natecornell
sumber
1
Apakah Anda yakin /mnt/chroot/sys/kernel/securitysudah terpasang pada titik itu? Apa output dari grep /sys/kernel/security /proc/mounts? umounttidak perlu argumennya didaftar di /etc/mtab. Jika Anda lulus -n, itu tidak akan membuka file sama sekali.
Gilles 'SANGAT berhenti menjadi jahat'
Jika Anda memperhatikan perintah grep saya untuk membuat xargs untuk umount, saya hanya mengirimkannya mount yang terdaftar di / proc / mounts
natecornell

Jawaban:

11

Ini berhasil bagi saya dengan benar - /unix//a/264488/4319 :

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

Penting untuk memiliki dua perintah pertama sebagai dua perintah terpisah: jangan gabungkan --rbinddan --make-rslavedalam satu pemanggilan mount.

Tanpa --make-rslave, perilaku itu tidak diinginkan (dan tidak berhasil):

  • umount -l akan mempengaruhi titik mount lama asli, juga,
  • dan umount -Rakan dipengaruhi oleh file sibuk (terbuka) di bawah mountpoints lama yang asli. (Sangat tak terduga ...)
imz - Ivan Zakharyaschev
sumber
Tidak tahu apakah ini telah diperbaiki dalam versi terbaru dari mount, tetapi sangat baik untuk menggabungkan --rbinddan --make-rslavedalam permintaan mount yang sama:mount --rbind --make-rslave /dev /mnt/test
Javi Merino
1
Meskipun Anda dapat menggabungkan dua argumen, itu membuatnya melakukan mount non-rekursif sebagai gantinya. Jadi itu tidak benar-benar berfungsi sebagaimana dimaksud.
Miral
10

Penghargaan untuk Gilles atas jawaban ini; Gilles mencatat dalam komentar pertanyaan bahwa saklar '-n' mengabaikan mtab dan meng-unmount apa pun yang terdaftar di / proc / mounts.

Dari halaman manual:

-n     Unmount without writing in /etc/mtab.

Jadi untuk menjawab pertanyaan saya tentang cara mengurai mount --rbind, ini adalah perintah lengkap yang bekerja untuk saya:

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

Merci, Gilles!

natecornell
sumber
1
Mencoba mount --rbind / /mnt && umount -n /mnt/dev/shm(atau poin), saya mengerti umount: /mnt/dev/shm: target is busy. umount -l /mntmembunuh sistem (misalnya sudo gagal mengatakan stdin bukan tty). Ini pada sistem Fedora yang diinstal. Saya kira ini adalah masalah lama saya: unix.stackexchange.com/questions/269695/…
sourcejedi
3

Sejak util-linux v2.23 (25-Apr-2013) umountperintah mendukung -R, --recursiveopsi.

Inilah yang dikatakan halaman manual:

Secara unmount melepas setiap direktori yang ditentukan. Rekursi untuk setiap direktori akan berhenti jika ada operasi unmount dalam rantai gagal karena alasan apa pun. Hubungan antara titik mount ditentukan oleh /proc/self/mountinfo entri. Sistem file harus ditentukan oleh jalur mountpoint; unmount rekursif dengan nama perangkat (atau UUID) tidak didukung.

Paul Tobias
sumber
0

Terima kasih untuk itu. Saya menggunakan ini dalam skrip untuk meng-unmount seluruh chroot-tree: (Pastikan untuk menyetel $ MNT)

for dir in $(grep "$MNT" /proc/mounts | cut -f2 -d" " | sort -r)
do
    umount $dir 2> /dev/null
    (( $? )) && umount -n $dir
done
Justin Sane
sumber