Cilat janë hapësirat e emrave Linux dhe për çfarë përdoren?


Hapësirat e emrave të Linux janë teknologjia themelore pas teknologjive të kontejnerëve si Docker. Ato janë një veçori e kernelit Linux që lejon sistemin të kufizojë burimet që shohin proceset e kontejnerizuara dhe që siguron që asnjëri prej tyre nuk mund të ndërhyjë me një tjetër.

Çfarë janë hapësirat e emrave?

Kur po ekzekutoni shumë procese dhe aplikacione të ndryshme në një server të vetëm, siç është rasti me mjetet e vendosjes si Kubernetes, është e rëndësishme që secili proces të jetë i izoluar, kryesisht për siguri.

Një kontejner nuk duhet të jetë në gjendje të fitojë kontrollin mbi burimet e një tjetri, sepse nëse ai kontejner më pas komprometohet, mund të komprometojë të gjithë sistemin. Kjo metodë e sulmit është e ngjashme me mënyrën se si funksionon Meltdown i gabimeve të CPU; fijet e ndryshme të një procesori duhet të izolohen nga njëra-tjetra. Në mënyrë të ngjashme, proceset që ekzekutohen në sisteme të ndryshme virtuale (kontejnerë) duhet të izolohen nga kontejnerët e tjerë.

Hapësirat e emrave e arrijnë këtë izolim në një nivel kernel. Ngjashëm me mënyrën se si funksionon aplikacioni chroot, i cili fut një proces në një direktori të ndryshme rrënjësore, hapësirat e emrave ndajnë aspekte të tjera të sistemit. Ekzistojnë shtatë hapësira emrash në dispozicion:

  • Mount ose mnt. Shumë e ngjashme me chroot, hapësira e emrave Mount praktikisht ndan sistemin e skedarëve. Proceset që ekzekutohen në hapësira emrash të veçanta të montimit nuk mund të kenë qasje në skedarë jashtë pikës së tyre të montimit. Për shkak se kjo bëhet në një nivel kerneli, është shumë më e sigurt se ndryshimi i direktoriumit rrënjë me chroot.
  • Proces ose pid. Në Linux, proceset e para shfaqen si fëmijë të PID 1, i cili formon rrënjën e pemës së procesit. Hapësira e emrave të procesit ndërpret një degë të pemës PID dhe nuk lejon hyrjen më lart në degë. Proceset në hapësirat e emrave të fëmijëve do të kenë në fakt PID të shumta—i pari që përfaqëson PID-në globale të përdorur nga sistemi kryesor dhe i dyti PID që përfaqëson PID brenda pemës së procesit të fëmijës, i cili do të rifillojë nga 1.
  • Komunikimi ndërprocesor ose ipc. Kjo hapësirë emri kontrollon nëse proceset mund të bisedojnë drejtpërdrejt me njëri-tjetrin.
  • Rrjeti ose net. Kjo hapësirë emrash menaxhon se cilat pajisje rrjeti mund të shikojë një proces. Megjithatë, kjo nuk konfiguron automatikisht asgjë për ju - do t'ju duhet ende të krijoni pajisje të rrjetit virtual dhe të menaxhoni lidhjen midis ndërfaqeve të rrjetit global dhe ndërfaqeve të rrjetit të fëmijëve. Softueri i kontejnerizimit si Docker tashmë e ka kuptuar këtë dhe mund të menaxhojë rrjetin për ju.
  • Përdorues. Kjo hapësirë e emrave lejon që procesi të ketë rrënjë virtuale brenda hapësirës së tyre të emrave, pa pasur qasje aktuale rrënjësore në sistemin prind. Ai gjithashtu ndan informacionin UID dhe GID, kështu që hapësirat e emrave të fëmijëve mund të kenë konfigurimet e tyre të përdoruesit.
  • UTS. Kjo hapësirë e emrave kontrollon informacionin e emrit të hostit dhe të domenit dhe i lejon proceset të mendojnë se po ekzekutohen në serverë me emra të ndryshëm.
  • Cgroup është një veçori tjetër e kernelit shumë e ngjashme me hapësirat e emrave. Grupet C lejojnë sistemin të përcaktojë kufijtë e burimeve (CPU, memorie, hapësirë në disk, trafik në rrjet, etj.) për një grup procesesh. Ky është një veçori e dobishme për aplikacionet me kontejnerë, por nuk bën asnjë lloj izolimi informacioni siç do të bënin hapësirat e emrave. cgroup emraspace është një gjë e veçantë dhe kontrollon vetëm se cilat cgrupe mund të shikojë një proces dhe nuk e cakton atë në një cgrup specifik.

