Namespace ya IPC (Inter-Process Communication) ni kipengele cha kernel ya Linux kinachotoa kujitengea kwa vitu vya System V IPC, kama vile foleni za ujumbe, sehemu za kumbukumbu zinazoshirikiwa, na semaphores. Kujitengea huku kunahakikisha kwamba michakato katika namespace tofauti za IPC haiwezi moja kwa moja kufikia au kubadilisha vitu vya IPC vya kila mmoja, na kutoa safu ya ziada ya usalama na faragha kati ya vikundi vya michakato.
How it works:
Wakati namespace mpya ya IPC inaundwa, inaanza na seti iliyojitenga kabisa ya vitu vya System V IPC. Hii inamaanisha kwamba michakato inayofanya kazi katika namespace mpya ya IPC haiwezi kufikia au kuingilia vitu vya IPC katika namespace nyingine au mfumo wa mwenyeji kwa default.
Vitu vya IPC vilivyoundwa ndani ya namespace vinonekana na vinapatikana tu kwa michakato ndani ya namespace hiyo. Kila kitu cha IPC kinatambulishwa kwa funguo ya kipekee ndani ya namespace yake. Ingawa funguo inaweza kuwa sawa katika namespace tofauti, vitu wenyewe vimejitengea na haviwezi kufikiwa kati ya namespace.
Michakato inaweza kuhamia kati ya namespace kwa kutumia wito wa mfumo wa setns() au kuunda namespace mpya kwa kutumia wito wa mfumo wa unshare() au clone() na bendera ya CLONE_NEWIPC. Wakati mchakato unahamia kwenye namespace mpya au kuunda moja, utaanza kutumia vitu vya IPC vinavyohusishwa na namespace hiyo.
Lab:
Create different Namespaces
CLI
sudounshare-i [--mount-proc] /bin/bash
Kwa kuunganisha mfano mpya wa mfumo wa /proc ikiwa unatumia param --mount-proc, unahakikisha kwamba namespace mpya ya kuunganisha ina mtazamo sahihi na uliojitegemea wa taarifa za mchakato zinazohusiana na namespace hiyo.
Kosa: bash: fork: Haiwezekani kugawa kumbukumbu
Wakati unshare inatekelezwa bila chaguo la -f, kosa linakutana kutokana na jinsi Linux inavyoshughulikia namespaces mpya za PID (Kitambulisho cha Mchakato). Maelezo muhimu na suluhisho yameelezwa hapa chini:
Maelezo ya Tatizo:
Kernel ya Linux inaruhusu mchakato kuunda namespaces mpya kwa kutumia wito wa mfumo wa unshare. Hata hivyo, mchakato unaoanzisha uundaji wa namespace mpya ya PID (inayojulikana kama mchakato wa "unshare") hauingii kwenye namespace mpya; ni watoto wake tu ndio wanaingia.
Kuendesha %unshare -p /bin/bash% kunaanzisha /bin/bash katika mchakato sawa na unshare. Kwa hivyo, /bin/bash na watoto wake wako katika namespace ya awali ya PID.
Mchakato wa kwanza wa mtoto wa /bin/bash katika namespace mpya unakuwa PID 1. Wakati mchakato huu unapoondoka, unachochea usafishaji wa namespace ikiwa hakuna mchakato mwingine, kwani PID 1 ina jukumu maalum la kupokea mchakato wa yatima. Kernel ya Linux itazima ugawaji wa PID katika namespace hiyo.
Matokeo:
Kuondoka kwa PID 1 katika namespace mpya kunasababisha usafishaji wa bendera ya PIDNS_HASH_ADDING. Hii inasababisha kazi ya alloc_pid kushindwa kugawa PID mpya wakati wa kuunda mchakato mpya, ikitoa kosa la "Haiwezekani kugawa kumbukumbu".
Suluhisho:
Tatizo linaweza kutatuliwa kwa kutumia chaguo la -f pamoja na unshare. Chaguo hili linafanya unshare kuunda mchakato mpya baada ya kuunda namespace mpya ya PID.
Kutekeleza %unshare -fp /bin/bash% kunahakikisha kwamba amri ya unshare yenyewe inakuwa PID 1 katika namespace mpya. /bin/bash na watoto wake sasa wanawekwa salama ndani ya namespace hii mpya, kuzuia kuondoka mapema kwa PID 1 na kuruhusu ugawaji wa PID wa kawaida.
Kwa kuhakikisha kwamba unshare inakimbia na bendera ya -f, namespace mpya ya PID inatunzwa ipasavyo, ikiruhusu /bin/bash na mchakato wake wa chini kufanya kazi bila kukutana na kosa la kugawa kumbukumbu.
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>
Ingia ndani ya IPC namespace
nsenter-iTARGET_PID--pid/bin/bash
Pia, unaweza tu kuingia katika namespace ya mchakato mwingine ikiwa wewe ni root. Na huwezi kuingia katika namespace nyingine bila deskteta inayorejelea hiyo (kama /proc/self/ns/net).
Create IPC object
# Containersudounshare-i/bin/bashipcmk-M100Sharedmemoryid:0ipcs-m------SharedMemorySegments--------keyshmidownerpermsbytesnattchstatus0x2fba90210root6441000# From the hostipcs-m# Nothing is seen