'n IPC (Inter-Process Communication) naamruimte is 'n Linux-kernkenmerk wat isolasie van System V IPC-objekte bied, soos boodskap rye, gedeelde geheue segmente, en semafore. Hierdie isolasie verseker dat prosesse in verskillende IPC naamruimtes nie direk toegang kan verkry tot of mekaar se IPC-objekte kan verander nie, wat 'n addisionele laag van sekuriteit en privaatheid tussen prosesgroepe bied.
Hoe dit werk:
Wanneer 'n nuwe IPC naamruimte geskep word, begin dit met 'n heeltemal geïsoleerde stel van System V IPC-objekte. Dit beteken dat prosesse wat in die nuwe IPC naamruimte loop nie toegang kan verkry tot of inmeng met die IPC-objekte in ander naamruimtes of die gasheerstelsel nie, per standaard.
IPC-objekte wat binne 'n naamruimte geskep word, is sigbaar en slegs toeganklik vir prosesse binne daardie naamruimte. Elke IPC-objek word geïdentifiseer deur 'n unieke sleutel binne sy naamruimte. Alhoewel die sleutel identies kan wees in verskillende naamruimtes, is die objekte self geïsoleer en kan nie oor naamruimtes toeganklik wees nie.
Prosesse kan tussen naamruimtes beweeg deur die setns() stelselskakel of nuwe naamruimtes skep deur die unshare() of clone() stelselskakels met die CLONE_NEWIPC vlag. Wanneer 'n proses na 'n nuwe naamruimte beweeg of een skep, sal dit begin om die IPC-objekte wat met daardie naamruimte geassosieer is, te gebruik.
Laboratorium:
Skep verskillende Naamruimtes
CLI
sudounshare-i [--mount-proc] /bin/bash
Deur 'n nuwe instansie van die /proc lêerstelsel te monteer as jy die parameter --mount-proc gebruik, verseker jy dat die nuwe monteernaamruimte 'n akkurate en geïsoleerde weergawe van die prosesinligting spesifiek vir daardie naamruimte het.
Fout: bash: fork: Kan nie geheue toewys nie
Wanneer unshare sonder die -f opsie uitgevoer word, word 'n fout ondervind weens die manier waarop Linux nuwe PID (Proses ID) naamruimtes hanteer. Die sleutelbesonderhede en die oplossing word hieronder uiteengesit:
Probleemverklaring:
Die Linux-kern laat 'n proses toe om nuwe naamruimtes te skep met die unshare stelselaanroep. Die proses wat die skepping van 'n nuwe PID naamruimte inisieer (genoem die "unshare" proses) betree egter nie die nuwe naamruimte nie; slegs sy kindproses doen.
Om %unshare -p /bin/bash% te loop, begin /bin/bash in dieselfde proses as unshare. Gevolglik is /bin/bash en sy kindproses in die oorspronklike PID naamruimte.
Die eerste kindproses van /bin/bash in die nuwe naamruimte word PID 1. Wanneer hierdie proses verlaat, aktiveer dit die opruiming van die naamruimte as daar geen ander prosesse is nie, aangesien PID 1 die spesiale rol het om weeskindprosesse aan te neem. Die Linux-kern sal dan PID-toewysing in daardie naamruimte deaktiveer.
Gevolg:
Die uitgang van PID 1 in 'n nuwe naamruimte lei tot die opruiming van die PIDNS_HASH_ADDING vlag. Dit lei tot die alloc_pid funksie wat misluk om 'n nuwe PID toe te wys wanneer 'n nuwe proses geskep word, wat die "Kan nie geheue toewys nie" fout veroorsaak.
Oplossing:
Die probleem kan opgelos word deur die -f opsie saam met unshare te gebruik. Hierdie opsie maak dat unshare 'n nuwe proses fork nadat die nuwe PID naamruimte geskep is.
Om %unshare -fp /bin/bash% uit te voer, verseker dat die unshare opdrag self PID 1 in die nuwe naamruimte word. /bin/bash en sy kindproses is dan veilig binne hierdie nuwe naamruimte, wat die voortydige uitgang van PID 1 voorkom en normale PID-toewysing toelaat.
Deur te verseker dat unshare met die -f vlag loop, word die nuwe PID naamruimte korrek gehandhaaf, wat toelaat dat /bin/bash en sy sub-prosesse kan werk sonder om die geheue toewysing fout te ondervind.
sudofind/proc-maxdepth3-typel-nameipc-execreadlink{} \; 2>/dev/null|sort-u# Find the processes with an specific namespacesudofind/proc-maxdepth3-typel-nameipc-execls-l{} \; 2>/dev/null|grep<ns-number>
Gaan binne 'n IPC-namespace in
nsenter-iTARGET_PID--pid/bin/bash
Ook, jy kan slegs in 'n ander prosesnaamruimte ingaan as jy root is. En jy kan nieingaan in 'n ander naamruimte sonder 'n beskrywer wat daarna verwys nie (soos /proc/self/ns/net).
Skep IPC objek
# Containersudounshare-i/bin/bashipcmk-M100Sharedmemoryid:0ipcs-m------SharedMemorySegments--------keyshmidownerpermsbytesnattchstatus0x2fba90210root6441000# From the hostipcs-m# Nothing is seen