Рекурсивный размонтирование после монтирования 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)

Возможно, решение состоит в том, чтобы выполнить ленивый переход, но это кажется мне довольно опасным.

Есть ли лучший способ сделать это, что я пропустил?

natecornell
источник
1
Вы уверены, что /mnt/chroot/sys/kernel/securityустановлен в этой точке? Какой выход grep /sys/kernel/security /proc/mounts? umountне нуждается в аргументах для перечисления в /etc/mtab. Если вы передадите его -n, он вообще не откроет файл.
Жиль "ТАК - перестань быть злым"
Если вы внимательно посмотрите на мою команду grep для создания xargs для umount, я отправляю только монтирования, перечисленные в / proc /
mounts

Ответы:

11

Это сработало для меня правильно - /unix//a/264488/4319 :

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

Было важно иметь две первые команды в виде двух отдельных команд: не объединять --rbindи --make-rslaveв одном вызове mount.

Без --make-rslaveэтого поведение было нежелательным (и не успешным):

  • umount -l будет влиять на оригинальные старые точки монтирования тоже
  • и umount -Rбудет зависеть от занятых (открытых) файлов в исходных старых точках монтирования. (Очень неожиданно ...)
imz - Иван Захарящев
источник
Не знаю, было ли это исправлено в последней версии монтирования, но это совершенно нормально для объединения --rbindи --make-rslaveв одном и том же вызове монтирования:mount --rbind --make-rslave /dev /mnt/test
Хави Мерино,
1
Хотя вы можете объединить два аргумента, вместо этого он выполняет монорекурсивное монтирование. Так что на самом деле это не работает, как задумано.
Мирал
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

Мерси, Жиль!

natecornell
источник
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 апреля 2013 г.) umountкоманда поддерживает эту -R, --recursiveопцию.

Вот что написано на странице руководства:

Рекурсивно размонтировать каждый указанный каталог. Рекурсия для каждого каталога будет остановлена, если по какой-либо причине любая операция размонтирования в цепочке завершится неудачно. Связь между точками монтирования определяется /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
Джастин сейн
источник