4.2.41 · D2 · HinglishOperating Systems

Visual walkthroughContainers — namespaces, cgroups, difference from VMs

2,814 words13 min read↑ Read in English

4.2.41 · D2 · Coding › Operating Systems › Containers — namespaces, cgroups, difference from VMs

Hum is order mein build karte hain:

  1. shared kernel par ek process,
  2. use ek private view dete hain (namespaces),
  3. use ek private root filesystem dete hain,
  4. jo kuch woh use kar sakta hai usse cap karte hain (cgroups) CPU-fraction formula ke saath,
  5. degenerate cases cover karte hain (koi namespace nahi, root-inside),
  6. poori cheez ko VM se contrast karte hain,
  7. ise ek picture mein compress karte hain.

Step 1 — Shuru karo EK bare process se, EK kernel par

Figure — Containers — namespaces, cgroups, difference from VMs

KYA HAI. Har Linux machine ke neeche kernel baith a hai: code ka woh ek piece jo real hardware (CPU, RAM, disk, network card) ka maalik hai. Baaki sab process hai — ek running program — aur har process kernel se cheezein syscalls ke through maangti hai (dekho Linux Kernel — syscalls).

YAHAN SE KYU SHURU KAREIN. Ek container koi nayi tarah ki object nahi hai. Yeh bilkul yahi process hogi kuch extra settings ke saath. Toh kuch bhi isolate karne se pehle, dekho ek plain process kya dekh sakti hai: woh har doosri process ke saath global tables share karti hai — PIDs ki ek list, ek hostname, ek network stack, ek filesystem mount table.

PICTURE. Figure mein blue box kernel hai; yellow circle hamaari process hai. Dashed lines dikhati hain ki woh kernel ki global tables mein pahunch rahi hai (daayein taraf bani hain). Abhi kuch bhi private nahi — hamaari process poori building dekh sakti hai. Haara poora kaam hai un dashed lines ko kaatna aur usse private copies dena.


Step 2 — EK dashed line kaato: pehla namespace

Figure — Containers — namespaces, cgroups, difference from VMs

KYA HAI. Hum kernel se request karte hain: "Mere naye child ko process-ID table ki apni private copy do." Tool hai clone syscall, ek flag bit ke saath jiska naam hai CLONE_NEWPID.

YEH TOOL KYU AUR DOOSRA NAHI. Hum permissions se doosri processes chhupane ki koshish kar sakte the, lekin woh phir bhi usi numbering mein rehti — hamaari process host ka PID 1, PID 2, … dekh leti. Iska ek hi saaf tarika hai — fresh table: ek namespace. Namespace literally hai "ek global table ki doosri, alag copy." Woh ek line kaatna aur ek blank table dena exactly wahi hai jo CLONE_NEWPID karta hai.

PICTURE. Figure mein wahi process hai, lekin ab PID wali dashed line kati hui hai (red X) aur ek nayi, khaali PID table ki taraf redirect ho gayi hai. Us fresh table mein hamaari process renumber ho jaati hai — woh PID 1 ban jaati hai, kyunki ek brand-new list 1 se count karna shuru karti hai.

  • clone — woh syscall jo nayi process banata hai.
  • CLONE_NEWPID — ek flag bit; ise set karna matlab "child ko apna PID namespace milega."
  • | (OR) — flags combine karne ka tarika; har bit ek table ko private banata hai, toh zyada bits OR karo → zyada tables private.

Step 3 — SAARI lines kaato: namespaces ka full set

Figure — Containers — namespaces, cgroups, difference from VMs

KYA HAI. Step 2 ko har us global table ke liye repeat karo jo kernel expose karta hai. Har ek ka apna flag hai.

KYU. Upar wale rule se, isolation ek conjunction hai: tum tabhi "akele" ho jab har shared cheez private ho. Ek chhoot gayi toh ek hole hai — jaise private PIDs lekin shared network stack matlab tum abhi bhi host ke IP addresses dekh sakte ho.

PICTURE. Saat dashed lines, saat red cuts, saat private tables:

Flag Private copy of Toh process ki apni…
CLONE_NEWPID process-ID table PID 1, host processes invisible
CLONE_NEWNS (mnt) mount table root / — dekho Filesystems — mount and chroot
CLONE_NEWNET network stack interfaces, IPs, ports — dekho Networking — virtual interfaces and bridges
CLONE_NEWUTS hostname/domain hostname
CLONE_NEWIPC shared-memory table semaphores/shm
CLONE_NEWUSER UID/GID mapping user IDs (root inside ≠ root outside)
CLONE_NEWCGROUP cgroup hierarchy view hidden cgroup tree

