namespaces — översikt över Linux
namnrymder
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.
Denna sida ger pekare till information om de olika
namnrymdstyperna, beskriver de tillhörande filerna i /proc och
sammanfattar API:erna för att arbeta med namnrymder.
Följande tabell visar namnrymdstyperna som är
tillgängliga i Linux. Den andra kolumnen i tabellen visar
flaggvärdet som används för att ange namnrymdstypen i
de olika API:erna. Den tredje kolumnen identifierar manualsidan som ger
detaljer om namnrymdstypen. Den sista kolumnen är en sammanfattning
av de resurser som isoleras av namnrymdstypen.
Namnrymd |
Flagga |
Sida |
Isolerar |
Cgroup |
CLONE_NEWCGROUP |
cgroup_namespaces(7) |
Cgroup-rotkatalog |
IPC |
CLONE_NEWIPC |
ipc_namespaces(7) |
System V IPC, POSIX meddelandeköer |
Nätverk |
CLONE_NEWNET |
network_namespaces(7) |
Nätverksenheter, stackar, portar, etc. |
Montering |
CLONE_NEWNS |
mount_namespaces(7) |
Monteringspunkter |
PID |
CLONE_NEWPID |
pid_namespaces(7) |
Process-ID:n |
Tid |
CLONE_NEWTIME |
time_namespaces(7) |
Uppstarts- och monotona klockor |
Användare |
CLONE_NEWUSER |
user_namespaces(7) |
Användar- och grupp-ID:n |
UTS |
CLONE_NEWUTS |
uts_namespaces(7) |
Värdnamn och NIS-domännamn |
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 ovan, 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 ovan, 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.)
- ioctl(2)
- Olika åtgärder med ioctl(2) kan användas
för att upptäcka information om namnrymder. Dessa
åtgärder beskrivs i ioctl_ns(2).
Att skapa nya namnrymder med clone(2) och unshare(2)
kräver i de flesta fall förmågan CAP_SYS_ADMIN
eftersom skaparen, i den nya namnrymden, kommer ha förmågan
att ändra globala resurser som är synliga för andra
processer som skapas i eller går med i namnrymden.
Användarnamnrymder är undantaget: från Linux 3.8
krävs inga privilegier för att skapa en
användarnamnrymd.
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 | 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]
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/time (från Linux 5.6)
- Denna fil är ett handtag till tidsnamnrymden för
processen.
- /proc/pid/ns/time_for_children (från Linux 5.6)
- Denna fil är ett handtag till tidsnamnrymden för
barnprocesser som skapas av denna process. Detta kan ändras som ett
resultat av anrop av unshare(2) och setns(2) (se
time_namespaces(7)), så filen kan skilja från
/proc/pid/ns/time.
- /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).
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:
- max_cgroup_namespaces
- Värdet i denna fil definierar en gräns per användare
på antalet cgroup-namnrymder som kan skapas i
användarnamnrymden.
- max_ipc_namespaces
- Värdet i denna fil definierar en gräns per användare
på antalet ipc-namnrymder som kan skapas i
användarnamnrymden.
- max_mnt_namespaces
- Värdet i denna fil definierar en gräns per användare
på antalet monteringsnamnrymder som kan skapas i
användarnamnrymden.
- max_net_namespaces
- Värdet i denna fil definierar en gräns per användare
på antalet nätverksnamnrymder som kan skapas i
användarnamnrymden.
- max_pid_namespaces
- Värdet i denna fil definierar en gräns per användare
på antalet PID-namnrymder som kan skapas i
användarnamnrymden.
- max_time_namespaces
(från Linux 5.7)
- Värdet i denna fil definierar en gräns per användare
på antalet tidsnamnrymder som kan skapas i
användarnamnrymden.
- max_user_namespaces
- Värdet i denna fil definierar en gräns per användare
på antalet användarnamnrymder som kan skapas i
användarnamnrymden.
- max_uts_namespaces
- Värdet i denna fil definierar en gräns per användare
på antalet uts-namnrymder 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.
I avsaknad av några andra faktorer rivs en namnrymd
automatiskt ner när den sista processen i namnrymden avslutar eller
lämnar namnrymden. Dock finns det ett antal andra faktorer som kan
fästa en namnrymd så att den finns kvar även om den
inte har några medlemsprocesser. Dessa faktorer inkluderar de
följande:
- •
- En öppen filbeskrivare eller bindmontering finns för den
motsvarande filen /proc/pid/ns/*.
- •
- Namnrymden är hierarkisk (d.v.s., en PID- eller
användarnamnrymd) och har en barnnamnrymd.
- •
- Det är en användarnamnrymd som äger en eller flera
icke-användar-namnrymder.
- •
- Det är en PID-namnrymd, och det finns en process som refererar till
namnrymden via en symbolisk länk
/proc/pid/ns/pid_for_children.
- •
- Det är en tidsnamnrymd, och det finns en process som refererar till
namnrymden via en symbolisk länk
/proc/pid/ns/time_for_children.
- •
- Det är en IPC-namnrymd, och en motsvarande montering av ett
mqueue-filsystem (se mq_overview(7)) refererar till denna
namnrymd.
- •
- Det är en PID-namnrymd, och en motsvarande montering av ett
proc(5)-filsystem refererar till denna namnrymd.
Se clone(2) och user_namespaces(7).
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)
Ö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.