ОПИС¶
Наредба
unshare ствара
нови
називни
простор
(као што је
наведено
опцијама
линије
наредби
описаним
испод) и
затим
извршава
наведени
програм.
Ако
програм
није дат,
тад се
покреће
„${SHELL}“
(основно:
/bin/sh).
По основи,
нови
називни
простор
постоји
само све
док има
процесе
чланове.
Нови
називни
простор се
може
учинити
постојаним
чак и када
нема
процеса
чланова
тако што
ћете
повезати
качење
„/proc/pid/ns/врста
датотеке“
на путању
система
датотека.
Називни
простор
који је на
овај начин
постао
постојан
може се
накнадно
унети са nsenter(1)
чак и након
окончања
програма
(осим ПИД
називних
простора
где је
потребан
трајно
покренут
процес
покретања).
Једном
када
трајни
називни
простор
више није
потребан,
може се
опозвати
коришћењем
umount(8) за
уклањање
повезаног
качења.
Погледајте
одељак
ПРИМЕРИ
за више о
томе.
unshare од „util-linux“
издања 2.36
користи
/proc/[pid]/ns/пид_за_децу
и
/proc/[pid]/ns/време_за_децу
датотеке
за трајни
називни
простор
ПИД и ВРЕМЕ.
Ова измена
захтева
Линукс
кернел 4.17
или
новији.
Следеће
врсте
називних
простора
се могу
направити
са unshare:
mount namespace
Качење и
откачињање
система
датотека
неће
деловати
на остатак
система,
изузев за
системе
датотека
који су
изричито
означени
као дељени
(са
mount --make-shared;
видите
/proc/self/mountinfo
или
findmnt
-o+ПРОСТИРАЊЕ
за опције
shared). За више о
томе,
видите
mount_namespaces(7).
unshare од
„util-linux“-а
издање 2.27
самостално
поставља
простирање
на private у
новом
називном
простору
качења да
би се
уверио да
нови
називни
простор
заиста
није дељен.
Могуће је
онемогућити
ову
функцију
опцијом --propagation
unchanged. Знајте
да је private
основна
вредност
кернела.
UTS namespace
Постављање
назива
домаћина
или назива
домена
неће
утицати на
остатак
система. За
више о томе,
видите
uts_namespaces(7).
IPC namespace
Процес
ће имати
независтан
називни
простор за
редове POSIX
порука као
и за редове
порука System V,
поставке
семафора и
сегменте
дељене
меморије.
За више о
томе,
видите
ipc_namespaces(7).
network namespace
Процес
ће имати
независне IPv4
и IPv6
спремнике,
табеле IP
рутине,
правила
мрежне
баријере,
сзабла
/proc/net и
/sys/class/net
директоријума,
прикључница,
итд. За више
о томе,
видите
network_namespaces(7).
PID namespace
Пород ће
имати
посебан
скуп
мапирања
ПИД-у-процес
од свог
родитеља.
За више
детаља,
погледајте
pid_namespaces(7).
cgroup namespace
Процес
ће имати
виртуелизовани
преглед
/proc/self/cgroup-е, а нова
„cgroup“ качења
биће
укорењена
у „cgroup“ корен
називног
простора.
За више о
томе,
видите
cgroup_namespaces(7).
user namespace
Процес
ће имати
различити
скуп
УИД-ова,
ГИД-ова и
могућности.
За више о
томе,
видите
user_namespaces(7).
time namespace
Процес
може имати
другачији
преглед
CLOCK_MONOTONIC-а и/или
CLOCK_BOOTTIME-а који
се могу
изменити
коришћењем
/proc/self/timens_offsets. За
више о томе,
видите
time_namespaces(7).
ОПЦИЈЕ¶
-i,
--ipc[=датотека]
Ствара
нови „IPC“
називни
простор.
Ако је
датотека
наведена,
тада се
називни
простор
чини
трајним
стварањем
свезе
качења на
датотеци.
-m,
--mount[=датотека]
Ствара
нови
називни
простор
качења. Ако
је
датотека
наведена,
тада се
називни
простор
чини
трајним
стварањем
свезе
качења на
датотеци.
Знајте да
датотека
мора да се
налази на
качењу
чија врста
простирања
није
дељена
(или је
резултат
грешке).
Користите
наредбу findmnt
-o+ПРОСТИРАЊЕ
када нисте
сигурни у
тренутну
поставку.
Погледајте
и примере у
наставку.
-n,
--net[=датотека]
Ствара
нови
називни
простор
мреже. Ако
је
датотека
наведена,
тада се
називни
простор
чини
трајним
стварањем
свезе
качења на
датотеци.
-p,
--pid[=датотека]
Ствара
нови
називни
простор
ПИД-а. Ако је
датотека
наведена,
тада се
називни
простор
чини
трајним
стварањем
свезе
качења на
датотеци.
(Стварање
трајног
ПИД
називног
простора
неће
успети ако
се и
--fork
опција
такође не
наведе.)
Видите
такође
опцију --fork и
--mount-proc.
-u,
--uts[=датотека]
Ствара
нови
простор
времена
УТС-а. Ако је
датотека
наведена,
тада се
називни
простор
чини
трајним
стварањем
свезе
качења на
датотеци.
-U,
--user[=датотека]
Ствара
нови
називни
простор
корисника.
Ако је
датотека
наведена,
тада се
називни
простор
чини
трајним
стварањем
свезе
качења на
датотеци.
-C,
--cgroup[=датотека]
Ствара
нови „cgroup“
називни
простор.
Ако је
датотека
наведена,
тада се
називни
простор
чини
трајним
стварањем
свезе
качења на
датотеци.
-T,
--time[=датотека]
Ствара
нови
називни
простор
времена.
Ако је
датотека
наведена,
тада се
називни
простор
чини
трајним
стварањем
свезе
качења на
датотеци.
Опције --monotonic и
--boottime се могу
користити
за
навођење
одговарајућег
помераја у
временском
називном
простору.
-f, --fork
Клонира
наведени
програм
као
подређени
процес unshare-а
уместо да
га покрене
непосредно.
Ово је
корисно
када
правите
нови ПИД
називни
простор.
Знајте да
када unshare
чека на
процес
порода,
тада
занемарује
SIGINT и SIGTERM и не
прослеђује
никакве
сигнале
породу.
Неопходно
је слати
сигнале
процесу
порода.
--keep-caps
Када је
опција --user
дата,
осигурава
да су
могућности
гарантоване
у
корисничком
називном
простору
очуване у
проистеклом
процесу.
--kill-child[=назив-сигнала]
Када се
unshare оконча,
чини да се
назив-сигнала
пошаље
клонираном
процесу
порода. У
комбинацији
са --pid ово
омогућава
лако и
поуздано
убијање
читавог
стабла
процеса
испод unshare.
Ако није
дато,
назив-сигнала
се по
основи
пребацује
на SIGKILL. Ова
опција
подразумева
--fork.
--mount-proc[=тачка-качења]
Непосредно
пре
покретања
програма,
качи „proc“
систем
датотека
на
тачку-качења
(основно је
/proc). Ово је
корисно
када
правите
нови
називни
простор
ПИД-а.
Такође
подразумева
стварање
новог
називног
простора
качења јер
би /proc качење
иначе
покварило
постојеће
програме
на систему.
Нови „proc“
систем
датотека
је
изричито
прикачен
као
приватни
(са MS_PRIVATE|MS_REC).
--mount-binfmt[=тачка-качења]
Непосредно
пре
покретања
програма,
качи „binfmt_misc“
систем
датотека
на
тачку-качења
(основно је
„/proc/sys/fs/binfmt_misc“).
Такође
подразумева
стварање
новог
називног
простора
качења јер
би „binfmt_misc“
качење
иначе
покварило
постојеће
програме
на систему.
Нови „binfmt_misc“
систем
датотека
је
изричито
прикачен
као
приватни
(са MS_PRIVATE|MS_REC).
--map-user
уид|назив
Покреће
програм
само након
што је
текући
ефективни
ИД
корисника
мапиран на
уид. Ако је
ова опција
наведена
више пута,
последње
појављивање
има
предност.
Ова опција
подразумева
--user.
--map-users
унутр-уид:спољ-уид:број|auto|subids|all
Покреће
програм
само након
што је блок
ИД-ова
корисника
величине
укупност
који
почиње на
спољномуид-у
био
мапиран на
блок ИД-ова
корисника
који
почињу на
унутарњемуид-у.
Ово
мапирање
се прави са
newuidmap(1) ако је
unshare
покренуто
без
привилегија.
Ако се
опсег
ИД-ова
корисника
преклапа
са
мапирањем
наведеним
са
--map-user, тада
ће „рупа“
бити
уклоњена
из
мапирања.
То може
резултирати
да највећи
ИД групе
мапирања
не буде
мапиран.
Користите
--map-users више
пута да
мапирате
више од
једног
блока
ИД-ова
група.
Нарочита
вредност
auto
ће
мапирати
први блок
ИД-ова
корисника
у поседу
ефективног
корисника
из
/etc/subuid у блок
који
почиње на
корисничком
ИД-у 0.
Нарочита
вредност
subids
ће
идентитетом
мапирати
исти блок.
Нарочита
вредност
all
направиће
пролазну
мапу за
сваки ИД
групе
доступан у
родитељском
називном
простору.
Ова опција
подразумева
--user.
Пре „util-linux“
издања 2.39,
ова опција
је
очекивала
аргумент
раздвојен
зарезима у
облику
outeruid,inneruid,count,
али је тај
формат
сада
застарео
због
доследности
са
редоследом
који се
користи у
/proc/[пид]/уид_мап
и X-mount.idmap
опција
качења.
--map-group
гид|назив
Покреће
програм
само након
што је
текући
ефективни
ИД
корисника
мапиран на
гид. Ако је
ова опција
наведена
више пута,
последње
појављивање
има
предност.
Ова опција
подразумева
--setgroups=deny и --user.
--map-groups
унутр-гид:спољгид:број|auto|subids|all
Покреће
програм
само након
што је блок
ИД-ова
групе
величине
укупност
који
почиње на
спољномгид-у
био
мапиран на
блок ИД-ова
групе који
почињу на
унутарњемгид-у.
Ово
мапирање
се прави са
newgidmap(1) ако је
unshare
покренуто
без
привилегија.
Ако се
опсег
ИД-ова
групе
преклапа
са
мапирањем
наведеним
са
--map-group, тада
ће „рупа“
бити
уклоњена
из
мапирања.
То може
резултирати
да највећи
ИД групе
мапирања
не буде
мапиран.
Користите
--map-groups више
пута да
мапирате
више од
једног
блока
ИД-ова
група.
Нарочита
вредност
auto
ће
мапирати
први блок
ИД-ова
корисника
у поседу
ефективног
корисника
из
/etc/subgid у блок
који
почиње на
ИД-у групе 0.
Нарочита
вредност
subids
ће
идентитетом
мапирати
исти блок.
Нарочита
вредност
all
направиће
пролазну
мапу за
сваки ИД
групе
доступан у
родитељском
називном
простору.
Ова опција
подразумева
--user.
Пре „util-linux“
издања 2.39,
ова опција
је
очекивала
аргумент
раздвојен
зарезима у
облику
outegid,innergid,count,
али је тај
формат
сада
застарео
због
доследности
са
редоследом
који се
користи у
/proc/[пид]/гид_мап
и X-mount.idmap
опција
качења.
--map-auto
Мапира
први блок
корисникових
ИД-ова у
власништву
ефективног
корисника
из /etc/subuid на
блок који
почиње на
корисниковом
ИД-у 0. На исти
начин,
такође
мапира
први блок
ИД-ова
групе у
власништву
ефективне
групе из /etc/subgid
на блок
који
почиње на
ИД-у групе 0.
Ова опција
је
замишљена
да ради са
општим
случајем
где први
блок
подређених
ИД-ова
корисника
и групе
може да
мапира
читав
простор
ИД-а
корисника
и групе. Ова
опција је
еквивалент
за
навођење
--map-users=auto и --map-groups=auto.
--map-subids
Идентитет
мапира
први блок
ИД-а
корисника
који
припада
стварном
кориснику
из /etc/subuid. На
исти начин,
такође
идентитет
мапира
први блок
ИД-а групе
који
припада
стварној
групи из /etc/subgid.
Ова опција
је
еквивалент
за
навођење
--map-users=subids и --map-groups=subids.
-r, --map-root-user
Покреће
програм
тек након
што се
тренутни
стварни
ИД-ови
корисника
и групе
мапирају у
УИД и ГИД
суперкорисника
у
новоствореном
корисничком
називном
простору.
Ово
омогућава
пригодно
добијање
могућности
потребних
за
управљање
различитим
аспектима
новостворених
наменских
простора
(као што је
подешавање
сучеља у
мрежном
називном
простору
или качење
система
датотека у
називном
простору
качења) чак
и када се
покрену
као
непривилеговани.
Као само
функција
погодности,
не
подржава
софистицираније
случајеве
употребе,
као што је
мапирање
више
опсега
УИД-а и
ГИД-ова. Ова
опција
подразумева
--setgroups=deny и --user. Ова
опција је
еквивалентна
са --map-user=0 --map-group=0.
-c, --map-current-user
Покреће
програм
тек након
што се
тренутни
стварни
ИД-ови
корисника
и групе
мапирају
на исти УИД
и ГИД у
новоствореном
корисничком
наменском
простору.
Ова опција
подразумева
--setgroups=deny и --user. Ова
опција је
еквивалентна
са --map-user=$(id -ru) --map-group=$(id -rg).
--propagation
private|shared|slave|unchanged
Дубински
поставља
опцију
простирања
качења у
новом
називном
простору
качења.
Основно је
постављање
простирања
на private.
Могуће је
онемогућити
ову
функцију
аргументом
unchanged. Опција
се тихо
занемарује
када се
називни
простор
качења (--mount)
не
захтева.
--setgroups allow|deny
Допушта
или
забрањује
setgroups(2)
системски
позив у
корисничком
називном
простору.
Да би био
у
могућности
да позове
setgroups(2), процес
позивања
мора да има
барем CAP_SETGID.
Али од
Линукса 3.19
примењује
се још
једно
ограничење:
кернел
даје
дозволу за
позивање
setgroups(2) само
након што
је ГИД мапа
(/proc/пид*/гид_мапа*)
постављена.
У ГИД мапу
може да
пише
администратор
када је setgroups(2)
омогућено
(тј. allow,
подразумевано),
а ГИД мапа
постаје
уписива
непривилегованим
процесима
када је setgroups(2)
трајно
онемогућено
(са deny).
-R, --root дир
извршава
наредбу са
кореним
директоријумом
постављеним
на дир.
-w, --wd дир
мења
радни
директоријум
у дир.
-S, --setuid уиб
Поставља
ИД
корисника
који ће се
користити
у унесеном
називном
простору.
-G, --setgid ГИБ
Поставља
ИД групе
који ће се
користити
у унесеном
називном
простору и
одбацује
додатне
групе.
-l, --load-interp
ниска
Учитава
„binfmt_misc“
дефиницију
у називном
простору
(подразумева
--mount-binfmt).
Аргумент string
је
„:name:type:offset:magic:mask:interpreter:flags“.
За више
детаља о
регистрацији
нове врсте
извршног
видите
„https://www.kernel.org/doc/Documentation/admin-guide/binfmt-misc.rst“.
Да
управљате
заставицу
„F“ у „flags“ са
--root
параметром,
„binfmt_misc“ се качи
два пута,
једном пре
„chroot“ да
учита
тумача из
система
датотека
позивара и
једном
после да га
учини
доступним
из „chroot“
корисничког
простора.
--monotonic
померај
Поставља
померај
CLOCK_MONOTONIC који ће
се
користити
у унесеном
временском
називном
простору.
Ова опција
захтева
поништавање
дељења
временског
називног
простора
са --time.
--boottime
померај
Поставља
померај CLOCK_BOOTTIME
који ће се
користити
у унесеном
временском
називном
простору.
Ова опција
захтева
поништавање
дељења
временског
називног
простора
са --time.
-h, --help
Приказује
текст
помоћи и
излази.
-V, --version
Исписује
издање и
излази.
ПРИМЕРИ¶
Следећа
наредба
ствара ПИД
називни
простор,
користећи
--fork да би се
осигурало
да се
извршена
наредба
обавља у
подређеном
процесу
који (као
први
процес у
називном
простору)
има ПИД 1.
Опција --mount-proc
обезбеђује
да се нови
називни
простор
качења
истовремено
прави и да
се качи
нови proc(5)
систем
датотека
који
садржи
информације
које
одговарају
новом ПИД
називном
простору.
Када се
наредба readlink(1)
заврши,
нови
називни
простори
се
самостално
руше.
# unshare --fork --pid --mount-proc readlink /proc/self
1
Као
непривилеговани
корисник,
ствара
нови
кориснички
називни
простор
где су
корисничка
уверења
мапирана
на ИД-ове
корена
унутар
називног
простора:
$ id -u; id -g
1000
1000
$ unshare --user --map-root-user \
sh -c 'whoami; cat /proc/self/uid_map /proc/self/gid_map'
root
0 1000 1
0 1000 1
Као
непривилеговани
корисник,
ствара
кориснички
називни
простор
где су
првих 65536
ИД-ова сви
мапирани, а
креденцијали
корисника
су
мапирани
на корене
ИД-ове
унутар
називног
простора.
Мапа је
одређена
подређеним
ИД-овима
додељеним
у subuid(5) и subgid(5).
Приказује
ово
мапирање
стварањем
датотеке
са ИД-ом 1
корисника
и ИД-ом 1
групе.
Укратко,
приказана
су само
мапирања
ИД-а
корисника:
$ id -u
1000
$ cat /etc/subuid
1000:100000:65536
$ unshare --user --map-auto --map-root-user
# id -u
0
# cat /proc/self/uid_map
0 1000 1
1 100000 65535
# touch file; chown 1:1 file
# ls -ln --time-style=+ file
-rw-r--r-- 1 1 1 0 file
# exit
$ ls -ln --time-style=+ file
-rw-r--r-- 1 100000 100000 0 file
Прва од
следећих
наредби
ствара
нови
трајни UTS
називни
простор и
мења назив
домаћина
како се
види у том
називном
простору.
Називни
простор се
затим
уноси са nsenter(1)
да би се
приказао
измењен
назив
домаћина;
овај корак
показује
да UTS
називни
простор
наставља
да постоји
иако
називни
простор
није имао
процесе
чланове
након што
се
окончала
наредба unshare.
Називни
простор се
затим
уништава
уклањањем
свезног
качења.
# touch /root/uts-ns
# unshare --uts=/root/uts-ns hostname FOO
# nsenter --uts=/root/uts-ns hostname
FOO
# umount /root/uts-ns
Следеће
наредбе
успостављају
постојан
називни
простор
качења на
који
упућује
свеза
качења /root/namespace/mnt.
Да би се
осигурало
да
стварање
тог
свезивања
качења
буде
успешно,
родитељски
директоријум
(/root/namespaces) је
учињен
свезом
качења
чија врста
простирања
није shared.
# mount --bind /root/namespaces /root/namespaces
# mount --make-private /root/namespaces
# touch /root/namespaces/mnt
# unshare --mount=/root/namespaces/mnt
Следеће
наредбе
показују
коришћење
опције --kill-child
приликом
стварања
ПИД
називног
пропстора,
да би се
осигурало
да када је
unshare убијено,
сви
процеси у
ПИД
називном
простору
су
убијени.
# set +m # Не исписује поруке стања посла
# unshare --pid --fork --mount-proc --kill-child -- \
bash --norc -c '(sleep 555 &) && (ps a &) && sleep 999' &
[1] 53456
# ПИД КОНЗ СТАЊЕ ВРЕМЕ НАРЕДБА
1 pts/3 S+ 0:00 sleep 999
3 pts/3 S+ 0:00 sleep 555
5 pts/3 R+ 0:00 ps a
# ps h -o 'comm' $! # Показује да је позадински посао „unshare(1)“
unshare
# kill $! # Убија „unshare(1)“
# pidof sleep
Наредба
pidof(1) не
исписује
никакав
излаз, јер
су sleep
процеси
убијени.
Тачније,
када је
процес sleep
који има
ПИД 1 у
називном
простору
(тј.
покретачки
процес
називног
простора)
био убијен,
то је
довело до
тога да сви
остали
процеси у
називном
простору
буду
убијени.
Насупрот
томе,
слична
серија
наредби
где се
опција --kill-child
не користи
показује
да када се
unshare оконча,
процеси у
ПИД
називном
простору
нису
убијени:
# unshare --pid --fork --mount-proc -- \
bash --norc -c '(sleep 555 &) && (ps a &) && sleep 999' &
[1] 53479
# ПИД КОНЗ СТАЊЕ ВРЕМЕ НАРЕДБА
1 pts/3 S+ 0:00 sleep 999
3 pts/3 S+ 0:00 sleep 555
5 pts/3 R+ 0:00 ps a
# kill $!
# pidof sleep
53482 53480
Следећи
пример
показује
стварање
временског
називног
простора
где је сат
времена
подизања
система
постављен
да
показује
неколико
година у
прошлости:
# uptime -p # Приказује „uptime“ у почетном временском називном простору
up 21 сат, 30 минута
# unshare --time --fork --boottime 300000000 uptime -p
up 9 година, 28 седмице, 1 дан, 2 сата, 50 минута
Следећи
пример
извршава
„chroot“ у
директоријуму
„/chroot/powerpc/jessie“ и
инсталира
тумача
„/bin/qemu-ppc-static“ да
изврши „powerpc“
извршне.
$ unshare --map-root-user --fork --pid --load-interp=":qemu-ppc:M::\\x7fELF\x01\\x02\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x14:\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x00\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xfe\\xff\\xff:/bin/qemu-ppc-static:OCF" --root=/chroot/powerpc/jessie /bin/bash -l
Параметар
„load-interp“ се
може
читати као
што следи
„qemu-ppc“
је назив
нове
датотеке
направљене
испод
„/proc/sys/fs/binfmt_misc“ да
региструје
преводиоца
„M“
дефинише
преводиоца
за дату
врсту
магичног
броја
„\\x7fELF\x01\\x02\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x1“
је
магични
број за
препознавање
датотеке
за
превођење
(у том
случају, ELF
заглавље
за PPC32)
„\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x00\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xfe\\xff\\xff“
маска за
примену на
магичном
броју
„/bin/qemu-ppc-static“
преводилац
за
коришћење
са
датотеком
„OCF“
датотеку
отвара
кернел са
креденцијалима
и
безбедносни
скупинама
саме
датотеке и
учитава се
одмах
након што
је
региструјемо.