Is point par process apni choti duniya dekh sakti hai. Lekin woh abhi bhi poori machine use kar sakti hai — kuch bhi roke RAM khaane se. Yeh Step 5 ka kaam hai. Pehle, "woh kya dekh sakti hai" ka woh ek piece jo apni khud ki picture maangta hai: filesystem.


Step 4 — Private root: mount namespace + chroot

Figure — Containers — namespaces, cgroups, difference from VMs

KYA HAI. Mount namespace ke andar hum process ke / ko ek aisi directory ki taraf point karte hain jisme poora ek chhota filesystem hai (ek layered image).

YEH ALAG STEP KYU. "Apna root filesystem" hi woh cheez hai jo ek container ko machine jaisi feel deti hai: uske paas Alpine ya Ubuntu ka /bin, /etc, /usr hota hai — chahe kernel abhi bhi host ka hi ho. Yahi woh trick hai jise log "poora OS" samajhne ki galti karte hain. Yeh OS nahi hai; yeh sirf woh files hain jo ek OS ke saath aati hain, us ek shared kernel par run karti hain.

PICTURE. Host ka real filesystem tree blue mein bana hai. Ek subtree — container ki image — green mein highlight hai. Ek green arrow us subtree ke top ko sirf container ke liye / relabel karta hai. Andar se, upar ka blue hissa simply view se gone hai: mount table mein uska koi entry nahi, toh usse naam nahi diya ja sakta.


Step 5 — Jo woh USE kar sakta hai usse cap karo: cgroups aur CPU-fraction formula

Figure — Containers — namespaces, cgroups, difference from VMs

KYA HAI. Hum apni ab-isolated process ko ek cgroup (control group) mein daalte hain aur ek controller attach karte hain jo ek resource limit karta hai. CPU lo.

YEH NAYI MECHANISM KYU. Namespaces ne sirf visibility badli thi — unhone kabhi nahi chhhua ki ek process kitna consume kar sakti hai. Perfect namespaces wali process abhi bhi threads spin up karke har core hog kar sakti hai, apne neighbours ko bhookha maar sakti hai. Quantity limit karna alag kaam hai, isliye kernel alag tool use karta hai: cgroups, jo scheduler ke upar baithe hain (Scheduling — CFS and CPU shares).

PICTURE — CPU time ka leaky-bucket. cpu.max knob mein do numbers hote hain, dono microseconds mein:

Har period µs mein kernel tumhara bucket quota µs runtime se refill karta hai. Sab kharach karo aur tum frozen ho jaate ho agla refill aane tak. Time ke saath average lene par tum paate ho:

  • quota — microseconds of CPU jo tumhe har window mein allow hai.
  • period — har window kitni lambi hoti hai.
  • ratio — ek core ka fraction jo tum average karte ho, kyunki diya gaya runtime ÷ beeta hua time = fraction busy.

Figure mein x-axis par time hai jo period-long windows mein bata hua hai. Har window ke andar width quota ki ek green bar tumhari allowed run-time hai; uske baad ek red "frozen" bar agali window tak. Dashed line long-run average hai — fraction .

Doosre controllers bhi usi tarah kaam karte hain — ek number jo tum likhte ho, ek limit jo kernel enforce karta hai:

Controller Knob Effect
memory memory.max = 268435456 256 MiB ke baad OOM-kill
pids pids.max = 100 fork bombs rok ta hai
io io.max disk bandwidth throttle karta hai

Step 6 — Degenerate cases (taaki koi surprise na aaye)

Figure — Containers — namespaces, cgroups, difference from VMs

Har real setup "namespaces hain?" aur "cgroups hain?" ka combination hai. Figure ek 2×2 grid hai — charon corners cover karo:

Case A — koi namespace nahi, koi cgroup nahi (plain process). Sab dikhta hai, kuch bhi use kar sakta hai. Container nahi hai. Yeh Step 1 hai.

Case B — sirf cgroup, koi namespace nahi. Yeh limited hai (RAM hog nahi kar sakta) lekin isolated nahi — woh abhi bhi host processes ko ls aur kill kar sakta hai kyunki uski PID/mount/net tables wahi shared hain.

