Intereting Posts
Пытаясь пересадить bash в / mnt для chroot, что хочет bash, чтобы работать? Как найти и удалить файлы старше определенных дней в unix? USB-сенсорный экран не работает с debian 3.8.13 (BeagleBone Black) использование команды sed для замены имен пробелами Metasploit ruby ​​"плохой интерпретатор: разрешение отказано" Можно ли приостановить e2fsck? Исправлена ​​точка монтирования внешнего usb hdd Отключить эффект перекрытия переключателя рабочего пространства Как разбирать аргументы командной строки с произвольной строкой Объединить 2 файла на основе всех значений первого столбца первого файла Как я могу запустить irb из сценария bash, выполнить некоторые команды, а затем передать сеанс irb на консоль? аудит linux повторяет USER_ACCT CRED_ACQ LOGIN USER_START USER_END под cron Я хочу изменить разрешения для всех папок / файлов, исключая некоторые из них Звуковой модуль alsa snd_aloop что означает «старый» в выводе `who -u`?

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

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

Можно хранить файловые дескрипторы из чужого пространства имен монтирования. Вы можете продемонстрировать это очень легко, найдя процесс во внешнем пространстве имен монтирования, таком как [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, };