امیرحسین کریم پور
مدیر ارشد توسینسو و متخصص سرویس های مایکروسافت

درک مفهوم و نحوه کار initrd و initramfs در فرآیند بوت شدن لینوکس

واقعیت اینه که توی لینوکس initrd و initramfs از روش های متفاوتی برای بارگزاری Root filesystem موقتی توی حافظه RAM برای Boot شدن کامل سیستم استفاده می کنن. خوب همونطور که احتمالا بهتر از من میدونید ما به وجود initrd یا initramfs نیاز داریم تا kernel بتونه بصورت موفق توی حافظه اصلی سیستم یا همون RAM بارگزاری بشه و Root filesystem اصلی از RAM بتونه روی هارد دیسک مون mount یا قابل استفاده بشه. ما تو این مقاله میخوایم که این دو تا موضوع رو زیر ذره بین ببریم و تفاوت ، وجه تشابه و نحوه کارشون رو براتون توضیح بدیم.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

initrd چیه و چطوری کار می کنه ؟

initrd به ما این اجازه رو میده که RAM disk رو بوسیله Boot Loader توی حافظه RAM بارگزاری یا load کنیم. و RAM disk ای که توی RAM نشسته رو به عنوان فایل سیستم روت mount کنیم و برنامه های مختلف رو از توش اجرا کنیم. در ضمن ما میتونیم initrd رو از توی یه دستگاه دیگه (حتی تو بستر شبکه) mount کنیم و به Boot Loader بگیم که initrd root رو به انتقال بده به یه دایرکتوری جدید تا initrd root قبلی رو بتونیم unmount کنیم. 

به زبان ساده میخوام بگم ، هدف اصلی از طراحی initrd اینه که وقتی سیستم بالا اومد دو تا چیز اتفاق بیافته تا سیستم بتونه به حالت عملیاتی دربیاد تا ما بتونیم ازش استفاده کنیم. اول اینکه kernel بیاد یه سری درایور های مهم compile شده توی خودش رو توی حافظه RAM بارگزاری کنه و دوم اینکه module های اضافی ای که همراهش هست رو هم load می کنه تا ما بتونیم در صورت نیاز ازشون استفاده کنیم.

نکته : داخل پرانتز میگم اینم گوشه ذهن تون داشته باشید که initrd منسوخ شده و تو لینوکس های جدید داره از initramfs استفاده میشه. ولی شما باید تفاوت بین این دو تا بدونید چون مهمه.

initrd معمولا به عنوان Block Device توی سیستم شناخته میشه و complie کردنش توی کرنل نیازمند این هستش که از فایل سیستم هایی مثل ext 2 , ext 3 یا ext4 استفاده کنیم. 

نکته : برای اینکه کرنل بتونه با موفقیت فایل سیستمی که initrd ازش استفاده می کنه رو شناسایی کنه باید حداقل یه module بصورت built-in توی خودش داشته باشه تا بتونه این کار رو انجام بده. 

حالا ببینیم initrd چطوری فرآیند بوت شدن سیستم رو بدست میگیره ...

1. Bootloader کرنل و RAM disk اولیه رو روی حافظه اصلی سیستم load می کنه.

2. کرنل initrd رو به RAM disk تبدیل می کنه. و در ادامه حافظه ای که توسط initrd توی RAM اشغال شده بود رو پاک می کنه.

3. کرنل میگرده پی root device ای که تو مسیر dev/ram0/ هستش. و اگه پیداش نکنه میره سراغ کار change_root.

4. اگه توی دایرکتوری dev/ram0/ پیداش کرد به عنوان Root filesystem روی هارد دیسک یا هر storage device ای که براش مشخص کردید mount می کنه. 

5. پراسس Init میاد و Root Filesystem اصلی یا همون ریشه رو load می کنه و بوسیله pivot_root System Call توی دایرکتوری قرار میده.

6. init در این مرحله sbin/init/ رو روی فایل سیستم روت اجرا می کنه و مراحل عادی بوت ادامه پیدا می کنه.

7. و در آخر initrd file system از روی سیستم برداشته میشه.


