একটি জেনেরিক কার্নেল ইমেজ (GKI)-এ কোনো ডিভাইসকে পার্টিশন মাউন্ট করতে সক্ষম করার জন্য প্রয়োজনীয় ড্রাইভার সাপোর্ট নাও থাকতে পারে। কোনো ডিভাইসকে পার্টিশন মাউন্ট করতে এবং বুটিং চালিয়ে যেতে সক্ষম করার জন্য, র্যামডিস্কে উপস্থিত কার্নেল মডিউলগুলো লোড করার উদ্দেশ্যে প্রথম-পর্যায়ের init উন্নত করা হয়। র্যামডিস্ককে জেনেরিক এবং ভেন্ডর র্যামডিস্কে বিভক্ত করা হয়। ভেন্ডর কার্নেল মডিউলগুলো ভেন্ডর র্যামডিস্কে সংরক্ষিত থাকে। কার্নেল মডিউলগুলো কোন ক্রমে লোড হবে তা কনফিগার করা যায়।
মডিউলের অবস্থান
র্যামডিস্ক হলো প্রথম-পর্যায়ের init, এবং A/B ও ভার্চুয়াল A/B ডিভাইসগুলিতে রিকভারি/ফাস্টবুটডি (recovery/fastbootd) ইমেজের জন্য ব্যবহৃত ফাইলসিস্টেম। এটি একটি initramfs যা দুটি সিপিআইও (cpio) আর্কাইভ দিয়ে গঠিত এবং বুটলোডার দ্বারা সেগুলোকে সংযুক্ত করা হয়। প্রথম সিপিআইও আর্কাইভটি, যা ভেন্ডর-বুট পার্টিশনে ভেন্ডর র্যামডিস্ক হিসেবে সংরক্ষিত থাকে, তাতে নিম্নলিখিত উপাদানগুলো থাকে:
- প্রথম পর্যায়ের
initভেন্ডর কার্নেল মডিউলসমূহ, যা/lib/modules/-এ অবস্থিত। -
modprobeকনফিগারেশন ফাইলগুলো/lib/modules/-এ অবস্থিত:modules.dep,modules.softdep,modules.alias,modules.options। -
/lib/modules/-এ অবস্থিত একটিmodules.loadফাইল, যা নির্দেশ করে প্রথম পর্যায়ের ইনিট-এর সময় কোন মডিউলগুলো এবং কোন ক্রমে লোড করতে হবে। - A/B এবং ভার্চুয়াল A/B ডিভাইসের জন্য ভেন্ডর রিকভারি-কার্নেল মডিউলসমূহ
/lib/modules/এ অবস্থিত। -
modules.load.recoveryনির্দেশ করে যে/lib/modulesএ A/B এবং ভার্চুয়াল A/B ডিভাইসগুলির জন্য কোন মডিউলগুলি এবং কোন ক্রমে লোড করতে হবে।
দ্বিতীয় cpio আর্কাইভটি, যা GKI-এর সাথে boot.img-এর ramdisk হিসেবে সরবরাহ করা হয় এবং প্রথমটির উপরে প্রয়োগ করা হয়, তাতে first_stage_init এবং এর উপর নির্ভরশীল লাইব্রেরিগুলো থাকে।
প্রথম পর্যায়ের ইনিটে মডিউল লোড হচ্ছে
প্রথম ধাপের init র্যামডিস্কের /lib/modules/ থেকে মডপ্রোব (modprobe) কনফিগারেশন ফাইলগুলো পড়ার মাধ্যমে শুরু হয়। এরপর, এটি /lib/modules/modules.load (অথবা রিকভারির ক্ষেত্রে, /lib/modules/modules.load.recovery এ নির্দিষ্ট করা মডিউলগুলোর তালিকা পড়ে এবং পূর্বে লোড করা ফাইলগুলোতে নির্দিষ্ট করা কনফিগারেশন অনুসরণ করে ক্রমানুসারে সেই মডিউলগুলোর প্রত্যেকটি লোড করার চেষ্টা করে। হার্ড বা সফট ডিপেন্ডেন্সি পূরণের জন্য অনুরোধ করা ক্রম থেকে বিচ্যুতি ঘটতে পারে।
বিল্ড সাপোর্ট, প্রথম-পর্যায়ের ইনিট
ভেন্ডর র্যামডিস্ক cpio-তে কপি করার জন্য কার্নেল মডিউলগুলো নির্দিষ্ট করতে, সেগুলোকে BOARD_VENDOR_RAMDISK_KERNEL_MODULES এ তালিকাভুক্ত করুন। বিল্ডটি এই মডিউলগুলোর উপর depmod চালায় এবং এর ফলে প্রাপ্ত modprobe কনফিগারেশন ফাইলগুলোকে ভেন্ডর র্যামডিস্ক cpio-তে রাখে।
বিল্ডটি একটি modules.load ফাইলও তৈরি করে এবং এটিকে ভেন্ডর র্যামডিস্ক cpio-তে সংরক্ষণ করে। ডিফল্টরূপে, এতে BOARD_VENDOR_RAMDISK_KERNEL_MODULES এ তালিকাভুক্ত সমস্ত মডিউল থাকে। ঐ ফাইলের বিষয়বস্তু ওভাররাইড করতে, BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD ব্যবহার করুন, যেমনটি এই উদাহরণে দেখানো হয়েছে:
BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD := \ device/vendor/mydevice-kernel/first.ko \ device/vendor/mydevice-kernel/second.ko \ device/vendor/mydevice-kernel/third.ko
বিল্ড সাপোর্ট, সম্পূর্ণ অ্যান্ড্রয়েড
অ্যান্ড্রয়েড ১০ এবং এর পূর্ববর্তী সংস্করণগুলোর মতোই, BOARD_VENDOR_KERNEL_MODULES এ তালিকাভুক্ত কার্নেল মডিউলগুলোকে অ্যান্ড্রয়েড প্ল্যাটফর্ম বিল্ড /vendor/lib/modules এ অবস্থিত ভেন্ডর পার্টিশনে কপি করে। প্ল্যাটফর্ম বিল্ড এই মডিউলগুলোর উপর depmod চালায় এবং depmod আউটপুট ফাইলগুলোকে ভেন্ডর পার্টিশনের একই স্থানে কপি করে। /vendor থেকে কার্নেল মডিউল লোড করার প্রক্রিয়াটি অ্যান্ড্রয়েডের পূর্ববর্তী সংস্করণগুলোর মতোই রয়েছে। এই মডিউলগুলো কীভাবে এবং কখন লোড করবেন, সেই সিদ্ধান্ত আপনার, যদিও সাধারণত এটি init.rc স্ক্রিপ্ট ব্যবহার করে করা হয়।
ওয়াইল্ডকার্ড এবং সমন্বিত কার্নেল বিল্ড
যেসব ভেন্ডর তাদের ডিভাইসের কার্নেল বিল্ডকে অ্যান্ড্রয়েড প্ল্যাটফর্ম বিল্ডের সাথে একত্রিত করেন, তারা ডিভাইসে কপি করার জন্য কার্নেল মডিউল নির্দিষ্ট করতে উপরে উল্লিখিত BOARD ম্যাক্রো ব্যবহার করার সময় একটি সমস্যার সম্মুখীন হতে পারেন। যদি ভেন্ডর ডিভাইসের প্ল্যাটফর্ম বিল্ড ফাইলে কার্নেল মডিউল তালিকাভুক্ত করা এড়াতে চান, তবে তারা একটি ওয়াইল্ডকার্ড ( $(wildcard device/vendor/mydevice/*.ko ) ব্যবহার করতে পারেন। উল্লেখ্য যে, ইন্টিগ্রেটেড কার্নেল বিল্ডের ক্ষেত্রে ওয়াইল্ডকার্ড কাজ করে না, কারণ যখন make চালু করা হয় এবং makefile-এ ম্যাক্রোগুলো এক্সপ্যান্ড করা হয়, তখন কার্নেল মডিউলগুলো বিল্ড করা থাকে না, ফলে ম্যাক্রোগুলো খালি থাকে।
এই সমস্যাটি এড়ানোর জন্য, ভেন্ডর তাদের কার্নেল বিল্ডের মাধ্যমে একটি জিপ আর্কাইভ তৈরি করতে পারে, যেটিতে কার্নেল মডিউলগুলো থাকবে এবং যা প্রতিটি পার্টিশনে কপি করা হবে। BOARD_*_KERNEL_MODULES_ARCHIVE এ সেই জিপ আর্কাইভটির পাথ সেট করুন, যেখানে * হলো পার্টিশনের নাম (যেমন BOARD_VENDOR_KERNEL_MODULES_ARCHIVE )। অ্যান্ড্রয়েড প্ল্যাটফর্ম বিল্ড এই জিপ আর্কাইভটিকে উপযুক্ত স্থানে এক্সট্র্যাক্ট করে এবং মডিউলগুলোর উপর depmod চালায়।
কার্নেল মডিউল জিপ আর্কাইভে এমন একটি মেক রুল থাকা উচিত, যা নিশ্চিত করবে যে প্ল্যাটফর্ম বিল্ড প্রয়োজনে আর্কাইভটি তৈরি করতে পারে।
পুনরুদ্ধার
পূর্ববর্তী অ্যান্ড্রয়েড রিলিজগুলিতে, রিকভারির জন্য প্রয়োজনীয় কার্নেল মডিউলগুলি BOARD_RECOVERY_KERNEL_MODULES এ নির্দিষ্ট করা হতো। অ্যান্ড্রয়েড ১২-এ, রিকভারির জন্য প্রয়োজনীয় কার্নেল মডিউলগুলি এখনও এই ম্যাক্রো ব্যবহার করে নির্দিষ্ট করা হয়। তবে, রিকভারি কার্নেল মডিউলগুলি জেনেরিক র্যামডিস্ক সিপিআইও-এর পরিবর্তে ভেন্ডর র্যামডিস্ক সিপিআইও-তে কপি করা হয়। ডিফল্টরূপে, BOARD_RECOVERY_KERNEL_MODULES এ তালিকাভুক্ত সমস্ত কার্নেল মডিউল প্রথম-পর্যায়ের init এর সময় লোড করা হয়। আপনি যদি এই মডিউলগুলির শুধুমাত্র একটি উপসেট লোড করতে চান, তাহলে সেই উপসেটের বিষয়বস্তু BOARD_RECOVERY_KERNEL_MODULES_LOAD এ নির্দিষ্ট করুন।
সম্পর্কিত নথিপত্র
ভেন্ডর বুট পার্টিশন (যেটিতে এই পৃষ্ঠায় উল্লিখিত ভেন্ডর র্যামডিস্ক থাকে) তৈরি করার বিষয়ে জানতে, বুট পার্টিশন দেখুন।