Case C — sirf namespaces, koi cgroup nahi. Yeh isolated hai (apna view) lekin unlimited — woh poori machine ko fork-bomb kar sakta hai kyunki kuch cap nahi karta. Limits ke bina isolation matlab ek container jo apna host DoS kar sakta hai.

Case D — dono (ek real container). Private view aur capped usage. Yahi goal hai.

Root-inside edge case. PID/mount duniya ke andar, whoami root (UID 0) print kar sakta hai. Kya iska matlab host-root hai?


Step 7 — Container vs VM: kernels gino

Figure — Containers — namespaces, cgroups, difference from VMs

KYA HAI. Apne tayyar container ko virtual machine ke saath rakho aur ek structural difference dekho.

KYU MATTER KARTA HAI. Weight, speed, aur security ke baare mein sab kuch ek single fact se aata hai: kitne kernels chal rahe hain.

PICTURE — side by side.

  • VM (left). Ek hypervisor hardware emulate karta hai (dekho Virtualization and Hypervisors (Type 1 vs Type 2)); uske upar har VM ek pura guest kernel + OS boot karta hai. Do boxes → do kernels. Mazboot walls (hardware-enforced), lekin boot karne mein GBs aur seconds.
  • Container (right). Hamaara process group ek host kernel share karta hai; isolation wahi namespaces+cgroups hai jo humne abhi build kiye. Ek kernel. MBs aur milliseconds, lekin ek kernel bug shared blast radius hai.
Container VM
Kernels running ek (shared host) do+ (apna guest)
Isolation by namespaces + cgroups hypervisor + virtual HW
Boot ms seconds
Size MBs GBs
Security wall parde (software) concrete (hardware)
Foreign kernel run kar sakte ho?

Ek-picture summary

Figure — Containers — namespaces, cgroups, difference from VMs

Final figure poori derivation ko ek diagram mein stack karta hai: neeche single host kernel (Step 1); uske upar hamaari process saat namespace curtains mein wrapped (Steps 2–4) jisse usse private view milta hai; uske around ek cgroup meter (Step 5) jo CPU/RAM cap karta hai; aur side mein, contrast ke liye VM apne extra kernel ke saath (Step 7). Woh stack hi ek container hai.

Recall Feynman retelling — poora walkthrough simple words mein

Ek shared ghar (kernel) mein khada ek baccha (process) imagine karo, jo har kamra dekh aur use kar sakta hai. Container banane ke liye hum do alag kaam karte hain. Pehla, parde (namespaces): hum bacche ko har "yahan kaun hai / kitchen kahan hai / address kya hai" list ki private copies dete hain — PIDs, filesystem root, network, hostname, wagera — taaki woh sirf apna chhota sa kona dekh sake; apni list mein woh "baccha number 1" ban jaata hai. Phir ek kaam ki list (cgroups): hum kehte hain "tum aadha TV use kar sakte ho" — quota ÷ period of one core — aur kernel unhe freeze karta hai jab woh is window mein apna share use kar lete hain. Sirf parde matlab woh abhi bhi fork-bomb kar sakte hain; sirf kaam ki list matlab woh abhi bhi sab dekh sakte hain — tumhe dono chahiye. Aur in sab mein woh abhi bhi wahi ghar, wahi kitchen hai: ek kernel. Ek virtual machine, iske opposite, ek pura doosra ghar baas mein baata hai — apna kernel — isliye woh bhaari aur slow hai lekin parde ki jagah real concrete walls hain.


Flashcards

Isolation rule mein ek process "fully isolated" kab hoti hai?
jab har global table jise woh naam de sake private copy ho — matlab saare CLONE_NEW* flags milaakar
Sirf cgroup wali process container kyun nahi hai?
woh limited hai lekin isolated nahi — woh abhi bhi host processes dekh aur kill kar sakti hai (Case B)
Sirf namespace wali process safe kyun nahi hai?
woh isolated hai lekin unlimited — woh fork-bomb / host resources exhaust kar sakti hai (Case C)
cpu.max = "50000 100000" se kya CPU share milta hai?
50000 / 100000 = 0.5 → ek core ka aadha
cpu.max = "200000 100000" se kya CPU share milta hai?
200000 / 100000 = 2 → do full cores
Container aur VM ke beech ek structural difference kya hai?
kernels ki sankhya — container ek host kernel share karta hai, VM apna guest kernel boot karta hai