ডিআইএন প্রক্রিয়াটি কি লিনাক্সের শেল স্ক্রিপ্ট হতে পারে?


14

আমি একটি কাস্টম ইনিরামফ সেটআপ করার টিউটোরিয়ালটি দিয়ে যাচ্ছিলাম যেখানে এটি উল্লেখ করেছে:

কেবলমাত্র অনুপস্থিত / init হচ্ছে, কার্নেলটি লোড হয়ে গেলে এটি দ্বারা চালিত করা হওয়া initramfs এর মূলের মধ্যে নির্বাহযোগ্য। যেহেতু সিস-অ্যাপস / ব্যস্তবক্সে সম্পূর্ণরূপে কার্যকরী শেল অন্তর্ভুক্ত রয়েছে, এর অর্থ আপনি আপনার / init বাইনারিটিকে একটি সাধারণ শেল স্ক্রিপ্ট হিসাবে লিখতে পারেন (এ্যাসেম্ব্লার বা সিতে লেখা একটি জটিল অ্যাপ্লিকেশন তৈরি করার পরিবর্তে যা আপনাকে সংকলন করতে হবে)।

এবং একটি শেল স্ক্রিপ্ট হিসাবে init এর উদাহরণ দেয় যা দিয়ে শুরু হয় #!/bin/busybox sh

এখনও অবধি, আমি এই ছাপের মধ্যে ছিলাম যে আরম্ভ হল মূল প্রক্রিয়া যা চালু হয় এবং অন্যান্য সমস্ত ব্যবহারকারী স্থান প্রক্রিয়া অবশেষে আর ডি-এর সন্তান। তবে প্রদত্ত উদাহরণে প্রথম প্রক্রিয়াটি আসলে bin/busybox/ shযা থেকে পরে আরআইপি তৈরি হয়।

এটি কি সঠিক আন্তঃআযোগিতা? উদাহরণস্বরূপ, আমি যদি সেই মুহুর্তে কোনও উপলব্ধ দোভাষী পেয়ে থাকি, আমি পাইথন স্ক্রিপ্ট হিসাবে আর ডি লিখতে পারি?

উত্তর:


12

আরআইডি "ছড়িয়ে ছিটিয়ে থাকা" (শিশু প্রক্রিয়া হিসাবে) নয়, বরং execএটির মতো:

# Boot the real thing.
exec switch_root /mnt/root /sbin/init

execপুরো প্রক্রিয়াটি স্থানে প্রতিস্থাপন করে। চূড়ান্ত উদ্যোগটি এখনও প্রথম প্রক্রিয়া (পিড 1), যদিও ইনিশ্রামফের সদস্যদের সাথে এটি পূর্ববর্তী ছিল।

দ্য ইনিশ্রামস /init, যা ব্যাসিবক্স শেল স্ক্রিপ্ট যা পিড 1, execএর সাথে ব্যাসিবক্সে switch_root(তাই এখন switch_rootপিড 1) রয়েছে; এই প্রোগ্রামটি আপনার মাউন্ট পয়েন্টগুলি পরিবর্তন /mnt/rootকরবে তাই নতুন হবে /

switch_rootতারপর আবার execকরতে গুলি /sbin/initআপনার আসল রুট ফাইল সিস্টেম এর; এর ফলে এটি আপনার আসল init সিস্টেমকে পিড 1 দিয়ে প্রথম প্রক্রিয়া করে তোলে, যার ফলে কোনও কোনও শিশু প্রক্রিয়া উত্সাহিত হতে পারে।

আপনি যদি কোনওভাবে পাইথনকে আপনার ইন্সট্রামফগুলিতে বেক করতে সক্ষম হন তবে অবশ্যই এটি একটি পাইথন স্ক্রিপ্ট দিয়ে সম্পন্ন করা যেতে পারে। যদিও আপনি যদি যাইহোক ব্যস্তবক্সকে অন্তর্ভুক্ত করার পরিকল্পনা না করেন তবে আপনাকে কঠোর পরিশ্রম করে এর কার্যকারিতাটির কিছুটা রিম্পিমেন্ট করতে হবে (যেমন switch_rootএবং আপনি সমস্ত কিছু সাধারণ কমান্ড দিয়েই করেন)।

তবে এটি কার্নেলগুলিতে কাজ করে না যা স্ক্রিপ্ট বাইনারিগুলিকে অনুমতি দেয় না ( CONFIG_BINFMT_SCRIPT=y), বা বরং এরকম ক্ষেত্রে আপনাকে সরাসরি দোভাষী চালু করতে হবে এবং কোনওভাবেই এটি আপনার স্ক্রিপ্টটি লোড করতে হবে।


