Provided by: manpages-ru-dev_4.19.0-7_all bug

ИМЯ

       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 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если вы обнаружите ошибки в переводе  этой  страницы  руководства,  пожалуйста,  отправьте
       электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.