• ما سیستم عامل خود را بر اساس لینوکس می سازیم. چگونه از ابتدا سیستم عامل خود را بسازیم

    ایلیا الکساندروف

    ما سیستم عامل خود را روی آن ایجاد می کنیم مبتنی بر لینوکس

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

    در طول سال ها کار با لینوکس، من از تعداد زیادی توزیع مختلف استفاده کرده ام: Mandriva، Fedora، SlackWare، Debian، Ubuntu و بسیاری دیگر. برخی از پروژه ها را بیشتر دوست داشتم، برخی را کمتر. اما در همه توزیع ها، ناگزیر باید با کاستی های جدی دست و پنجه نرم کرد که کار را بسیار دشوار می کرد. یکی بیش از حد به منابع نیاز دارد، دیگری همه چیز را پشتیبانی نمی کند تجهیزات لازم، سومی فاقد نرم افزارهای مختلف است. آن وقت بود که به یاد حکمت معروف شرقی افتادم: اگر لازم است کاری را به خوبی انجام دهی، خودت انجامش بده.

    لینوکس از ابتدا

    من تنها کسی نیستم که تصمیم گرفتم نسخه لینوکس خود را شروع کنم - سیستم عاملی که در آن قسمت پایه سیستم و هسته به عنوان پایه در نظر گرفته می شود، اما در آن حتی یک کیلوبایت اضافی از لینوکس وجود نخواهد داشت. توسعه دهنده، یعنی از طرف شما. تعداد زیادی ازتوزیع‌های لینوکس که نیازهای کاربران را برآورده نمی‌کنند، جرارد بیکمنز را بر آن داشت تا یک کیت توزیع ایجاد کند که همه را قادر می‌سازد تا سیستمی را تنها با اجزا و عملکردهای مورد نیاز خود بسازند.

    میل یک برنامه نویس با استعداد منجر به پروژه Linux from Scratch (www.linuxfromscratch.org) شد که به اختصار LFS نامیده می شود. این پروژه به شما اجازه می دهد تا از ابتدا، از کدهای منبع، سیستم عامل مبتنی بر لینوکس خود را بسازید. کامپایل LFS روی رایانه ای با سیستم لینوکس از قبل نصب شده انجام می شود، با این حال، یک Live-CD "پیشرفته" مانند Knoppix نیز مناسب است.

    در عین حال، سیستم لینوکس مورد استفاده برای مونتاژ می تواند هر گونه باشد - فقط وجود یک کامپایلر و کتابخانه های سیستم. Linux From Scratch را به سختی می توان یک توزیع به معنای معمول کلمه نامید - چیزی شبیه نرم افزار کمکی است که همراه با بخش اصلی سیستم عامل به شما امکان می دهد نسخه منحصر به فرد خود را از سیستم عامل ایجاد کنید.

    همانطور که می دانید لینوس توروالدز سیستم عامل خود را با شعار "فقط برای سرگرمی!" - یعنی فقط برای سرگرمی. باید اعتراف کرد که LFS واقعاً اغلب در سرورها یافت نمی شود ، به عنوان یک قاعده ، علاقه مندان به رایانه از این سیستم استفاده می کنند. نصب و کار با لینوکس از ابتدا به شما کمک می کند تا رابطه بین اجزای سیستم عامل را درک کنید، که برای توسعه یک توزیع لینوکس و نه تنها بر اساس LFS مفید است. بنابراین، LFS تا حد زیادی برای افرادی طراحی شده است که فرآیند ساخت توزیع خود برای آنها هیجان انگیز و جالب است - و باور کنید، چنین افرادی زیادی وجود دارند.

    بنابراین، اگر آماده هستید یک روز کامل (یا حتی بیشتر) را برای طراحی سیستم صرف کنید، توصیه می کنم از سایت (2) LFS-packages-6.0، LFS-book دانلود کنید و به خواندن این مقاله ادامه دهید.

    پارتیشن بندی دیسک و ایجاد درخت دایرکتوری

    برای درک بهتر مواد، کل دوره فرآیند را به صورت کلی توصیف می کنیم (شکل 1 را ببینید).

    در مرحله اول، با استفاده از یک کیت توزیع از قبل نصب شده یا LiveCD، دیسک شکسته می شود. یک پارتیشن بر روی هارد دیسک اختصاص داده شده است سیستم جدید. پس از آن، در این پارتیشن، باید تمام برنامه های لازم و هسته سیستم را به صورت استاتیک کامپایل کنید. سپس دایرکتوری ریشه به یک پارتیشن تغییر می کند هارد دیسکبه سیستم عامل جدید ما اختصاص داده شده است. شما باید کامپایل را تکرار کنید، اما این بار نرم افزار باید به صورت پویا ساخته شود (تفاوت بین کامپایل پویا و استاتیک در زیر توضیح داده خواهد شد). آخرین مرحله شامل ساخت کتابخانه حیاتی glibc و پیکربندی سیستم عامل نصب شده است. همانطور که می بینید، لازم نیست کار خاصی انجام دهید.

    در طول فرآیند، دستیار اصلی شما مستندات بسته کتاب LFS است که ترجمه روسی آن را می‌توانید در اینجا بیابید: http://multilinux.sakh.com/download/lfsbook.tar.bz2. کتاب جزئیات هر مرحله از ایجاد یک سیستم عامل را نشان می دهد، بنابراین در صورت مواجهه با مشکلات، حتماً به این راهنما مراجعه کنید (این مقاله برای جایگزینی چنین اسناد گسترده ای در نظر گرفته نشده است).

    ما ایجاد می کنیم بخش جدید- در مورد من /dev/hda5 است، زیرا پارتیشن /dev/hda1 قبلاً توسط پارتیشن نصب شده در اشغال شده است. HDD Slackware لینوکس. توصیه می شود ابتدا از سیستم یک نسخه پشتیبان تهیه کنید تا در صورت آسیب بتوانید آن را بازیابی کنید، البته احتمال این امر نزدیک به صفر است. و در اینجا، فکر می کنم، همه چیز واضح است: ما مقدار مورد نیاز (23 گیگابایت کافی است) را برای دایرکتوری ریشه اختصاص می دهیم، فضایی معادل دو برابر مقدار رم برای پارتیشن swap، در صورت تمایل، می توانید پارتیشن های جداگانه ای برای فهرست خانه (/ home) و برای / بوت. با این حال، گزینه پارتیشن بندی مورد علاقه بسیاری - تخصیص تمام فضای موجود منهای swap به دایرکتوری ریشه و سپس ایجاد مبادله واقعی - هنگام ساخت LFS نیز کاملاً قابل قبول است. در رایانه نویسنده، هم Linux Slackware که سیستم عامل اصلی است و هم LFS از یک هارد دیسک استفاده می کنند، با این حال، نصب LFS بر روی هارد دیسک دیگر نیز دشوار نیست.

    سیستم فایل را به صلاحدید خود انتخاب کنید: هیچ مشکلی با Ext3 و ReiserFS تحت LFS وجود ندارد. اما طرفداران XFS باید ناامید شوند - تلاش ها برای استفاده از Linux From Scratch برای کار با این FS موفقیت آمیز نبوده است.

    اکنون پارتیشن رزرو شده برای سیستم عامل جدید را سوار می کنیم:

    $ mount /dev/hda5 /mnt/mylin

    برای راحتی، اجازه دهید متغیر MYLIN را تعریف کنیم:

    $ صادرات MYLIN=/mnt/mylin

    عالی است، برای کار بیشتر بهتر است ایجاد کنید کاربر فردی mylin که صاحب پارتیشن نصب شده را به آن اختصاص می دهیم.

    $ useradd mylin

    $ chown -R mylin $MYLIN

    شما باید یک درخت دایرکتوری در ریشه پارتیشن جدید ایجاد کنید:

    $ سی دی $MYLIN

    $ mkdir –p bin boot dev و غیره home lib mnt opt ​​root sbin usr/(X11R6,local) var

    در دایرکتوری های usr, usr/X11R6, usr/local ما ساختار لازم را ایجاد می کنیم: زیر شاخه ها bin و غیره شامل، lib، sbin، share، src.

    سپس همین کار را برای دایرکتوری های /var و /opt انجام خواهیم داد سیستم آینده:

    $ mkdir var/(cache,lib,local,lock,log,opt,run,spool)

    $ mkdir opt/(bin,doc,include,info,lib,man)

    فراموش نکنیم که سلسله مراتب عمیق تری مانند /usr/share/man/man1 وجود دارد. اما حجم مقاله اجازه نمی دهد در اینجا تمام اطلاعات مربوط به ساختار درخت فایل ارائه شود، بنابراین باید از سند استاندارد سلسله مراتبی سیستم فایل (موجود در: http://linux-ve.net/MyLDP/) استفاده کنید. file-sys/fhs-2.2-rus)، یا ساختار سیستم عامل خانواده لینوکس را که قبلاً نصب کرده اید به دقت مطالعه کنید. بعد از تمرین سختدیسک، ما به مونتاژ استاتیک می رویم.

    مونتاژ استاتیک

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

    اما هنگامی که از دستور chroot برای تنظیم دایرکتوری ریشه برای سیستم تازه اسمبل شده استفاده می کنیم، کتابخانه های "والد"، سیستم نصب شده، واقع در / lib، / usr / lib و سایر موارد، دیگر در دسترس نخواهند بود، بنابراین به صورت پویا برنامه های کامپایل شده از کار کردن خودداری می کنند، علاوه بر این، سازگاری نسخه توسط هیچ کس تضمین نشده است.

    برای جلوگیری از این، همه شما نیاز دارید نرم افزاربرای سیستم آینده خود، ابتدا آن را به صورت ایستا کامپایل می کنیم. بیایید با شاید شروع کنیم مترجم فرمانضربه شدید. (طرفداران ZSH یا TCSH می توانند مفسرهای مورد علاقه خود را پس از نصب سیستم نصب کنند، اما استفاده از آنها در مرحله ساخت توسط نویسنده LFS در نظر گرفته نشده است). باید بررسی کنید که آیا فایل /usr/lib/libcurses.a را دارید یا خیر و اگر نه، بسته ncursesdev را نصب کنید. همه بسته‌ها باید با پرچم‌های ساخت استاتیک ساخته شوند: "--enable-static-link"، "--disable-shared"، یا "--static". کدام یک مناسب هر کدام است مورد خاص، را می توان در مستندات یک بسته خاص یا از خروجی یک اسکریپت پیکربندی اجرا شده با گزینه "--help" یافت.

    $ ./configure --help

    برای اینکه برنامه های کامپایل شده بعدی را با برنامه های "دینامیک" اشتباه نگیریم، یک دایرکتوری ویژه برای آنها ایجاد می کنیم:

    $ mkdir $MYLIN/stat

    هنگام ساخت و نصب بسته ها، فراموش نکنید که پارامتر "--prefix=$MYLIN/stat" را برای انتقال فایل ها به این دایرکتوری اضافه کنید. و در نهایت، bash را نصب کنید:

    $ ./configure --enable-static-link --prefix=$MYLIN/stat

    $ساخت

    $ را نصب کنید

    مابقی بسته های لازم را نیز به همین ترتیب جمع آوری می کنیم. : binutils، bzip2، textutils، texinfo، tar، sh-utils، gcc، grep، gzip، gawk، diffutils، fileutils، make، patch، sed،و در واقع لینوکس کرنل.

    بله، هنگام کامپایل کرنل، فراموش نکنید که برای نسخه های کرنل قدیمی (2.2.x-2.4.x) باید از gcc 2.95 استفاده کنید و برای نسخه فعلی 2.6.x توصیه می شود از gcc 3.x استفاده کنید تا هیچ مشکلی وجود ندارد

    فراموش نکنید که به بخش های مربوطه کتاب LFS نگاه کنید، در مورد این و بسیاری از تفاوت های ظریف دیگر می گوید. به طور کلی، کامپایل کردن هسته در LFS با روش مشابهی که هنگام استفاده از کیت توزیع نصب شده بر روی HDD انجام می شود، تفاوتی ندارد. منبع هسته را در $MYLIN/usr/src/linux-2.6.xx از حالت فشرده خارج کنید، سپس با اجرای آن پیکربندی کنید:

    $ make menuconfig

    فرآیند پیکربندی پارامترهای هسته بارها در اینترنت توضیح داده شده است (6)، به سختی نیازی به پرداختن به جزئیات بیشتر در این مورد نیست. بعد، دستورات زیر را در پوشه منبع Linux-kernel می دهیم:

    $ ساخت bzImage

    $ ساخت ماژول

    همه چیز، در $MYLIN/usr/src/linux-2.6.xx/arch/i386/boot/bzImage هسته جدید است.

    بعد، ما $MYLIN/etc/passwd و $MYLIN/etc/group را ایجاد می کنیم. در اول، ما تنها کاربر را تا کنون ثبت می کنیم - root با هر رمز عبور، و در دوم، گروه های کاربری (برای شروع با یک گروه ریشه نیز کافی است).

    این کار آماده سازی ما را برای مرحله بعدی تکمیل می کند و به مونتاژ پویا ظریف تری می رویم.

    مونتاژ دینامیک

    اکنون باید دایرکتوری ریشه را به /mnt/mylin تغییر دهیم، جایی که فقط از ابزارهای کامپایل شده استاتیک استفاده خواهیم کرد - دیگر نمی توانیم به کمک ابزارهای سیستم عامل "والد" متوسل شویم. دستور را در کنسول می دهیم:

    $ chroot $MYLIN/usr/bin/env -i

    >HOME=/root TERM=$TERM PS1='u:w$'

    >PATH=/bin: /usr/bin: /sbin: /usr/sbin: /stat/sbin

    >/stat/bin/bash --ورود به سیستم

    با این دستور مسیرهای فایل های اجرایی، نوع ترمینال، مفسر و نوع خط فرمان را مشخص کردیم.

    برای اینکه برخی از برنامه ها کار کنند، باید فایل سیستم proc را روی سیستم جدید نصب کنید.

    $ mount proc /proc -t proc

    حساس ترین لحظه فرا رسیده است. ساخت کتابخانه glibc او مسئول ترین است زیرا اکثر مردم بدون او کار می کنند. برنامه های لازماین کار را نخواهد کرد و استفاده از لینوکس بدون کتابخانه هسته هیچ فایده ای ندارد. از طرف دیگر ساختن glibc اغلب مشکلات زیادی را ایجاد می کند.

    هنگام ساخت، ما پارامتر "--prefix=$MYLIN/stat" را مشخص کردیم، بنابراین هنگام تغییر ریشه، تمام بسته های استاتیک ساخته شده در فهرست /stat پارتیشن جدید سیستم عامل قرار می گیرند.

    بنابراین، آرشیو glibc-2.x.x.tar.gz را باز کنید (مثلاً در پوشه /usr/src/) و به دایرکتوری glibclinuxthreads بروید. ما باید کد منبع را کمی تغییر دهیم زیرا این مرحلهشناسایی یک کاربر با نام در سیستم غیرممکن است (فقط به دلیل عدم وجود glibc و سایر کتابخانه ها) و این واقعیت که نصب glibc به مفسر Perl نیاز دارد که ما آن را نداریم.

    نام کاربری ریشه در login/Makefile را با uid آن، یعنی 0 جایگزین می کنیم، و متغیر $PERL در malloc/Makefile باید با مسیر مفسر - /usr/bin/perl - جایگزین شود و به سادگی این کار را انجام می دهد. در طول پیکربندی نادیده گرفته شود.

    $ /usr/src/glibc-2.x.x/configure --prefix=/usr --enable-add-ons --libexecdir=/usr/bin &&

    & درست کن

    و نصب کنید

    $ make localedata/install-locales

    $ /stat/bash --login

    اگر همه کارها را به درستی انجام داده باشید، glibc کامپایل می شود، "root" در نهایت در اعلان ظاهر می شود و همه برنامه ها را می توان به صورت پویا دوباره کامپایل کرد.

    نصب کرنل را تمام کنید:

    $ make modules_install

    $ را نصب کنید

    برای انتقال هسته جدید به پوشه /boot، یک دستور دیگر را اجرا کنید:

    $ را نصب کنید

    ما همه برنامه های نصب شده و برخی از برنامه های جدید را جمع آوری می کنیم، اکنون بدون پرچم های کامپایل ثابت. ما نیاز داریم (در این مرحله بسیار مهم است که کامپایل همه موارد زیر را فراموش نکنید) (جدول 1 را ببینید).

    جدول 1. مجموعه مورد نیاز از بسته ها برای مونتاژ

    تنظیم خودکار

    grep

    پرل

    خودروسازی

    groff

    ضربه شدید

    gzip

    procinfo

    bin86

    لوازم

    بینوتیل

    کمتر

    pmisc

    bzip2

    reiserfs-progs

    دیفیوتیل ها

    libtool

    e2fsprogs

    لیلو

    sh-utils

    سایه

    فایل

    ساختن

    syslogd

    fileutils

    makedev

    sysvinit

    یافته ها

    صفحات مرد

    خم شدن

    مدوتیل ها

    texinfo

    گاو

    نفرین می کند

    پارچه های پارچه ای

    netkitbase

    استفاده از لینوکس

    بیسون

    ابزارهای شبکه

    دریافت متن

    پچ

    پس از انجام کامپایل مجدد پویا، می توانید دایرکتوری را با بسته های ایستا ساخته شده حذف کنید:

    $ rm -rf /stat

    می توانید نفس راحتی بکشید و قهوه بنوشید - سخت ترین و روتین پشت سر گذاشته می شود. بیایید به ادامه مطلب برویم گام بعدی- پیکربندی اولیه سیستم ما

    پیکربندی اولیه سیستم

    قبل از ادامه پیکربندی، توجه می کنم که تمام تغییرات باید در فایل های دایرکتوری سیستم عامل جدید انجام شود و نه سیستم پدر و مادر.

    برای تنظیم زمان سیستم، اجازه دهید فایل /etc/sysconfig/clock حاوی فقط یک خط ایجاد کنیم:

    UTC=0

    اکنون ساعت رایانه زمان را در منطقه زمانی شما نمایش می دهد - به شرطی که مقدار زمان در BIOS به درستی تنظیم شده باشد.

    بیایید یک نام به رایانه بدهیم:

    echo "HOSTNAME=my_linux" > /etc/sysconfig/network

    اکنون پارتیشن هایی را که سیستم باید در هنگام بوت در /etc/fstab mount کند را مشخص می کنیم:

    # گزینه های سیستم فایل mount-point fs-type dump fsck-order

    /dev/hda5 / ext3 پیش‌فرض 1 1

    /dev/hda3 swap swap pri=1 0 0

    proc /proc پیش‌فرض proc 0 0

    به جای /dev/hda3 و /dev/hda5 پارتیشن‌های خود را بنویسید (روت و مبادله)، در صورت لزوم فایل را با نقاط نصب برای سایر پارتیشن‌های هارد دیسک و CD-ROM تکمیل کنید.

    حالا بیایید سیستم خود را قابل بوت کنیم.

    اگر علاوه بر lFS از موارد دیگر استفاده کنید توزیع های لینوکس، اکنون باید وارد شوید سیستم قدیمی- برای این دستور را اجرا می کنیم:

    خروج $

    قبلاً در سیستم عامل والد، موارد زیر را به فایل /etc/lilo.conf اضافه کنید:

    # LFS

    image=/boot/bzImage

    برچسب = lfs

    ریشه =

    فقط خواندنی

    واضح است که "/boot/bzImage" مسیر هسته سیستمی است که شما کامپایل کرده اید، و "پارتیشن" پارتیشن دیسکی است که دایرکتوری ریشه در آن قرار دارد.

    اگر قصد استفاده از سیستم عامل های دیگر و توزیع های لینوکس را ندارید، بلافاصله اقدام به راه اندازی LILO در LFS کنید.

    در این مورد، lilo.conf چیزی شبیه به این خواهد بود:

    boot=/dev/hda

    تاخیر=40

    فشرده - جمع و جور

    Vga = عادی

    Root=/dev/hda1

    فقط خواندنی

    Image=/boot/zImage-2.6.12

    برچسب = لینوکس

    بسته به پیکربندی خود تغییرات لازم را انجام دهید. بوت لودر را با دستور زیر به روز کنید:

    $ /sbin/lilo -v

    و اگر تمام مراحل قبلی به درستی انجام شود، خود را در یک سیستم جدید خواهیم دید. با این حال، مرحله طولانی تنظیم "زیبا" (توجه ویژه باید به امنیت سیستم جدید شود، زیرا LFS به طور پیش فرض بسیار ناامن به نظر می رسد، مانند هر سیستم عامل تازه نصب شده) هنوز در پیش است. اما شما در حال حاضر نسخه کامپایل شده لینوکس خود را دارید.

    P.S

    جرارد بیکمنز تنها کسی نیست که ایده ساخت لینوکس خود را دارد. پروژه دیگری، BYOLinux، به رهبری جاناتان تورپ، امروز توسعه خود را متوقف کرده است، اگرچه مستندات نوشته شده توسط او حتی در حال حاضر نیز مرتبط است، اما به اندازه کتاب LFS دقیق نیست و به روسی ترجمه نشده است. تفاوت اصلی روش جان این است که کتابخانه glibc بدون کامپایل مجدد از سیستم والد به سیستم فرزند منتقل می شود، این کار چندان کارآمد نیست، اما از بسیاری از مشکلات ساخت جلوگیری می کند. برخی از کاربران FreeBSD نیز میل به احساس طراح سیستم عامل را دارند.

    اکنون این کاملا امکان پذیر است - در http://ezine.daemonnews.org/200302/fbsdscratch.html مقاله ای در مورد ساخت FreeBSD از منبع به طور کامل وجود دارد - از توزیع ها تا پورت ها، و با روشی که مشابه روش معمول نیست. بازسازی» سیستم، اما شبیه به روش جرارد بیکمنز. خوب، اکنون شما یک سیستم شخصی و منحصر به فرد دارید که بر روی لینوکس ساخته شده است. در صورت بروز مشکل، به دنبال راه حل آنها در کتاب LFS بگردید، همه چیز با جزئیات در آنجا توضیح داده شده است. من همچنین توصیه می کنم راهنمای مدیر شبکه لینوکس را از پورتال http://www.tldp.org دانلود کنید، اگرچه مستقیماً به LFS اعمال نمی شود، اما در مرحله پیکربندی سیستم مفید خواهد بود. فراموش نکنید که با هر برنامه صفحات مختلف man و info نیز ارائه می شود که همچنین برای آسان کردن زندگی یک کاربر لینوکس طراحی شده است.

    1. کتاب LFS به زبان روسی - http://multilinux.sakh.com/lfs.
    2. پورتال رسمی پروژه LFS http://www.linuxfromscratch.org است.
    3. پورتال ByoLinux - http://www.byolinux.org.
    4. مقاله درباره FreeBSD از ابتدا - http://ezine.daemonnews.org/200302/fbsdscratch.html.
    5. مقاله ای در مورد کامپایل هسته لینوکس - http://vikos.lrn.ru/MyLDP/kernel/kompil-2-6.html .
    6. Bairak A. مروری بر Knoppix 3.7 نسخه روسی. - مجله " مدیر سیستم"، شماره 3، مارس 2005 - 4-6 ص. ().

    کتاب سیستم عامل 0 تا 1 در GitHub منتشر شده است و بیش از 2000 ستاره و 100 فورک دارد. همانطور که از نام آن پیداست، پس از خواندن آن، می توانید سیستم عامل خود را ایجاد کنید - و شاید، چیزهای کمی در دنیای برنامه نویسان می توانند خنک تر باشند.

    از طریق این کتاب موارد زیر را خواهید آموخت:

    • نحوه ایجاد یک سیستم عامل بر اساس مستندات فنیغده. این روش در دنیای واقعی کار می کند، شما نمی توانید از گوگل برای پاسخ های سریع استفاده کنید.
    • درک نحوه تعامل اجزای کامپیوتر با یکدیگر، از نرم افزار گرفته تا سخت افزار.
    • یاد بگیرید که خودتان کد بنویسید. کپی کورکورانه کد یادگیری نیست، شما در واقع یاد خواهید گرفت که چگونه مشکلات را حل کنید. در ضمن کپی کورکورانه هم خطرناکه.
    • بر ابزارهای آشنا برای توسعه سطح پایین تسلط داشته باشید.
    • با زبان اسمبلی آشنا شوید.
    • ببینید از چه برنامه هایی ساخته شده اند و سیستم عامل چگونه آنها را اجرا می کند. ما یک نمای کلی از این موضوع را برای افراد کنجکاو ارائه کردیم.
    • یاد بگیرید که چگونه برنامه را مستقیماً روی سخت افزار با GDB و QEMU اشکال زدایی کنید.
    • زبان برنامه نویسی C. با دنبال کردن سریع می توانید به آن مسلط شوید.
    • دانش اولیه لینوکس. کافی است در وب سایت ما مطالعه کنید.
    • دانش پایه در فیزیک: اتم، الکترون، پروتون، نوترون، ولتاژ.
    • قانون اهم در مورد نسبت ولتاژ، جریان و مقاومت.

    کتاب تقریباً هر روز بهبود می‌یابد و ویرایش می‌شود: خودتان می‌توانید تغییراتی ایجاد کنید یا یک اشتباه تایپی را اصلاح کنید. سیستم عاملی که توسعه آن به عنوان "طرح" برای این کتاب عمل کرد،

    اصل: "اسباب بازی خود را UNIX-clone OS رول کن"
    نویسنده: جیمز مولوی
    تاریخ انتشار: 2008
    ترجمه: N.Romodanov
    تاریخ انتقال: ژانویه 2012

    این مجموعه آموزشی طراحی شده است تا نحوه برنامه ریزی یک سیستم عامل ساده شبیه به یونیکس را برای معماری x86 با جزئیات به شما نشان دهد. در این راهنماها، C به عنوان زبان برنامه نویسی انتخاب می شود که در صورت لزوم با زبان اسمبلی تکمیل می شود. هدف از آموزش ها این است که به شما در مورد طراحی و پیاده سازی راه حل های مورد استفاده در ساخت سیستم عامل سیستم عاملی که در حال ساخت یکپارچه ساختار هستیم (درایورها در حالت ماژول هسته بارگذاری می شوند، نه در حالت کاربر، همانطور که در مورد آن وجود دارد) به شما بگوید. با برنامه ها)، از آنجا که چنین راه حل ساده تر است.

    این مجموعه راهنما ماهیت بسیار کاربردی دارد. هر بخش اطلاعات نظری ارائه می دهد، اما بیشتر راهنما به اجرای ایده ها و مکانیسم های انتزاعی در نظر گرفته شده در عمل می پردازد. توجه به این نکته ضروری است که هسته به صورت آموزشی اجرا می شود. می‌دانم که الگوریتم‌های مورد استفاده نه کارآمدترین و نه بهینه‌ترین الگوریتم‌ها هستند. آنها عموما به دلیل سادگی و سهولت درک انتخاب شدند. هدف از این کار این است که ذهنیت درستی به شما بدهد و مبنایی برای کار کردن به شما ارائه دهد. این هسته قابل توسعه است و می توانید به راحتی بهترین الگوریتم ها را به آن وصل کنید. اگر با یک نظریه مشکل دارید، سایت های زیادی وجود دارند که می توانند به شما در کشف آن کمک کنند. بیشتر سؤالات مطرح شده در انجمن OSDev در مورد پیاده سازی است ("عملکرد من کار نمی کند! کمک!" هوای تازه. پیوندها را می توان در انتهای این مقدمه یافت.

    آماده سازی اولیه

    برای کامپایل و اجرای کد نمونه، حدس می‌زنم تنها چیزی که نیاز دارید GCC، ld، NASM و GNU Make است. NASM یک اسمبلر x86 منبع باز است. کد منبعو بسیاری از توسعه دهندگان سیستم عامل برای پلتفرم x86 آن را انتخاب می کنند.

    با این حال، اگر مثال ها را متوجه نشدید، صرفاً جمع آوری و اجرای آنها فایده ای ندارد. شما باید درک کنید که چه چیزی در حال کدگذاری است، و برای آن باید زبان C را به خوبی بدانید، به خصوص در مورد اشاره گرها. همچنین باید درک درستی از اسمبلر داشته باشید (این راهنماها از سینتکس اینتل استفاده می کنند)، از جمله اینکه ثبت EBP برای چه مواردی استفاده می شود.

    منابع

    اگر بدانید منابع زیادی وجود دارد چگونه به دنبال آنها بگردیم. به طور خاص، پیوندهای زیر برای شما مفید خواهد بود:

    • RTFM! کتابچه های راهنما اینتل یک نعمت الهی است.
    • صفحات ویکی و سایت انجمن osdev.org.
    • آموزش ها و مقالات خوب زیادی در Osdever.net وجود دارد و مخصوصاً آموزش های توسعه هسته بران که این آموزش بر اساس کدهای قبلی است. من خودم برای شروع از این آموزش ها استفاده کردم و کدهای موجود در آنها به قدری خوب بود که انجام دادم. آن را برای چند سال تغییر دهید.
    • اگر مبتدی نیستید، می توانید پاسخ بسیاری از سوالات را در گروه دریافت کنید

    اگر سر اصل مطلب بروید...

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

    سیستم عامل دیگری در صورت موجود بودن حافظه بلند مدت، باید دسترسی به آن را فراهم کند: یعنی تمام توابع را برای کار با آن فراهم کند سیستم فایل. حداقل است.

    تقریباً در همه جا، اولین کد بوت باید در اسمبلر نوشته شود - قوانین زیادی در مورد اینکه کجا باید باشد، چگونه باید باشد، چه کاری باید انجام دهد و اندازه آن نباید بیشتر شود وجود دارد.

    برای رایانه شخصی، باید یک بوت لودر روی asma بنویسید، که توسط BIOS فراخوانی می شود و بدون بیش از چهارصد بایت، باید کاری انجام دهد و سیستم عامل اصلی را شروع کند - کنترل را به کد اصلی منتقل کند، که در نزدیکی آینده را می توان از قبل به زبان C نوشت.

    برای ARM، باید یک جدول وقفه در asma ایجاد کنید (تنظیم مجدد، خطاهای مختلف، IRQ قطع می شود، FIQ و غیره) و کنترل را به کد اصلی منتقل کنید. اگرچه، در بسیاری از محیط‌های توسعه، چنین کدی تقریباً برای هر کنترل‌کننده‌ای موجود است.

    یعنی برای این امر لازم است:

    1. اسمبلر پلتفرم هدف را بشناسید.
    2. معماری پردازنده و انواع دستورات و رجیسترهای سرویس را بشناسید تا بتوانید آن را برای کار در آن پیکربندی کنید. حالت مورد نظر. در رایانه شخصی، این یک انتقال به یک حالت محافظت شده است، برای مثال، یا به یک حالت 64 بیتی ... در ARM، تنظیم ساعت های هسته و محیطی است.
    3. دقیقاً بدانید که سیستم عامل چگونه شروع می شود، کجا و چگونه باید کد خود را وارد کنید.
    4. برای دانستن زبان C - نوشتن یک کد بزرگ در asma بدون تجربه دشوار است، حفظ آن حتی دشوارتر خواهد بود. بنابراین لازم است که کرنل را به زبان C بنویسیم.
    5. بدانید سیستم عامل چگونه کار می کند. خوب، کتاب‌های زیادی به زبان روسی در این زمینه وجود دارد، اگرچه نمی‌دانم همه آنها خوب هستند یا نه.
    6. صبر و استقامت زیادی داشته باشید. اشتباهاتی وجود خواهد داشت و باید آنها را پیدا کرد و اصلاح کرد. و همچنین باید زیاد بخوانید.
    7. زمان زیاد و زیادی داشته باشید.

    به علاوه. فرض کنید چیزی نوشته اید. باید این مورد رو تست کرد یا به یک دستگاه فیزیکی نیاز دارید که آزمایش‌ها روی آن انجام شود (برد اشکال‌زدایی، رایانه دوم)، یا شبیه‌ساز آن. استفاده از دومی معمولا آسانتر و سریعتر است. برای کامپیوتر، به عنوان مثال، VMWare.

    در اینترنت هم مقالات کافی در این زمینه وجود دارد، اگر خوب جستجو کنید. و همچنین نمونه های زیادی از سیستم عامل آماده با کد منبع وجود دارد.

    حتی با یک تمایل شدید، حتی می توانید منابع هسته قدیمی سیستم های NT (ویندوز) را به طور جداگانه (که توسط میکرونرم افزار ارسال شده است، با نظرات و انواع مختلف مواد مرجع) و در ارتباط با همان منابع نگاه کنید. سیستم عامل های قدیمی (لو شده).

    دیر یا زود، هر کاربر لینوکس به ایجاد توزیع خود فکر می کند. برخی استدلال می کنند که شما می توانید "همه چیز را برای خودتان سفارشی کنید." دیگران شکایت دارند که در میان توزیع هایی که قبلاً در Vetka ارائه شده است، هیچ توزیع ایده آلی وجود ندارد. و آنها ظاهراً ایده های فوق مفهومی برای سیستم خود دارند. چرا این همه روانشناسی را شروع کردم؟ به منظور قطع فوری اکسیژن برای مبتدیانی که با لینوکس بازی می کنند و کاری ندارند. اگر از قبل به ایجاد یک سیستم عامل فکر می کنید، تا انتها فکر کنید. بنابراین،

    من می خواهم یک سیستم عامل مبتنی بر لینوکس ایجاد کنم.
    فوراً به شما هشدار می دهم: اگر قرن هجدهم بود، همه کسانی که کیت توزیع توسعه یافته دیگری (و خدای ناکرده محبوب ...) را برای اساس سیستم آینده خود انتخاب می کردند به دار آویخته می شدند. این پست در مورد ایجاد یک سیستم از ابتدا است که به معنی انواع Slax و لینوکس مینتما لمس نخواهیم کرد.

    مرحله 1: یک رسانه را انتخاب کنید
    گزینه های کمی وجود دارد: یا سیستم عامل شما از یک LiveCD شروع می شود، یا از یک هارد دیسک، یا از یک دستگاه فلش. من فوراً رزرو می کنم: در پست هیچ کلمه ای در مورد هارد دیسک نمی گویم، زیرا ایجاد یک کیت توزیع انعطاف پذیر از سری "من همه چیز را با خودم حمل می کنم" یا یک توزیع قفل شده بسیار راحت تر است. کیت در دیسک نوری. اگر یاد بگیرید که چگونه یک سیستم LiveCD یا LiveUSB ایجاد کنید، هیچ مشکلی برای نصب روی هارد دیسک وجود نخواهد داشت.

    در هر صورت یک فلش خالی، سی دی تهیه کنید و در نهایت Virtualbox را نصب کنید.

    مرحله 2 کامپایل کرنل
    با توجه به انتشار سومین هسته لینوکس، این مرحله توسعه بیشتر را تشویق می کند ... بنابراین، ما به منابع هسته نیاز داریم. هر کاربر می داند که آنها را می توان از kernel.org به دست آورد. به هیچ وجه، آیا می شنوید؟، هرگز یک هسته خارجی که توسط شما کامپایل نشده است را به سیستم خود وارد نکنید!

    از آنجایی که تنبلی من از مقیاس خارج شد، یک پوشه / لینوکس کرنل ایجاد کردم و آرشیو را با منابع موجود در آن باز کردم. با ورود به عنوان روت، موارد زیر را انجام دادم:

    سی دی /linuxkernel
    منوی پیکربندی را انجام دهید

    در اصل، هسته را می توان به سه روش پیکربندی کرد: پیکربندی (پیکربندی آنلاین)، منوکانفیگ (پیکربندی شبه گرافیکی از طریق ncurses) و xconfig (پیکربندی گرافیکی). نکته اصلی این است که make config برای مدت طولانی روحیه شما را خراب می کند، زیرا. او همه چیز را انجام خواهد داد سوالات احتمالیدر تمام جنبه های همه موضوعات مشکل make xconfig در همه یافت نمی شود، اما من ملاقات کرده ام و هنوز هم دارم. اگر دوست دارید این کار را از طریق X انجام دهید، خودتان آن را کشف کنید. بهترین گزینه- تنظیمات منو را ایجاد کنید. این مورد یک رابط شبه گرافیکی را برای شما باز می کند که از طریق آن می توانید هسته را به روش خود شخصی سازی کنید. این مورد به کتابخانه ncurses نیاز دارد که نصب آن آسان است.

    در اصل، اگر مغز شما اصلاً لینوکس را بفهمد، پیکربندی را متوجه خواهید شد. روند جالب است، واقعاً گزینه های زیادی وجود دارد و کمک می کند زبان انگلیسی، اما همچنان از دسترسی و سادگی آن راضی است.

    با این حال، شما هنوز باید هدایت شوید. به File Systems ---> بروید و ستاره های مورد نیاز را قرار دهید. حرف M به این معنی است که پشتیبانی از یک درایور خاص با اتصال یک ماژول خارجی به هسته انجام می شود (من از آنها متنفرم!). همچنین برای خواندن دیسک به پشتیبانی isofs نیاز داریم. سیستم های فایل ---> سیستم های فایل CD-ROM/DVD ---> CDROM ISO 9660 سیستم فایلحمایت کردن. هنوز هم می‌توانید از سیستم‌های dos قدیمی پشتیبانی کنید.

    توسعه دهندگان عجیب و غریب Mandriva فراموش کردند که به سیستم های فایل ---> فایل سیستم های فایل DOS/FAT/NT ---> NTFS پشتیبانی نوشتن اجازه دهند، و در یکی از توزیع های آنها من برای دسترسی به پارتیشن قدیمی ویندوز مشکل داشتم.

    نگاه کنید نوع و ویژگی های پردازنده ---> خانواده پردازنده، به من توصیه شد Pentium-MMX را انتخاب کنم.

    درایورهای دستگاه را نیز بررسی کنید، مفید است. برای سرگرمی، می توانید همه چیز را در آنجا انتخاب کنید و یک هسته با وزن بیش از 50 مگابایت را کامپایل کنید.

    به علاوه. هسته، پس از بارگذاری خود، باید در واقع سیستم را بارگیری کند. یا از فایل های خود کامپایل شده (مورد استفاده در سیستم های جاسازی شده)، یا از آرشیو CPIO فشرده شده با چیزی، یا از Initrd. این DOS برای شما نیست، در اینجا شما نمی توانید بلافاصله به برخی از فایل های جدید init در دایرکتوری ریشه یک دیسک یا فلش درایو مراجعه کنید. در واقع، کار می کند، به Uncle Annix گوش ندهید! از initrd برای سیستم ما استفاده خواهد کرد، زیرا راحت است و برخلاف بایگانی CPIO باعث عبارات زشت از طرف توسعه دهندگان شخص ثالث نمی شود.

    اوه بله، هسته را با دستور کامپایل کنید

    اگر x86 دارید، می توانید آن را در /linuxkernel/arch/x86/boot/bzImage پیدا کنید.

    برای برنامه نویسان خشن چلیابینسک، می توانید از کامپایل متقابل استفاده کنید ...

    Ramdisk را ایجاد کنید.

    اکنون به یک initrd با یک پوسته ساده نصب شده در آنجا نیاز داریم. ما از busybox استفاده خواهیم کرد زیرا این nyasha می تواند هر کاری را انجام دهد. ما راه را از روبرتو د لئو، خالق موویکس خواهیم دزدید (اگر عشق متعالی به پرل نبود، حتی به او احترام می گذاشتم):

    dd if=/dev/zero of=/dev/ram0 bs=1k count=5000 - Ramdisk را در حافظه دسترسی تصادفیکامپیوتر ما
    mke2fs -m0 /dev/ram0 5000 - فرمت Ramdisk در سیستم Ext2
    mkdir /distro - یک پوشه ایجاد کنید
    mount /dev/ram0 /distro - به پوشه /distro سوار شوید

    همه چیز، حالا ما یک Ramdisk با ظرفیت 5 مگابایت داریم. شما می توانید کارهای بیشتری انجام دهید، اما نیازی به این کار ندارید. برخلاف Thomas Mathejisek، من قصد ندارم initrds را با ماژول های Squashfs فشرده LZMA پر کنم. هر چیزی که مورد نیاز است با هسته کامپایل می شود. بله، این خیلی منطقی و درست نیست، اما دردسر صد برابر کمتر است. و به خصوص برای کسانی که این رویکرد را محکوم می کنند، می توانید گزینه مدولاریته را در هسته فعال کنید: پشتیبانی از ماژول قابل بارگذاری را فعال کنید.

    در Ramdisk ما، نصب شده بر روی / توزیع، چنین پوشه ای وجود دارد، گم شده + یافت شده است. این به این دلیل است که ما آن را در ext2 فرمت کردیم. برای قرار دادن busybox در ابتدا ...

    نصب Busybox
    چرا چنین پروژه های بزرگی چنین وب سایت های مزخرفی دارند؟ اگر چه... دیگر اهمیتی ندارد که منابع دانلود شده و با موفقیت در پوشه /busybox باز شوند.

    شما می توانید busybox را به همین روش پیکربندی کنید:

    سی دی /busybox
    منوی پیکربندی را انجام دهید

    اگر هنوز متوجه نشدید چیست، توضیح می دهم. Busybox جایگزین هزاران برنامه یونیکس ذخیره شده در پوشه های /bin، /sbin، /usr/bin، /usr/sbin می شود. در عوض، تنها یک برنامه ایجاد می‌شود: /bin/busybox، و دسته‌ای از پیوندها به آن در پوشه‌های بالا ایجاد می‌شوند. با دستور زیر busybox را نصب کنید:

    CONFIG_PREFIX=/distro را نصب کنید

    Busybox همچنین فایل های /sbin/init و /linuxrc را بنا به دلایلی ایجاد می کند تا سیستم شما به درستی راه اندازی شود. اما همه پوشه های لازم ایجاد نشده اند. بنابراین ما همه چیز را با دستان خود تمام می کنیم و ایجاد می کنیم:

    /distro/و غیره
    /distro/lib
    /distro/dev
    /distro/mnt
    توزیع / پروک
    /distro/root
    /distro/tmp
    /distro/root

    اگر چیزی را فراموش کردید، به خاطر بسپارید، زیرا فراموش کردن این دایرکتوری ها سخت است.

    همه چیز خوب خواهد بود، اما busybox برای کار کردن به کتابخانه ها نیاز دارد که باید در توزیع ما کپی شود. خیلی راحت میشه فهمید که:

    ldd /distro/bin/busybox

    این برنامه کتابخانه های مورد نیاز پوسته را به ما نشان می دهد. فوراً می گویم: گیت لینوکس توسط هسته ایجاد می شود و قابل کپی نیست.

    هنگام کپی کردن کتابخانه ها، می توانید اطلاعات اشکال زدایی را قطع کنید (همانطور که روبرتو توصیه می کند):

    objcopy --strip-debug from where to

    ساخت لینوکس از لینوکس

    شما باید چندین فایل متنی سیستم ایجاد کنید:

    ما به /etc/inittab نیاز داریم. من شما را شگفت زده خواهم کرد: در ابتدای زندگی، سیستم حتی نمی داند که Root چیست. ما حتی یک کاربر بی نام داریم، اما فایل ویژگی های سطح پایین سیستم (ONF) باید وجود داشته باشد. محتوای آزمایشی فایل به شرح زیر است:

    # اولین فایلی که اجرا می شود، /sbin/init پس از آن.
    ::sysinit:/etc/rc.d/rc.S

    # یک پوسته را در کنسول اجرا کنید.
    ::respawn:-/bin/sh

    # دستورات برای اجرا قبل از خاموش شدن و راه اندازی مجدد.
    :: shutdown:/sbin/swapoff -a >/dev/null 2>&1
    :: shutdown:/bin/umount -a -r >/dev/null 2>&1

    فایل بعدی /etc/fstab است. این جدولی است که توضیح می دهد چه چیزی و کجا باید در هنگام بوت سوار شود. چیز بی فایده است! ما باید proc را مونت کنیم، در غیر این صورت هیچ چیز کار نمی کند، بنابراین در فایل می نویسیم:

    none /proc proc پیش‌فرض 0 0 است

    Mount همچنین به /etc/mtab نیاز دارد. آن را ایجاد کنید و آن را خالی بگذارید.

    اما mount تنها زمانی کاری را انجام می‌دهد که ما صریحاً از آن بخواهیم. و ما در همان فایل راه‌اندازی /etc/rc.d/rc.S می‌پرسیم (rc.d یک پوشه است). مودبانه می پرسیم:

    /bin/mount -av -t nonfs

    ما همچنین به یک فایل پروفایل (b) (a) sh نیاز داریم، به طور کلی آزادی برای تخیل وجود دارد. یک فایل /etc/profile ایجاد کنید و آن را با موارد زیر پر کنید:

    PATH="$PATH:/bin:/sbin:/usr/bin:/usr/sbin:"
    کمتر = - میلی متر
    TERM=لینوکس
    HOME=/root
    PS1=">"
    PS2=">"
    ignoreeof=10
    صادرات PATH DISPLAY LESS TERM PS1 PS2 HOME ignoreeof

    شما همچنین به فایل /etc/shell نیاز دارید که نشان می دهد یک پوسته وجود دارد:

    /bin/sh
    /bin/ash
    /bin/bash

    این در واقع تمام است. ما می توانیم Ramdisk خود را در یک فایل بنویسیم.

    mkdir /os - پوشه "آماده".
    umount /dev/ram0 - یک قطعه از RAM را جدا کنید.
    dd if=/dev/ram0 of=/os/initrd bs=1k count=5000 - فایل ایجاد کنید.
    gzip /os/initrd - فایل initrd را فشرده کنید

    یک درایو فلش قابل بوت بسازید

    "خط پایان" توسعه کوچک ما. ما یک درایو فلش USB می گیریم، آن را وارد می کنیم، آن را در vfat فرمت می کنیم (در ext نیز امکان پذیر است، اما فراموش نکنید که همه کاربران ویندوز هنوز خود را شلیک نکرده اند).

    در درایو فلش، یک پوشه بوت ایجاد کنید، این پوشه حاوی پوشه های initrd و kernel است.

    از پوشه / os، Ramdisk فشرده شده را در پوشه boot / initrd در درایو فلش کپی کنید، آن را "main.gz" نامید. از پوشه حاوی منابع هسته، bzImage را در پوشه بوت / هسته در درایو فلش USB کپی کنید، آن را "main.lk" نامید. فایل های بوت لودر Syslinux (در اینترنت یا از توزیع دیگری: اینجا مهم نیست)، یعنی syslinux.bin، syslinux.boot، syslinux.cfg را دریافت می کنیم. ما آنها را در پوشه اصلی فلش مموری کپی می کنیم. در فایل syslinux.cfg چیزی شبیه این می نویسیم:

    میلی متر پیش فرض
    درخواست 1
    تایم اوت 100
    برچسب میلی متر
    هسته /boot/kernel/main.lk

    برچسب mc
    هسته /boot/kernel/main.lk

    برچسب سانتی متر
    هسته /boot/kernel/custom.lk
    اضافه کردن initrd=/boot/initrd/main.gz load_ramdisk=1 ramdisk_size=5000 rw root=/dev/ram0
    برچسب سی سی
    هسته /boot/kernel/custom.lk
    اضافه کردن initrd=/boot/initrd/custom.gz load_ramdisk=1 ramdisk_size=5000 rw root=/dev/ram0
    برچسب hd
    لوکال بوت 0x80

    بنابراین، ما از initrds سفارشی و هسته پشتیبانی می‌کنیم، که برای آزمایش، می‌تواند به توزیع ما متصل شود.

    بیایید دریابیم که درایو فلش ما در سیستم چه دستگاهی است (می توانید mount را بدون پارامتر اجرا کنید و ببینید). این یا /dev/sdb1 یا /dev/sdc1 یا /dev/sdd1 است. قبل از شروع نصب، ارزش آن را دارد که درایو فلش را جدا کنید.

    syslinux را نصب کنید (اگر بسته در سیستم نیست، apt-get install syslinux):

    syslinux -d device_path

    فایل ldlinux.sys باید در دایرکتوری ریشه فلش درایو ظاهر شود. اگر چنین است، syslinux.bin، syslinux.boot دیگر مورد نیاز نیست.

    من به شما نمی گویم که چگونه بایوس را برای بوت شدن از درایو فلش USB راه اندازی کنید - آسان است. بگذارید فقط بگویم که ایجاد پوشه /boot/initrd/init که می توانید /boot/initrd/main را در آن برای کار بعدی با آن سوار کنید بسیار راحت است. فقط فراموش نکنید که آن را با gzip از حالت فشرده خارج کرده و فشرده کنید.

    باشه الان تموم شد

    همانطور که من به شما گفتم که چگونه یک سیستم لینوکس را از ابتدا بسازید. آسان است، اینطور نیست؟ سپس می توانید اسکریپت /sbin/init را ویرایش کنید، زیرا هنوز کار زیادی برای انجام دادن دارید! شما باید یک اسکریپت بنویسید تا فلش درایو را که در دایرکتوری ریشه chroot می شود، سوار کنید. در غیر این صورت مجبور خواهید بود با یک پارتیشن ReadOnly 5 مگابایتی کار کنید. اما این یک داستان کاملا متفاوت است.