Bosh sahifa Wiki PID Namespace

PID Namespace

PID NamespaceLinux process identifikatorlari va process tree ko‘rinishini izolyatsiya qiladigan namespace turi. Bir process parent namespace’da katta PID, ichki namespace’da esa kichik PID bilan ko‘rinishi mumkin. Container ichidagi birinchi process PID 1 bo‘ladi va shu namespace processlari uchun initga xos signal hamda orphan-reaping vazifalarini oladi.

Ierarxiya

PID namespace’lar parent-child ierarxiyasida yaratiladi. Parent namespace ichki child processlarni ko‘ra oladi, child esa parent yoki sibling namespace processlarini ko‘rmaydi. Process har ancestor namespace’da alohida PIDga ega bo‘ladi.

Bu ko‘rinish kernel obyektini nusxalamaydi. Bir task turli observer uchun turli raqam bilan ifodalanadi. Monitoring PID bilan birga namespace identifikatori va process start time’ni saqlashi kerak.

Namespace init

Yangi PID namespace’da yaratilgan birinchi child PID 1dir. U orphanlarni wait bilan yig‘adi. U tugasa kernel odatda namespace’dagi qolgan processlarni majburan tugatadi, chunki ularning init tayanchi yo‘qoladi.

PID 1 uchun handler o‘rnatilmagan ayrim signallarning default ta’siri odatiy processdan farq qiladi. Container entrypoint signal forwardingni to‘g‘ri bajarishi va zombie processlarni yig‘ishi kerak. Minimal init wrapper ko‘pincha shu sabab ishlatiladi.

/proc ko‘rinishi

PID namespace yaratishning o‘zi eski /proc mountini o‘zgartirmaydi. Ichki processlar ro‘yxati ko‘rinishi uchun procfs yangi mount namespace ichida qayta mount qilinadi. Aks holda container host PIDlarini ko‘rishi yoki noto‘g‘ri pathlardan foydalanishi mumkin.

/proc/self/status va namespace-aware maydonlar taskning turli darajadagi PIDlarini ko‘rsatishi mumkin. Tool faqat katalog nomiga tayanmay, kernel bergan namespace metadata’dan foydalanadi.

Signal va boshqaruv

Parent namespace’dagi ruxsatli process ichki taskga uning tashqi PIDi orqali signal yuborishi mumkin. Child namespace processi tashqi processni nomlay olmaydi. Permission user namespace, credential va ptrace policy bilan birga tekshiriladi.

PID reuse har namespace’da alohida sodir bo‘ladi. Eski PIDni saqlab keyin signal yuborish yangi processni nishonlashi mumkin. Pidfd process obyektiga barqarorroq reference beradi va lifecycle race’ini kamaytiradi.

Yaratish cheklovi

clone yoki unshare yangi PID namespace’ni belgilaydi, lekin chaqiruvchi processning o‘zi unda ko‘rinmaydi; uning keyingi childi yangi namespace’ga kiradi. Multi-thread process va namespace o‘tish qoidalari qat’iydir.

Test PID 1 exit, orphan reaping, nested namespace, proc mount, signal permission va PID exhaustion holatini qamraydi. PID namespace CPU yoki memory limit bermaydi; buning uchun cgroup kerak.

Nested PID ko‘rinishi

Process statusidagi NSpid qiymatlari ancestor namespace’lardan ichkariga qarab PIDlar ketma-ketligini ko‘rsatishi mumkin. Host debugger tashqi PID bilan attach qiladi, container ichidagi tool esa ichki PIDni ishlatadi. Core dump filename faqat %p bilan tuzilsa turli containerlarda collision ehtimoli bor; host collector namespace va workload identityni qo‘shadi.

Reboot semantikasi

Namespace init’i tegishli system call bilan “reboot” so‘rasa hostni qayta yuklash o‘rniga namespace processlarini tugatish semantikasi qo‘llanishi mumkin. Runtime exit statusni container restart policyga uzatadi. Ichki init keng host capability olsa haqiqiy host reboot xavfi tug‘iladi, shuning uchun user namespace va capability boundary aniq sozlanadi.

Bog‘liq tushunchalar

PID 1, process tree, pidfd, procfs, container init, Linux namespace