Scroll to navigation

NAMESPACES(7) Linux programmerarmanual NAMESPACES(7)

NAMN

namespaces — översikt över Linux namnrymder

BESKRIVNING

En namnrymd slår in en global systemresurs i en abstraktion som gör att det ser ut för processer inuti namnrymden som att de har sin egen isolerade instans av den globala resursen. Ändringar av den globala resursen är synlig för andra processer som är medlemmar i namnrymden, men är osynliga för andra processer. En användning av namnrymder är att implementera behållare.

Linux tillhandahåller följande namnrymder:

Namnrymd Konstant Isolerar
Cgroup CLONE_NEWCGROUP Cgroup-rotkatalog
IPC CLONE_NEWIPC System V IPC, POSIX meddelandeköer
Nätverk CLONE_NEWNET Nätverksenheter, stackar, portar, etc.
Montering CLONE_NEWNS Monteringspunkter
PID CLONE_NEWPID Process-ID:n
Användare CLONE_NEWUSER Användar- och grupp-ID:n
UTS CLONE_NEWUTS Värdnamn och NIS-domännamn

Denna sida beskriver de olika namnrymderna och de tillhörande filerna i /proc, och sammanfattar API:erna för att arbeta med namnrymder.

Namnrymds-API:erna

Förutom olika filer i /proc som beskrivs nedan inkluderar namnrymds-API:erna följande systemanrop:

clone(2)
Systemanropet clone(2) skapar en ny process. Om argumentet flaggor till anropet anger en eller flera av flaggorna CLONE_NEW* som listas nedan, då skapas nya namnrymder för varje flagga, och barnprocessen görs till en medlem av dessa namnrymder. (Detta systemanrop implementerar även ett antal funktioner som är orelaterade till namnrymder.)
setns(2)
Systemanropet setns(2) låter den anropande processen gå med i en befintlig namnrymd. Namnrymden att gå med i anges via en filbeskrivare som refererar till en av filerna /proc/[pid]/ns som beskrivs nedan.
unshare(2)
Systemanropet unshare(2) förflyttar den anropande processen till en ny namnrymd. Om argumentet flaggor till anropet anger en eller flera av flaggorna CLONE_NEW* som listas nedan, då skapas nya namnrymder för varje flagga, och den anropande processen görs till en medlem av dessa namnrymder. (Detta systemanrop implementerar även ett antal funktioner som är orelaterade till namnrymder.)

Att skapa nya namnrymder med clone(2) och unshare(2) kräver i de flesta fall förmågan CAP_SYS_ADMIN. Användarnamnrymder är undantaget: från Linux 3.8 krävs inga privilegier för att skapa en användarnamnrymd.

Katalogen /proc/[pid]/ns/

Varje process har en underkatalog /proc/[pid]/ns/ som innehåller en post för varje namnrymd som stödjer att hanteras av setns(2):


$ ls -l /proc/$$/ns
total 0
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 cgroup -> cgroup:[4026531835]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 ipc -> ipc:[4026531839]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 mnt -> mnt:[4026531840]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 net -> net:[4026531969]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 pid -> pid:[4026531836]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 pid_for_children -> pid:[4026531834]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 user -> user:[4026531837]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 uts -> uts:[4026531838]

Bindmontering (se mount(2)) av en av filerna i denna katalog till någon annanstans i filsystemet håller den motsvarande namnrymden för processen som anges av pid vid liv även om alla processer som för närvarande finns i namnrymden avslutar.

Att öppna en av filerna i denna katalog (eller en fil som är bindmonterad till en av dessa filer) returnerar ett filhandtag för den motsvarande namnrymden för processen som anges av pid. Så länge denna filbeskrivare är fortsatt öppen kommer namnrymden fortsätta vara vid liv, även om alla processer i namnrymden avslutar. Filbeskrivaren kan skickas till setns(2).

I Linux 3.7 och tidigare var dessa filer synliga som hårda länkar. Från Linux 3.8 dyker de upp som symboliska länkar. Om två processer finns i samma namnrymd, då kommer enhets-ID:n och inodsnummer för deras symboliska länkar /proc/[pid]/ns/xxx vara desamma; ett program kan kontrollera detta med fälten stat.st_dev och stat.st_ino som returneras av stat(2). Innehållet för denna symboliska länk är en sträng som innehåller namnrymdstypen och inodsnumret som i följande exempel:


$ readlink /proc/$$/ns/uts
uts:[4026531838]

De symboliska länkarna i denna underkatalog är enligt följande:

/proc/[pid]/ns/cgroup (från Linux 4.6)
Denna fil är ett handtag till cgroup-namnrymden för processen.
/proc/[pid]/ns/ipc (från Linux 3.0)
Denna fil är ett handtag till IPC-namnrymden för processen.
/proc/[pid]/ns/mnt (från Linux 3.8)
Denna fil är ett handtag till monteringsnamnrymden för processen.
/proc/[pid]/ns/net (från Linux 3.0)
Denna fil är ett handtag till nätverksnamnrymden för processen.
/proc/[pid]/ns/pid (från Linux 3.8)
Denna fil är ett handtag till PID-namnrymden för processen. Detta handtag är permanent under livstiden för processen (d.v.s., en process PID-namnrymdsmedlemskap ändras aldrig).
/proc/[pid]/ns/pid_for_children (från Linux 4.12)
Denna fil är ett handtag till PID-namnrymden för barnprocesser som skapas av denna process. Detta kan ändras som ett resultat av anrop av unshare(2) och setns(2) (se pid_namespaces(7)), så filen kan skilja från /proc/[pid]/ns/pid. Den symboliska länken får ett värde endast efter att den första barnprocessen skapas i namnrymden. (Före dess kommer readlink(2) av den symboliska länken returnera en tom buffert.)
/proc/[pid]/ns/user (från Linux 3.8)
Denna fil är ett handtag till användarnamnrymden för processen.
/proc/[pid]/ns/uts (från Linux 3.0)
Denna fil är ett handtag till UTS-namnrymden för processen.

Rättigheter att dereferera eller läsa (readlink(2)) dessa symboliska länkar styrs av en kontroll av åtkomstläget ptrace PTRACE_MODE_READ_FSCREDS; se ptrace(2).

Katalogen /proc/sys/user

Filerna i katalogen /proc/sys/user (som finns sedan Linux 4.9) visar gränser på antalet namnrymder av olika typer som kan skapas. Filerna är som följer:

Värdet i denna fil definierar en gräns per användare på antalet cgroup-namnrymder som kan skapas i användarnamnrymden.
Värdet i denna fil definierar en gräns per användare på antalet ipc-namnrymder som kan skapas i användarnamnrymden.
Värdet i denna fil definierar en gräns per användare på antalet monteringsnamnrymder som kan skapas i användarnamnrymden.
Värdet i denna fil definierar en gräns per användare på antalet nätverksnamnrymder som kan skapas i användarnamnrymden.
Värdet i denna fil definierar en gräns per användare på antalet pid-namnrymder som kan skapas i användarnamnrymden.
Värdet i denna fil definierar en gräns per användare på antalet användarnamnrymder som kan skapas i användarnamnrymden.
Värdet i denna fil definierar en gräns per användare på antalet användarnamnrymder som kan skapas i användarnamnrymden.

Observera följande detaljer om dessa filer:

  • Värdena i dessa filer kan ändras av privilegierade processer.
  • Värdena som visas av dessa filer är gränserna för användarnamnrymden i vilken processen som öppnar den finns.
  • Gränserna är per användare. Varje användare i samma användarnamnrymd kan skapa namnrymder upp till den definierade gränsen.
  • Gränserna gäller alla användare, inklusive AID 0.
  • Dessa gränser gäller utöver andra gränser per användare (såsom de för PID- och användarnamnrymder) som kan upprätthållas.
  • När man når dessa grånser misslyckas clone(2) och unshare(2) med felet ENOSPC.
  • För den initiala användarnamnrymden är standardvärdet i var och en av dessa filer hälften av gränsen på antalet trådar som kan skapas (/proc/sys/kernel/threads-max). I alla nedstigande användarnamnrymder är standardvärdet i varje fil MAXINT.
  • När en namnrymd skapas medräknas objektet även mot föräldranamnrymder. Mer precist:
+
Varje användarnamnrymd har ett skapar-AID.
+
När en namnrymd skapas räknas den mot skapar-AID:n i var och en av föräldranamnrymderna, och kärnan säkerställer att motsvarande namnrymdsgräns för skapar-AID:t i föräldranamnrymden inte överskrids.
+
Ovannämnda punkt säkerställer att skapandet av en ny användarnamnrymd inte kan användas som ett sätt att undvika gränserna som gäller i den aktuella användarnamnrymden.

Cgroup-namnrymder (CLONE_NEWCGROUP)

Se cgroup_namespaces(7).

IPC-namnrymder (CLONE_NEWIPC)

IPC-namnrymder isolerar vissa IPC-resurser, nämligen System V IPC-objekt (se svipc(7)) och (från Linux 2.6.30) POSIX-meddelandeköer (se mq_overview(7)). Den gemensamma egenskapen hos dessa IPC-mekanismer är att IPC-objekt identifieras av andra mekanismer än filsystemssökvägar.

Varje IPC-namnrymd har sin egen uppsättning av System V IPC-identifierare och sitt eget filsystem för POSIX meddelandeköer. Objekt som skapas i en IPC-namnrymd är synliga för alla andra processer som är medlemmar av den namnrymden, men är inte synliga för processer i andra IPC-namnrymder.

Följande gränssnitt i /proc är separata för varje IPC-namnrymd:

  • Gränssnitten för POSIX meddelandeköer i /proc/sys/fs/mqueue.
  • System V IPC-gränssnitt i /proc/sys/kernel, nämligen: msgmax, msgmnb, msgmni, sem, shmall, shmmax, shmmni och shm_rmid_forced.
  • System V IPC-gränssnitt i /proc/sysvipc.

När en IPC-namnrymd förstörs (d.v.s., när den sista processen som är medlem i namnrymden avslutar) förstörs automatiskt alla IPC-objekt i namnrymden.

Användning av IPC-namnrymder kräver en kärna som är konfigurerad med CONFIG_IPC_NS.

Nätverksnamnrymder (CLONE_NEWNET)

Se network_namespaces(7).

Monteringsnamnrymder (CLONE_NEWNS)

Se mount_namespaces(7).

PID-namnrymder (CLONE_NEWPID)

Se pid_namespaces(7).

Användarnamnrymder (CLONE_NEWUSER)

Se user_namespaces(7).

UTS-namnrymder (CLONE_NEWUTS)

UTS-namnrymder åstadkommer isolering av två systemidentifierare: värdnamnet och NIS-domännamnet. Dessa identifierare sätts med sethostname(2) och setdomainname(2), och kan avläsas med uname(2), gethostname(2) och getdomainname(2).

Användning av UTS-namnrymder kräver en kärna som är konfigurerad med alternativet CONFIG_UTS_NS.

EXEMPEL

Se clone(2) och user_namespaces(7).

SE ÄVEN

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), network_namespaces(7), pid_namespaces(7), user_namespaces(7), lsns(8), switch_root(8)

KOLOFON

Denna sida är del av version 4.16 av Linux man-pages-projektet. En beskrivning av projektet, information om hur man rapporterar fel och den senaste versionen av denna sida kan hittas på https://www.kernel.org/doc/man-pages/.

ÖVERSÄTTNING

Den svenska översättningen av denna manualsida skapades av Göran Uddeborg <goeran@uddeborg.se>

Denna översättning är fri dokumentation; läs GNU General Public License Version 3 eller senare för upphovsrättsvillkor. Vi tar INGET ANSVAR.

Om du hittar fel i översättningen av denna manualsida, skicka ett mail till Tp-sv@listor.tp-sv.se.

2 februari 2018 Linux