table of contents
UNSHARE(1) | Корисничке наредбе | UNSHARE(1) |
НАЗИВ¶
unshare - извршава програм у новим називним просторима
УВОД¶
unshare [options] [program [arguments]]
ОПИС¶
Наредба unshare ствара нови називни простор (као што је наведено опцијама линије наредби описаним испод) и затим извршава наведени програм. Ако програм није дат, тад се покреће „${SHELL}“ (основно: /bin/sh).
По основи, нови називни простор постоји само све док има процесе чланове. Нови називни простор се може учинити постојаним чак и када нема процеса чланова тако што ћете повезати качење „/proc/pid/ns/врста датотеке“ на путању система датотека. Називни простор који је на овај начин постао постојан може се накнадно унети са nsenter(1) чак и након окончања програма (осим ПИД називних простора где је потребан трајно покренут процес покретања). Једном када трајни називни простор више није потребан, може се опозвати коришћењем umount(8) за уклањање повезаног качења. Погледајте одељак ПРИМЕРИ за више о томе.
unshare since util-linux version 2.36 uses /proc/[pid]/ns/pid_for_children and /proc/[pid]/ns/time_for_children files for persistent PID and TIME namespaces. This change requires Linux kernel 4.17 or newer.
Следеће врсте називних простора се могу направити са unshare:
mount namespace
unshare since util-linux version 2.27 automatically sets propagation to private in a new mount namespace to make sure that the new namespace is really unshared. It’s possible to disable this feature with option --propagation unchanged. Note that private is the kernel default.
UTS namespace
IPC namespace
network namespace
PID namespace
cgroup namespace
user namespace
time namespace
ОПЦИЈЕ¶
-i, --ipc[=датотека]
-m, --mount[=датотека]
-n, --net[=датотека]
-p, --pid[=датотека]
Видите такође опцију --fork и --mount-proc.
-u, --uts[=датотека]
-U, --user[=датотека]
-C, --cgroup[=датотека]
-T, --time[=датотека]
-f, --fork
--keep-caps
--kill-child[=назив-сигнала]
--mount-proc[=тачка-качења]
--map-user=уид|назив
--map-users=inneruid:outeruid:count|auto|all
Пре „util-linux“ издања 2.39, ова опција је очекивала аргумент раздвојен зарезима у облику outeruid,inneruid,count, али је тај формат сада застарео због доследности са редоследом који се користи у /proc/[пид]/уид_мап и X-mount.idmap опција качења.
--map-group=гид|назив
--map-groups=innergid:outergid:count|auto|all
Пре „util-linux“ издања 2.39, ова опција је очекивала аргумент раздвојен зарезима у облику outergid,innergid,count, али је тај формат сада застарео због доследности са редоследом који се користи у /proc/[пид]/гид_мап и X-mount.idmap опцији качења.
--map-auto
-r, --map-root-user
-c, --map-current-user
--propagation private|shared|slave|unchanged
--setgroups allow|deny
Да би био у могућности да позове setgroups(2), процес позивања мора да има барем CAP_SETGID. Али од Линукса 3.19 примењује се још једно ограничење: кернел даје дозволу за позивање setgroups(2) само након што је ГИД мапа (/proc/пид*/гид_мапа*) постављена. У ГИД мапу може да пише администратор када је setgroups(2) омогућено (тј. allow, подразумевано), а ГИД мапа постаје уписива непривилегованим процесима када је setgroups(2) трајно онемогућено (са deny).
-R, --root=дир
-w, --wd=дир
-S, --setuid уиб
-G, --setgid ГИБ
--monotonic померај
--boottime померај
-h, --help
-V, --version
БЕЛЕШКЕ¶
Системи датотека „proc“ и „sysfs“ који се каче као корени у корисничком називном простору морају бити ограничени тако да мање привилеговани корисник не може да добије већи приступ осетљивим датотекама које је привилегованији корисник учинио недоступним. Укратко, правило за „proc“ и „sysfs“ је што је могуће ближе свезивању качења.
ПРИМЕРИ¶
Следећа наредба ствара ПИД називни простор, користећи --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 минута
АУТОРИ¶
Mikhail Gusarov <dottedmag@dottedmag.net>, Karel Zak <kzak@redhat.com>
ПОГЛЕДАЈТЕ ТАКОЂЕ¶
newuidmap(1), newgidmap(1), clone(2), unshare(2), namespaces(7), mount(8)
ПРИЈАВЉИВАЊЕ ГРЕШАКА¶
За пријављивање грешака, користите пратиоца грешака на <https://github.com/util-linux/util-linux/issues>.
ДОСТУПНОСТ¶
Наредба unshare је део пакета „util-linux“ који се може преузети са Архиве Линукс кернела <https://www.kernel.org/pub/linux/utils/util-linux/>.
2024-06-23 | util-linux 2.40.1 |