Почему моё связывающее монтирование видно вне пространства имен монтирования?

12

Поэтому я пытаюсь понять, как работает пространство имен монтирования Linux. Итак, я провел небольшой эксперимент, открыл два терминала и запустил следующее:

Терминал 1

root@goliath:~# mkdir a b
root@goliath:~# touch a/foo.txt
root@goliath:~# unshare --mount -- /bin/bash
root@goliath:~# mount --bind a b
root@goliath:~# ls b
foo.txt

Терминал 2

root@goliath:~# ls b
foo.txt

Как получилось, что гора видна в Терминале 2? Так как он не является частью пространства имен mount, я ожидал, что каталог здесь будет пустым. Я также пытался передать -o shared=noи использовать --make-privateпараметры с mount, но я получил тот же результат.

Что мне не хватает и как я могу сделать это на самом деле частным?

Фатальная ошибка
источник
Крепления являются общесистемными, не специфичными для среды оболочки. общий, рабский, личный и несвязанный - это не то, о чем вы думаете. чтения man mount.
Cas
3
@ CAS: Согласитесь, --make-privateэто не то, что я хочу. Но разве это не точка пространства монтирования (что они не являются системными)?
FatalError

Ответы:

11

Если вы используете системный дистрибутив с util-linuxверсией ниже 2.27, вы увидите это не интуитивное поведение. Это связано с тем, что CLONE_NEWNSтакие флаги распространяются в sharedзависимости от настроек ядра. Этот параметр обычно private, но systemd меняет его на shared. Начиная с util-linux2.27, было сделано исправление, которое изменяет поведение unshareкоманды по privateумолчанию, которое будет использоваться в качестве поведения распространения по умолчанию, чтобы сделать его более интуитивным.

Решение

Если вы находитесь в системе systemd с <2.27 util-linux, вы должны перемонтировать корневую файловую систему после выполнения unshareкоманды:

# unshare --mount -- /bin/bash
# mount --make-private -o remount /

Если вы работаете в системе systemd с> = 2.27 util-linux, она должна работать как положено в примере, который вы дали в своем вопросе, дословно, без необходимости перемонтирования. Если нет: перейти --propagation privateк unshareкоманде , чтобы заставить размножить смонтировать имена быть частными.

Дейв
источник
0

это не сработало в Ubuntu, (15.04 и 14.04). это работало на федоре. и для fedora. нужен ли вам --make-private или нет, вы также можете проверить

cat / proc / self / mountinfo | поделился grep

если он используется совместно, это означает, что какое-то другое пространство имен все еще может видеть, что монтируется Тогда это системная проблема. Вы можете использовать --make-private, чтобы заставить его работать

Кеннан
источник