Si parazgjedhje, çdo proces që ekzekutoni përdor hapësirat globale të emrave dhe shumica e proceseve në sistemin tuaj bëjnë po ashtu, përveç nëse specifikohet ndryshe.

Puna me hapësirat e emrave

Ju mund të përdorni komandën lsns (ls-namespaces) për të parë hapësirat aktuale të emrave që sistemi juaj ka aktive. Kjo komandë duhet të ekzekutohet si rrënjë, përndryshe lista mund të jetë e paplotë.

Më sipër është dalja lsns nga një instalim i ri i Ubuntu. Çdo hapësirë emri renditet së bashku me ID-në e procesit, përdoruesin dhe komandën që e krijoi atë. Shtatë hapësirat e emrave të krijuara nga /sbin/init me PID 1 janë shtatë hapësirat globale të emrave. Të vetmet hapësira të tjera emrash janë hapësirat mnt për demonët e sistemit, së bashku me shërbimin Livepatch të Canonical.

Nëse do të punonit me kontejnerë, kjo listë do të ishte shumë më e gjatë. Mund ta nxirrni këtë listë në formatin JSON me flamurin -J, të cilin mund ta përdorni shumë më lehtë me një gjuhë skriptimi.

Mund ta ndryshosh hapësirën aktuale të emrave me mjetin nsenter . Kjo komandë ju lejon të hyni në hapësirën e emrave të një procesi tjetër, zakonisht për qëllime korrigjimi. Në fakt mund të ekzekutojë çdo komandë në atë hapësirë emri, por si parazgjedhje thjesht përpiqet të ngarkojë një guaskë (/bin/bash zakonisht).

Ju specifikoni një ID të procesit, pastaj çdo hapësirë emri që dëshironi të futni:

sudo nsenter -t PID --mount --net --pid  //etc.

Për shembull, përpjekja për të futur hapësirën e emrave të montimit për kdevtmpfs do t'ju ngarkojë në atë hapësirë emri, por më pas dështon sepse nuk mund të gjejë /bin/bash, që në fakt do të thotë funksionoi, sepse direktoria e dukshme rrënjë u ndryshua.

Nëse mnt hapësira e emrave të fëmijës tuaj përfshin /bin/bash, mund ta futni atë dhe të ngarkoni një guaskë. Kjo mund të bëhet me dorë, por duhet të bëhet përmes montimeve të lidhjeve, të cilat mund të manipulojnë pemën e drejtorive dhe skedarët e lidhjes nëpër hapësirat e emrave mnt. Kjo mund të çojë në disa raste përdorimi interesant, si p.sh. bërja e dy proceseve që lexojnë përmbajtje të ndryshme nga i njëjti skedar.

Për të krijuar hapësira të reja emrash, duhet të shkëputeni nga një ekzistuese (zakonisht globale) dhe të specifikoni se cilat hapësira emrash dëshironi të ndryshoni. Kjo bëhet me komandën unshare , e cila ekzekuton një komandë me një hapësirë të re emri të pandarë nga masteri.

Për të hequr ndarjen e hapësirës së emrave të hostit, përdorni:

sudo unshare -u command

Nëse komanda lihet bosh, unshare drejton bash si parazgjedhje. Kjo krijon një hapësirë të re emri që do të shfaqet në daljen e lsns:

Multiplekseri terminal ekrani përdoret këtu për të mbajtur bash të funksionojë në sfond, përndryshe hapësira e emrave do të zhduket kur procesi të mbyllet.

Nëse nuk jeni duke bërë programim të nivelit shumë të ulët, ndoshta nuk do t'ju duhet të prekni vetë hapësirat e emrave. Programet e kontejnerizimit si Docker do të menaxhojnë detajet për ju dhe në shumicën e rasteve kur keni nevojë për izolim të procesit, thjesht duhet të përdorni një mjet ekzistues. Sidoqoftë, është e rëndësishme të kuptoni se si funksionojnë hapësirat e emrave në kontekstin e kontejnerizimit, veçanërisht nëse jeni duke bërë ndonjë konfigurim të nivelit të ulët të kontejnerëve tuaj Docker ose duhet të bëni ndonjë korrigjim manual.