namespaces(7) Miscellaneous Information Manual namespaces(7) NAZWA namespaces - przeglad linuksowych przestrzeni nazw OPIS Przestrzen nazw opakowuje globalny zasob systemowy w warstwie abstrakcji tak, ze dla procesow w niej wystepujacych, wyglada to jakby mialy wlasne, izolowane wystapienie tego zasobu. Zmiany globalnego zasobu sa widoczne dla innych czlonkow tej przestrzeni nazw, ale sa niewidoczne dla innych procesow. Jednym z zastosowan przestrzeni nazw sa kontenery. Niniejsza strona podrecznika zawiera odsylacze do informacji o roznych typach przestrzeni nazw, opisuje powiazane pliki /proc i podsumowuje API sluzace do pracy z przestrzeniami nazw. Typy przestrzeni nazw Ponizsza tabela ukazuje dostepne w Linuksie typy przestrzeni nazw. Druga kolumna tabeli zawiera wartosci znacznikow uzywanych do okreslenia typu przestrzeni nazw w roznych API. Trzecia kolumna identyfikuje strone podrecznika systemowego ze szczegolowym opisem danego typu przestrzeni nazw. Ostatnia kolumna podsumowuje zasoby, ktore sa izolowane danym typem przestrzeni nazw. Prz. nazw Znacznik Podrecznik Izoluje Cgroup CLONE_NEWCGROUP cgroup_namespaces(7) Glowny katalog cgroup IPC CLONE_NEWIPC ipc_namespaces(7) IPC Systemu V, kolejki komunikatow POSIX Sieci CLONE_NEWNET network_namespaces(7) Urzadzenia sieciowe, stosy, porty itp. Montowania CLONE_NEWNS mount_namespaces(7) Punkty montowania PID CLONE_NEWPID pid_namespaces(7) Identyfikatory procesow Czasu CLONE_NEWTIME time_namespaces(7) Zegary rozruchu i monotoniczne Uzytkownika CLONE_NEWUSER user_namespaces(7) ID uzytkownika i grupy UTS CLONE_NEWUTS uts_namespaces(7) Nazwe stacji i nazwe domeny NIS API przestrzeni nazw Oprocz roznych plikow /proc opisanych ponizej, API przestrzeni nazw obejmuje nastepujace wywolania systemowe: clone(2) Wywolanie systemowe clone(2) tworzy nowy proces. Jesli argument flags wywolania okresla jeden lub wiecej ze znacznikow CLONE_NEW* wypisanych wyzej, to dla kazdego znacznika tworzona jest nowa przestrzen nazw, a proces potomny staje sie ich czlonkiem (to wywolanie implementuje rowniez wiele funkcji niezwiazanych z przestrzeniami nazw). setns(2) Wywolanie systemowe setns(2) pozwala na dolaczenie procesu wywolujacego do istniejacej przestrzeni nazw. Podaje sie ja za pomoca deskryptora pliku, odnoszacego sie do jednego z plikow /proc/pid/ns opisanych ponizej. unshare(2) Wywolanie systemowe unshare(2) przenosi proces wywolujacy do nowej przestrzeni nazw. Jesli argument flags wywolania okresla jeden lub wiecej ze znacznikow CLONE_NEW* wypisanych wyzej, to dla kazdego znacznika tworzona jest nowa przestrzen nazw, a proces wywolujacy staje sie ich czlonkiem (to wywolanie implementuje rowniez wiele funkcji niezwiazanych z przestrzeniami nazw). ioctl(2) Rozne operacje ioctl(2) sluza do pozyskiwania informacji o przestrzeniach nazw. Sa opisane w podreczniku systemowym ioctl_ns(2). Utworzenie nowej przestrzeni nazw za pomoca clone(2) i unshare(2), w wiekszosci sytuacji wymaga przywileju (ang. capability) CAP_SYS_ADMIN, poniewaz w nowej przestrzeni nazw, tworca ma prawo zmiany globalnych zasobow widocznych dla innych procesow, ktore sa w niej pozniej tworzone albo do niej dolaczaja. Wyjatkiem sa przestrzenie nazw uzytkownika: od Linuksa 3.8 nie sa wymagane przywileje do utworzenia przestrzeni nazw uzytkownika. Katalog /proc/pid/ns/ Kazdy proces posiada podkatalog /proc/pid/ns/ zawierajacy po jednym wpisie dla kazdej przestrzeni nazw, obslugujacej 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 podpiecie (ang. bind; zob. mount(2)) jednego z plikow w tym katalogu, w inne miejsce systemu plikow, utrzymuje istnienie odpowiadajacej przestrzeni nazw procesu, okreslonego przez pid, nawet gdy zakoncza sie wszystkie procesy istniejace obecnie w tej przestrzeni. Otwarcie jednego z plikow w tym katalogu (lub pliku zamontowanego przed podpiecie do jednego z tych plikow), zwraca deskryptor pliku odpowiadajacej przestrzeni nazw procesu, okreslonego przez pid. Tak dlugo, jak ten deskryptor pliku pozostaje otwarty, przestrzen nazw bedzie istniala, nawet gdy zakoncza sie wszystkie procesy istniejace obecnie w tej przestrzeni. Deskryptor pliku mozna przekazac do setns(2). W Linuksie 3.7 i wczesniejszych, pliki te byly widoczne jako dowiazania zwykle (stale). Od Linuksa 3.8 sa widoczne jako dowiazania symboliczne. Jesli wystepuja dwa procesy w tej samej przestrzeni nazw, to identyfikatory urzadzen i numery i-wezlow ich dowiazan symbolicznych /proc/pid/ns/xxx beda takie same; aplikacje moga to sprawdzic za pomoca pol stat.st_dev i stat.st_ino zwracanych przez stat(2). Zawartoscia dowiazania symbolicznego jest lancuch zawierajacy typ przestrzeni nazw i numer i-wezla, jak w ponizszym przykladzie: $ readlink /proc/$$/ns/uts uts:[4026531838] W tym podkatalogu wystepuja nastepujace dowiazania 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 staly w trakcie istnienia procesu (tj. czlonkowstwo w przestrzeni nazw PID nigdy sie 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. Moze ulec zmianie jako wynik wywolan do unshare(2) i setns(2) (zob. pid_namespaces(7)), tak wiec plik moze sie roznic od /proc/pid/ns/pid. To dowiazanie symboliczne zyskuje wartosc dopiero po utworzeniu pierwszego procesu potomnego w tej przestrzeni nazw (wczesniej, readlink(2) odnoszace sie do dowiazania symbolicznego, zwroci 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. Moze ulec zmianie jako wynik wywolan do unshare(2) i setns(2) (zob. time_namespaces(7)), tak wiec plik moze sie roznic od /proc/pid/ns/pid. /proc/pid/ns/user (od Linuksa 3.8) Plik stanowi uchwyt do przestrzeni nazw uzytkownika procesu. /proc/pid/ns/uts (od Linuksa 3.0) Plik stanowi uchwyt do przestrzeni nazw UTS procesu Uprawnieniem do rozwiazywania lub odczytywania (readlink(2)) tych dowiazan symbolicznych zarzadza sprawdzenie PTRACE_MODE_READ_FSCREDS trybu dostepu ptrace; zob. ptrace(2). Katalog /proc/sys/user Pliki w katalogu /proc/sys/user (obecnego od Linuksa 4.9) ujawniaja limity liczby przestrzeni nazw poszczegolnych typow, jakie mozna utworzyc. Wystepuja nastepujace pliki: max_cgroup_namespaces Wartosc w pliku okresla limit liczby przestrzeni nazw cgroup na jednego uzytkownika, jakie mozna utworzyc w przestrzeni nazw uzytkownika. max_ipc_namespaces Wartosc w pliku okresla limit liczby przestrzeni nazw ipc na jednego uzytkownika, jakie mozna utworzyc w przestrzeni nazw uzytkownika. max_mnt_namespaces Wartosc w pliku okresla limit liczby przestrzeni nazw montowania na jednego uzytkownika, jakie mozna utworzyc w przestrzeni nazw uzytkownika. max_net_namespaces Wartosc w pliku okresla limit liczby przestrzeni nazw sieci na jednego uzytkownika, jakie mozna utworzyc w przestrzeni nazw uzytkownika. max_pid_namespaces Wartosc w pliku okresla limit liczby przestrzeni nazw PID na jednego uzytkownika, jakie mozna utworzyc w przestrzeni nazw uzytkownika. max_time_namespaces (od Linuksa 5.7) Wartosc w pliku okresla limit liczby przestrzeni nazw czasu na jednego uzytkownika, jakie mozna utworzyc w przestrzeni nazw uzytkownika. max_user_namespaces Wartosc w pliku okresla limit liczby przestrzeni nazw uzytkownika na jednego uzytkownika, jakie mozna utworzyc w przestrzeni nazw uzytkownika. max_uts_namespaces Wartosc w pliku okresla limit liczby przestrzeni nazw uts na jednego uzytkownika, jakie mozna utworzyc w przestrzeni nazw uzytkownika. W odniesieniu do tych plikow, prosze zauwazyc co nastepuje: o Wartosci w plikach sa modyfikowalne przez procesy uprzywilejowane. o Wartosci ujawnione w plikach sa limitami dla przestrzeni nazw uzytkownika, w ktorej wystepuje otwierajacy proces. o Limity odnosza sie do jednego uzytkownika. Kazdy uzytkownik w tej samej przestrzeni nazw uzytkownika moze utworzyc do okreslonej limitem liczby przestrzeni nazw. o Limity stosuja sie do wszystkich uzytkownikow, w tym tego o UID 0. o Limity stosuje sie nienaruszajac innych limitow wystepujacych na przestrzen nazw (takich jak limity przestrzeni nazw PID i uzytkownika). o Po wyczerpaniu limitow, clone(2) i unshare(2) zawioda z bledem ENOSPC. o W przypadku pierwotnej przestrzeni nazw uzytkownika, domyslna wartoscia w kazdym z plikow jest polowa limitu liczby watkow mozliwych do utworzenia (/proc/sys/kernel/threads-max). We wszystkich potomnych przestrzeniach nazw uzytkownika, domyslna wartoscia w kazdym z plikow jest MAXINT. o Gdy tworzona jest przestrzen nazw, obiekt liczony jest rowniez wobec przestrzeni nazw rodzica. Precyzyjniej: o Kazda przestrzen uzytkownika ma UID tworcy. o Gdy tworzona jest przestrzen nazw, jest liczona wobec UID-ow tworcy w kazdej z przestrzeni nazw uzytkownika rodzica, a jadro upewnia sie, ze odpowiedni limit przestrzeni nazw dla UID-u tworcy, w przestrzeni nazw rodzica, nie jest przekroczony. o Wyzej wymieniony punkt zapewnia, ze utworzenie nowej przestrzeni nazw uzytkownika, nie moze sluzyc jako sposob ominiecia limitow, obowiazujacych dla biezacej przestrzeni nazw uzytkownika. Istnienie przestrzeni nazw Jesli nie wystepuja inne czynniki, przestrzen nazw jest automatycznie likwidowana, gdy ostatni proces w przestrzeni nazw konczy sie lub opuszcza przestrzen nazw. Jednak istnieje rowniez szereg innych czynnikow, ktore moga utworzyc przestrzen nazw, nawet gdy nie ma ona procesow czlonkowskich. Sa to m.in.: o Istnieje montowanie przez podpiecie lub otwarty deskryptor pliku do odpowiadajacego pliku /proc/pid/ns/*. o Przestrzen nazw jest hierarchiczna (tzn. jest to przestrzen nazw PID lub uzytkownika) i posiada potomna przestrzen nazw. o Jest to przestrzen nazw uzytkownika, posiadajaca jedna lub wiecej przestrzeni nazw, niebedacymi przestrzeniami nazw uzytkownika. o Jest to przestrzen nazw PID i wystepuje proces odnoszacy sie do tej przestrzeni nazw, za pomoca dowiazania symbolicznego /proc/pid/ns/pid_for_children. o Jest to przestrzen nazw czasu i wystepuje proces odnoszacy sie do tej przestrzeni nazw, za pomoca dowiazania symbolicznego /proc/pid/ns/time_for_children. o Jest to przestrzen nazw IPC i wystepuje odpowiednie montowanie systemu plikow mqueue (zob. mq_overview(7)), odnoszace sie do tej przestrzeni nazw. o Jest to przestrzen nazw PID i wystepuje odpowiednie montowanie systemu plikow proc(5), odnoszace sie do tej przestrzeni nazw. PRZYKLADY Zob. clone(2) i user_namespaces(7). ZOBACZ TAKZE nsenter(1), readlink(1), unshare(1), clone(2), ioctl_ns(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) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.06 31 pazdziernika 2023 r. namespaces(7)