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

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

    به عنوان یک واقعیت، اگر یک ماژول هسته را با استفاده از فایل‌های هدر دیگر بسازید (به‌غیر از مواردی که برای ساخت تصویر هسته‌ای که دارید - تقریباً Lane)، بسته به نحوه فایل‌های هدر، ماژول قادر به بارگیری با خطا نخواهد بود. متفاوت از موارد مورد نیاز می تواند از امضاهای بد، نسخه های بد و موارد دیگر شکایت کند.

    پیکربندی هسته

    اولین قدم این است که منبع هسته را تا حد امکان نزدیک به تصویر هسته پیدا کنید. احتمالاً به دست آوردن پیکربندی مناسب دشوارترین بخش کل فرآیند ساخت ماژول است. با شماره نسخه هسته که می تواند از /proc/version خوانده شود شروع کنید. اگر مانند من در حال ساخت ماژول برای دستگاه اندرویدی هستید، هسته های اندروید کد Aurora، Cyanogen، یا Android را امتحان کنید، هر کدام که به دستگاه شما نزدیکتر است. در مورد من، هسته msm-3.0 بود. توجه داشته باشید که لزوماً نیازی به جستجوی نسخه منبع مشابه نسخه تصویر هسته خود ندارید. تفاوت های کوچک نسخه به احتمال زیاد مانعی نخواهد بود. من از منابع هسته 3.0.21 استفاده کردم، در حالی که نسخه تصویر هسته موجود 3.0.8 بود. با این حال، اگر تصویر هسته 3.0.x دارید، سعی نکنید از منابع هسته 3.1 استفاده کنید.

    اگر تصویر هسته ای که دارید به اندازه کافی برای ارائه یک فایل /proc/config.gz مهربان است، می توانید از آنجا شروع کنید، در غیر این صورت، می توانید سعی کنید با پیکربندی پیش فرض شروع کنید، اما در این مورد باید بسیار مراقب باشید (هر چند من به جزئیات استفاده از پیکربندی پیش‌فرض نمی‌پردازم، زیرا به اندازه کافی خوش شانس هستم که مجبور به این کار نیستم، جزئیاتی در زیر وجود دارد که چرا پیکربندی مناسب بسیار مهم است.

    با فرض اینکه arm-eabi-gcc را در یکی از مسیرهای متغیر محیطی PATH خود دارید و ترمینال در پوشه منبع هسته باز است، می توانید پیکربندی هسته و نصب فایل ها و اسکریپت های هدر را شروع کنید:

    $ mkdir ساخت $ gunzip config.gz > build/.config # یا هر چیزی که باید آماده شود .config $ make silentoldconfig آماده کردن headers_install scripts ARCH=arm CROSS_COMPILE=arm-eabi- O=build KERNELRELEASE=`adb shell uname - r`
    ساخت silentoldconfig به احتمال زیاد از شما می پرسد که آیا می خواهید گزینه های خاصی را فعال کنید. شما می توانید پیش فرض ها را انتخاب کنید، اما ممکن است کار نکند.

    شما می توانید از هر چیز دیگری در KERNELRELEASE استفاده کنید، اما باید دقیقاً با نسخه هسته ای که می خواهید ماژول را از آن بارگیری کنید مطابقت داشته باشد.

    نوشتن یک ماژول ساده

    برای ایجاد یک ماژول خالی، باید دو فایل ایجاد کنید: منبع و Makefile. کد زیر را در hello.c در فهرستی جداگانه قرار دهید:

    #عبارتند از /* مورد نیاز همه ماژول ها */ #include /* مورد نیاز برای KERN_INFO */ #include /* مورد نیاز برای ماکروها */ static int __init hello_start(void) ( printk(KERN_INFO "Hello world\n"); return 0; ) static void __exit hello_end(void) (printk(KERN_INFO "Goodbye world\n"); ) module_init(hello_start); module_exit(hello_end);
    متن زیر را در یک Makefile در همان دایرکتوری قرار دهید:

    Obj-m = hello.o
    مونتاژ ماژول بسیار ساده است، اما این مرحلهماژول حاصل بارگذاری نخواهد شد.

    مونتاژ ماژول

    در مونتاژ معمولیکرنل، سیستم ساخت هسته یک فایل hello.mod.c ایجاد می کند که محتویات آن می تواند مشکلات مختلفی ایجاد کند:

    MODULE_INFO (vermagic، VERMAGIC_STRING)؛
    مقدار VERMAGIC_STRING توسط ماکرو UTS_RELEASE تعیین می شود که در فایل include/generated/utsrelease.h ایجاد شده توسط سیستم ساخت هسته قرار دارد. به طور پیش فرض، این مقدار توسط نسخه هسته و وضعیت مخزن git تعیین می شود. این همان چیزی است که KERNELRELEASE هنگام پیکربندی هسته نصب می کند. اگر VERMAGIC_STRING با نسخه هسته مطابقت نداشته باشد، بارگیری ماژول منجر به پیامی مانند این در dmesg می شود:

    سلام: نسخه magic "3.0.21-perf-ge728813-00399-gd5fa0c9" باید "3.0.8-perf" باشد
    علاوه بر این، ما همچنین در اینجا تعریف ساختار ماژول را داریم:

    ماژول ساختار __this_module __attribute__((section(".gnu.linkonce.this_module"))) = ( .name = KBUILD_MODNAME, .init = init_module, #ifdef CONFIG_MODULE_UNLOAD .exit = #cleanup_MODULE_IN,arch = #cleanup_MODULE,ARCH);
    به خودی خود، این تعریف بی ضرر به نظر می رسد، اما ساختار ماژول struct تعریف شده در include/linux/module.h با یک شگفتی ناخوشایند همراه است:

    ماژول ساختار ((...) #ifdef CONFIG_UNUSED_SYMBOLS (...) #endif (...) /* تابع راه اندازی. */ int (*init)(void)؛ (...) #ifdef CONFIG_GENERIC_BUG (.. .) #endif #ifdef CONFIG_KALLSYMS (...) #endif (...) (... تعداد زیادی ifdefs ...) #ifdef CONFIG_MODULE_UNLOAD (...) /* عملکرد تخریب.*/ void (*خروج) (باطل)؛(...) #endif(...) )
    این بدان معنی است که برای اینکه نشانگر init در جای درست قرار گیرد، CONFIG_UNUSED_SYMBOLS باید مطابق با آنچه که تصویر هسته ما استفاده می کند تنظیم شود. در مورد نشانگر خروج، آنها عبارتند از CONFIG_GENERIC_BUG، CONFIG_KALLSYMS، CONFIG_SMP، CONFIG_TRACEPOINTS، CONFIG_JUMP_LABEL، CONFIG_TRACING، CONFIG_EVENT_TRACING_CONFIG_TRACE_CONFIG_EVENT_TRACING_TRACO_CONFIG_EVENT_TRACING_FTRACE_CONFIG_EVENT_TRACING_FRACE_CONFIG.

    آیا شروع به درک این موضوع کرده اید که چرا معمولاً قرار است دقیقاً از همان فایل های هدر استفاده شود که هسته ما با آن ساخته شده است؟

    ساختار static const modversion_info ____versions __used __attribute__((section("__versions"))) = ( ( 0xsomehex, "module_layout" ), ( 0xsomehex, "__aeabi_unwind_cpp_pr0" ),"hex,ks, ( 0xs);
    این تعاریف از فایل Module.symvers گرفته شده است که با توجه به فایل های هدر تولید می شود.

    هر ورودی نشان دهنده نماد مورد نیاز ماژول و امضایی است که نماد باید داشته باشد. اولین کاراکتر، module_layout، به شکل ظاهری ماژول struct بستگی دارد، یعنی بستگی به این دارد که کدام گزینه های پیکربندی که قبلا ذکر شد فعال باشد. دومین مورد، __aeabi_unwind_cpp_pr0، یک تابع خاص ARM ABI است، و آخرین مورد برای فراخوانی تابع printk ما است.

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

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

    سلام: در مورد نسخه نماد symbol_name مخالف است
    این بدان معناست که ما به فایل Module.symvers صحیح نیاز داریم که با تصویر هسته مطابقت داشته باشد، که ما آن را نداریم.

    کاوش در هسته

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

    هسته استفاده می کند تابع بعدیبرای جستجو در جدول نماد خود (در kernel/module.c):

    Bool every_symbol_section(bool (*fn)(const struct symsearch *arr, struct module *owner, void *data), void *data) (struct module *mod; static const struct symsearch arr = ( ( __start___ksymtab, __stop___ksymtab, LY__k , false ), ( __start___ksymtab_gpl, __stop___ksymtab_gpl, __start___kcrctab_gpl, GPL_ONLY, false ), ( __start___ksymtab_gpl_future, __stop___ksymtab_gpl_future, __start___kcrctab_gpl_future, WILL_BE_GPL_ONLY, false ), #ifdef CONFIG_UNUSED_SYMBOLS ( __start___ksymtab_unused, __stop___ksymtab_unused, __start___kcrctab_unused, NOT_GPL_ONLY, true ), ( __start___ksymtab_unused_gpl, __stop___ksymtab_unused_gpl, __start___kcrctab_unused_gpl, GPL_ONLY، true)، #endif؛ اگر (هر_نماد_در_بخش(arr، ARRAY_SIZE(arr)، NULL، fn، داده)) true باشد؛ (...)
    ساختار مورد استفاده در این تابع در include/linux/module.h تعریف شده است:

    Struct symsearch ( const struct kernel_symbol *start, *stop; const unsigned long *crcs; enum ( NOT_GPL_ONLY, GPL_ONLY, WILL_BE_GPL_ONLY, ) مجوز; bool unused; );
    توجه داشته باشید: کد داده شدههسته در چهار سال گذشته تغییر چندانی نکرده است.

    آنچه در بالا در تابع every_symbol_section داریم سه فیلد (یا پنج وقتی که پیکربندی CONFIG_UNUSED_SYMBOLS فعال است) است که هر کدام شامل ابتدای جدول نماد، انتهای آن و دو پرچم است.

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

    متأسفانه، امروزه اکثر هسته‌ها فشرده شده‌اند (zImage)، بنابراین یک جستجوی ساده انجام می‌شود تصویر فشرده شدهغیر ممکن هسته فشرده در واقع یک باینری کوچک است که توسط یک جریان فشرده دنبال می شود. می توانید فایل zImage را اسکن کنید تا جریان فشرده شده را پیدا کنید و تصویر غیرفشرده شده را از آن دریافت کنید.

    برچسب ها: اضافه کردن برچسب

    بارگذاری هر سیستم عامل مدرن یک فرآیند پیچیده چند مرحله ای است. بسته به توزیع لینوکس، فرآیند بوت ممکن است کمی متفاوت باشد، اما طرح کلیتقریباً یکسان است و شامل مراحل زیر است:

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

      • هنگام بوت شدن از فلاپی دیسک یا هارد دیسک، بوت لودر از اولین بخش رسانه فیزیکی خوانده می شود.
      • هنگام بوت شدن از CD/DVD - از اولین بخش تصویر دیسک بوت واقع در ساختار داده CD.
      • برای بوت شبکه، از اولین سکتور تصویر دیسک بوت که از طریق پروتکل tftp از سرور دانلود می شود.

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

      خواندن در حافظه بوت لودر اصلی (GRUB، LiLo، NTLDR) و اجرای کد آن. از آنجایی که بوت لودر بسیار کوچک است، بنابراین، به عنوان یک قاعده، بخش هایی در کد آن کدگذاری می شوند، که باید کد لودر اصلی از آن خوانده شود. در دیسک سخت، این ممکن است فضای بین MBR و اولین پارتیشن روی دیسک (تراک صفر) باشد. در فلاپی دیسک و هنگام استفاده از تصویر دیسک هنگام بوت شدن از سی دی و از طریق شبکه، بوت لودر اصلی می تواند بلافاصله بعد از بوت لودر اصلی قرار گرفته و کل حجم تصویر را اشغال کند.

      هسته بوت (vmlinuz) و تصویر دیسک کمکی (initrd). لودر اصلی به اندازه کافی هوشمند است که فایل پیکربندی، فایل تصویر هسته و فایل تصویر دیسک کمکی را در سیستم فایل پیدا کند. در صورت لزوم، تصویر هسته در RAM باز می شود، یک ناحیه حافظه تشکیل می شود که حاوی پارامترهایی است که از بوت لودر به هسته ارسال می شود، از جمله آدرس تصویر دیسک کمکی.

      دیسک کمکی به دلیل ماژولار بودن هسته مورد نیاز سیستم های لینوکس مدرن است و شامل درایورهای (ATA، NFS، RAID و غیره) لازم برای دسترسی به سیستم فایل اصلی است.

      در این مرحله یک فرآیند با pid=1 ایجاد می شود که در آن اسکریپت init که در دایرکتوری ریشه درایو کمکی قرار دارد اجرا می شود. گزینه های ارسال شده به هسته در واقع به عنوان آرگومان های خط فرمان به init ارسال می شوند.

      اسکریپت حاوی دانلود است درایورهای مورد نیازبه عنوان ماژول های هسته، ایجاد فایل های دستگاه موقت در دایرکتوری dev / برای دسترسی به این ماژول ها، اسکن پارتیشن های دیسک برای شناسایی و مقداردهی اولیه RAID ها و حجم های منطقی. پس از مقداردهی اولیه درایوهای منطقی، تلاش می شود تا سیستم فایل ریشه مشخص شده توسط پارامتر root= مونت شود. در مورد بوت شبکه بدون دیسک، تلاش می شود تا دایرکتوری ریشه از طریق NFS نصب شود.

      پیام هایی در مورد بارگیری درایورها و جستجوی حجم های مجازی زیرسیستم LVM روی صفحه نمایش داده می شود. مرحله با نصب مجدد دایرکتوری ریشه به سیستم فایل اصلی و بارگذاری برنامه اصلی /sbin/init (یا معادل آن) در فرآیند با pid=1 تکمیل می شود.

      در یونیکس کلاسیک و نسخه‌های قدیمی‌تر لینوکس (تا حدود ۲۰۱۲)، برنامه init فایل پیکربندی /etc/inittab را می‌خواند، کنسول‌های متنی را مقداردهی اولیه می‌کند و معمولاً با استفاده از مجموعه‌ای از اسکریپت‌های واقع در /etc/init، خدمات لازم را شروع می‌کند. دایرکتوری‌های d و /etc/rc*.d در توزیع‌های مدرن لینوکس، فایل /sbin/init حاوی موارد بیشتری است. برنامه مدرنشروع خدمات محبوب ترین این برنامه ها upstart و systemd هستند که می توانند زمان این مرحله بوت را به میزان قابل توجهی کاهش دهند.

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

    بوت لودر GRUB

    بوت از دیسک نصب به حالت بازیابی - حالت نجات. برای انجام این کار، در زمان بوت در اعلان بوت: باید لینوکس نجات را وارد کنید.

    اگر همه چیز به خوبی پیش برود، دایرکتوری ریشه سیستم اصلی در /mnt/sysimage و فهرست راه‌اندازی به /mnt/sysimage/boot نصب می‌شود. علاوه بر این، دایرکتوری‌های /proc، /sys و /dev در زیر شاخه‌های /mnt/sysimage مربوطه خود نصب می‌شوند. اگر این اتفاق نیفتد، باید این عملیات را به صورت دستی انجام دهید.

    هنگامی که همه دایرکتوری ها نصب می شوند، می توانید دایرکتوری ریشه را تغییر دهید

    #اگر معلوم شد که چیزی را فراموش کرده اید، می توانید با ^D chroot /mnt/sysimage خارج شوید.

    و initrd را بازسازی کنید

    #فایل قدیمی را کپی کنید cp -p /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak #دراکات جدید ایجاد کنید -f #اگر نسخه هسته باشد در سیستم اصلی با نسخه روی دیسک نصب متفاوت است، آن را به صراحت مشخص کنید dracut -f /boot/initramfs-2.6.32-358.el6.x86_64.img 2.6.32-358.el6.x86_64

    #فایل قدیمی را کپی کنید cp -p /boot/initrd-$(uname -r).img /boot/initrd-$(uname -r).img.bak #یک فایل جدید ایجاد کنید mkinitrd -f -v /boot/initrd -$( uname -r).img $(uname -r) #اگر نسخه هسته در سیستم اصلی با نسخه موجود در دیسک نصب متفاوت است، آن را به صراحت مشخص کنید mkinitrd -f -v /boot/initrd-2.6. 18-371.el5.img 2.6. 18-371.el5

    cd/sync telinit 6

    مثال کامل با درایور i2o_block (آداپتور SCSI Adaptec 2010S) که به طور خودکار بارگیری نمی شود. این مثال روی CentOS 5 اجرا می شود زیرا هسته استاندارد CentOS 6 از این درایور پشتیبانی نمی کند.

    پس از بوت شدن از روی سی دی در حالت Rescue، پیغامی مبنی بر پیدا نشدن پارتیشن های لینوکس نمایش داده می شود و باید به صورت دستی نصب شوند.

    #درایور insmod i2o_block را بارگیری کنید #بررسی کنید همه چیز کار کرده است lsmod .... dmesg ... #فایل های دستگاه را بر اساس اطلاعات موجود در dmesg ایجاد کنید mkdir /dev/i2o mknod /dev/i2o/hda b 80 0 mknod /dev/i2o/ hda1 b 80 1 mknod /dev/i2o/hda2 b 80 2 #فعال کردن VolumeGroup lvm vgchange -a y #mount volumes mkdir /mnt/sysimage mount /dev/mapper/VolGroup00-LogVol00 /mntsy/mntsy/ mnt/sysimage/boot #Mount فهرست‌های ویژه mount --bind /proc /mnt/sysimage/proc mount --bind /dev /mnt/sysimage/dev mount --bind /sys /mnt/sysimage/sys

    علاوه بر این، طبق دستورالعمل، فقط هنگام ایجاد یک تصویر دیسک، باید برنامه mkinitrd را مشخص کنید. گزینه اضافی--preload=i2o_block و سرویس های پیشخوان را غیرفعال کنید زیرا باعث قطع شدن درایور i2o_block می شوند:

    chkconfig زودخوان خاموش chkconfig later-readahead خاموش

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

    در این سخنرانی توضیح خواهم داد که چیست برنامه کلاسیک init در ترکیب با اسکریپت های rc.d به سبک System V. System V نسخه کلاسیک یونیکس است که یونیکس تجاری بر اساس آن ساخته شده است.

    همانطور که از نام آن پیداست، rc.d یک دایرکتوری است. چنین سنت یونیکس وجود دارد - اگر کل پیکربندی چیزی در یک فایل قرار می گیرد و پیکربندی را نامگذاری می کند، وقتی به فایل های جداگانه ای تقسیم می شود که به فایل اصلی متصل هستند، یک دایرکتوری با همان نام ایجاد می کنند و به آن اضافه می کنند. name.d - config.d. حرف d به این معنی است که این یک دایرکتوری است و قسمت های کمکی فایل پیکربندی در آن قرار دارد. فرمت فایل پیکربندی init دو سنت دارد: نوع System V که هر جزئیات پیکربندی را در یک فایل جداگانه در پوشه rc.d نگه می‌دارد و سنت سیستم BSD که دارای یک فایل /etc/rc است که حاوی اسکریپت‌ها و متغیرهای زیادی است. ، که مسئول رفتار سیستم هستند.

    در هر صورت زمانی که سیستم راه اندازی می شود یک فرآیند با PID=1 ایجاد می کنیم که در آن برنامه ای به نام init در حال اجرا است. همانطور که دفعه قبل دیدید، اگر برنامه init کشته شود، کرنل وحشت می کند و تمام کارها را متوقف می کند.

    کلاسیک System V init فایل /etc/inittab را می خواند و تعدادی دستورات نوشته شده در این فایل را اجرا می کند. Inittab یک فایل متنی است که هر خط آن در واقع یک دستور یا نوعی قانون رفتار است. تب init به شکل زیر است:

    id:3:initdefault:

    si::sysinit:/etc/rc.d/rc.sysinit

    l3:3:wait:/etc/rc.d/rc3

    ca::ctrlaltdel:/sbin/shutdown -t3 -r اکنون

    در ابتدای خط یک برچسب وجود دارد. معنی بزرگ این برچسب چیست، من واقعاً نمی فهمم. می توانیم فرض کنیم که این یک متن ساده است و تمام. مورد دوم یا به اصطلاح سطح بار یا مقدار خالی است. سطح بارگذاری یا یک عدد منفرد بین 0 تا 6 است یا لیستی از اعداد که با کاما از هم جدا شده اند. بعد یه اقدامی میاد اقدامات به شرح زیر است: صبر کنید، respawn، sysinit، ctrlaltdel. اقدامات دیگری نیز وجود دارد، اما اینها بیشترین استفاده را دارند. در نهایت در انتهای خط یک دستور مشخص با نام فایل اجرایی و آرگومان هایی که باید به این دستور ارسال شود نوشته می شود.

    عمل sysinit یک بار در هنگام راه اندازی سیستم اجرا می شود.

    عمل ctrlaltdel در واقع یک عمل نیست - یک کنترل کننده میانبر alt del کنترل است. خود پرس توسط هسته سیستم رهگیری می شود و اطلاعات مربوط به آن به فرآیند init ارسال می شود که باید دستور خاصی را اجرا کند. برای مثال می توان دستور shutdown را صادر کرد که باعث خاموش شدن کامپیوتر می شود. در اصل، هر برنامه دیگری را می توان در اینجا نوشت، به عنوان مثال، echo، که پس از فشردن کنترل alt del، نوعی پیام به تمام پایانه های سیستم صادر می کند. کنسول شومینه بنابراین

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

    عمل respawn به این معنی است که باید برنامه را اجرا کنید و بدون اینکه منتظر اتمام آن باشید، به آن بروید اقدامات بیشتر. اگر این برنامه متعاقباً خاتمه یابد، باید مجدداً راه اندازی شود.

    بنابراین، یک اجرای واحد با انتظار نتایج و اجرای چندگانه در حالت ناهمزمان وجود دارد - آنها شروع کردند، صبر کردند تا تمام شود، آنها کلمات را شروع کردند.

    سطوح بارگذاری قراردادی است که به شما امکان می دهد کنترل کنید کدام سرویس ها بارگذاری می شوند. نزدیکترین آنالوگ در ویندوز در حال بارگذاری است حالت امن، هنگامی که فقط تعداد محدودی از درایورها بارگیری می شوند و حداقل تعداد سرویس ها شروع می شود، با اشکال زدایی بوت می شود، زمانی که هر عملکرد اضافه ثبت می شود، و بوت کامل معمولی.

    لینوکس به طور سنتی دارای 6 گزینه بوت است. این تقسیم نسبتاً مشروط است.

    0 و 6 خاموش هستند. 0 - خاموش شدن کامل، و 6 - حالت راه اندازی مجدد.

    4 به طور کلی در لینوکس حذف می شود

    چهار سطح بارگذاری وجود دارد:

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

    3 - حالت متنی چند کاربره معمولی، زمانی که همه سرویس ها در حال اجرا هستند، شبکه کار می کند، همه درایورها کار می کنند.

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

    5 - همان 3، اما با راه اندازی پنجره x - یک رابط گرافیکی.

    حالت 2 شامل 1 + حالت چند نفره است. 3 شامل 2 + نصب سیستم فایل شبکه است. در نهایت، 5 شامل 3 + اجرای زیرسیستم گرافیکی است. این که آیا این به طور مداوم اجرا می شود یا نه یک مسئله توزیع است. به طور کلی، مدیران می توانند به طور مستقل فایل inittab را پیکربندی کنند تا این حالت ها به صورت متوالی راه اندازی شوند، یا می توانید همه چیز را کاملاً مستقل کنید - به حالت بعدی بروید، تمام کارهایی را که در مرحله قبل انجام شد حذف کنید و همه چیز را از ابتدا پیکربندی کنید.

    خطوط یک فایل واقعی را در نظر بگیرید. آنها بسیار ساده هستند.

    l3:3:wait:/etc/rc.d/rc3

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

    لانچر rc نام دارد و با شماره سطح به عنوان پارامتر اجرا می شود. خود برنامه init بسیار ساده است. او می تواند فایل خود را خط به خط با یک نحو ساده بخواند و با راه اندازی برخی از آنها، فرآیندهای جدیدی را آغاز کند برنامه های کمکی. تمام منطق سطح بار در rc پنهان است. با اجرای rc با پارامتر 3 به سطح سوم و با پارامتر 5 - به سطح پنجم می رویم.

    برنامه rc نیز بسیار ساده است. این اسکریپتی است که تمام فایل‌ها را در دایرکتوری‌های مربوط به سطح بار اجرا می‌کند، به عنوان مثال /etc/rc3.d/. این دایرکتوری ها حاوی فایل های اجرایی هستند که یک پارامتر دارند - شروع یا توقف. اگر فایل با پارامتر start شروع شود، سرویس را شروع می کند، اگر با پارامتر stop، آن را متوقف می کند. به عنوان مثال، شروع شبکه، رابط های شبکه را پیکربندی می کند، و توقف شبکه، رابط ها را در حالت پایین قرار می دهد. علاوه بر رابط های شبکه، اسکریپت هایی برای اتصال / قطع سیستم های فایل شبکه، راه اندازی / توقف خدمات و غیره وجود دارد.

    نام فایل ها در دایرکتوری هایی که طبق قوانین خاصی ساخته شده اند. آنها با یک K یا یک S شروع می شوند و به دنبال آن یک عدد و نام سرویس قرار می گیرند.

    اسکریپت rc به محتویات دایرکتوری rc3 نگاه می کند و تمام فایل هایی را که با حرف K شروع می شوند (kill) از آنجا انتخاب می کند. فایل ها به ترتیب افزایشی تعداد مرتب شده و با پارامتر توقف اجرا می شوند. سپس همان اقدامات با فایل هایی که با حرف S شروع می شوند (شروع) انجام می شود که با پارامتر شروع راه اندازی می شوند. به طور کلی، این کل روند حرکت به یک سطح خاص است.

    می‌توان فرض کرد که دایرکتوری /etc/rc0.d/ فقط حاوی فایل‌هایی است که با حرف K شروع می‌شوند، زیرا هنگام خاموش شدن همه چیز باید متوقف شود و دایرکتوری /etc/rc1.d/ یک فایل در کتابچه S دارد. برای راه اندازی کنسول مدیر

    برای سهولت در برنامه نویسی، یک دایرکتوری جداگانه /etc/init.d/ وجود دارد که شامل همان فایل ها فقط بدون حرف اعداد در ابتدای نام است. در واقع، فایل های موجود در دایرکتوری های سطح فقط پیوندهای نمادین به فایل های اصلی هستند. بنابراین /etc/rc3.d/S10apache یک پیوند به /etc/init.d/apache است. حروف و اعداد در نام پیوندها مورد نیاز است تا اسکریپت rc آنها را به ترتیب درست و با آرگومان های مناسب فراخوانی کند.

    در سیستم هایی که بر اساس این اصل ساخته می شوند، برای شروع یا توقف هر سرویسی در پوشه /etc/init.d/ باید فایل مربوط به آن را پیدا کنید و با پارامتر start یا stop شروع کنید. چیزی که در راه اندازی سرویس ها از این طریق دوست ندارد، فراخوانی صریح اسکریپت ها است. نکته این است که در خط فرمانتکمیل خودکار لینوکس عالی کار می کند. با آن می توانید خیلی سریع وارد مسیر فایل راه اندازی شوید.

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

    برنامه chkconfig به شما امکان می دهد پیوندهای نمادین را به اسکریپت های مناسب دستکاری کنید. برای اینکه ببینید چه چیزی در هر سطح شروع می‌شود و چه چیزی متوقف می‌شود، می‌توانید از دستور ls استفاده کنید و اسکریپت‌ها را در دایرکتوری مناسب فهرست کنید، اما استفاده از دستور chkconfig --list آسان‌تر است. برنامه chkconfig تمام دایرکتوری‌های rc را مرور می‌کند و لیستی از مواردی که در هر سطح شروع و متوقف می‌شوند را فهرست می‌کند. اگر بخواهیم چیزی به طور خودکار یک سرویس خاص را هنگام راه اندازی سیستم راه اندازی کند، chkconfig را اجرا می کنیم<имя службы>روشن است و اسکریپت پیوندی را برای اجرا در دایرکتوری درست و با آن ایجاد می کند نام درست. chkconfig را اجرا کنید<имя службы>خاموش باعث حذف لینک شروع و ایجاد لینک توقف می شود. بنابراین، برنامه chkconfig به شما امکان می دهد لیست خدماتی را که از راه اندازی سیستم شروع می شود، مدیریت کنید.

    برنامه دیگر، سرویس، برای شروع و توقف دستی خدمات استفاده می شود. Service یک wrapper است که به شما امکان می دهد مستقیماً به اسکریپت دسترسی نداشته باشید، بلکه نام سرویس را مشخص کنید و بگویید می خواهیم آن را شروع یا متوقف کنیم. bash که من استفاده می کنم تکمیل خودکار برای دستور سرویس ندارد، بنابراین تایپ مسیر اسکریپت ها برای من آسان تر است.

    در اسکریپت های شروع، آرگومان های start و stop باید بدون شکست پردازش شوند. علاوه بر این، می توانید برخی از استدلال های خود را ارائه دهید که کار مفیدی انجام دهد.

    اکثر اسکریپت ها گزینه status را اجرا می کنند که نشان می دهد سرویس در حال اجرا است یا خیر. هنگامی که شروع را اجرا می کنیم، اسکریپت پس از شروع موفقیت آمیز سرویس، PID خود را دریافت کرده و در آن می نویسد فایل خاص. دستور stop فایل را حذف می کند. به طور معمول، چنین فایل هایی در پوشه /var/run/ ایجاد می شوند. دستور وضعیت بررسی می کند که آیا چنین فایلی وجود دارد یا خیر. وجود ندارد، گزارش می دهد که سرویس اجرا نمی شود. اگر فایل وجود داشته باشد، شناسه فرآیند را از آن استخراج می کند و لیست فعلی فرآیندها را بررسی می کند. اگر این شناسه وجود داشته باشد، همه چیز در حال اجرا است، اگر برنامه به دلایلی خراب شود، وضعیت نشان می دهد که تلاشی برای راه اندازی این سرویس انجام شده است - فایل وجود دارد، اما خود سرویس در حال اجرا نیست.

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

    اگر مدیر سیستم به جای توقف یا شروع خدمات فردی، بخواهد کل سیستم را به یک سطح مشخص منتقل کند، آنگاه می توان به یکی از دو روش به این امر دست یافت. می توانید مستقیماً برنامه /sbin/init را فراخوانی کنید. اگر با یک عدد مشخص به عنوان پارامتر فراخوانی شود، تمام دستورالعمل های فایل inittab را که سطح مربوطه برای آن تعیین شده است، اجرا می کند. اگر مثلا / sbin / init 1 را اجرا کنید، init تمام خطوطی را که سطح 1 دارند در فایل پیکربندی خود پیدا کرده و آنها را اجرا می کند. در برخی از سیستم ها، دستور shutdown به صورت /sbin/init 0 پیاده سازی می شود زیرا سطح 0 خاموشی سیستم است. اخیراً برای انتقال بین سطوح، برنامه ویژهبه نام telinit که پیوندی به init است. وظیفه آن ارسال سیگنالی به فرآیند init است که مدیر می خواهد به سطح خاصی برود. telinit q به init می گوید که فایل inittab را دوباره بخواند. در سیستم‌های قدیمی‌تر، این امر با ارسال یک سیگنال SIGHUP به فرآیند با PID=1 (کشیدن -HUP 1) به دست می‌آمد.

    چند خط دیگر در inittab، این راه اندازی پایانه ها است

    1:2345:respawn:/sbin/mingetty tty1

    به منظور دسترسی تعاملی به سیستم، ممکن است تعدادی از این نوع خطوط در inittabe داشته باشید. 2345 سطوحی هستند که دستور باید در آنها اجرا شود، respawn به این معنی است که در صورت خاتمه برنامه باید دوباره راه اندازی شود. برنامه getty یک برنامه مدیریت ترمینال است. به طور سنتی، ترمینال در یونیکس تله تایپ نامیده می شود، زیرا اولین پایانه ها ماشین تحریر الکتریکی بودند. بر این اساس، tty مخفف تله تایپ است. Mingetty برنامه ای است که می تواند با ترمینال های مجازی روی آن کار کند کامپیوتر شخصی. می تواند درایور ترمینال را پیکربندی کند و به عنوان پارامتر نام دستگاه ترمینال را که قرار است پیکربندی شود دریافت می کند. در پوشه /dev/ یک فایل دستگاه tty1 وجود دارد که مربوط به اولین ترمینال مجازی است. اگر ما یک مودم داشتیم و می‌خواستیم آن را در زمان راه‌اندازی مقداردهی اولیه کنیم، می‌توانیم getty را با پارامتر ttyS0 که مربوط به پورت COM1 است فراخوانی کنیم. هنگام راه اندازی اولیه مودم، می توان پارامترهای اضافی را تنظیم کرد: سرعت اتصال 19200 باد، 7 یا 8 بیت در هر بایت، برابری، تعداد بیت های توقف.

    S0:2345:respawn:/sbin/getty ttyS0 19200 8 n 1

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

    جلسات کاربر متن بر روی چنین زنجیره‌هایی مرتب می‌شوند: ابتدا، init یک کپی از خود می‌سازد و برنامه mingetty را در آن اجرا می‌کند. Mingetty ترمینال و صفحه کلید را مقداردهی اولیه می کند و سپس برنامه لاگین را در همان فرآیند اجرا می کند. ورود به سیستم اعلان‌هایی را برای وارد کردن نام و رمز عبور نمایش می‌دهد و اگر همه چیز خوب پیش رفت، امتیازات کاربر را به خود اختصاص می‌دهد و در همان فرآیند، با بازنویسی خود، یک مترجم کاربر، به عنوان مثال، bash را راه‌اندازی می‌کند. هنگامی که کاربر دستور خروج را تایپ می کند، مفسر مسیر زندگی آن فرآیند را خاتمه می دهد. هنگامی که یک فرآیند خاتمه می یابد، init یک سیگنال در مورد آن دریافت می کند. Init به آنچه که قرار است انجام دهد نگاه می کند، عمل respawn را می بیند، برنامه mingetty را دوباره اجرا می کند، که ترمینال را دوباره راه اندازی می کند، و همه چیز تکرار می شود. بنابراین، هر جلسه در یک فرآیند است. به محض اینکه جلسه را ترک کردیم، فرآیند ما به پایان رسید و بلافاصله برنامه ای شروع شد که ترمینال را برای ما پاک می کرد و تمام تنظیمات پیش فرض را بازیابی می کرد.

    در فایل inittab یک کلمه کلیدی ویژه دیگر initdefault وجود دارد - سطح پیش فرض. اگر هسته init پارامتر واحد را از طریق کرنل دریافت کرده باشد، آنگاه به سطح 1 بوت خواهیم شد. اگر پس از نصب پوسته گرافیکی معلوم شد که رایانه ما برای گرافیک ضعیف است، می توانیم سطح پیش فرض را روی 3 تنظیم کنیم و پس از راه اندازی مجدد بعدی به سطح سوم - یعنی در حالت متنی می رسیم. سیستم را بدون حالت گرافیکی نصب کردیم، سپس تمام پکیج ها را برای x window نصب کردیم، سطح پیش فرض را به 5 تغییر دادیم و بعد از راه اندازی مجدد بعدی بلافاصله وارد حالت گرافیکی شدیم.

    در این سیستم اسکریپت نویسی، گاهی اوقات می خواهید کاری را خودتان انجام دهید، به عنوان مثال، هنگام راه اندازی، تمام فایل های موجود در فهرست /tmp/ را حذف کنید. برای این وجود دارد فایل جداگانهبه نام /etc/rc.local، که بعد از بقیه اجرا می شود. این فقط یک اسکریپت بدون پارامتر است که در آن می توانید هر چیزی را که می خواهید بنویسید. برای مثال در یکی از روترهای من در زمان راه اندازی سیستم، جداول مسیریابی در این فایل نوشته شده است. من خیلی تنبل بودم که به دنبال محل قرارگیری اسکریپت های استاندارد مربوطه از توزیع باشم و معلوم شد که نوشتن دستورات در rc.local آسان تر است.

    با بیش از 13 میلیون خط کد، هسته لینوکس یکی از بزرگترین پروژه های منبع باز در جهان است. پس هسته لینوکس چیست و چه کاربردی دارد؟

    هسته بیشتر است سطح پاییننرم افزاری که با سخت افزار کامپیوتر تعامل دارد. مسئول تعامل همه برنامه های در حال اجرا در فضای کاربر تا سخت افزار فیزیکی است. همچنین به فرآیندهایی که به عنوان خدمات شناخته می شوند اجازه می دهد تا با استفاده از سیستم IPC اطلاعات را از یکدیگر دریافت کنند.

    انواع و نسخه های هسته

    هسته لینوکس که قبلاً می شناسید چیست، اما انواع هسته ها کدامند؟ بخور راه های مختلفو ملاحظات معماری هنگام ساختن هسته ها از ابتدا. اکثر هسته ها می توانند یکی از سه نوع باشند: هسته یکپارچه، میکروکرنل و هیبرید. هسته لینوکس یک هسته یکپارچه است، در حالی که هسته های ویندوز و OS X ترکیبی هستند. بیایید این سه نوع هسته را مرور کنیم.

    میکرو هسته

    میکروکرنل ها رویکردی را اتخاذ می کنند که در آن فقط آنچه را که باید مدیریت می کنند: CPU، حافظه و IPC. تقریباً هر چیز دیگری در رایانه به عنوان لوازم جانبی در نظر گرفته می شود و در حالت کاربر استفاده می شود. میکروکرنل ها مزیت قابل حمل بودن را دارند، می توان از آنها بر روی سخت افزارهای مختلف و حتی سیستم عامل های مختلف استفاده کرد، تا زمانی که سیستم عامل سعی کند به سخت افزار به روشی سازگار دسترسی پیدا کند.

    میکروکرنل ها نیز بسیار کوچک و ایمن تر هستند زیرا اکثر فرآیندها در حالت کاربر با حداقل امتیازات اجرا می شوند.

    طرفداران

    • قابل حمل بودن
    • اندازه کوچک
    • مصرف کم حافظه
    • ایمنی

    موارد منفی

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

    هسته یکپارچه

    هسته های یکپارچه برعکس میکروکرنل ها هستند زیرا نه تنها CPU، حافظه و IPC را پوشش می دهند، بلکه شامل مواردی مانند درایورهای دستگاه، مدیریت سیستم فایل و I/O نیز می شوند. هسته های یکپارچه می دهد دسترسی بهتربه سخت افزار و اجرای چند وظیفه ای بهتر، زیرا اگر برنامه ای نیاز به دریافت اطلاعات از حافظه یا فرآیند دیگری داشته باشد، لازم نیست در یک صف منتظر بماند. اما این می تواند مشکلاتی ایجاد کند، زیرا بسیاری از کارها در حالت superuser انجام می شوند. و در صورت رفتار نادرست می تواند به سیستم آسیب برساند.

    طرفداران:

    • دسترسی مستقیم بیشتر به سخت افزار
    • ارتباط آسان تر بین فرآیندها
    • فرآیندها سریعتر پاسخ می دهند

    موارد منفی:

    • سایز بزرگ
    • رم زیادی را اشغال می کند
    • امنیت کمتر

    هسته هیبریدی

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

    طرفداران

    • امکان انتخاب آنچه در هسته و فضای کاربر کار می کند
    • کوچکتر از یک هسته یکپارچه
    • انعطاف پذیرتر

    موارد منفی

    • ممکن است کندتر اجرا شود
    • درایورهای دستگاه توسط سازندگان منتشر شده است

    فایل های هسته کجا ذخیره می شوند؟

    هسته لینوکس در کجا قرار دارد؟ فایل های هسته اوبونتو یا هر توزیع لینوکس دیگر در پوشه /boot قرار دارند و vmlinuz-version نامیده می شوند. نام vmlinuz از دوران یونیکس گرفته شده است. در دهه 60، هسته ها را به سادگی یونیکس می نامیدند، در دهه 90 به هسته های لینوکس لینوکس نیز می گفتند.

    هنگامی که حافظه مجازی برای تسهیل انجام چند وظیفه ای توسعه یافت، حروف vm در جلوی نام فایل ظاهر شد تا نشان دهد که هسته از این فناوری پشتیبانی می کند. برای مدتی هسته vmlinux نامیده می شد، اما پس از آن تصویر دیگر در حافظه جا نمی شد بوت استرپ، و فشرده شد. پس از آن، آخرین حرف x به z تغییر یافت تا نشان دهد که از فشرده سازی zlib استفاده شده است. این فشرده سازی همیشه استفاده نمی شود، گاهی اوقات می توانید LZMA یا BZIP2 را پیدا کنید، بنابراین برخی از هسته ها به سادگی zImage را صدا می کنند.

    شماره‌گذاری نسخه شامل سه رقم، شماره نسخه هسته لینوکس، شماره نسخه شما و وصله‌ها یا اصلاحات است.

    در بسته /boot، نه تنها هسته لینوکس، بلکه فایل هایی مانند initrd.img و system.map را نیز می توانید پیدا کنید. initrd به عنوان یک دیسک مجازی کوچک استفاده می شود که فایل هسته واقعی را واکشی و اجرا می کند. فایل System.map برای مدیریت حافظه در حالی که هسته هنوز بارگذاری نشده است استفاده می‌شود و فایل‌های پیکربندی می‌توانند مشخص کنند که کدام ماژول‌های هسته در هنگام ساختن تصویر هسته در آن گنجانده می‌شوند.

    معماری هسته لینوکس

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

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

    تصور کنید بتوانید بسته به روز رسانی ویندوز را بدون نیاز به راه اندازی مجدد دائمی نصب کنید.

    ماژول های هسته

    اگر ویندوز قبلاً تمام درایورهای مورد نیاز شما را به طور پیش فرض داشته باشد و شما فقط می‌توانید درایورهایی را که نیاز دارید فعال کنید، چه اتفاقی می‌افتد؟ این اصل توسط ماژول های هسته لینوکس پیاده سازی شده است. ماژول‌های کرنل، که به عنوان ماژول‌های قابل بارگذاری (LKM) نیز شناخته می‌شوند، برای اجرا کردن هسته بر روی تمام سخت‌افزارها بدون مصرف تمام RAM ضروری هستند.

    ماژول گسترش می یابد عملکردهسته پایه برای دستگاه ها، سیستم های فایل، تماس های سیستمی. ماژول های قابل بارگیری دارای پسوند .ko هستند و معمولاً در پوشه /lib/modules/ ذخیره می شوند. با توجه به ماهیت ماژولار بودن آن، می توانید به راحتی با نصب و بارگذاری ماژول ها، کرنل را شخصی سازی کنید. بارگیری خودکاریا تخلیه ماژول را می توان در پیکربندی کرد فایل های پیکربندییا با استفاده از دستورات خاص، در لحظه آپلود و دانلود کنید.

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

    اکنون به پاسخ این سوال که هسته لینوکس چیست نزدیکتر شده اید. هسته جادو نیست. برای عملکرد هر کامپیوتری بسیار ضروری است. هسته لینوکس با OS X و Windows متفاوت است زیرا شامل تمام درایورها می شود و کارهای زیادی را انجام می دهد که خارج از جعبه پشتیبانی می شوند. اکنون کمی بیشتر در مورد نحوه عملکرد نرم افزار و فایل هایی که استفاده می کند می دانید.

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

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

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

    اولین کاری که باید انجام دهید این است که منابع هسته را دانلود کنید. بهترین منابع از سایت توزیع شما، در صورت وجود، یا سایت رسمی هسته: kernel.org گرفته شده است. ما به دانلود منبع از kernel.org نگاه خواهیم کرد.

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

    بنابراین، هنگامی که در مورد نسخه تصمیم گرفتیم، به kernel.org می رویم و منابع لازم را با فرمت tar.xz دانلود می کنیم:

    این مقاله از جدیدترین ها استفاده خواهد کرد این لحظهنسخه ناپایدار 4.4.rc7.

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

    mkdir kernel_sources

    برای دانلود آخرین نسخه، تایپ کنید:

    git clone https://github.com/torvalds/linux

    باز کردن منابع هسته

    اکنون منابع را ذخیره کرده ایم. به پوشه منبع بروید:

    cd linux_sources

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

    mkdir linux_sources

    cp ~/Downloads/linux* ~/linux_sources

    بایگانی را با استفاده از ابزار tar باز کنید:

    و به پوشه ای که هسته آن بسته نشده است بروید، این را دارم:

    سی دی لینوکس-4.4-rc7/

    تنظیم خودکار ساخت هسته لینوکس

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

    پارامترهای هسته مورد استفاده در آرشیو /proc/config.gz ذخیره می شوند. پیکربندی را از حالت بسته خارج کرده و با ابزار zcat در پوشه خود قرار دهید:

    در طول کار او، شما باید به چندین سوال پاسخ دهید. اینها گزینه های جدیدی هستند که تغییر کرده یا به هسته جدید اضافه شده اند و از سخت افزار جدید پشتیبانی می کنند، در بیشتر موارد می توانید گزینه پیش فرض را انتخاب کنید. معمولاً سه گزینه y وجود دارد - شامل، n - شامل نمی شود، m - شامل به عنوان یک ماژول است. گزینه پیشنهادی با حرف بزرگ نوشته شده است که برای انتخاب آن کافیست Enter را فشار دهید.

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

    تنظیم دستی هسته لینوکس

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

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

    این ابزار با رابط ncurses باز می شود:

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

    در اینجا ما پارامترهای زیر را تنظیم می کنیم:

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

    اطلاعات نسخه را به صورت خودکار به رشته نسخه اضافه کنید- اضافه کردن نسخه به نام فایل هسته

    حالت فشرده سازی هسته- حالت فشرده سازی تصویر هسته، کارآمدترین lzma.

    نام میزبان پیش فرض- نام کامپیوتر در اعلان ورودی نمایش داده می شود

    صف های پیام POSIX- پشتیبانی از صف های POSTIX

    پشتیبانی از صفحه بندی حافظه ناشناس -پشتیبانی swap را فعال کنید

    پشتیبانی از گروه کنترل- پشتیبانی از مکانیسم تخصیص منابع بین گروه های فرآیندی

    پشتیبانی از هسته پیکربندیو دسترسی به .config را از طریق /proc/config.gz فعال کنید- امکان استخراج پیکربندی هسته از طریق /proc/config.gz را فعال کنید

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

    پشتیبانی از غیرفعال کردن ماژول ها

    خاموش شدن اجباری ماژول ها

    دوباره برگردید و باز کنید نوع و ویژگی های پردازنده:

    خانواده پردازنده (Opteron/Athlon64/Hammer/K8)- نوع پردازنده خود را انتخاب کنید.

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

    حتما فعال کنید سیستم فایل Extended 3 (ext3).و سیستم فایل Extended 4 (ext4).- برای پشتیبانی از سیستم های فایل استاندارد ext3 و ext4

    برمی گردیم و می رویم هک کرنل

    در اینجا ما را شامل می شود کلید SysRq جادویی- پشتیبانی از توابع جادویی SysRq، چیزی که ضروری نیست، اما گاهی اوقات مفید است.

    یک نقطه دیگر باقی مانده است، سخت ترین آن، زیرا باید خودتان از آن عبور کنید. درایورهای دستگاه- باید بخش ها را مرور کنید و درایورهای تجهیزات خود را روشن کنید. منظورم از تجهیزات غیر استاندارد است هارد دیسک ها، موش ها، دستگاه های USB، وب کم، بلوتوث، آداپتورهای WIFI، چاپگرها و غیره

    با دستور زیر می توانید ببینید چه تجهیزاتی به سیستم شما متصل است:

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

    دکمه را چند بار فشار دهید تا خارج شوید. خروج.

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

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

    ساخت && ساخت ماژول

    حالا می توانید قهوه بنوشید یا پیاده روی کنید، زیرا روند مونتاژ طولانی است و حدود نیم ساعت طول می کشد.

    نصب یک کرنل جدید

    هنگامی که هسته و ماژول ها ساخته می شوند، می توان هسته جدید را نصب کرد. می توانید فایل هسته را به صورت دستی در پوشه بوت لودر کپی کنید:

    cp arch/x86_64/boot/bzImage /boot/vmlinuz

    یا می توانید به سادگی اسکریپت نصب را اجرا کنید و بلافاصله ماژول ها را همزمان نصب کنید:

    sudo make install && sudo make modules_install

    پس از نصب، فراموش نکنید که پیکربندی بوت لودر Grub را به روز کنید:

    grub-mkconfig -o /boot/grub/grub.cfg

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

    نتیجه گیری

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