/পাতলা বাতাসে অদৃশ্য হয়ে যায় না - এটি মাউন্ট করা হয় (যদিও মেমরিটি সংরক্ষণ করার আগে সাধারণত এর সামগ্রীগুলি সমস্ত মুছে ফেলা হয়) । এটি এখনও আছেswitch_rootপ্রাপ্ত syscall করে switchroot- যা কি কার্নেল যখন তারা কার্নেল বুট করার প্রক্রিয়া পরিবর্তিত initramfs -র প্রয়োজন 2.6.something প্রদান devs। এটি কার্নেল যা যাদু করে।
মাইক্রোজার্ভ

1
একটি switchrootসিস্কেল সত্যিই আমার কাছে সংবাদ হবে। আপনি যে জন্য একটি উৎস আছে? আপনি যদি সুইচ_রোট.সি উত্স কোডটি দেখেন তবে এটি বেশ একটি ম্যানুয়াল প্রক্রিয়া বলে মনে হচ্ছে এবং ডকুমেন্টেশন / ফাইলসিসটেমস / র্যামফস-রুটফেস-ইনিরামফেস.টিএসটিএস-এ বর্ণিত হিসাবে একই। এছাড়াও আপনি যদি সমস্ত কিছু মুছে ফেলে এবং এটি মাউন্ট করেন তবে এটি এই মুহুর্তে প্রায় নিখোঁজ হয়ে গেছে, আপনি কি ভাবেন না?
frostschutz

pivot_rootঅন্যদিকে, এটি একটি সিস্টাল। এটি switch_rootযদিও এর জন্য ব্যবহৃত হয় না এবং কিছু হুপের মাধ্যমে ঝাঁপ দেওয়া ছাড়া এটি ব্যবহার করা যায় না, এবং উভয় দিক দিয়েই উত্তরটির জন্য এটি কোনও বিষয় নয়, তাই আমি কেবল এটি পুরোপুরি সরিয়েছি। খুব খারাপ, আমি ভেবেছিলাম যে ম্যাজিক এবং পাতলা বাতাসে
বিলীন হওয়া

ভাল, সম্ভবত আমি সম্পর্কে ভুল ধারণা পেয়েছি switch_root- যার জন্য আমি দুঃখিত, এবং আমাকে দেখানোর জন্য আপনাকে ধন্যবাদ জানাই - তবে এটি কোনওভাবেই বিলুপ্ত হয় না। initramfs -র মূল চলতেই এবং সবার জন্য সবসময় সেখানে - এটা হল রুট।
মাইকজার্ভেস

1
আপনি যে ডকগুলিতে লিঙ্কটি find -xdev / -exec rm '{}' ';'cd /newmount; mount --move . /; chroot .
মাইক্রোজার্ভ

4

লিনাক্স কার্নেলের এক্সিকিউট সিস্টেমে শেবাং দেশীয়ভাবে কম দেখায়

যখন এক্সিকিউটেড ফাইলটি ম্যাজিক বাইটগুলি দিয়ে শুরু হয় #!, তারা কার্নেলকে এটি #!/bin/shহিসাবে ব্যবহার করতে বলে:

  • এবং execসিস্টেম কল
  • এক্সিকিউটেবল সহ /bin/sh
  • এবং সি এল আই যুক্তি সহ: বর্তমান স্ক্রিপ্টের পথে

আপনি যখন নিয়মিত ইউজারল্যান্ড শেল স্ক্রিপ্টটি চালাবেন ঠিক তখনই এটি ঘটে:

./myscript.sh

যদি ফাইলটি ম্যাজিক বাইটের .ELFপরিবর্তে শুরু করে #!, কার্নেলটি চালানোর পরিবর্তে ইএলএফ লোডারটি বেছে নেবে।

আরও বিশদে এখানে: লোকেরা পাইথন স্ক্রিপ্টের প্রথম লাইনে #! / Usr / bin / env পাইথন শেবাং লেখেন কেন? | স্ট্যাক ওভারফ্লো

একবার এটি আপনার মনে রাখার পরে, এটি /initশেল স্ক্রিপ্ট সহ কার্নেল দ্বারা কার্যকর /bin/shকরা যায় এমন কিছুও হতে পারে এবং এ ক্ষেত্রে প্রথম নির্বাহযোগ্য কেন হবে তা গ্রহণ করা সহজ হয়ে যায় ।

যারা এটি চেষ্টা করতে চান তাদের জন্য এখানে একটি ন্যূনতম চলমান উদাহরণ: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/cbea7cc02c868711109ae1a261d01fd0473eea0b#custom-init

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.