লিনাক্স নেমস্পেসের সাহায্যে ক্রুট কীভাবে করবেন?


14

লিনাক্স নেমস্পেসগুলি সম্পর্কে পড়ার পরে আমি এই ধারণাটি বদ্ধ হয়েছিলাম যে তারা অন্যান্য অনেক বৈশিষ্ট্যের মধ্যে ক্রোটের বিকল্প। উদাহরণস্বরূপ, এই নিবন্ধে :

[নেমস্পেসের] অন্যান্য ব্যবহারের মধ্যে রয়েছে [...] ক্রুট () - একক ডিরেক্টরি শ্রেণিবদ্ধের কোনও অংশে কোনও প্রক্রিয়া শৈলীর বিচ্ছিন্নকরণ।

যাইহোক, যখন আমি মাউন্ট নেমস্পেসটি ক্লোন করি, উদাহরণস্বরূপ নীচের কমান্ডটি সহ, আমি এখনও পুরো মূল মূল গাছটি দেখতে পাচ্ছি।

unshare --mount -- /bin/bash

আমি বুঝতে পেরেছি যে আমি এখন নতুন নেমস্পেসে অতিরিক্ত মাউন্টগুলি সম্পাদন করতে সক্ষম হয়েছি যা মূল নেমস্পেসের সাথে ভাগ করা হয়নি এবং এইভাবে এটি বিচ্ছিন্নতা সরবরাহ করে, তবে এটি এখনও একই মূল, যেমন /etcউভয় নেমস্পেসের ক্ষেত্রে এখনও একই for আমার কি এখনও chrootশিকড় পরিবর্তন করতে হবে বা এর বিকল্প আছে?

আমি প্রত্যাশা করছিলাম যে এই প্রশ্নের উত্তর সরবরাহ করবে তবে উত্তরটি কেবল chrootআবার ব্যবহার করে ।

সম্পাদনা # 1

এখানে একটি এখন মুছে ফেলা মন্তব্য ছিল pivot_root। যেহেতু এটি আসলে অংশ linux/fs/namespace.c, তাই এটি বাস্তবে নেমস্পেস বাস্তবায়নের অংশ। এটি পরামর্শ দেয় যে মূল ডিরেক্টরিটি কেবলমাত্র দিয়েই পরিবর্তন করা সম্ভব unshareএবং mountএটি সম্ভব নয়, তবে নেমস্পেসগুলি একটি নিজস্ব - আরও চতুর - সংস্করণ সরবরাহ করে chroot। তবুও chrootউত্স কোডটি পড়ার পরেও (উদাহরণস্বরূপ সুরক্ষা বা আরও ভাল বিচ্ছিন্নতার অর্থে) এই পদ্ধতির মূল ধারণাটি আমি এটিকে মূলত পৃথক করে না।

সম্পাদনা # 2

এটি এই প্রশ্নের সদৃশ নয় । উত্তর থেকে সমস্ত কমান্ড কার্যকর করার পরে আমার কাছে পৃথক /tmp/tmp.vyM9IwnKuY (বা অনুরূপ) আছে, তবে রুট ডিরেক্টরিটি এখনও একইরকম!


pivot_rootএবং এর মধ্যে পার্থক্য সম্পর্কে chroot: আমি ডকার উত্সগুলি একবার দেখেছিলাম এবং দেখেছি যে এটি কার্যকর করতে ব্যর্থ হলে এটি pivot_rootআবার পড়ে যায় chroot, অর্থাত্ এই প্রক্রিয়াগুলি কনটেইনারাইজেশনের উদ্দেশ্যে কার্যত কার্যত কমপক্ষে অনুরূপ বলে বিবেচিত হয়।
ড্যানিলা কিভার

উত্তর:


13

একটি সেট আপ করার আগে একটি মাউন্ট নেমস্পেস প্রবেশ করানো chroot, আপনাকে অতিরিক্ত মাউন্টগুলির সাথে হোস্টের নেমস্পেসকে বিশৃঙ্খলা এড়াতে দেয়, উদাহরণস্বরূপ /proc। আপনি chrootএকটি মাউন্ট নেমস্পেসের ভিতরে একটি সুন্দর এবং সাধারণ হ্যাক হিসাবে ব্যবহার করতে পারেন ।

আমি বোঝার সুবিধাগুলি আছে বলে মনে করি pivot_root, তবে এটির কিছুটা শেখার বক্ররেখা রয়েছে। ডকুমেন্টেশন সব কিছু পুরোপুরি ব্যাখ্যা করে না ... যদিও এর ব্যবহারের উদাহরণ রয়েছে man 8 pivot_root(শেল কমান্ডের জন্য)। man 2 pivot_root(সিস্টেম কলের জন্য) এটি একইভাবে করা থাকলে আরও পরিষ্কার হতে পারে এবং এর মধ্যে সি প্রোগ্রাম অন্তর্ভুক্ত রয়েছে।

পিভট_রোট কীভাবে ব্যবহার করবেন

মাউন্ট নেমস্পেসে প্রবেশের সাথে সাথেই আপনার প্রয়োজন mount --make-rslave /বা সমতুল্য। অন্যথায়, আপনার সমস্ত মাউন্ট পরিবর্তনগুলি মুল নাম সহ স্থান সহ মাউন্টগুলিতে প্রচার করে pivot_root। আপনি এটা চান না :)।

আপনি যদি unshare --mountকমান্ডটি ব্যবহার করেন তবে নোট করুন এটি mount --make-rprivateডিফল্টরূপে প্রয়োগ করার জন্য ডকুমেন্টেড । আফিক্স এটি একটি খারাপ ডিফল্ট এবং আপনি উত্পাদন কোডে এটি চান না। যেমন এই মুহুর্তে, এটি ejectহোস্ট নেমস্পেসে মাউন্ট করা ডিভিডি বা ইউএসবিতে কাজ করা বন্ধ করবে । ডিভিডি বা ইউএসবি ব্যক্তিগত মাউন্ট ট্রি এর ভিতরে মাউন্ট থাকবে এবং কার্নেল আপনাকে ডিভিডি বের করতে দেবে না।

একবার এটি হয়ে গেলে আপনি মাউন্ট করতে পারেন যেমন আপনি যে /procডিরেক্টরিটি ব্যবহার করবেন সেটি। আপনার জন্য একইভাবে chroot

যখন আপনি ব্যবহার ভিন্ন chroot, pivot_rootপ্রয়োজন যে আপনার নতুন মূল ফাইল সিস্টেম মাউন্ট-পয়েন্ট হয়। যদি ইতিমধ্যেই নয়, আপনি কেবল একটি বাঁধাই করা মাউন্ট প্রয়োগের দ্বারা এই সন্তুষ্ট করতে পারেন: mount --rbind new_root new_root

ব্যবহারের pivot_root- এবং তারপর umountবয়সী রুট ফাইল সিস্টেম, সঙ্গে -l/ MNT_DETACHবিকল্প। ( আপনার দরকার নেই umount -R, যা বেশি সময় নিতে পারে ))

প্রযুক্তিগতভাবে, pivot_rootসাধারণত ব্যবহারের chrootপাশাপাশি জড়িত থাকা প্রয়োজন ; এটি "হয়-না" হয় না।

হিসাবে man 2 pivot_root, এটি কেবল মাউন্ট নেমস্পেসের মূলটি অদলবদল হিসাবে সংজ্ঞায়িত করা হয়েছে। প্রক্রিয়া রুটটি কোন শারীরিক ডিরেক্টরিতে নির্দেশ করছে তা পরিবর্তনের জন্য এটি সংজ্ঞায়িত হয়নি। বা বর্তমান কার্যকারী ডিরেক্টরি ( /proc/self/cwd)। এটা যে এটা করে , তাই না, কিন্তু এই হাতল কার্নেল থ্রেড করার জন্য একটি হ্যাক হয়। ম্যানপেজটি বলে যে এটি ভবিষ্যতে পরিবর্তন হতে পারে।

সাধারণত আপনি এই ক্রমটি চান:

chdir(new_root);            // cd new_root
pivot_root(".", put_old);   // pivot_root . put_old
chroot(".");                // chroot .

chrootএই অনুক্রমের পোস্টটি আরও একটি সূক্ষ্ম বিশদ । যদিও পয়েন্টটি pivot_rootহ'ল মাউন্ট নেমস্পেসটি পুনরায় সাজানো, কার্নেল কোডটি প্রতি-প্রক্রিয়া রুটের দিকে তাকিয়ে রুট ফাইল সিস্টেমটি সন্ধান করতে পারে বলে মনে হয়, যা chrootসেট করে।

পিভট_রোট কেন ব্যবহার করবেন

নীতিগতভাবে, এটি pivot_rootসুরক্ষা এবং বিচ্ছিন্নতার জন্য ব্যবহার করা বোধগম্য । আমি ক্ষমতা-ভিত্তিক সুরক্ষা তত্ত্ব সম্পর্কে ভাবতে চাই । আপনি প্রয়োজনীয় নির্দিষ্ট সংস্থানগুলির একটি তালিকায় পাস করেছেন এবং প্রক্রিয়াটি অন্য কোনও সংস্থান অ্যাক্সেস করতে পারে না। এই ক্ষেত্রে আমরা একটি মাউন্ট নেমস্পেসে পাস হওয়া ফাইল সিস্টেমগুলি সম্পর্কে কথা বলছি। এই ধারণাটি সাধারণত লিনাক্স "নেমস্পেস" বৈশিষ্ট্যের ক্ষেত্রে প্রযোজ্য, যদিও আমি সম্ভবত এটি খুব ভালভাবে প্রকাশ করছি না।

chrootকেবলমাত্র প্রক্রিয়াটি রুট সেট করে তবে প্রক্রিয়াটি এখনও পুরো মাউন্ট নেমস্পেসকে বোঝায়। যদি কোনও প্রক্রিয়া সম্পাদন করার অধিকার বজায় রাখে chroot, তবে এটি ফাইল সিস্টেমের নেমস্পেসটিকে ব্যাক আপ করতে পারে। এতে বিশদ হিসাবে বলা হয়েছে man 2 chroot, "সুপারভাইজার একটি 'ক্রুট জেল' থেকে পালাতে পারে ..."।

পূর্বাবস্থা আরেকটি চিন্তার উদ্দীপক ভাবে chrootহয় nsenter --mount=/proc/self/ns/mnt। এটি নীতিটির পক্ষে সম্ভবত আরও দৃ argument় যুক্তি। nsenter/ setns()অবশ্যই মাউন্ট নেমস্পেসের মূল থেকে প্রক্রিয়াটির মূলটি পুনরায় লোড করে ... যদিও সত্য যে এটি যখন কাজ করে যখন দুটি পৃথক শারীরিক ডিরেক্টরি উল্লেখ করে তখন কার্নেল বাগ হিসাবে বিবেচিত হতে পারে। (প্রযুক্তিগত দ্রষ্টব্য: মূলটিতে একে অপরের শীর্ষে মাউন্ট করা একাধিক ফাইল সিস্টেম থাকতে পারে; setns()শীর্ষটি ব্যবহার করে, সম্প্রতি একটি মাউন্ট করা হয়েছে))

এটি একটি "পিআইডি নেমস্পেস" এর সাথে মাউন্ট নেমস্পেসের একত্রিত করার একটি সুবিধা চিত্রিত করে। একটি পিআইডি নেমস্পেসের অভ্যন্তরে থাকা আপনাকে একটি অপির্ধারিত প্রক্রিয়ার মাউন্ট নেমস্পেসে প্রবেশ করতে বাধা দিতে পারে। এটি আপনাকে একটি অসমর্থিত প্রক্রিয়া ( /proc/$PID/root) এর গোড়ায় প্রবেশ করতে বাধা দেয় । এবং অবশ্যই একটি পিআইডি নেমস্পেস আপনাকে এর বাইরে যে কোনও প্রক্রিয়া মেরে ফেলতে বাধা দেয় :-)।


এটি ইতিমধ্যে অনেক সাহায্য করে। তবুও, "নেমস্পেসের শীর্ষে মাউন্ট" বলতে আপনার অর্থ কী তা আমি নিশ্চিত নই। এবং এটি পরিবর্তন করার কোন উপায় আছে?
কোওলো

1
@ কোয়ালো সম্পাদিত :-)। পিএস আমি জানি না কেন আপনার "মেক-আরস্লেভ" / "মেক-আরপ্রাইভেট" এর জন্য fstab দরকার হবে। সিস্টেমেডের স্যুইচ-রুট.সি ঠিক করেনmount(NULL, "/", NULL, MS_REC|MS_PRIVATE, NULL)
সোর্সজেডি

1
@ কোয়ালো এবং তারপরে লিনাক্স কার্নেল বিকাশকারীরা যখন একটি চতুর্থ জিনিসের নাম রেখেছিলেন: "পি" unix.stackexchange.com/questions/152029/…
সোর্সজেডি

1
এই উত্সটি এবং @ সোর্সজেদি দ্বারা অন্যরা ব্যতিক্রমীভাবে সহায়ক ছিল, আমি "পিভট_রূট: পুতুলকে ব্যস্ত হিসাবে গণ্য করতে পারি না" জিজ্ঞাসা করতাম তবে উত্তরটি ইতিমধ্যে এখানে ছিল, শক্তি হিসাবে কাজ করবে না বলে অলস হতে হবেumount -l ./oldroot
ইরাকাম

1
সম্প্রতি বেশ কয়েকটি ব্যাখ্যা সহ পিভট_রূট (২) ম্যান পৃষ্ঠায় একটি আপডেট ছিল এবং এটিতে এখন একটি উদাহরণ প্রোগ্রাম রয়েছে। এটি প্রতিফলিত করতে আপনি নিজের উত্তর আপডেট করতে চান? ম্যান পেজটি এখন দুর্দান্ত কৌশলটিও ব্যাখ্যা করে pivot_root(".", "."), যা pivot_rootবেশিরভাগ পরিস্থিতিতে ব্যবহারের সহজতম উপায় ( chrootপ্রয়োজন নেই)।
ফিলিপ উইন্ডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.