Контейнеры и системный вызов.CLONE_NEWNS

Я запускаю код golang в этом репозитории https://github.com/lizrice/containers-from-scratch/blob/master/main.go, и у меня возникла проблема с пространством имен монтирования. Что должен сделать код, так это создать процесс в своем собственном пространстве имен монтирования. Поэтому, если я запускаю код с sudo go run main.go run /bin/bash и создаю файл внутри каталога mytemp, я должен увидеть этот файл из нового запущенного процесса, но если я попытаюсь просмотреть этот файл, перемещающийся в каталог rootfs на хосте, Я не должен видеть этот файл из-за пространства имен mount. К сожалению, я все еще вижу этот файл, поэтому кажется, что процесс, который я запускаю, не имеет пространства имен монтирования. Для запуска кода я использовал этот https://github.com/ericchiang/containers-from-scratch/releases/download/v0.1.0/rootfs.tar.gz как rootfs и переместил его под /home/me. Затем я создал каталог mytemp для использования в качестве цели монтирования tmpfs. Есть ли у вас какие-либо идеи о причинах, по которым процесс не получает пространство имен mount?

Спасибо!


person Michy_Arya    schedule 26.06.2017    source источник


Ответы (1)


Эту проблему можно решить, настроив монтирование хост-компьютера как частное, которое не получает и не пересылает какие-либо события распространения на другие монтирования, см. RedHat — Совместное использование креплений.

Эта команда должна быть выполнена на вашем хост-компьютере до создания контейнера:

$ mount --make-rprivate /
person Henrique Gontijo    schedule 05.08.2017
comment
Который вызывает системный вызов mount с MS_PRIVATE|MS_REC флагами. Это можно сделать в Go. - person ephemient; 05.08.2017
comment
Правильно, @ephemient, вот один пример: syscall.Mount("", "/", "", syscall.MS_PRIVATE|syscall.MS_REC, "") - person Henrique Gontijo; 06.08.2017