initramfs چیه و چطوری کار می کنه ؟

initramfs یه فایل آرشیو شده از فایل سیستم اولیه با پسوند cpio هست که توی حافظه RAM بارگزاری میشه. ولی نکتش اینجاست که این load شدن بعد از بدست گرفتن سیستم توسط Kernel و قبل از شروع شدن پروسه init و اجرا شدن سرویس های سیستم هست. بعبارت دیگه initramfs بین user space و kernel space کارش تعریف میشه. این نکته رو مهم رو تو ذهنتون داشته باشید که محتویات initramfs به عنوان Root filesystem اولیه قبل از load شدن Root filesystem اصلی load میشه. محتویات Root filesystem اولیه شامل فایل هایی هست که برای load کردن Root filesystem اصلی سیستم و آغاز به کار سخت افزار های سیستم مورد استفاده قرار میگیره. این فایل ها عمدتا همون kernel module ها هستن. initramfs همینطور به kernel این امکان رو میده تا از یه RAM filesystem جداگونه module ها رو load کنه. که این امکان رو هم فراهم می کنه تا Root filesystem اصلی رو بتونیم از یه فایل سیستم یا storage device دیگه load کنیم توی حافظه RAM. خوب الان توضیح دادیم که initramfs چیه حالا بریم ببینیم initramfs چجوری کار می کنه.

همونطور که تو بالا هم خدمتتون گفتیم initramfs معمولا به صورت یه فایل فشره با پسوند cpio توی لینوکس گذاشته شده. زمانیکه سیستم بوت میشه میاد بالا kernel فرآیند زیر رو انجام میده :

1. اگه فایل initramfs مون بصورت compressed یا فشرده بود kernel اونو از حالت فشرده خارج می کنه و داده های microcode ای اونو توی CPU بارگزاری می کنه.

2. اگه فایل initramfs مون بصورت فشرده سازی شده نبود kernel باهاش کاری نداره و اونو همونجوری به عنوان یه initramfs ساده در نظر میگیره.

3. در ادامه میاد این initramfs ساده رو باز می کنه و به عنوان یه cpio archive file فشرده توی RAM disk میزارتش.

خوب شما شاید بپرسید که مزیت initramfs نسبت به initrd چیه ؟ جواب اینه که از اونجا که initramfs خیلی از کاراش تو محیط user space انجام میشه پس این این نوید رو به میده که بتونیم فرآیند بوت شدن سیستم رو بدون patch کردن kernel و دردسر های کار با kernel-space code ها به راحتی با تغییر user-space code ها و ارتباط با system call ها سفارشی سازی کنیم. 

تفاوت initrd و initramfs 

initrd برای kernel های نسخه 2.4 و پایین تر استفاده میشد ولی initramfs واسه kernel های 2.6 به بعد اومد. کامپایل کردن initrd توی kernel حداقل به یه دونه فایل سیستم درایور نیاز داره که این خیلی تو سرعت و انعطاف پذیری بوت شدن سیستم تاثیر مثبتی داره و از لحاظ اشغال حافظه هم برای سیستم خوبه. initramfs هم مهمترین مزیتش نسبت به initrd ماژولار بودنشه. یعنی ما میتونیم یه آرشیو از فایل هایی که نیاز داریم رو بسازیم تا kernel از اونا بتونه استفاده کنه و سیستم رو بالا بیاره. امیدوارم مورد توجه تون قرار گرفته باشه.


امیرحسین کریم پور
امیرحسین کریم پور

مدیر ارشد توسینسو و متخصص سرویس های مایکروسافت

امیرحسین کریم پور ، مدیر ارشد توسینسو ، متخصص در حوزه سیستم عامل های کلاینت و سرور مایکروسافت و سرویس های مربوطه ، سیستم عامل لینوکس ، مجازی سازی و ... سابقه کار با سازمان ها و شرکت های مختلف در زمینه سرویس های مایکروسافت در قالب پروژه ، مشاوره و آموزش. علاقه مند به حوزه امنیت اطلاعات و تست نفوذ سنجی

نظرات