table of contents
- testing 2.40.4-5
- unstable 2.40.4-5
- experimental 2.41-2
UNSHARE(1) | Comenzi utilizator | UNSHARE(1) |
NUME¶
unshare - rulează programul în spații de nume noi
REZUMAT¶
unshare [opțiuni] [program [argumente]]
DESCRIERE¶
Comanda unshare creează noi spații de nume (așa cum se specifică în opțiunile liniei de comandă descrise mai jos) și apoi execută programul specificat. Dacă nu se indică programul, atunci se execută "${SHELL}" (implicit: /bin/sh).
În mod implicit, un nou spațiu de nume persistă doar atât timp cât are procese membre. Un nou spațiu de nume poate fi făcut persistent chiar și atunci când nu are procese membre prin montarea „bind” a fișierelor /proc/pid/ns/tip la o rută din sistemul de fișiere. Un spațiu de nume care a fost făcut persistent în acest mod poate fi introdus ulterior cu nsenter(1) chiar și după ce programul se termină (cu excepția spațiilor de nume PID, unde este necesar un proces de init care rulează permanent). Odată ce un spațiu de nume persistent nu mai este necesar, acesta poate fi scos din persistență prin utilizarea umount(8) pentru a elimina montarea „bind”. Pentru mai multe detalii, consultați secțiunea EXEMPLE.
Deoarece unshare, util-linux versiunea 2.36 utilizează fișierele /proc/[pid]/spațiu-nume/pid_pt_proces-copil și /proc/[pid]/spațiu-nume/timp_pt_proces-copil pentru spațiile de nume persistente PID și TIME. Această modificare necesită nucleul Linux 4.17 sau o versiune mai nouă.
Următoarele tipuri de spații de nume pot fi create cu unshare:
mount namespace
unshare, începând cu util-linux versiunea 2.27, stabilește automat propagarea la private într-un nou spațiu de nume de montare pentru a se asigura că noul spațiu de nume este într-adevăr nepartajat. Este posibil să dezactivați această caracteristică cu opțiunea --propagation unchanged. Rețineți că private este valoarea implicită a nucleului.
UTS namespace
IPC namespace
network namespace
PID namespace
cgroup namespace
user namespace
time namespace
OPȚIUNI¶
-i, --ipc[=fișier]
-m, --mount[=filșier]
-n, --net[=fișier]
-p, --pid[=fișier]
A se vedea, de asemenea, opțiunile --fork și --mount-proc.
-u, --uts[=fișier]
-U, --user[=fișier]
-C, --cgroup[=fișier]
-T, --time[=fișier]
-f, --fork
--keep-caps
--kill-child[=nume-semnal]
--mount-proc[=punct-montare]
--mount-binfmt[=mountpoint]
--map-user=uid|nume
--map-users=uid-interior:uid-exterior:cantitate|auto|all
Înainte de util-linux versiunea 2.39, această opțiune aștepta un argument separat prin virgulă de forma uid-exterior,uid-interior,cantitate, dar acest format este acum depreciat pentru coerență cu ordinea folosită în /proc/[pid]/uid_map și opțiunea de montare X-mount.idmap.
--map-group=gid|nume
--map-groups=gid-interior:gid-exterior:cantitate|auto|all
Înainte de util-linux versiunea 2.39, această opțiune aștepta un argument separat prin virgulă de forma gid-exterior,gid-interior,cantitate, dar acest format este acum depreciat pentru coerență cu ordinea folosită în /proc/[pid]/gid_map și opțiunea de montare X-mount.idmap.
--map-auto
-r, --map-root-user
-c, --map-current-user
--propagation private|shared|slave|unchanged
--setgroups allow|deny
Pentru a putea apela setgroups(2), procesul care face apelul trebuie să aibă cel puțin CAP_SETGID. Dar, începând cu Linux 3.19, se aplică o restricție suplimentară: nucleul oferă permisiunea de a apela setgroups(2) numai după ce harta GID (/proc/pid*/gid_map*) a fost stabilită. Harta GID poate fi scrisă de root atunci când setgroups(2) este activată (adică allow, valoarea implicită), iar harta GID devine inscriptibilă de către procesele neprivilegiate atunci când setgroups(2) este dezactivată permanent (cu deny).
-R, --root=dir
-w, --wd=dir
-S, --setuid uid
-G, --setgid gid
-l, --load-interp=string
--monotonic decalaj
--boottime decalaj
-h, --help
-V, --version
NOTE¶
Sistemele de fișiere proc și sysfs care se montează ca root într-un spațiu de nume de utilizator trebuie să fie restricționate astfel încât un utilizator mai puțin privilegiat să nu poată avea acces la fișiere sensibile pe care un utilizator mai privilegiat nu le-a făcut disponibile. Pe scurt, regula pentru proc și sysfs este să fie cât mai aproape de o montare „bind”.
EXEMPLE¶
Următoarea comandă creează un spațiu de nume PID, folosind --fork pentru a se asigura că execuția comenzii este realizată într-un proces-copil care (fiind primul proces din spațiul de nume) are PID 1. Opțiunea --mount-proc asigură crearea simultană a unui nou spațiu de nume de montare și montarea unui nou sistem de fișiere proc(5) care conține informații corespunzătoare noului spațiu de nume PID. Când comanda readlink(1) se termină, noile spații de nume sunt automat demontate.
# unshare --fork --pid --mount-proc readlink /proc/self 1
În calitate de utilizator neprivilegiat, creați un nou spațiu de nume de utilizator în care acreditările utilizatorului sunt puse în corespondență cu ID-urile rădăcină din interiorul spațiului de nume:
$ 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
În calitate de utilizator neprivilegiat, creați un spațiu de nume de utilizator în care primele 65536 ID-uri sunt toate alocate, iar acreditările utilizatorului sunt alocate ID-urilor rădăcină din interiorul spațiului de nume. Corespondența este determinată de ID-urile subordonate atribuite în subuid(5) și subgid(5). Demonstrați această corespondență prin crearea unui fișier cu ID-ul de utilizator 1 și ID-ul de grup 1. Din motive de concizie, sunt prezentate doar corespondențele ID-ului utilizatorului:
$ 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
Prima dintre următoarele comenzi creează un nou spațiu de nume UTS persistent și modifică numele de gazdă așa cum este văzut în acel spațiu de nume. Apoi se intră în spațiul de nume cu nsenter(1) pentru a afișa numele de gazdă modificat; acest pas demonstrează că spațiul de nume UTS continuă să existe chiar dacă spațiul de nume nu mai are procese membre după terminarea comenzii unshare. Spațiul de nume este apoi distrus prin eliminarea montării „bind”.
# touch /root/uts-ns # unshare --uts=/root/uts-ns hostname FOO # nsenter --uts=/root/uts-ns hostname FOO # umount /root/uts-ns
Următoarele comenzi stabilesc un spațiu de nume de montare persistentă la care se face referire prin montarea „bind” /root/namespaces/mnt. Pentru a se asigura de succesul creării acestei montări „bind”, directorul părinte (/root/namespaces) este transformat într-o montare „bind” al cărei tip de propagare nu este shared.
# mount --bind /root/namespaces /root/namespaces # mount --make-private /root/namespaces # touch /root/namespaces/mnt # unshare --mount=/root/namespaces/mnt
Următoarele comenzi demonstrează utilizarea opțiunii --kill-child atunci când se creează un spațiu de nume PID, pentru a se asigura că atunci când unshare este omorât, toate procesele din cadrul spațiului de nume PID sunt omorâte.
# set +m # Nu afișează mesajele de stare a lucrării # unshare --pid --fork --mount-proc --kill-child -- \
bash --norc -c '(sleep 555 &) && (ps a &) && sleep 999' & [1] 53456 # PID TTY STAT TIME COMMAND
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' $! # Afișează că munca de fond este nepartajată unshare(1) unshare # kill $! # Omoară unshare(1) # pidof sleep
Comanda pidof(1) nu afișează niciun rezultat, deoarece procesele sleep au fost omorâte. Mai exact, atunci când procesul sleep care are PID 1 în spațiul de nume (adică procesul de init al spațiului de nume) a fost omorât, această acțiune a dus la omorârea tuturor celorlalte procese din spațiul de nume. În schimb, o serie similară de comenzi în care nu se utilizează opțiunea --kill-child arată că, atunci când unshare se termină, procesele din spațiul de nume cu PID nu sunt omorâte:
# unshare --pid --fork --mount-proc -- \
bash --norc -c '(sleep 555 &) && (ps a &) && sleep 999' & [1] 53479 # PID TTY STAT TIME COMMAND
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
Următorul exemplu demonstrează crearea unui spațiu de nume de timp în care ceasul boottime (ora de pornire) este fixat la un punct din trecut, cu câțiva ani în urmă:
# uptime -p # Afișează timpul de funcționare în spațiul de nume al timpului inițial up 21 hours, 30 minutes # unshare --time --fork --boottime 300000000 uptime -p up 9 years, 28 weeks, 1 day, 2 hours, 50 minutes
The following example execute a chroot into the directory /chroot/powerpc/jessie and install the interpreter /bin/qemu-ppc-static to execute the powerpc binaries.
$ 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
The load-interp parameter can be read as following
qemu-ppc
M
\\x7fELF\x01\\x02\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x1
\\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
AUTORI¶
Mikhail Gusarov <dottedmag@dottedmag.net>, Karel Zak <kzak@redhat.com>
CONSULTAȚI ȘI¶
newuidmap(1), newgidmap(1), clone(2), unshare(2), namespaces(7), mount(8)
RAPORTAREA ERORILOR¶
Pentru rapoarte de eroare, folosiți sistemul de urmărire al erorilor la <https://github.com/util-linux/util-linux/issues>.
DISPONIBILITATE¶
Comanda unshare face parte din pachetul util-linux care poate fi descărcat de la Linux Kernel Archive <https://www.kernel.org/pub/linux/utils/util-linux/>.
2025-01-14 | util-linux 2.40.4 |