Linux namnområden - Linux namespaces
| Ursprungliga författare | Al Viro |
|---|---|
| Utvecklare | Eric W. Biederman, Pavel Emelyanov, Al Viro, Cyrill Gorcunov et al. |
| Initial release | 2002 |
| Skrivet i | C |
| Operativ system | Linux |
| Typ | Systemmjukvara |
| Licens | GPL och LGPL |
Namnområden är en funktion i Linux -kärnan som partitionerar kärnresurser så att en uppsättning processer ser en uppsättning resurser medan en annan uppsättning processer ser en annan uppsättning resurser. Funktionen fungerar genom att ha samma namnutrymme för en uppsättning resurser och processer, men dessa namnområden refererar till olika resurser. Resurser kan finnas i flera utrymmen. Exempel på sådana resurser är process -ID, värdnamn, användar -ID, filnamn och några namn som är associerade med nätverksåtkomst och kommunikation mellan processer .
Namnutrymmen är en grundläggande aspekt av behållare på Linux.
Termen "namnrymd" används ofta för en typ av namnrymd (t.ex. process -ID) såväl som för ett visst namnutrymme.
Ett Linux -system börjar med ett enda namnutrymme av varje typ, som används av alla processer. Processer kan skapa ytterligare namnområden och gå med i olika namnområden.
Historia
Linux -namnutrymmen inspirerades av den bredare namnrymdfunktionaliteten som används kraftigt i hela Plan 9 från Bell Labs .
Linux -namnrymden härstammade 2002 i 2.4.19 -kärnan med arbete med namnet på typen mount. Ytterligare namnområden tillkom från och med 2006 och fortsätter in i framtiden.
Tillräckliga behållarstödsfunktioner slutfördes i kärnversion 3.8 med introduktionen av användarnamnutrymmen.
Namnutrymme
Sedan kärnversion 5.6 finns det 8 typer av namnutrymmen. Namnutrymme -funktionaliteten är densamma för alla typer: varje process är associerad med ett namnutrymme och kan bara se eller använda de resurser som är associerade med det namnområdet och efterkommande namnområden där så är tillämpligt. På så sätt kan varje process (eller processgrupp därav) ha en unik syn på resurserna. Vilken resurs som är isolerad beror på vilken typ av namnrymd som har skapats för en given processgrupp.
Montera (mnt)
Montera namnområden styr monteringspunkter. Vid skapandet kopieras fästena från det aktuella namnutrymmet till det nya namnområdet, men monteringspunkter som skapas efteråt sprider sig inte mellan namnområden (med delade subtrees är det möjligt att sprida monteringspunkter mellan namnområden).
Klonflaggan som används för att skapa ett nytt namnutrymme av denna typ är CLONE_NEWNS - kort för "NEW NameSpace". Denna term är inte beskrivande (eftersom den inte berättar vilken typ av namnutrymme som ska skapas) eftersom namnområden för montering var den första typen av namnrymd och designers inte förutsåg att det skulle finnas några andra.
Process -ID (pid)
Den PID namespace tillhandahåller förfaranden med en oberoende uppsättning process-ID (PID) från andra namnutrymmen. PID -namnutrymmen är kapslade, vilket betyder att när en ny process skapas kommer den att ha ett PID för varje namnområde från det nuvarande namnområdet till det första PID -namnområdet. Därför kan det ursprungliga PID -namnutrymmet se alla processer, om än med andra PID -värden än andra namnområden kommer att se processer med.
Den första processen som skapas i ett PID -namnutrymme tilldelas process -id -nummer 1 och får det mesta av samma specialbehandling som den normala init -processen, framför allt att föräldralösa processer inom namnområdet är kopplade till den. Detta innebär också att avslutningen av denna PID 1 -process omedelbart kommer att avsluta alla processer i dess PID -namnområde och eventuella ättlingar.
Nätverk (netto)
Nätverksnamnutrymmen virtualiserar nätverksstacken . Vid skapandet av ett nätverksnamnutrymme innehåller endast ett loopback -gränssnitt.
Varje nätverksgränssnitt (fysiskt eller virtuellt) finns i exakt 1 namnområde och kan flyttas mellan namnområden.
Varje namnrymd kommer att ha en privat uppsättning IP-adresser , sin egen routingtabellen , socket notering, anslutning spårning bord, brandväggar och andra nätverksresurser relaterad.
Att förstöra ett nätverks namnområde förstör alla virtuella gränssnitt i det och flyttar alla fysiska gränssnitt inom det tillbaka till det ursprungliga nätverksnamnutrymmet.
Interprocess Communication (ipc)
IPC-namnutrymmen isolerar processer från kommunikation mellan processer i SysV- stil. Detta hindrar processer i olika IPC -namnområden från att till exempel använda SHM -funktionsfamiljen för att upprätta en rad delat minne mellan de två processerna. Istället kommer varje process att kunna använda samma identifierare för en delad minnesregion och producera två sådana distinkta regioner.
UTS
UTS (UNIX Time-Sharing ) namnutrymmen tillåter att ett enda system verkar ha olika värd- och domännamn för olika processer. "När en process skapar ett nytt UTS -namnområde ... kopieras värdnamnet och domänen för det nya UTS -namnutrymmet från motsvarande värden i den som ringer UTS -namnområde."
Användar -ID (användare)
Användarnamnutrymmen är en funktion som ger både isolering av privilegier och segregering av användaridentifiering i flera uppsättningar processer som är tillgängliga sedan kärnan 3.8. Med administrativt bistånd är det möjligt att bygga en behållare med till synes administrativa rättigheter utan att faktiskt ge förhöjda privilegier till användarprocesser. Precis som PID -namnutrymmet är användarnamnområden kapslade och varje nytt användarnamnsutrymme anses vara ett underordnat till användarnamnutrymmet som skapade det.
Ett användarnamnutrymme innehåller en mappningstabell som konverterar användar -ID från behållarens synvinkel till systemets synvinkel. Detta tillåter till exempel rotanvändaren att ha användar -ID 0 i behållaren men behandlas faktiskt som användar -ID 1 400 000 av systemet för ägandekontroller. En liknande tabell används för grupp -id -mappningar och ägandekontroller.
För att underlätta privilegieisolering av administrativa åtgärder anses varje namnutrymmetyp ägs av ett användarnamnutrymme baserat på det aktiva användarnamnutrymmet vid skapandet. En användare med administratörsbehörighet i lämpligt användarnamnutrymme får utföra administrativa åtgärder inom den andra namnutrymmet. Om en process till exempel har administrativ behörighet att ändra IP -adressen för ett nätverksgränssnitt kan den göra det så länge det egna användarnamnutrymmet är detsamma som (eller förfader till) användarnamnutrymmet som äger nätverksnamnutrymmet. Därför har det ursprungliga användarnamnutrymmet administrativ kontroll över alla namnutrymmetyper i systemet.
Kontrollgrupp (cgroup) namnområde
Den cgroup typen namnområde döljer identiteten hos kontrollgruppen av vilken process som är en medlem. En process i ett sådant namnutrymme, som kontrollerar vilken kontrollgrupp någon process är en del av, skulle se en sökväg som faktiskt är relativ till kontrollgruppen som skapades vid skapandetiden, döljer dess sanna kontrollgruppsposition och identitet. Denna typ av namnutrymme har funnits sedan mars 2016 i Linux 4.6.
Tidsnamn
Tidsnamnsutrymmet tillåter processer att se olika systemtider på ett sätt som liknar UTS -namnutrymmet. Det föreslogs 2018 och landade på Linux 5.6, som släpptes i mars 2020.
Föreslagna namnområden
syslog namnområde
Implementeringsdetaljer
Kärnan tilldelar varje process en symbolisk länk per namnrymd /proc/<pid>/ns/. Inodtalet som denna symlänk pekar på är samma för varje process i detta namnområde. Detta identifierar varje namnutrymme unikt med det inodtal som en av dess symlänkar pekar på.
Genom att läsa symlänken via läslänken returneras en sträng som innehåller namnutrymmet och namnets inodnummer.
Syscalls
Tre syscalls kan direkt manipulera namnområden:
- klon, flaggar för att ange vilket nytt namnområde den nya processen ska migreras till.
- unshare, tillåter en process (eller tråd) att koppla bort delar av dess exekveringskontext som för närvarande delas med andra processer (eller trådar)
- setns, anger det namnområde som anges av en filbeskrivare.
Förstörelse
Om det inte längre refereras till ett namnutrymme kommer det att raderas, hanteringen av den innehållna resursen beror på namnutrymmet. Namnområden kan refereras på tre sätt:
- genom en process som tillhör namnområdet
- av en öppen filskriptor till namnrymdets fil (
/proc/<pid>/ns/<ns-kind>) - en bindningsfäste för namnrymdens fil (
/proc/<pid>/ns/<ns-kind>)
Adoption
Olika behållarprogram använder Linux -namnutrymmen i kombination med c -grupper för att isolera sina processer, inklusive Docker och LXC .
Andra applikationer, till exempel Google Chrome, använder namnutrymmen för att isolera sina egna processer som riskerar att attackeras på internet.
Det finns också en unshare-omslag i util-linux . Ett exempel på dess användning är:
SHELL=/bin/sh unshare --map-root-user --fork --pid chroot "${chrootdir}" "$@"
Referenser
externa länkar
- namnområden manpage
- Namespaces - Linux Kernel -dokumentationen
- Linux -kärnan Namnutrymmen och cgroups av Rami Rosen
- Namnområden och cgroups, grunden för Linux -behållare (inklusive cgroups v2) - bilder av ett tal av Rami Rosen, Netdev 1.1, Sevilla, Spanien (2016)
- Behållare och namnutrymmen i Linux -kärnan av Kir Kolyshkin
- https://medium.com/@teddyking/linux-namespaces-850489d3ccf
- https://medium.com/@teddyking/namespaces-in-go-basics-e3f0fc1ff69a
- https://medium.com/@teddyking/namespaces-in-go-user-a54ef9476f2a
- https://medium.com/@teddyking/namespaces-in-go-reexec-3d1295b91af8
- https://medium.com/@teddyking/namespaces-in-go-mount-e4c04fe9fb29
- https://medium.com/@teddyking/namespaces-in-go-network-fdcf63e76100
- https://medium.com/@teddyking/namespaces-in-go-uts-d47aebcdf00e