.\" -*- coding: UTF-8 -*- .\" Copyright (C) 2011, Eric Biederman .\" and Copyright (C) 2011, 2012, Michael Kerrisk .\" .\" SPDX-License-Identifier: GPL-2.0-only .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH setns 2 "5 февраля 2023 г." "Linux man\-pages 6.03" .SH ИМЯ setns \- повторно связывает нить с пространством имён .SH LIBRARY Standard C library (\fIlibc\fP, \fI\-lc\fP) .SH СИНТАКСИС .nf \fB#define _GNU_SOURCE\fP /* Смотрите feature_test_macros(7) */ \fB#include \fP .PP \fBint setns(int \fP\fIfd\fP\fB, int \fP\fInstype\fP\fB);\fP .fi .SH ОПИСАНИЕ The \fBsetns\fP() system call allows the calling thread to move into different namespaces. The \fIfd\fP argument is one of the following: .IP \[bu] 3 a file descriptor referring to one of the magic links in a \fI/proc/\fPpid\fI/ns/\fP directory (or a bind mount to such a link); .IP \[bu] a PID file descriptor (see \fBpidfd_open\fP(2)). .PP .\" The \fInstype\fP argument is interpreted differently in each case. .SS "fd refers to a /proc/[pid]/ns/ link" If \fIfd\fP refers to a \fI/proc/\fPpid\fI/ns/\fP link, then \fBsetns\fP() reassociates the calling thread with the namespace associated with that link, subject to any constraints imposed by the \fInstype\fP argument. In this usage, each call to \fBsetns\fP() changes just one of the caller's namespace memberships. .PP В аргументе \fInstype\fP указывается тип пространства имён, с которым вызывающая нить может быть повторно связана. Данный аргумент может иметь \fIодно\fP из следующих значений: .TP \fB0\fP Разрешить подключиться к пространству имён любого типа. .TP \fBCLONE_NEWCGROUP\fP (начиная с Linux 4.6) Значение \fIfd\fP должно указывать на пространство имён cgroup. .TP \fBCLONE_NEWIPC\fP (начиная с Linux 3.0) Значение \fIfd\fP должно указывать на пространство имён IPC. .TP \fBCLONE_NEWNET\fP (начиная с Linux 3.0) Значение \fIfd\fP должно указывать на пространство имён network. .TP \fBCLONE_NEWNS\fP (начиная с Linux 3.8) Значение \fIfd\fP должно указывать на пространство имён mount. .TP \fBCLONE_NEWPID\fP (начиная с Linux 3.8) Значение \fIfd\fP должно указывать на пространство имён PID потомков. .TP \fBCLONE_NEWTIME\fP (начиная с Linux 5.8) .\" commit 76c12881a38aaa83e1eb4ce2fada36c3a732bad4 \fIfd\fP must refer to a time namespace. .TP \fBCLONE_NEWUSER\fP (начиная с Linux 3.8) Значение \fIfd\fP должно указывать на пространство имён user. .TP \fBCLONE_NEWUTS\fP (начиная с Linux 3.0) Значение \fIfd\fP должно указывать на пространство имён UTS. .PP .\" Установка \fInstype\fP в 0 имеет смысл только, если вызывающий знает (или ему не важно) на какой тип пространства имён ссылается \fIfd\fP. Назначение ненулевого значения в \fInstype\fP полезно, если вызывающий не знает на какой тип пространства имён ссылается \fIfd\fP. и хочет быть уверенным, что пространство имён именно нужного типа (вызывающий может не знать тип пространства имён на который указывает \fIfd\fP, если файловый дескриптор был открыт другим процессом и, например, передан вызывающему через доменный сокет UNIX). .SS "fd is a PID file descriptor" Since Linux 5.8, \fIfd\fP may refer to a PID file descriptor obtained from \fBpidfd_open\fP(2) or \fBclone\fP(2). In this usage, \fBsetns\fP() atomically moves the calling thread into one or more of the same namespaces as the thread referred to by \fIfd\fP. .PP The \fInstype\fP argument is a bit mask specified by ORing together \fIone or more\fP of the \fBCLONE_NEW*\fP namespace constants listed above. The caller is moved into each of the target thread's namespaces that is specified in \fInstype\fP; the caller's memberships in the remaining namespaces are left unchanged. .PP For example, the following code would move the caller into the same user, network, and UTS namespaces as PID 1234, but would leave the caller's other namespace memberships unchanged: .PP .in +4n .EX int fd = pidfd_open(1234, 0); setns(fd, CLONE_NEWUSER | CLONE_NEWNET | CLONE_NEWUTS); .EE .in .\" .SS "Информация по определённым типам пространств имён" Некоторые примечания и ограничения при пересопряжении с некоторыми типами пространств имён: .TP Пользовательские пространства имён .\" See kernel/user_namespace.c:userns_install() [3.8 source] Для пересопряжения процесса с пространством имён пользователя он должен иметь мандат \fBCAP_SYS_ADMIN\fP в назначаемом пространстве имён пользователя (эта необходимость подразумевает, что возможно присоединение только дочернего пространства имён пользователя). При успешном присоединении к пространству имён пользователя процесс получает все мандаты в этом пространстве имён, независимо от своего ID пользователя и группы. .IP Многонитевой процесс не может изменить пространство имён пользователя с помощью \fBsetns\fP(). .IP Запрещается использовать \fBsetns\fP() для повторного вхождения вызывающего в текущее пространство имён пользователя. Это не позволяет вызывающему, оставшемуся без мандатов, повторно получить их через вызов \fBsetns\fP(). .IP .\" commit e66eded8309ebf679d3d3c1f5820d1f2ca332c71 .\" https://lwn.net/Articles/543273/ По причинам, связанным с безопасностью, процесс не может войти в новое пользовательское пространство имён, если он сообща владеет атрибутами файловых систем (атрибуты, чьё наследование управляется флагом \fBCLONE_FS\fP в \fBclone\fP(2)) с другим процессом. .IP Дополнительную информацию о пользовательских пространствах имён смотрите в \fBuser_namespaces\fP(7). .TP Пространства имён монтирования Для смены пространства имён монтирования требуется, чтобы вызывающий процесс имел мандаты \fBCAP_SYS_CHROOT\fP и \fBCAP_SYS_ADMIN\fP в своём пространстве имён пользователя и мандат \fBCAP_SYS_ADMIN\fP в пользовательском пространстве имён, которое принадлежит целевому пространству имён монтирования. .IP .\" Above check is in fs/namespace.c:mntns_install() [3.8 source] Процесс не может войти в новое пространство имён монтирования, если он сообща владеет атрибутами файловых систем (атрибуты, чьё наследование управляется флагом \fBCLONE_FS\fP в \fBclone\fP(2)) с другим процессом. .IP Подробную информацию взаимодействии пользовательского пространствах имён и пространства имён монтирования смотрите в \fBuser_namespaces\fP(7). .TP Пространства имён PID Чтобы пересопрячь новое пространство имён PID c самим собой, вызывающий должен иметь мандат \fBCAP_SYS_ADMIN\fP в своём пространстве имён пользователя и пространстве имён пользователя целевого пространства имён PID. .IP Reassociating the PID namespace has somewhat different from other namespace types. Reassociating the calling thread with a PID namespace changes only the PID namespace that subsequently created child processes of the caller will be placed in; it does not change the PID namespace of the caller itself. .IP Reassociating with a PID namespace is allowed only if the target PID namespace is a descendant (child, grandchild, etc.) of, or is the same as, the current PID namespace of the caller. .IP Дополнительную информацию о пространствах имён PID смотрите в \fBpid_namespaces\fP(7). .TP Пространства имён cgroup Чтобы пересопрячь новое пространство имён cgroup c самим собой, вызывающий должен иметь мандат \fBCAP_SYS_ADMIN\fP в своём пространстве имён пользователя и пространстве имён пользователя целевого пространства имён cgroup. .IP Использование \fBsetns\fP() для изменения пространства имён cgroup вызывающего не изменяет членство cgroup вызывающего. .TP Network, IPC, time, and UTS namespaces In order to reassociate itself with a new network, IPC, time, or UTS namespace, the caller must have the \fBCAP_SYS_ADMIN\fP capability both in its own user namespace and in the user namespace that owns the target namespace. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" При успешном выполнении \fBsetns\fP() возвращает 0. При ошибке возвращается \-1, и \fIerrno\fP устанавливается в соответствующее значение. .SH ОШИБКИ .TP \fBEBADF\fP Значение \fIfd\fP не является правильным файловым дескриптором. .TP \fBEINVAL\fP Значение \fIfd\fP ссылается на пространство имён, чей тип не соответствует с указанным в \fInstype\fP. .TP \fBEINVAL\fP Эти проблемы возникают при повторном связывании нити с указанным пространством имён. .TP .\" See kernel/pid_namespace.c::pidns_install() [kernel 3.18 sources] \fBEINVAL\fP Вызывающий пытается объединиться с пространством имён PID предка (родителя, родителя родителя и т. д.). .TP \fBEINVAL\fP Вызывающий пытается объединиться с пространством имён пользователя, в которое он уже входит. .TP \fBEINVAL\fP .\" commit e66eded8309ebf679d3d3c1f5820d1f2ca332c71 Вызывающий сообща владеет состоянием файловой системы (\fBCLONE_FS\fP) (в частности, корневой каталог) с другим процессом и пытается объединить новое пользовательское пространство имён. .TP \fBEINVAL\fP .\" See kernel/user_namespace.c::userns_install() [kernel 3.15 sources] Вызывающий состоит из нескольких нитей и пытается объединить новое пользовательское пространство имён. .TP \fBEINVAL\fP \fIfd\fP is a PID file descriptor and \fInstype\fP is invalid (e.g., it is 0). .TP \fBENOMEM\fP Невозможно выделить достаточно памяти для изменения указанного пространства имён. .TP \fBEPERM\fP Вызывающая нить не имеет требуемого мандата для этой операции. .TP \fBESRCH\fP \fIfd\fP is a PID file descriptor but the process it refers to no longer exists (i.e., it has terminated and been waited on). .SH ВЕРСИИ The \fBsetns\fP() system call first appeared in Linux 3.0; library support was added in glibc 2.14. .SH СТАНДАРТЫ Системный вызов \fBsetns\fP() есть только в Linux. .SH ЗАМЕЧАНИЯ For further information on the \fI/proc/\fPpid\fI/ns/\fP magic links, see \fBnamespaces\fP(7). .PP Не все атрибуты, которыми можно владеть сообща при создании новой нити с помощью using \fBclone\fP(2), можно изменить с помощью \fBsetns\fP(). .SH ПРИМЕРЫ Программа, представленная ниже, ожидает два и более аргументов. В первом аргумент указывается путь к файлу пространства имён в существующем каталоге \fI/proc/\fPpid\fI/ns/\fP. В остальных аргументах указывается команда и её параметры. Программа открывает файл пространства имён, объединяет это пространство имён с помощью \fBsetns\fP() и выполняет указанную команду внутри этого пространства имён. .PP В следующем сеансе оболочки показано использование этой программы (скомпилирована под именем \fIns_exec\fP) вместе с примером для \fBCLONE_NEWUTS\fP из справочной страницы \fBclone\fP(2) (скомпилирована под именем \fInewuts\fP). .PP Сначала мы запускаем программу из \fBclone\fP(2) в фоновом режиме. Эта программа создаёт потомка в отдельном пространстве имён UTS. Потомок изменяет имя узла в своём пространстве имён, а затем оба процесса отображают имена узлов в своих пространствах имён UTS для того, чтобы мы увидели, что они разные. .PP .in +4n .EX $ \fBsu\fP # Требуются права для выполнения # операций с пространством имён Password: # \fB./newuts bizarro &\fP [1] 3549 clone() returned 3550 uts.nodename in child: bizarro uts.nodename in parent: antero # \fBuname \-n\fP # проверяем имя узла в оболочке antero .EE .in .PP Затем мы запускаем программу, показанную ниже, используя ту же оболочку. Внутри этой оболочки мы проверяем, что имя узла — одно из изменённых потомком, созданным первой программой: .PP .in +4n .EX # \fB./ns_exec /proc/3550/ns/uts /bin/bash\fP # \fBuname \-n\fP # выполняется в оболочке, запущенной ns_exec bizarro .EE .in .SS "Исходный код программы" .\" SRC BEGIN (setns.c) .EX #define _GNU_SOURCE #include #include #include #include #include #include int main(int argc, char *argv[]) { int fd; if (argc < 3) { fprintf(stderr, "%s /proc/PID/ns/FILE команда аргументы…\en", argv[0]); exit(EXIT_FAILURE); } /* Get file descriptor for namespace; the file descriptor is opened with O_CLOEXEC so as to ensure that it is not inherited by the program that is later executed. */ fd = open(argv[1], O_RDONLY | O_CLOEXEC); if (fd == \-1) err(EXIT_FAILURE, "open"); if (setns(fd, 0) == \-1) /* объединяемся с этим пространством имён */ err(EXIT_FAILURE, "setns"); execvp(argv[2], &argv[2]); /* выполняем команду в пространстве имён */ err(EXIT_FAILURE, "execvp"); } .EE .\" SRC END .SH "СМ. ТАКЖЕ" \fBnsenter\fP(1), \fBclone\fP(2), \fBfork\fP(2), \fBunshare\fP(2), \fBvfork\fP(2), \fBnamespaces\fP(7), \fBunix\fP(7) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан Alexander Golubev , Azamat Hackimov , Hotellook, Nikita , Spiros Georgaras , Vladislav , Yuri Kozlov и Иван Павлов . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .