Bosh sahifa Wiki Mount Namespace

Mount Namespace

Mount NamespaceLinux processlari ko‘radigan mount daraxtini alohida nusxa sifatida boshqaradigan namespace turi. Yangi namespace yaratilganda mavjud mountlar ko‘rinishi nusxalanadi, keyingi mount va unmount amallari propagation siyosatiga qarab boshqa namespace’larga ta’sir qilmasligi mumkin. Containerning o‘z root filesystemi va /proc, /dev kabi ko‘rinishlari shu mexanizm bilan yaratiladi.

Daraxt nusxasi

Mount namespace filesystem data’sini ko‘chirmaydi. U qaysi filesystem obyektlari qaysi pathlarda biriktirilganini ifodalovchi mount tree’ni ajratadi. Bir disk yoki inode turli namespace’da boshqa pathda ko‘rinishi mumkin.

unshare bilan yangi mount namespace olingach process mountlarni qo‘shadi, olib tashlaydi yoki read-only remount qiladi. Boshqa process eski namespace’da avvalgi daraxtni ko‘rishda davom etadi.

Propagation

Mountlar shared, private, slave yoki unbindable propagation turiga ega. Shared mount ostidagi yangi child mount peer guruhidagi boshqa namespace’larga tarqaladi. Private mount hech qayerga tarqalmaydi. Slave parentdan hodisa oladi, lekin o‘zgarishni orqaga yubormaydi.

Container runtime root daraxtini odatda private yoki slave qiladi. Aks holda container ichida yaratilgan mount hostga chiqib ketishi yoki hostdagi removable media kutilmaganda containerda paydo bo‘lishi mumkin. Propagation flag faqat mount pointga emas, subtree munosabatiga ta’sir qiladi.

Rootni almashtirish

pivot_root yangi root mountni /ga aylantirib, eski rootni yangi daraxt ichidagi pathga ko‘chiradi. So‘ng eski root unmount qilinadi. chroot faqat path resolution rootini o‘zgartiradi va mount namespace yaratmaydi; privilege’li process uchun u to‘liq izolatsiya emas.

Open file descriptor yoki current working directory eski rootga reference saqlashi mumkin. Runtime barcha descriptor va directory holatini tekshiradi. MS_MOVE va bind mountlar setup tartibida ehtiyotkor ishlatiladi.

Container filesystemi

Image layerlari overlay filesystem bilan birlashtirilib yangi root mountga aylanadi. Writable upper layer container o‘zgarishlarini saqlaydi, volume esa alohida bind mount sifatida qo‘shiladi. Secret va configuration tmpfs yoki read-only mount orqali berilishi mumkin.

User namespace bilan birga ishlaganda mount operationlari capability’ni tegishli namespace doirasida tekshiradi. Har filesystem unprivileged mount uchun xavfsiz deb hisoblanmaydi.

/proc va kuzatuv

Container ichida yangi PID namespace to‘g‘ri ko‘rinishi uchun /proc shu namespace ichida qayta mount qilinadi. Hostdan meros qolgan /proc tashqi processlarni ko‘rsatib isolationni buzishi mumkin. Sysfs va device mountlari ham minimal, ko‘pincha read-only ko‘rinishda beriladi.

Tashxis /proc/PID/mountinfo orqali mount ID, parent, root, mount point va propagationni ko‘radi. Oddiy mount chiqishi bind source yoki peer guruhini to‘liq ko‘rsatmasligi mumkin.

Recursive mount amallari

Subtree ichida boshqa mountlar bo‘lsa oddiy bind faqat yuqori mountni yoki recursive bind barcha child mountlarni ko‘chirishiga qarab farq qiladi. Read-only flagni yuqori nuqtaga qo‘yish nested writable mountlarni avtomatik yopmasligi mumkin. Container runtime recursive read-only va mount attribute API’larini ishlatib butun daraxt invariantini tekshiradi. Secret mount child orqali yoziladigan host pathga chiqib ketmasligi lozim.

Unmount lifecycle

Mount busy bo‘lsa ochiq descriptor, cwd yoki child mount reference mavjud. Lazy unmount daraxtdan ajratadi, lekin oxirgi reference tugaguncha filesystem yashaydi. Bu cleanupni tezlashtiradi, ammo device detach yoki secret revocationni darhol kafolatlamaydi. Force unmount filesystemga xos va pending I/Oga zarar yetkazishi mumkin. Runtime resource tugaganini reference va I/O completion bilan tasdiqlaydi.

Bog‘liq tushunchalar

mount propagation, pivot_root, bind mount, overlay filesystem, chroot, container filesystem