namespaces(7)

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
Tłumaczenie niniejszej strony podręcznika: 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 (https://www.gnu.org/licenses/gpl-3.0.html) 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.