pid_namespaces(7) Miscellaneous Information Manual pid_namespaces(7) NAMN pid_namespaces -- oversikt over Linux PID-namnrymder BESKRIVNING For en oversikt over namnrymder, se namespaces(7). PID-namnrymder isolerar process-ID-nummerrymden, vilket betyder att processer i olika PID-namnrymder kan ha samma PID. PID-namnrymder gor att behallare kan astadkomma funktionalitet sasom att stoppa/ateruppta uppsattningen av processer i behallaren och migrera behallaren till en ny vard medan processerna inuti behallaren behaller samma PID:ar. PID:ar i en ny PID-namnrymd borjar pa 1, ungefar som ett fristaende system, och anrop av fork(2), vfork(2) eller clone(2) kommer skapa processer med PID:ar som ar unika inom namnrymden. Anvandning av PID-namnrymder kraver en karna som ar konfigurerad med alternativet CONFIG_PID_NS. Namnrymdens init-process Den forsta processen som skapas i en ny namnrymd (d.v.s., processen som skapas med clone(2) med flaggan CLONE_NEWPID, eller det forsta barnet som skapas av en process efter ett anrop av unshare(2) med flaggan CLONE_NEWPID) har PID:en 1, och ar "init"-processen for namnrymden (se init(1)). Denna process blir foralder for barnprocesser som blir foraldralosa for att en process som bor i denna PID-namnrymd avslutas (se nedan for ytterligare detaljer). Om "init"-processen i en PID-namnrymd avslutas avslutar karnan alla processerna i namnrymden med en signal SIGKILL. Detta beteende avspeglar faktumet att "init"-processen ar avgorande for den korrekta funktionen hos en PID-namnrymd. I detta fall kommer en senare fork(2) in i denna PID-namnrymd att misslyckas med felet ENOMEM; det ar inte mojligt att skapa en ny process i en PID-namnrymd vars "init"-process har avslutat. Sadana scenarier kan uppsta nar, till exempel, en process anvander en oppen filbeskrivare for en fil /proc/pid/ns/pid som motsvarar en process som fanns i en namnrymd for att gora setns(2) in i den namnrymden efter att "init"-processen har avslutat. Ett annat mojligt scenario kan uppsta efter ett anrop av unshare(2): om det forsta barnet som darefter skapas av en fork(2) avslutar, da misslyckas senare anrop av fork(2) med ENOMEM. Endast signaler for vilka "init"-processen har etablerat en signalhanterare kan skickas till "init"-processen av andra medlemmar av PID-namnrymden. Denna begransning galler aven for privilegierade processer, och hindrar andra medlemmar av PID-namnrymden fran att av misstag doda "init"-processen. Pa liknande satt kan en process i en anfadernamnrymd -- med hansyn till de vanliga rattighetskontrollerna som beskrivs i kill(2) -- skicka signaler till "init"-processen i en barn-PID-namnrymd endast om "init"-processen har etablerat en hanterare for den signalen. (Inom hanteraren kommer faltet siginfo_t si_pid som beskrivs i sigaction(2) att vara noll.) SIGKILL eller SIGSTOP hanteras speciellt: dessa signaler skickas tvingande nar de skickas fran en anfader-PID-namnrymd. Ingendera av dessa signaler kan fangas av "init"-processen, och kommer darfor resultera i de vanliga atgarderna som associeras med dessa signaler (avslut respektive stopp av processen). Med borjan fran Linux 3.4 far systemanropet reboot(2) en signal att skickas till namnrymdens "init"-process. Se reboot(2) for mer detaljer. Nastning av PID-namnrymder PID-namnrymder kan nastas: varje PID-namnrymd har en foralder, utom den intitiala ("rot") PID-namnrymden. Foralder till en PID-namnrymd ar PID-namnrymden for processen som skapade namnrymden med clone(2) eller unshare(2). PID-namnrymder formar alltsa ett trad, dar alla namnrymder ytterst sparar sitt ursprung till rotnamnrymden. Sedan Linux 3.7 begransar karnan det maximala nastningsdjupet for PID-namnrymder till 32. En process ar synlig for andra processer i sin PID-namnrymd, och for processer i varje direkt anfaders-PID-namnrymd hela vagen tillbaka till rot-PID-namnrymden. I detta sammanhang betyder "synlig" att en process kan vara malet for atgarder av en annan process med systemanrop som anger ett process-ID. Omvant, processer i en barn-PID-namnrymd kan inte se processer i foraldranamnrymden och mer avlagsna anfadernamnrymder. Mer koncist: en process kan se (t.ex., skicka signaler till med kill(2), satta nice-varde pa med setpriority(2), etc.) endast processer som ingar i dess egen PID-namnrymd och avkommor av den namnrymden. En process har ett process-ID i varje lager av PID-namnrymdshierarkin i vilken den ar synlig, och gar tillbaka genom varje direkt anfadernamnrymd vidare till rot-PID-namnrymden. Systemanrop som verkar pa process-ID:er arbetar alltid med anvandning av process-ID:t som ar synligt i anroparens PID-namnrymd. Ett anrop av getpid(2) returnerar alltid PID:en som ar associerad med namnrymden i vilken processen skapades. Nagra processer i en PID-namnrymd kan ha foraldrar som ligger utanfor namnrymden. Till exempel, foraldern till den initiala processen i namnrymden (d.v.s., processen init(1) med PID 1) finns av nodvandighet i en annan namnrymd. Pa samma satt finns de direkta barnen till en process som anvander setns(2) for att fa sina barn att ga med i en PID-namnrymd i en annan PID-namnrymd an den som anropade setns(2). Anrop av getppid(2) for sadana processer returnerar 0. Medan processer fritt kan ga in i barn-PID-namnrymder (t.ex. med setns(2) med en PID-namnrymdsfilbeskrivare) kan de inte flytta i nagon annan riktning. Det vill saga, processer kan inte ga in i nagon anfadernamnrymd (foralder, farforalder, etc.). Att byta PID-namnrymder ar en envagsatgard. Atgarden NS_GET_PARENT till ioctl(2) kan anvandas for att upptacka foraldrarelationen mellan PID-namnrymder; se ioctl_ns(2). semantiken hos setns(2) och unshare(2) Anrop av setns(2) som anger en PID-namnrymdsfilbeskrivare och anrop av unshare(2) med flagga CLONE_NEWPID far barn som senare skapas av anroparen att placeras i en annan PID-namnrymd an anroparens. (Fran Linux 4.12 visas PID-namnrymden via filen /proc/pid/ns/pid_for_children, sa som beskrivs i namespaces(7).) Dessa anrop andrar dock inte PID-namnrymden for den anropande processen, da detta skulle andra anroparens uppfattning om sin egen PID (sa som den rapporteras av getpid()), vilket skulle gora sonder manga program och bibliotek. For att uttrycka saker pa ett annat satt: en process PID-namnrymdsmedlemskap avgors nar processen skapas och kan inte andras darefter. Bland annat betyder detta att foraldrarelationen mellan processer avspeglar foraldrarelationen mellan PID-namnrymder: foraldern till en process finns antingen i samma namnrymd eller bor i den omedelbara foraldra-PID-namnrymden. En process kan anropa unshare(2) med flaggan CLONE_NEWPID endast en gang. Efter att den utfort denna atgard kommer dess symboliska lank /proc/pid/ns/pid_for_children att vara tom tills det forsta barnet ar skapat i namnrymden. Adoption av foraldralosa barn Nar en barnprocess blir foraldralos flyttas den over till "init"-processen i PID-namnrymden for dess foralder (om inte en av de narmare anfaderna till foraldern har anvant kommandot prctl(2) PR_SET_CHILD_SUBREAPER for att markera sig sjalv som den som skordar avkommeprocesser som blir foraldralosa). Observera att pa grund av semantiken hos setns(2) och unshare(2) som beskrivs ovan kan detta vara "init"-processen i PID-namnrymden som ar foralder till barnets PID-namnrymd, istallet for "init"-processen i barnets egen PID-namnrymd. Kompatibilitet hos CLONE_NEWPID med andra CLONE_*-flaggor I de nuvarande versionerna av Linux kan inte CLONE_NEWPID kombineras med CLONE_THREAD. Tradar maste befinna sig i samma PID-namnrymd sa att de kan skicka signaler till varandra. Vidare maste det vara mojligt att se alla tradarna hos en process i filsystemet proc(5). Dessutom, om tva tradar skulle vara i olika PID-namnrymder skulle inte process-ID:t for processen som skickar en signal kunna kodas pa ett meningsfullt satt nar en signal skickas (se beskrivningen av typen siginfo_t i sigaction(2)). Eftersom detta beraknas nar en signal koas upp skulle en signalko delad mellan processer i flera PID-namnrymder omojliggora det. I tidigare versioner av Linux var dessutom CLONE_NEWPID inte tillatet (misslyckades med felet EINVAL) i kombination med CLONE_SIGHAND (fore Linux 4.3) saval som CLONE_VM (fore Linux 3.12). Andringarna som lyfte dessa begransningar har aven porterats till tidigare stabila karnor. /proc och PID-namnrymder Ett /proc-filsystem visar (i katalogerna /proc/pid) endast processer som ar synliga i PID-namnrymden for processen som utfor monteringen, aven om /proc visas for processer i andra namnrymder. Efter att ha skapat en ny PID-namnrymd ar det bra for barnet att byta sin rotkatalog och montera en ny procfs-instans pa /proc sa att verktyg sasom ps(1) fungerar korrekt. Om en ny monteringsnamnrymd skapas samtidigt genom att inkludera CLONE_NEWNS i argumentet flaggor till clone(2) eller unshare(2), da ar det inte nodvandigt att byta rotkatalog: en ny procfs-instans kan monteras direkt over /proc. Fran ett skal ar kommandot for att montera /proc: $ mount -t proc proc /proc Att anropa readlink(2) pa sokvagen /proc/self ger process-ID:t for anroparen i den procfs-monteringens PID-namnrymd (d.v.s., PID-namnrymden for processen som monterade procfs). Detta kan vara anvandbart for introspektionsandamal, nar en process vill veta sin PID i andra namnrymder. /proc-filer /proc/sys/kernel/ns_last_pid (fran Linux 3.3) Denna fil (som ar virtualiserad per PID-namnrymd) visar den senaste PID:en som allokerades i denna PID-namnrymd. Nar nasta PID allokeras kommer karnan soka efter den lagsta oallokerade PID:en som ar storre an detta varde, och nar denna fil darefter lases kommer den visa den PID:en. Denna fil kan skrivas av en process som har formagan CAP_SYS_ADMIN eller (fran Linux 5.9) CAP_CHECKPOINT_RESTORE inuti anvandarnamnrymden som ager PID-namnrymden. Detta gor det mojligt att bestamma PID:en som allokeras for nasta process som skapas inuti denna PID-namnrymd. Diverse Nar ett process-ID skickas over ett UNIX-domansuttag till en process i en annan PID-namnrymd (se beskrivningen av SCM_CREDENTIALS i unix(7)) oversatts den till det motsvarande PID-vardet i den mottagande processens PID-namnrymd. STANDARDER Linux. EXEMPEL Se user_namespaces(7). SE AVEN clone(2), reboot(2), setns(2), unshare(2), proc(5), capabilities(7), credentials(7), mount_namespaces(7), namespaces(7), user_namespaces(7), switch_root(8) OVERSATTNING Den svenska oversattningen av denna manualsida skapades av Goran Uddeborg Denna oversattning ar fri dokumentation; las GNU General Public License Version 3 eller senare for upphovsrattsvillkor. Vi tar INGET ANSVAR. Om du hittar fel i oversattningen av denna manualsida, skicka ett mail till . Linux man-pages 6.06 31 oktober 2023 pid_namespaces(7)