Provided by: manpages-pl_4.26.0-1_all 

NAZWA
namespaces - przegląd linuksowych przestrzeni nazw
OPIS
Przestrzeń nazw opakowuje globalny zasób systemowy w warstwie abstrakcji tak, że dla procesów w niej
występujących, wygląda to jakby miały własne, izolowane wystąpienie tego zasobu. Zmiany globalnego zasobu
są widoczne dla innych członków tej przestrzeni nazw, ale są niewidoczne dla innych procesów. Jednym z
zastosowań przestrzeni nazw są kontenery.
Niniejsza strona podręcznika zawiera odsyłacze do informacji o różnych typach przestrzeni nazw, opisuje
powiązane pliki /proc i podsumowuje API służące do pracy z przestrzeniami nazw.
Typy przestrzeni nazw
Poniższa tabela ukazuje dostępne w Linuksie typy przestrzeni nazw. Druga kolumna tabeli zawiera wartości
znaczników używanych do określenia typu przestrzeni nazw w różnych API. Trzecia kolumna identyfikuje
stronę podręcznika systemowego ze szczegółowym opisem danego typu przestrzeni nazw. Ostatnia kolumna
podsumowuje zasoby, które są izolowane danym typem przestrzeni nazw.
Prz. nazw Znacznik Podręcznik Izoluje
Cgroup CLONE_NEWCGROUP cgroup_namespaces(7) Główny katalog cgroup
IPC CLONE_NEWIPC ipc_namespaces(7) IPC Systemu V, kolejki
komunikatów POSIX
Sieci CLONE_NEWNET network_namespaces(7) Urządzenia sieciowe,
stosy, porty itp.
Montowania CLONE_NEWNS mount_namespaces(7) Punkty montowania
PID CLONE_NEWPID pid_namespaces(7) Identyfikatory procesów
Czasu CLONE_NEWTIME time_namespaces(7) Zegary rozruchu i
monotoniczne
Użytkownika CLONE_NEWUSER user_namespaces(7) ID użytkownika i grupy
UTS CLONE_NEWUTS uts_namespaces(7) Nazwę stacji i nazwę
domeny NIS
API przestrzeni nazw
Oprócz różnych plików /proc opisanych poniżej, API przestrzeni nazw obejmuje następujące wywołania
systemowe:
clone(2)
Wywołanie systemowe clone(2) tworzy nowy proces. Jeśli argument flags wywołania określa jeden lub
więcej ze znaczników CLONE_NEW* wypisanych wyżej, to dla każdego znacznika tworzona jest nowa
przestrzeń nazw, a proces potomny staje się ich członkiem (to wywołanie implementuje również wiele
funkcji niezwiązanych z przestrzeniami nazw).
setns(2)
Wywołanie systemowe setns(2) pozwala na dołączenie procesu wywołującego do istniejącej przestrzeni
nazw. Podaje się ją za pomocą deskryptora pliku, odnoszącego się do jednego z plików /proc/pid/ns
opisanych poniżej.
unshare(2)
Wywołanie systemowe unshare(2) przenosi proces wywołujący do nowej przestrzeni nazw. Jeśli
argument flags wywołania określa jeden lub więcej ze znaczników CLONE_NEW* wypisanych wyżej, to
dla każdego znacznika tworzona jest nowa przestrzeń nazw, a proces wywołujący staje się ich
członkiem (to wywołanie implementuje również wiele funkcji niezwiązanych z przestrzeniami nazw).
ioctl(2)
Różne operacje ioctl(2) służą do pozyskiwania informacji o przestrzeniach nazw. Są opisane w
podręczniku systemowym ioctl_nsfs(2).
Utworzenie nowej przestrzeni nazw za pomocą clone(2) i unshare(2), w większości sytuacji wymaga
przywileju (ang. capability) CAP_SYS_ADMIN, ponieważ w nowej przestrzeni nazw, twórca ma prawo zmiany
globalnych zasobów widocznych dla innych procesów, które są w niej później tworzone albo do niej
dołączają. Wyjątkiem są przestrzenie nazw użytkownika: od Linuksa 3.8 nie są wymagane przywileje do
utworzenia przestrzeni nazw użytkownika.
Katalog /proc/pid/ns/
Każdy proces posiada podkatalog /proc/pid/ns/ zawierający po jednym wpisie dla każdej przestrzeni nazw,
obsługującej zmienianie przez setns(2):
$ ls -l /proc/$$/ns | awk '{print $1, $9, $10, $11}'
total 0
lrwxrwxrwx. cgroup -> cgroup:[4026531835]
lrwxrwxrwx. ipc -> ipc:[4026531839]
lrwxrwxrwx. mnt -> mnt:[4026531840]
lrwxrwxrwx. net -> net:[4026531969]
lrwxrwxrwx. pid -> pid:[4026531836]
lrwxrwxrwx. pid_for_children -> pid:[4026531834]
lrwxrwxrwx. time -> time:[4026531834]
lrwxrwxrwx. time_for_children -> time:[4026531834]
lrwxrwxrwx. user -> user:[4026531837]
lrwxrwxrwx. uts -> uts:[4026531838]
Zamontowanie przez podpięcie (ang. bind; zob. mount(2)) jednego z plików w tym katalogu, w inne miejsce
systemu plików, utrzymuje istnienie odpowiadającej przestrzeni nazw procesu, określonego przez pid, nawet
gdy zakończą się wszystkie procesy istniejące obecnie w tej przestrzeni.
Otwarcie jednego z plików w tym katalogu (lub pliku zamontowanego przed podpięcie do jednego z tych
plików), zwraca deskryptor pliku odpowiadającej przestrzeni nazw procesu, określonego przez pid. Tak
długo, jak ten deskryptor pliku pozostaje otwarty, przestrzeń nazw będzie istniała, nawet gdy zakończą
się wszystkie procesy istniejące obecnie w tej przestrzeni. Deskryptor pliku można przekazać do setns(2).
W Linuksie 3.7 i wcześniejszych, pliki te były widoczne jako dowiązania zwykłe (stałe). Od Linuksa 3.8 są
widoczne jako dowiązania symboliczne. Jeśli występują dwa procesy w tej samej przestrzeni nazw, to
identyfikatory urządzeń i numery i-węzłów ich dowiązań symbolicznych /proc/pid/ns/xxx będą takie same;
aplikacje mogą to sprawdzić za pomocą pól stat.st_dev i stat.st_ino zwracanych przez stat(2). Zawartością
dowiązania symbolicznego jest łańcuch zawierający typ przestrzeni nazw i numer i-węzła, jak w poniższym
przykładzie:
$ readlink /proc/$$/ns/uts
uts:[4026531838]
W tym podkatalogu występują następujące dowiązania symboliczne
/proc/pid/ns/cgroup (od Linuksa 4.6)
Plik stanowi uchwyt do przestrzeni nazw cgroup procesu.
/proc/pid/ns/ipc (od Linuksa 3.0)
Plik stanowi uchwyt do przestrzeni nazw IPC procesu.
/proc/pid/ns/mnt (since Linux 3.8)
Plik stanowi uchwyt do przestrzeni nazw montowania procesu.
/proc/pid/ns/net (od Linuksa 3.0)
Plik stanowi uchwyt do przestrzeni nazw sieci procesu.
/proc/pid/ns/pid (od Linuksa 3.8)
Plik stanowi uchwyt do przestrzeni nazw PID procesu. Uchwyt ten jest stały w trakcie istnienia
procesu (tj. członkowstwo w przestrzeni nazw PID nigdy się nie zmienia).
/proc/pid/ns/pid_for_children (od Linuksa 4.12)
Plik stanowi uchwyt do przestrzeni nazw PID procesu potomnego utworzonego przez ten proces. Może
ulec zmianie jako wynik wywołań do unshare(2) i setns(2) (zob. pid_namespaces(7)), tak więc plik
może się różnić od /proc/pid/ns/pid. To dowiązanie symboliczne zyskuje wartość dopiero po
utworzeniu pierwszego procesu potomnego w tej przestrzeni nazw (wcześniej, readlink(2) odnoszące
się do dowiązania symbolicznego, zwróci pusty bufor).
/proc/pid/ns/time (od Linuksa 5.6)
Plik stanowi uchwyt do przestrzeni nazw czasu procesu.
/proc/pid/ns/time_for_children (od Linuksa 5.6)
Plik stanowi uchwyt do przestrzeni nazw czasu procesu potomnego utworzonego przez ten proces. Może
ulec zmianie jako wynik wywołań do unshare(2) i setns(2) (zob. time_namespaces(7)), tak więc plik
może się różnić od /proc/pid/ns/pid.
/proc/pid/ns/user (od Linuksa 3.8)
Plik stanowi uchwyt do przestrzeni nazw użytkownika procesu.
/proc/pid/ns/uts (od Linuksa 3.0)
Plik stanowi uchwyt do przestrzeni nazw UTS procesu
Uprawnieniem do rozwiązywania lub odczytywania (readlink(2)) tych dowiązań symbolicznych zarządza
sprawdzenie PTRACE_MODE_READ_FSCREDS trybu dostępu ptrace; zob. ptrace(2).
Katalog /proc/sys/user
Pliki w katalogu /proc/sys/user (obecnego od Linuksa 4.9) ujawniają limity liczby przestrzeni nazw
poszczególnych typów, jakie można utworzyć. Występują następujące pliki:
max_cgroup_namespaces
Wartość w pliku określa limit liczby przestrzeni nazw cgroup na jednego użytkownika, jakie można
utworzyć w przestrzeni nazw użytkownika.
max_ipc_namespaces
Wartość w pliku określa limit liczby przestrzeni nazw ipc na jednego użytkownika, jakie można
utworzyć w przestrzeni nazw użytkownika.
max_mnt_namespaces
Wartość w pliku określa limit liczby przestrzeni nazw montowania na jednego użytkownika, jakie
można utworzyć w przestrzeni nazw użytkownika.
max_net_namespaces
Wartość w pliku określa limit liczby przestrzeni nazw sieci na jednego użytkownika, jakie można
utworzyć w przestrzeni nazw użytkownika.
max_pid_namespaces
Wartość w pliku określa limit liczby przestrzeni nazw PID na jednego użytkownika, jakie można
utworzyć w przestrzeni nazw użytkownika.
max_time_namespaces (od Linuksa 5.7)
Wartość w pliku określa limit liczby przestrzeni nazw czasu na jednego użytkownika, jakie można
utworzyć w przestrzeni nazw użytkownika.
max_user_namespaces
Wartość w pliku określa limit liczby przestrzeni nazw użytkownika na jednego użytkownika, jakie
można utworzyć w przestrzeni nazw użytkownika.
max_uts_namespaces
Wartość w pliku określa limit liczby przestrzeni nazw uts na jednego użytkownika, jakie można
utworzyć w przestrzeni nazw użytkownika.
W odniesieniu do tych plików, proszę zauważyć co następuje:
• Wartości w plikach są modyfikowalne przez procesy uprzywilejowane.
• Wartości ujawnione w plikach są limitami dla przestrzeni nazw użytkownika, w której występuje
otwierający proces.
• Limity odnoszą się do jednego użytkownika. Każdy użytkownik w tej samej przestrzeni nazw użytkownika
może utworzyć do określonej limitem liczby przestrzeni nazw.
• Limity stosują się do wszystkich użytkowników, w tym tego o UID 0.
• Limity stosuje się nienaruszając innych limitów występujących na przestrzeń nazw (takich jak limity
przestrzeni nazw PID i użytkownika).
• Po wyczerpaniu limitów, clone(2) i unshare(2) zawiodą z błędem ENOSPC.
• W przypadku pierwotnej przestrzeni nazw użytkownika, domyślną wartością w każdym z plików jest połowa
limitu liczby wątków możliwych do utworzenia (/proc/sys/kernel/threads-max). We wszystkich potomnych
przestrzeniach nazw użytkownika, domyślną wartością w każdym z plików jest MAXINT.
• Gdy tworzona jest przestrzeń nazw, obiekt liczony jest również wobec przestrzeni nazw rodzica.
Precyzyjniej:
• Każda przestrzeń użytkownika ma UID twórcy.
• Gdy tworzona jest przestrzeń nazw, jest liczona wobec UID-ów twórcy w każdej z przestrzeni nazw
użytkownika rodzica, a jądro upewnia się, że odpowiedni limit przestrzeni nazw dla UID-u twórcy, w
przestrzeni nazw rodzica, nie jest przekroczony.
• Wyżej wymieniony punkt zapewnia, że utworzenie nowej przestrzeni nazw użytkownika, nie może służyć
jako sposób ominięcia limitów, obowiązujących dla bieżącej przestrzeni nazw użytkownika.
Istnienie przestrzeni nazw
Jeśli nie występują inne czynniki, przestrzeń nazw jest automatycznie likwidowana, gdy ostatni proces w
przestrzeni nazw kończy się lub opuszcza przestrzeń nazw. Jednak istnieje również szereg innych
czynników, które mogą utworzyć przestrzeń nazw, nawet gdy nie ma ona procesów członkowskich. Są to m.in.:
• Istnieje montowanie przez podpięcie lub otwarty deskryptor pliku do odpowiadającego pliku
/proc/pid/ns/*.
• Przestrzeń nazw jest hierarchiczna (tzn. jest to przestrzeń nazw PID lub użytkownika) i posiada
potomną przestrzeń nazw.
• Jest to przestrzeń nazw użytkownika, posiadająca jedną lub więcej przestrzeni nazw, niebędącymi
przestrzeniami nazw użytkownika.
• Jest to przestrzeń nazw PID i występuje proces odnoszący się do tej przestrzeni nazw, za pomocą
dowiązania symbolicznego /proc/pid/ns/pid_for_children.
• Jest to przestrzeń nazw czasu i występuje proces odnoszący się do tej przestrzeni nazw, za pomocą
dowiązania symbolicznego /proc/pid/ns/time_for_children.
• Jest to przestrzeń nazw IPC i występuje odpowiednie montowanie systemu plików mqueue (zob.
mq_overview(7)), odnoszące się do tej przestrzeni nazw.
• Jest to przestrzeń nazw PID i występuje odpowiednie montowanie systemu plików proc(5), odnoszące się
do tej przestrzeni nazw.
PRZYKŁADY
Zob. clone(2) i user_namespaces(7).
ZOBACZ TAKŻE
nsenter(1), readlink(1), unshare(1), clone(2), ioctl_nsfs(2), setns(2), unshare(2), proc(5),
capabilities(7), cgroup_namespaces(7), cgroups(7), credentials(7), ipc_namespaces(7),
network_namespaces(7), pid_namespaces(7), user_namespaces(7), uts_namespaces(7), lsns(8), switch_root(8)
TŁUMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Michał Kułach <michal.kulach@gmail.com>
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać
zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ
ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-
list@lists.sourceforge.net.
Linux man-pages 6.9.1 13 czerwca 2024 r. namespaces(7)