قسمتهائی از سیستم عامل لینوکس و توزیع جنتو وجود دارد که کمتر کاربر لینوکسی (بجز لری گاوه) با آنها دست و پنجه نرم میکند. بسته initramfs یکی از این دسته بخشهاست که همه کاربران لینوکس و بخصوص جنتو کاران آن را دیدهاند اما شاید هیچوقت به آن توجه نکرده باشند. این مقاله توضیحات به نظر من خوبی در این باره است که درباره این فایل در جنتو لینوکس صحبت میکند اما در دیگر توزیعهای لینوکس هم کار بر همین منوال است. تا چه قبول افتد و چه در نظر آید.
استفاده ازinitramfs انتخابی است. بشکل پیشفرض ٬ کرنل جنتو لینوکس سختافزاری را که از درایورهای درون ساز استفاده میکنند را پردازش میکند٬ پارتیشنی را که به کاربر ریشه اختصاص داده شده را مانت میکند و دستگاه init را وابسته به توزیع لینوکسی که از آن استفاده میشود و در اینجا جنتو است٬ راه اندازی میکند. پس از آن دستگاه init ماژولهای اضافه را لود میکند و خدمات دیگر را راهاندازی میکند تا هنگامی که شما بتوانید وارد سیستم شوید. این رفتار پیش فرض خوبی است و برای بسیاری از کاربران کافی است. فایل initramfs برای کاربرانی با احتیاجات پیشرفتهتر است. این فایل بدرد کاربرانی میخورد که میخواهند برخی کارها را پیشتر از آنچه ممکن است٬ انجام دهند یعنی هنگامی که هنوز پارتیشن مربوط به کاربر ریشه مانت نگردیده است.
نمونههائی از کارهایی که میتوان با initramfs انجام داد در زیر آورده شدهاست:
- سفارشیسازی مرحله راهاندازی جنتو (برای مثال ایجاد یک پیغام خوشآمدگویی)
- لود نمودن ماژولهای شناسائی درایورها در جنتو (برای مثال لود نمودن ماژولهای درایورهائی که به عنوان بخش سوم به کرنل اضافه شدهاند و نمیتوانند مستقیما در کرنل جایسازی شوند)
- مانت نمودن پارتیشن کاربر ریشه جنتوی شما (برای پارتیشنهای رمزنگاری شده٬ لوجیکال٬ و دیگر پارتیشنهای خاص)
- فراهم آورد یک شل نجات (یا خط فرمان ریسکیو) حداقل جنتو (اگر چیزی به خطا رفت)
- هر کاری که کرنل لینوکس نمی تواند انجام دهد (که می توانید در فضای کاری کاربر جنتو انجام دهید٬ برای مثال اجرای دستورات)
اگر نیازهای پیشرفته ندارید به initramfs احتیاجی ندارید.
پیشنیاز
راههای بیشماری برای ساختن یک فایل initramfs در جنتو وجود دارد. میتوانید انتخاب کنید این فایل را بسازید یا به برخی برنامههای موجود در جنتو مانند genkernel ساختن آنرا واگذار نمایید برای توزیعهای دیگر باید از ابزارهای مربوط به آنها استفاده نمایید. اگر خوششانس باشید genkernel همه آن چیزی را که لازم دارید برای شما ایجاد مینماید و نیازی نیست شما به این فکر کنید که initramfs چگونه ساخته میشود. اگر خوششانس نباشید چطور؟ خوب البته genkernel موفق به ساخت یک initramfs برای شما نمیشود و باید همه آنرا خودتان بصورت دستی برای راهاندازی موفق جنتویتان بسازید.
فایل initramfs معمولا حداقل حاوی یک فایل است به نام /init این فایل به عنوان مرحله init اصلی توسط کرنل (PID1) اجرا میشود. این همه کارها را انجام میدهد. افزون بر آن میتواند حاوی فایلها و دایرکتوریهای اضافهتری باشد که مورد نیاز /init هستند. آنها معمولا فایلهائی هستند که آنها را در دیگر فایل سیستمهای کاربر ریشه جنتو هم پیدا مینمایید مانند /dev برای نودهای دستگاهها٬ /proc برای داده های کرنل٬ /bin برای باینریهای اضافه٬ و مانند آن. ساختار initramfs وابسته به آنچه برای آن نقشه کشیدهاید٬ میتواند ساده باشد یا پیچیده.
هنگامی که کرنل initramfs را مانت می کند٬ پارتیشن کاربر ریشه جنتوی شما هنوز مانت نشدهاست٬ بنابر این شما هنوز به فایلهای خودتان دسترسی ندارید. این به این معنی است که بجز initramfs وجود ندارد. بنابر این شما باید هر آنچه را میخواهید و هر آنچه را نیاز دارید در initramfs خود قرار دهید. اگر یک شل میخواهید٬ باید آنرا در initramfs قرار دهید. اگر میخواهید چیزی را مانت کنید٬ باید ابزارهای مفید برای مانت نمودن را در آن قرار دهید. اگر نیاز دارید تا ماژولی را مانت نمایید٬ لازم دارید تا هم ماژول و هم ابزارهای مورد نیاز برای مانت نمودن آنرا در initramfs قرار دهید. اگر ابزاری برای کارکرد مناسب٬ به کتابخانهایی نیاز دارد٬ باید آنرا نیز در initramfs قرار دهید. این به نظر پیچیده میآید ولی واقعا اینگونه نیست٬ چرا که initramfs بشکل تابعی کار می کند و البته مهمتر از آن: جنتو؟ بسیار ساده است.
مبانی
در این بخش نحوه ساخت آسان initramfs را در لینوکس جنتو یاد خواهید گرفت. شما یک initramfs را بشکل فعال ایجاد خواهید نمود که پس از آن میتوانید آنچه را که مورد نیازتان است را به آن اضافه نمایید.
ساختار دایرکتوری
دایرکتوری ایجاد نمایید که بعدا از آن به عنوان ریشه initramfs تان استفاده شود. به عنوان نمونه ما از دایرکتوری /usr/src/initramfs استفاده میکنیم٬ اما هر دایرکتوری را می توان استفاده نمود. دایرکتوری ریشه initramfs را ایجاد نمایید و با دستور cd به آن وارد شوید.
mkdir /usr/src/initramfs
cd /usr/src/initramfs
یک دایرکتوری لایهایی مبنایی ایجاد نمایید.
mkdir -p bin lib dev etc mnt/root proc root sbin sys
نودهای دستگاه جنتو
بیشتر چیزهایی که در initramfs انجام میدهید٬ نیازمند یک دوجین از نودهای دستگاه هستند٬ خصوصا دستگاههای پارتیشن ریشه لینوکس جنتویتان. در سراسر این متن /dev/sda1 به عنوان پارتیشن کاربر ریشه مورد مثال قرار میگیرد. نودهای دستگاه مورد نیازتان را کپی نمایید٬ دستگاههایی که برای استفاده از آنها درحال نصب initramfs هستید. دستور را وابسته به نیازهای خودتان اصلاح نمایید.
cp -a /dev/{null,console,tty,sda1} /usr/src/initramfs/dev/
برنامهها
هر باینری که بخواهید در هنگام راهاندازی اجرا شود نیاز دارد در initramfs کپی شود. همچنین همه کتابخانههایی هم که در این باینری لازم دارد باید کپی شوند. برای آنکه ببینید چه باینری چه کتابخانههایی را لازم دارد٬ از ldd استفاده نمایید. مثال زیر نشان میدهد که برنامه app-text/nano به چه کتابخانههایی نیاز دارد. این ابزار ویرایشگر متنی است که در لوح فشردههای نصب جنتو لینوکس به عنوان ویرایشگر متن پیشفرض مورد استفاده قرار میگیرد:
ldd /usr/bin/nano
linux-gate.so.1 => (0xb7f8a000)
libncursesw.so.5 => /lib/libncursesw.so.5 (0xb7f2e000)
libc.so.6 => /lib/libc.so.6 (0xb7dbb000)
/lib/ld-linux.so.2 (0xb7f8b000)
در اینجا شما آنچه را app-text/nano لازم دارد تا در initramfs دستگاه جنتوی ما کار نماید را مشاهده میکنید. نه تنها لازم است تا /usr/bin/nano در /usr/src/initramfs/bin کپی شود٬ بلکه /lib/libncursesw.so.5 و /lib/libc.so.6 و lib/ld-linux.so.2 هم باید به /usr/src/initramfs/lib کپی شوند. توجه نمایید که نیازی به linux-gate.so.1 نیست.
افزون بر آن ممکن است برخی برنامهها وابسته به برنامههای دیگری باشند که آنها برای کارکرد صحیح نیاز به کتابخانههائی داشته باشند. برای نمونه app-text/nano یک فایل terminfo نیاز دارد: از بسته ncurses فایل /usr/share/terminfo/l/linux که باید به initramfs شما کپی شود. برای یافتن چنین وابستگیهائی ابزارهائی مانند equerry و strace میتوانند کمکهای مفیدی باشند.
Busybox
بجای گردآوری تعداد بیشماری از ابزارها و کتابخانهها (که هرگز پایان آنها را نخواهید دید) ٬ میتوانید بسادگی از sys-apps/busybox استفاده نمایید. این دستهائی از ابزاهای سودمند و قابل جایگزاری در دستگاه است. این بسته شامل یک شل٬ ابزارهای مفیدی مانند ls و mkdir و cp و mount و insmod و بسیاری ابزارهای مفید دیگر است که در بستهائی به نام /bin/busybox گردآوری شدهاند. برای اینکه busybox در یک initramfs بخوبی کار کند٬ ابتدا لازم است تا sys-apps/busybox را با پرچمک USE فعال شده static امرژ (emerge) نمایید. پس از آن /bin/busybox را درون initramfs خودتان در دایرکتوری /usr/scr/initramfs/bin/bysybox به عنوان یک لایه کپی نمایید:
نکته: بدون پرچمک USE فعال static ممکن است bustbox پایدار شما به عنوان /bin/bb خوانده شود. با ldd بررسی نمایید که در حال کپی نمودن یک busybox پایدار باشید.
USE="static -pam -savedconfig" emerge -av busybox
cp -a /bin/busybox /usr/src/initramfs/bin/busybox
init
ساختار initramfs شما تقریبا کامل است. تنها چیزی که کم دارد /init است. فایل اجرائی در ریشه initramfs که به مجردی که کرنل جنتو لود شد ٬ اجرا میشود. از آنجا که sys-apps/busybox یک شل کاملا کاربردی در خود دارد میتوانید /init خود را به عنوان کد قابل اجرا در شل بنویسید (بجای اینکه پیچیدگیهای نوشتن آن با اسمبلی و یا C را تحمل نموده و آنرا کامپایل نمایید).
نمونه زیر کد کوتاهی از /init است که به عنوان کد قابل اجرا در شل نوشته شدهاست:
File: /usr/src/initramfs/init
#!/bin/busybox sh
# Mount the /proc and /sys filesystems.
mount -t proc none /proc
mount -t sysfs none /sys
# Do your stuff here.
echo "This script mounts rootfs and boots it up, nothing more!"
# Mount the root filesystem.
mount -o ro /dev/sda1 /mnt/root
# Clean up.
umount /proc
umount /sys
# Boot the real thing.
exec switch_root /mnt/root /sbin/init
این نمونه برخی نودهای دستگاه جنتو را خصوصا دستگاههای ریشه را برای کارکردن نیاز دارد. کد را تغییر دهید و فایل متناظر در /dev دستگاه جنتوی خودتان را بکار بندید تا با نیازهای شما سازگار شود.
در آخر /init را قابل اجرا نمایید:
chmod +x /usr/src/initramfs/init
بسته بندی initramfs
بسته initramfs شما اکنون آماده است تا در ابتدای لود شدن کرنل راهاندازی شود. اینکار با بستهبندی شدن و فشردهسازی با آرشیو cpio انجام میشود. پس از آن این آرشیو مستقیما در تصویر کرنل لینوکس جنتوی شما جایگزاری میشود و یا به عنوان یک فایل جداگانه به همراه کرنل جنتو نگهداری میشود که در هنگام راهاندازی توسط گراب ( grub یا راه انداز مورد علاقه شما) در هنگامه مراحل راهاندازی جنتو ٬ لود میگردد. هر دو روش بخوبی یکدیگر کار میکنند و انتخاب هر کدام کاملا وابسته به انتخاب شماست. حتما فراموش نکردهاید که جنتو همهاش درباره انتخابهاست.
پیکربندی در کرنل
در این روش لازم است تا گزینه زیر را در هنگام پیکربندی کرنل جنتو فعال نمایید:
General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
جایگزاری در داخل کرنل
اگر میخواهید initramfs در داخل تصویر کرنل جنتو قرار بگیرد٬ فایل پیکربندی کرنل خود را ویرایش نمایید و (برای مثال ما ) /usr/scr/initramfs را در آن تعریف نمایید:
General setup --->
(/usr/src/initramfs) Initramfs source file(s)
اکنون هنگامی که کرنل جنتوی خودتان را کامپایل مینمایید٬ بسته شما بطور خودکار به آرشیو cpio افزوده شده و در تصویر کرنل جایگزاری میگردد. لازم است تا هر موقع تغییری در initramfs خود میدهید٬ مجددا کرنلتان را کامپایل نمایید.
ایجاد یک فایل جداگانه
میتوانید با اجرای دستور زیر یک فایل آرشیو جداگانه ایجاد نمایید:
cd /usr/src/initramfs
find . -print0 | cpio --null -ov --format=newc | gzip -9 > /boot/my-initramfs.cpio.gz
این دستور فایلی با نام my-initramfs.cpio.gz در دایرکتوری /boot شما ایجاد مینماید. اکنون لازم است تا گراب را تنظیم نمایید تا در هنگام راهاندازی دستگاه این فایل را راهاندازی نماید. این کار را با یک خط initrd انجام دهید:
File: /boot/grub/grub.conf
title=My Linux
root (hd0,0)
kernel /boot/my-kernel
initrd /boot/my-initramfs.cpio.gz
نکته: اگر از grub-mkconfig استفاده میکنید که از کدهای گراب ۲ است و میخواهید initramfs ساخته شده توسط آن شناسائی شود٬ فایل /etc/grub.d/10_linux را برای ویرایش باز نموده و به دنبال خط initrd = بگردید. در این خط فهرستی از همه initramfs های قابل شناسائی وجود دارد. به سادگی شما هم نام initramfs.cpio.gz را به آن بیافزایید.
سرانجام
میتوانید اکنون دستگاه خود را راهاندازی مجدد نمایید (reboot). کرنل جنتو فایلهای شما را از initramfs بازگشائی نموده و /init شما را اجرا مینماید و پس از آن وابسته به توزیع لینوکس شما ادامه کارها را انجام میدهد. گفتم جنتو بسیار ساده است.
این متن برگردانی خلاصه شده از پایگاه gentoo-en است. متن کامل و به زبان اصلی را می توانید در همان پایگاه مطالعه فرمایید.
دست شما درد نکنه. مطلب مفید و آموزندهای بود.
چند ماهی پیش با خوندن وبلاگتون تصمیم به نصب جنتو گرفتم و الان هم توزیع اصلیام شده :)
درود به شما!
بقول فضیل عیار: همین یک کلام من را از هزار دستمریزاد به!
ممنونم از لطف شما!