Provided by: manpages-ru-dev_4.21.0-2_all 

ИМЯ
unshare - отделяет части процесса контекста выполнения
LIBRARY
Standard C library (libc, -lc)
СИНТАКСИС
#define _GNU_SOURCE
#include <sched.h>
int unshare(int flags);
ОПИСАНИЕ
Вызов unshare() позволяет процессу (или потоку) отделить части своего контекста выполнения, которые
используются совместно с другими процессами (или потоками). Часть контекста выполнения, например
пространство имён монтирования, неявно делается общей при создании нового процесса с помощью fork(2) или
vfork(2), в то время как другие части, такие как виртуальная память, могут стать общими по явному запросу
при создании процесса или потока с помощью clone(2).
Основное предназначение unshare() — позволить процессу контролировать свой общий контекст выполнения без
создания нового процесса.
Значение аргумента flags представляет собой битовую маску, в которой указывается какие части контекста
выполнения должны перестать быть общими. Значение составляется из нескольких следующих констант (через
OR):
CLONE_FILES
Обратный эффект флагу CLONE_FILES для clone(2). Отделяет таблицу файловых дескрипторов таким
образом, что вызывающий процесс больше не имеет общих файловых дескрипторов с другими процессами.
CLONE_FS
Обратный эффект флагу CLONE_FS для clone(2). Отделяет атрибуты файловой системы таким образом, что
вызывающий процесс больше не имеет общих атрибутов корневого каталога (chroot(2)), текущего
каталога (chdir(2)) и umask (umask(2)) с другими процессами.
CLONE_NEWCGROUP (начиная с Linux 4.6)
Этот флаг имеет действие подобное флагу CLONE_NEWCGROUP для clone(2). Отделяет пространство имён
cgroup. Для использования CLONE_NEWCGROUP требуется мандат CAP_SYS_ADMIN.
CLONE_NEWIPC (начиная с Linux 2.6.19)
Этот флаг имеет действие подобное флагу CLONE_NEWIPC для clone(2). Отделяет пространство имён IPC
таким образом, что вызывающий процесс будет иметь свою личную копию пространства имён IPC,
неиспользуемую другими процессами. Задание данного флага автоматически устанавливает флаг
CLONE_SYSVSEM. Для использования CLONE_NEWIPC требуется мандат CAP_SYS_ADMIN.
CLONE_NEWNET (начиная с Linux 2.6.24)
Этот флаг имеет действие подобное флагу CLONE_NEWNET для clone(2). Отделяет сетевое пространство
имён таким образом, что вызывающий процесс будет иметь свою личную копию сетевого пространства
имён, неиспользуемую другими процессами. Для использования CLONE_NEWNET требуется мандат
CAP_SYS_ADMIN.
CLONE_NEWNS
Этот флаг имеет действие подобное флагу CLONE_NEWNS для clone(2). Отделяет пространство имён
монтирования таким образом, что вызывающий процесс будет иметь свою личную копию данного
пространства имён, неиспользуемую другими процессами. Задание данного флага автоматически
устанавливает флаг CLONE_FS. Для использования CLONE_NEWNS требуется мандат CAP_SYS_ADMIN.
Дополнительная информация доступна в mount_namespaces(7).
CLONE_NEWPID (начиная с Linux 3.8)
Данный флаг позволяет то же что и CLONE_NEWPID у clone(2). Выполняется отключение от пространства
имён PID; вызывающий процесс создаёт новое пространство имён PID для своих потомков, которые до
этого не были объединены с существующим процессом. Вызывающий процесс не перемещается в новое
пространство имён. Первый потомок, созданный вызывающим процессом, будет иметь ID процесса 1 и
считаться init(1) в новом пространстве имён. Также флаг CLONE_NEWPID автоматически подразумевает
CLONE_THREAD. Для использования CLONE_NEWPID требуется мандат CAP_SYS_ADMIN. Подробней смотрите
pid_namespaces(7).
CLONE_NEWTIME (начиная с Linux 5.6)
Unshare the time namespace, so that the calling process has a new time namespace for its children
which is not shared with any previously existing process. The calling process is not moved into
the new namespace. Use of CLONE_NEWTIME requires the CAP_SYS_ADMIN capability. For further
information, see time_namespaces(7).
CLONE_NEWUSER (начиная с Linux 3.8)
Данный флаг позволяет то же что и CLONE_NEWUSER у clone(2). Выполняется отключение от
пользовательского пространства имён; вызывающий процесс перемещается в новое пользовательское
пространство имён, которое до этого не был общим для существующего процесса. Как потомок процесса,
созданный clone(2) с флагом CLONE_NEWUSER, вызывающий получает полный набор мандатов в новом
пользовательском пространстве имён.
Для CLONE_NEWUSER требуется, чтобы вызывающий процесс не имел нитей; указание CLONE_NEWUSER
автоматически подразумевает CLONE_THREAD. Начиная с Linux 3.9, CLONE_NEWUSER также автоматически
подразумевает CLONE_FS. Для CLONE_NEWUSER требуется, чтобы ID пользователя и группы вызывающего
процесса отображались в ID пользователя и группы в пользовательском пространстве имён вызывающего
процесса на момент вызова.
Дополнительную информацию о пространствах имён пользователя смотрите в user_namespaces(7).
CLONE_NEWUTS (начиная с Linux 2.6.19)
Этот флаг имеет действие подобное флагу CLONE_NEWUTS для clone(2). Отделяет пространство имён UTS
IPC таким образом, что вызывающий процесс будет иметь свою личную копию пространства имён UTS,
неиспользуемую другими процессами. Для использования CLONE_NEWUTS требуется мандат CAP_SYS_ADMIN.
CLONE_SYSVSEM (начиная с Linux 2.6.26)
С данным флагом выполняется обратное действие clone(2) с флагом CLONE_SYSVSEM. Выполняется отмена
изменения значений семафоров System V (semadj) таким образом, что вызывающий процесс получает
новый пустой список semadj, который не является общим ни с одним другим процессом. Если это
последний процесс, который ссылается на текущий список semadj процесса, то изменения (adjustments)
в этом списке применяются к соответствующим семафорам как описано в semop(2).
Также в flags могут быть указаны флаги CLONE_THREAD, CLONE_SIGHAND и CLONE_VM, если вызывающий состоит из
одной нити (т. е., он не делит своё адресное пространство с другим процессом или нитью). Иначе данные
флаги не работают (также заметим, что указание CLONE_THREAD автоматически подразумевает CLONE_VM, а
указание CLONE_VM автоматически подразумевает CLONE_SIGHAND). Если процесс состоит из нескольких нитей,
то использование данных флагов приведёт к ошибке.
Если значение flags равно нулю, то unshare() ничего не делает, то есть в контексте выполнения вызывающего
процесса ничего не изменяется.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении возвращается 0. При ошибке возвращается -1, а errno присваивается значение
ошибки.
ОШИБКИ
EINVAL В значении flags установлен недопустимый бит.
EINVAL В flags указан CLONE_THREAD, CLONE_SIGHAND или CLONE_VM, а вызывающий состоит из нескольких нитей.
EINVAL Указан флаг CLONE_NEWIPC в flags, но ядро собрано без параметров CONFIG_SYSVIPC и CONFIG_IPC_NS.
EINVAL Указан флаг CLONE_NEWNET в flags, но ядро собрано без параметра CONFIG_NET_NS.
EINVAL Указан флаг CLONE_NEWPID в flags, но ядро собрано без параметра CONFIG_PID_NS.
EINVAL Указан флаг CLONE_NEWUSER в flags, но ядро собрано без параметра CONFIG_USER_NS.
EINVAL Указан флаг CLONE_NEWUTS в flags, но ядро собрано без параметра CONFIG_UTS_NS.
EINVAL Указан флаг CLONE_NEWPID в flags, но процесс был ранее вызван unshare() с флагом CLONE_NEWPID.
ENOMEM Не удалось выделить достаточно памяти для копирования части контекста вызывающего, которая должна
быть отделена.
ENOSPC (начиная с Linux 3.7)
В флагах указан CLONE_NEWPID, но вызов привёл бы к превышению ограничения на количество вложенных
имён PID; смотрите pid_namespaces(7).
ENOSPC (начиная с Linux 4.9; до этого EUSERS)
Флаг CLONE_NEWUSER указан в flags, и вызов привёл бы к превышению ограничения на количество
вложенных пользовательских пространств имён. Смотрите user_namespaces(7).
В этом случае в Linux 3.11 по Linux 4.8 возвращалась ошибка EUSERS.
ENOSPC (начиная с Linux 4.9)
Одним из значений в flags задаётся создание нового пространства пространства имён пользователя, но
это превысило бы ограничение, определённое в соответствующем файле в каталоге /proc/sys/user.
Дополнительную информацию смотрите в namespaces(7).
EPERM Вызывающий процесс не имеет требуемых привилегий для этой операции.
EPERM Флаг CLONE_NEWUSER указан в flags, но эффективный пользовательский ID или эффективный ID группы
вызывающего не отображён в родительское пространство имён (смотрите user_namespaces(7)).
EPERM (начиная с Linux 3.9)
В flags был указан флаг CLONE_NEWUSER и вызывающий выполняется в окружении chroot (т. е. корневой
каталог вызывающего не совпадает с корневым каталогом пространства имён монтирования, в котором он
находится).
EUSERS (Linux 3.11 по Linux 4.8)
Флаг CLONE_NEWUSER указан в flags, и вызов привёл бы к превышению ограничения на количество
вложенных пользовательских пространств имён. Смотрите описание ошибки ENOSPC, представленное выше.
ВЕРСИИ
The unshare() system call was added in Linux 2.6.16.
СТАНДАРТЫ
Системный вызов unshare() есть только в Linux.
ЗАМЕЧАНИЯ
Не все атрибуты процесса, которые могут использоваться совместно при создании нового процесса с помощью
clone(2), могут быть отделены с помощью unshare(). В частности, начиная с ядра 3.8 в unshare() не
реализована поддержка флагов, которые были имели обратное действие CLONE_SIGHAND, CLONE_THREAD или
CLONE_VM. Эти возможности могут быть добавлены позднее, если потребуется.
Creating all kinds of namespace, except user namespaces, requires the CAP_SYS_ADMIN capability. However,
since creating a user namespace automatically confers a full set of capabilities, creating both a user
namespace and any other type of namespace in the same unshare() call does not require the CAP_SYS_ADMIN
capability in the original namespace.
ПРИМЕРЫ
Программа, представленная далее, предоставляет простую реализацию команды unshare(1), которая отключает
использование одного или более пространств имён и выполняет команду, переданную в аргументах командной
строки. Вот пример использования этой программы; запускается оболочка в новом пространстве имён
монтирования и проверяется, что первоначальная оболочка и новая оболочка находятся в разных пространствах
имён монтирования:
$ readlink /proc/$$/ns/mnt
mnt:[4026531840]
$ sudo ./unshare -m /bin/bash
# readlink /proc/$$/ns/mnt
mnt:[4026532325]
Различающийся вывод двух команд readlink(1) показывает, что две оболочки находятся в разных пространствах
имён монтирования.
Исходный код программы
/* unshare.c
Простая реализация команды unshare(1): отключение от
пространств имён и выполнение команды.
*/
#define _GNU_SOURCE
#include <err.h>
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
static void
usage(char *pname)
{
fprintf(stderr, "Usage: %s [options] program [arg...]\n", pname);
fprintf(stderr, "Options can be:\n");
fprintf(stderr, " -C unshare cgroup namespace\n");
fprintf(stderr, " -i unshare IPC namespace\n");
fprintf(stderr, " -m unshare mount namespace\n");
fprintf(stderr, " -n unshare network namespace\n");
fprintf(stderr, " -p unshare PID namespace\n");
fprintf(stderr, " -t unshare time namespace\n");
fprintf(stderr, " -u unshare UTS namespace\n");
fprintf(stderr, " -U unshare user namespace\n");
exit(EXIT_FAILURE);
}
int
main(int argc, char *argv[])
{
int flags, opt;
flags = 0;
while ((opt = getopt(argc, argv, "CimnptuU")) != -1) {
switch (opt) {
case 'C': flags |= CLONE_NEWCGROUP; break;
case 'i': flags |= CLONE_NEWIPC; break;
case 'm': flags |= CLONE_NEWNS; break;
case 'n': flags |= CLONE_NEWNET; break;
case 'p': flags |= CLONE_NEWPID; break;
case 't': flags |= CLONE_NEWTIME; break;
case 'u': flags |= CLONE_NEWUTS; break;
case 'U': flags |= CLONE_NEWUSER; break;
default: usage(argv[0]);
}
}
if (optind >= argc)
usage(argv[0]);
if (unshare(flags) == -1)
err(EXIT_FAILURE, "unshare");
execvp(argv[optind], &argv[optind]);
err(EXIT_FAILURE, "execvp");
}
СМ. ТАКЖЕ
unshare(1), clone(2), fork(2), kcmp(2), setns(2), vfork(2), namespaces(7)
Файл Documentation/userspace-api/unshare.rst из дерева исходного кода ядра Linux (или
Documentation/unshare.txt до Linux 4.12)
ПЕРЕВОД
Русский перевод этой страницы руководства был сделан Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy
Ovchinnikov <dmitriyxt5@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Katrin Kutepova
<blackkatelv@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3
или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо
на man-pages-ru-talks@lists.sourceforge.net.
Linux man-pages 6.03 5 февраля 2023 г. unshare(2)