Рекурсивний umount після встановлення rbind


13

При введенні chroot іноді доводиться монтувати / sys та / dev, використовуючи -rbind, а не -bind, щоб переконатися, що все в потрібному місці, коли хтось піде шукати.

Проблема виникає при відключенні.

Простий розум завжди провалюється; при встановленні дітей, як здається, він використовується:

$ 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, він взагалі не відкриє файл.
Жил "ТАК - перестань бути злим"

Якщо ви уважно придивитесь до моєї команди grep для створення xargs для umount, я надсилаю їй лише кріплення, перелічені в / proc / mounts
natecornell

Відповіді:


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них впливатимуть зайняті (відкриті) файли під початковими старими точками кріплення. (Дуже несподівано ...)

Не знаю, чи це було зафіксовано в останній версії кріплення, але цілком нормально поєднувати --rbindі --make-rslaveв тому ж виклику монтувати:mount --rbind --make-rslave /dev /mnt/test
Javi Merino

1
Хоча ви можете комбінувати два аргументи, це змушує робити замість цього нерекурсивне кріплення. Тож насправді це не працює за призначенням.
Miral

10

За цю відповідь заслуговує Жиль ; Жилль зазначив у коментарях до запитання, що перемикач '-n' ігнорує mtab і відключає все, що зазначено в / proc / mounts.

На сторінці сторінки:

-n     Unmount without writing in /etc/mtab.

Отже, щоб відповісти на моє запитання про те, як розгадати кріплення --rbind, це повна команда, яка працювала для мене:

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

Мерсі, Жиль!


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-Apr-2013), umountкоманда підтримує цю -R, --recursiveопцію.

Ось що пише сторінка man:

Рекурсивно відключайте кожен вказаний каталог. Рекурсія для кожного каталогу припиниться, якщо будь-яка операція відключення ланцюга завершиться з будь-якої причини. Зв'язок між точками кріплення визначається /proc/self/mountinfo записами. Файлова система повинна бути визначена шляхом встановлення точки монтажу; рекурсивне відключення за назвою пристрою (або UUID) не підтримується.


0

Дякую за це. Я використовую це у своїх сценаріях, щоб демонтувати ціле дерево chroot: (Переконайтеся, що встановіть $ MNT відповідно)

for dir in $(grep "$MNT" /proc/mounts | cut -f2 -d" " | sort -r)
do
    umount $dir 2> /dev/null
    (( $? )) && umount -n $dir
done
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.