X
تبلیغات
رایتل
آموزش نصب و کار با سیستم عامل جنتو Gentoo OS

تهیه و تدوین initramfs در لینوکس جنتو

سه‌شنبه 17 تیر‌ماه سال 1393 ساعت 10:27 ق.ظ

قسمتهائی از سیستم عامل لینوکس و توزیع جنتو وجود دارد که کمتر کاربر لینوکسی (بجز لری گاوه) با آنها دست و پنجه نرم می‌کند.  بسته initramfs یکی از این دسته بخش‌هاست که همه کاربران لینوکس و بخصوص جنتو کاران آن را دیده‌اند اما شاید هیچوقت به آن توجه نکرده باشند. این مقاله توضیحات به نظر من خوبی در این باره است که درباره این فایل در جنتو لینوکس صحبت می‌کند اما در دیگر توزیع‌های لینوکس هم کار بر همین منوال است. تا چه قبول افتد و چه در نظر آید.

 
  
 بسته Initramfs یک فایل سیستمی کاربر ریشه است که در کرنل لینوکس و خصوصا توزیع جنتو جاسازی شده‌است و در اولین مراحل پروسه راه‌اندازی لود می‌گردد. در واقع این پروسه دسترسی به initrd را ممکن می‌سازد. این فایل یک محیط کاربری پیش‌از موعد فراهم می‌آورد که می‌تواند کارهائی را انجام دهد که خود کرنل لینوکس و خصوصا توزیع جنتو به تنهائی نمی‌تواند آنها را در مراحل راه‌اندازی ٬ انجام دهد.

استفاده از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 است. متن کامل و به زبان اصلی را می توانید در همان پایگاه مطالعه فرمایید.