Linux-nimiavaruudet

Linux-nimiavaruudet (engl. Linux namespaces, user namespaces) on Linux-ytimen ominaisuus, jolla voidaan jakaa samalla tietokoneella olevat resurssit toisilleen näkymättömiin alueisiin eli nimiavaruuksiin.[1] Globaalit järjestelmän resurssit voidaan abstraktoida siten, että prosesseille näkyy omat erilliset instanssit globaaleista resursseista.[2] Samaan nimiavaruuteen kuuluvat prosessit näkevät resurssit samoin kun taas eri nimiavaruuteen kuuluvat eivät.[2]

Menetelmä vastaa periaatteeltaan Unixin chroot-komennon laajentamista muihin käyttöjärjestelmän hallinnoimiin resursseihin niiden eriyttämiseen.[1] Ominaisuutta käytetään säiliöinnissä jotta eri nimiavaruuksiin sijoitetut sovellukset eivät vaikuta toistensa toimintaan.[1]

Esimerkiksi mitä vain hakemistoa voidaan käyttää juurihakemistona varsinaisen juuren sijaan muuttamatta itse ohjelman toimintaa.[1] Samalla periaatteella prosessit voidaan jakaa osiin, jolloin yhteen osioon kuuluva ei näe eikä voi muokata muiden osioiden prosesseja: kahdessa eri prosessiavaruudessa voi olla samanaikaisesti eri prosessi samalla tunnistenumerolla.[1] Myös muun muassa verkkoliitännät ja muun tyyppiset resurssit voidaan osioida.[1][2][3] Eräät ohjelmat eivät salli useampaa instanssia ohjelmasta, esimerkiksi tiettyä verkkoporttia voi normaalisti kuunnella vain yksi ohjelma kerrallaan.[4] Jakamalla verkkoyhteydet eri nimiavaruuksiin voi eri nimiavaruuksissa olla kaikki portit käytettävissä ja siten ajaa useampaa instanssia ohjelmasta.[4]

Ominaisuuden ensimmäinen toteutus koski mount-nimiavaruutta, joka otettiin mukaan ytimen versiossa 2.4.19 vuonna 2002.[5] Nimiavaruudella eriyttäminen ei tarvitse hypervisor-virtualisointia.[5] Virtualisoinnissa laitteistoa emuloidaan ja sen päällä ajetaan toista käyttöjärjestelmäydintä.[1] Nimiavaruuksien avulla säiliöinnissä ei käytetä laitteistoemulaatiota eikä toista ydintä.[1]

Ominaisuutta on myöhemmin laajennettu käyttäjien nimiavaruuksiin ytimen versiossa 3.8.[6][7]

Omiin nimiavaruuksien osioitavia tyyppejä ovat:[8][9][2]

Tyyppi Selite
mount levyjen, osioiden ja taltioiden liitokset
UTS verkkonimet (koneen nimi, domain-nimi)
IPC prosessien välinen kommunikaatio
Network verkkolaitteet, pinot, portit
PID prosessitunnukset
User käyttäjä- ja ryhmätunnukset
Cgroups Cgroups
time kellonajat[10][11]

Myös kellonaikojen hallintaan on kehitetty tukea säiliöiden siirtämiseen eri fyysisten tietokoneiden välillä.[12]

Menetelmään on saatu vaikutteita Plan 9 -käyttöjärjestelmän vastaavasta ratkaisusta.[5] Solaris-käyttöjärjestelmässä on vastaava toiminnallisuus nimeltä Zones.[13]

Esimerkki

muokkaa

seuraava komento root-oikeuksin käynnistää komentotulkin, joka ei näe muita prosesseja:

  unshare --fork --pid --mount-proc /bin/bash

Lähteet

muokkaa
  1. a b c d e f g h Mahmud Ridwan: Separation Anxiety: A Tutorial for Isolating Your System with Linux Namespaces toptal.com. Viitattu 25.11.2017.
  2. a b c d NAMESPACES(7) man7.org. Viitattu 14.2.2022. (englanniksi)
  3. Seth Kenlon: Demystifying namespaces and containers in Linux opensource.com. 29.10.2019. Viitattu 14.2.2022. (englanniksi)
  4. a b Steve Ovens: The 7 most used Linux namespaces redhat.com. 11.1.2021. Viitattu 14.2.2022. (englanniksi)
  5. a b c Rami Rosen: Resource management: Linux kernel Namespaces and cgroups (PDF) haifux.org. toukokuu 2013. Viitattu 25.11.2017.
  6. Kerrisk, Michael: Namespaces in operation, part 5: User namespaces 27.2.2013. LWN.net. Viitattu 25.11.2017.
  7. Kerrisk, Michael: Namespaces in operation, part 1: namespaces overview 4.1.2013. LWN.net. Viitattu 25.11.2017.
  8. Baker, Pam: Understanding and Securing Linux Namespaces 18.10.2016. Linux.com. Viitattu 25.11.2017.
  9. Ubuntu Manpage: Namespaces - overview manpages.ubuntu.com. Arkistoitu 1.12.2017. Viitattu 25.11.2017.
  10. It's Finally Time: The Time Namespace Support Has Been Added To The Linux 5.6 Kernel phoronix.com. 29.1.2020. Viitattu 2.8.2020. (englanniksi)
  11. The Time Namespace Appears To Finally Be On-Deck For The Mainline Linux Kernel phoronix.com. 14.1.2020. Viitattu 2.8.2020. (englanniksi)
  12. Jonathan Corbet: Time namespaces lwn.net. 21.9.2018. Viitattu 25.2.2020. (englanniksi) 
  13. Oracle Solaris Zones docs.oracle.com. Viitattu 7.6.2024. (englanniksi)