Я не понимаю, как может работать ввод пространства имен монтирования

либо если вы переходите в новое пространство имен монтирования, либо вводите существующее.

Можно хранить файловые дескрипторы из чужого пространства имен монтирования. Вы можете продемонстрировать это очень легко, найдя процесс во внешнем пространстве имен монтирования, таком как [kdevtmpfs] , и открыв /proc/$PID/root . (Если я перехожу в этот каталог и запускаю /bin/pwd , кажется, что выводится удивительное сообщение об ошибке /usr/bin/pwd: couldn't find directory entry in '..' with matching i-node , и strace показывает, что getcwd() вернул (unreachable)/ ).

Пожалуйста, определите, что происходит с существующими ссылками, которые процесс удерживает в текущем пространстве имен монтирования – текущем каталоге и текущем корне (chroot) – при входе в новое пространство имен монтирования.

Если бы ни одна из этих ссылок не была изменена, не было бы особого смысла входить в новое пространство имен монтирования. Например, открытие файла /path/to/file откроет его из старого пространства имен монтирования, если корень процесса все еще будет указывать на старое пространство имен монтирования.

Опять же, я хотел бы понять как случай clone () с CLONENEWNS (как команда unshare ), так и случай setns () (как команда nsenter ).

И текущий рабочий каталог, и корневой каталог сбрасываются в корневую файловую систему введенного пространства имен монтирования.

Например, я проверил, что могу выйти из chroot , запустив nsenter -m --target $$ .

(Напоминание: chroot легко убежать, когда вы все еще root. man chroot документирует хорошо известный способ сделать это).


Источник

https://elixir.bootlin.com/linux/latest/source/fs/namespace.c?v=4.17#L3507

 static int mntns_install(struct nsproxy *nsproxy, struct ns_common *ns) { struct fs_struct *fs = current->fs; 

Примечание: current означает текущую задачу – текущий stream / процесс.

->fs будет данными файловой системы этой задачи – они распределяются между задачами, которые являются streamами в одном и том же процессе. Например, ниже вы увидите, что смена рабочего каталога – это операция с ->fs .

Например, изменение рабочего каталога влияет на все streamи одного и того же процесса. Подобные streamи, совместимые с POSIX, реализуются с использованием флага clone () CLONE_FS.

  struct mnt_namespace *mnt_ns = to_mnt_ns(ns), *old_mnt_ns; struct path root; int err; ... /* Find the root */ err = vfs_path_lookup(mnt_ns->root->mnt.mnt_root, &mnt_ns->root->mnt, "/", LOOKUP_DOWN, &root); 

вот эта строка:

  /* Update the pwd and root */ set_fs_pwd(fs, &root); set_fs_root(fs, &root); ... } ... const struct proc_ns_operations mntns_operations = { .name = "mnt", .type = CLONE_NEWNS, .get = mntns_get, .put = mntns_put, .install = mntns_install, .owner = mntns_owner, };