Linux-namnområden
Originalfö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 |
Namnutrymmen ä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 hänvisar till distinkta resurser. Resurser kan finnas i flera utrymmen. Exempel på sådana resurser är process-ID, värdnamn, användar-ID, filnamn, några namn som är associerade med nätverksåtkomst och kommunikation mellan processer .
Namnutrymmen är en grundläggande aspekt av behållare i Linux.
Termen "namnutrymme" används ofta för en typ av namnutrymme (t.ex. process-ID) såväl som för ett särskilt 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 även sammanfoga olika namnområden.
Historia
Linux-namnrymder inspirerades av den bredare namnrymdsfunktionalitet som användes flitigt i Plan 9 från Bell Labs .
Linux Namespaces har sitt ursprung 2002 i 2.4.19 kärnan med arbete på mount namespace. Ytterligare namnområden lades till med början 2006 och fortsätter in i framtiden.
Adekvata behållarstödsfunktioner färdigställdes i kärnversion 3.8 med introduktionen av användarnamnrymder.
Namnutrymmestyper
Sedan kärnversion 5.6 finns det 8 typer av namnrymder. Namnutrymmesfunktionaliteten är densamma för alla typer: varje process är associerad med ett namnområde och kan bara se eller använda resurserna som är associerade med det namnområdet, och underordnade namnområden dä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 namnutrymme som har skapats för en given processgrupp.
Montering (mnt)
Montera namnområden kontrollera monteringspunkter . Vid skapande kopieras monteringarna från det aktuella monteringsnamnområdet till det nya namnutrymmet, men monteringspunkter som skapas efteråt sprids inte mellan namnområden (med delade underträd är det möjligt att sprida monteringspunkter mellan namnområden).
Klonflaggan som används för att skapa ett nytt namnområde av denna typ är CLONE_NEWNS - en förkortning för "NEW NameSpace". Den här termen är inte beskrivande (den berättar inte vilken typ av namnrymd som ska skapas) eftersom mount namnutrymmen var den första typen av namnrymd och designers inte förutsåg att det skulle finnas några andra.
Process-ID (pid)
PID - namnutrymmet förser processer med en oberoende uppsättning process-ID:n (PID) från andra namnutrymmen. PID-namnrymder är kapslade, vilket innebär att när en ny process skapas kommer den att ha en PID för varje namnrymd från dess nuvarande namnutrymme upp till det initiala PID-namnutrymmet. Därför kan det initiala PID-namnutrymmet se alla processer, om än med andra PID än andra namnutrymmen kommer att se processer med.
Den första processen som skapas i ett PID-namnområde 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 avkomlingar.
Nätverk (nät)
Nätverksnamnområden virtualiserar nätverksstacken . När ett nätverksnamnområde skapas innehåller det endast ett loopback- gränssnitt.
Varje nätverksgränssnitt (fysiskt eller virtuellt) finns i exakt ett namnområde och kan flyttas mellan namnområden.
Varje namnområde kommer att ha en privat uppsättning IP-adresser , sin egen routingtabell , socketlistning , anslutningsspårningstabell, brandvägg och andra nätverksrelaterade resurser.
Att förstöra ett nätverksnamnområde förstör alla virtuella gränssnitt inom det och flyttar alla fysiska gränssnitt inom det tillbaka till det ursprungliga nätverkets namnutrymme.
Kommunikation mellan processer (ipc)
IPC-namnområden isolerar processer från SysV- liknande kommunikation mellan processer. Detta förhindrar processer i olika IPC-namnutrymmen från att använda till exempel SHM-funktionsfamiljen för att etablera 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-namnrymder (UNIX Time-Sharing ) gör att ett enda system kan se ut att 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-namnområdet från motsvarande värden i anroparens UTS-namnområde."
Användar-ID (användare)
Användarnamnrymder är en funktion för att ge både behörighetsisolering och användaridentifikationssegregering över flera uppsättningar av processer tillgängliga sedan kärnan 3.8. Med administrativ hjälp är det möjligt att bygga en container med skenbara administrativa rättigheter utan att faktiskt ge förhöjda privilegier till användarprocesser. Liksom PID-namnutrymmet är användarnamnutrymmen kapslade och varje nytt användarnamnområde anses vara ett underordnat användarnamnutrymme som skapade det.
Ett användarnamnområde innehåller en mappningstabell som konverterar användar-ID:n från containerns synvinkel till systemets synvinkel. Detta tillåter till exempel rotanvändaren har användar-id 0 i behållaren men behandlas faktiskt som användar-id 1 400 000 av systemet för ägarkontroller. En liknande tabell används för grupp-id-mappningar och ägarkontroller.
För att underlätta privilegieisolering av administrativa åtgärder anses varje namnområdestyp ägas av ett användarnamnområde baserat på det aktiva användarnamnområdet vid skapandet. En användare med administratörsbehörighet i lämpligt användarnamnutrymme kommer att tillåtas utföra administrativa åtgärder inom den andra namnområdestypen. Till exempel, om en process har administrativ behörighet att ändra IP-adressen för ett nätverksgränssnitt, kan den göra det så länge som dess eget användarnamnutrymme är detsamma som (eller stamfader till) användarnamnområdet som äger nätverkets namnutrymme. Därför har det ursprungliga användarnamnområdet administrativ kontroll över alla namnområdestyper i systemet.
Kontrollgrupp (cgroup) Namnutrymme
Namnutrymmestypen cgroup döljer identiteten för kontrollgruppen som processen är medlem av. En process i ett sådant namnområde, som kontrollerar vilken kontrollgrupp en process är en del av, skulle se en sökväg som faktiskt är relativt kontrollgruppen som sattes in vid skapandet och döljer dess verkliga kontrollgruppsposition och identitet. Denna namnområdestyp har funnits sedan mars 2016 i Linux 4.6.
Tidsnamnutrymme
Tidsnamnutrymmet 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 namnutrymmen
syslog namnutrymme
Syslog-namnrymden föreslogs av Rui Xiang, en ingenjör på Huawei , men slogs inte ihop med Linux-kärnan. systemd implementerade en liknande funktion som kallas "journal namespace" i februari 2020.
Genomförande detaljer
Kärnan tilldelar varje process en symbolisk länk per namnområdestyp i /proc/<pid>/ns/
. Inodnumret som pekas på av denna symbollänk är detsamma för varje process i detta namnutrymme. Detta identifierar varje namnområde unikt med inodnumret som pekas på av en av dess symboliska länkar.
Att läsa symbollänken via läslänk returnerar en sträng som innehåller namnområdets typnamn och inodnumret för namnområdet.
Syscalls
Tre syscalls kan direkt manipulera namnrymder:
- clone, flaggor för att ange vilket nytt namnområde den nya processen ska migreras till.
- unshare, tillåter en process (eller tråd) att ta bort delar av dess exekveringskontext som för närvarande delas med andra processer (eller trådar)
- setns, anger namnutrymmet som anges av en filbeskrivning.
Förstörelse
Om ett namnområde inte längre hänvisas till kommer det att tas bort, hanteringen av den ingående resursen beror på namnområdets typ. Namnutrymmen kan refereras på tre sätt:
- av en process som hör till namnområdet
- av en öppen filbeskrivning till namnområdets fil (
/proc/<pid>/ns/<ns-kind>
) - en bindningsmontering av namnutrymmets fil (
/proc/<pid>/ns/<ns-kind>
)
Adoption
Olika containerprogram använder Linux-namnområden i kombination med cgroups för att isolera sina processer, inklusive Docker och LXC .
Andra applikationer, som Google Chrome, använder namnutrymmen för att isolera sina egna processer som riskerar att bli attackerade på internet.
Det finns också ett unshare-omslag i util-linux . Ett exempel på dess användning är:
SHELL = /bin/sh unshare --map-root-user --fork --pid chroot " $ { chrootdir } " " $@ "
externa länkar
- manpage för namnutrymmen
- Namnområden — Linux-kärnan-dokumentationen
- Linux-kärnan Namnutrymmen och cgroups av Rami Rosen
- Namnutrymmen och cgroups, grunden för Linux-behållare (inklusive cgroups v2) - bilder av ett föredrag av Rami Rosen, Netdev 1.1, Sevilla, Spanien (2016)
- Behållare och namnutrymmen i Linux-kärnan av Kir Kolyshkin