وزن: 2
توضیحات: داوطلبان باید بتوانند از اجزای هسته که برای سختافزار خاص، درایورهای سختافزار، منابع سیستم و الزامات لازم هستند استفاده کنند. این هدف شامل پیادهسازی انواع مختلف تصاویر هسته، شناسایی هستههای پایدار و توسعه و پچها، و همچنین استفاده از ماژولهای هسته است.
نواحی کلیدی دانش:
- مستندات هسته 2.6.x، 3.x و 4.x
اصطلاحات و ابزارها:
- /usr/src/linux/
- /usr/src/linux/Documentation/
- zImage
- bzImage
- فشردهسازی xz
هسته لینوکس به عنوان قلب سیستم عامل لینوکس از ابتدا شمارهگذاری شده است. قاعده شمارهگذاری نسخه به این صورت بود:
| 2 | 5 | 75 | 3 |
|---|---|---|---|
| شماره نسخه | بازنگری اصلی | بازنگری جزئی | اصلاح/پچ |
که در آن شماره بازنگری "فرد" یا "زوج" مفاهیم متفاوتی داشت. شمارههای "فرد" برای "نسخههای توسعه" استفاده میشد و این نشان میداد که آنها به نوعی ناپایدار هستند و برای محیط تولید مناسب نیستند. از سوی دیگر شماره بازنگری "زوج" نسخه "پایدار" را نشان میداد و بنابراین امید به قابلیت اطمینان میداد. اما این داستان مربوط به گذشته است. وقتی هسته 2.6 آمد، آنها تصمیم گرفتند فقط هستههای "پایدار" منتشر کنند و بنابراین به نسخه 2.6.X پایبند ماندند. بنابراین تمام نسخهها بعد از 2.6، چه شمارههای "فرد" یا "زوج" داشته باشند، همه آنها "پایدار" هستند. هسته 2.6.X تا شماره نسخه 2.6.39.4 زنده بود، این یک شماره طولانی نه؟ در نهایت لینوس ترووالدز پذیرفت که از نسخه 3 و به بعد استفاده کند و قاعده را تغییر داد:
| 3 | 0 | X |
|---|---|---|
| شماره نسخه | بازنگری اصلی | بازنگری جزئی |
و ما نیازی به نگرانی در مورد شماره اصلاح/پچ نداریم. 3.19 آخرین نسخه است و نسخه 4 اکنون فعال است. بیایید بررسی کنیم:
root@server1:~# uname -a
Linux server1 4.10.0-40-generic #44~16.04.1-Ubuntu SMP Thu Nov 9 15:37:44 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
root@server1:~# uname -r
4.10.0-40-generic
root@server1:~#
همانطور که میبینید ما در نسخه "4"، انتشار اصلی "10" و پچ مشخص شده اوبونتو "0-40-generic" هستیم
برای یادگیری اینکه هستههای لینوکس و اجزای آن چگونه در مکانهای مختلف درخت لینوکس قرار گرفتهاند، به اختاپوس فکر کنید :). به این روش شما بینش کافی برای کار با هسته، ارتقای آن و عیبیابی سیستم لینوکس خواهید داشت. بیایید یادگیری موضوع را کمکم شروع کنیم:
بعد از اینکه Bios/UEFI کار خود را تمام کرد و کنترل را به boot loader منتقل کرد، boot loader سعی میکند هسته را بارگذاری کند. اما بارگذاری هسته آنقدر هم آسان نیست. هسته نیاز به برخی درایورها دارد که بارگذاری شوند. لینوکس چگونه به این دست مییابد؟ initrd. initrd (initial ramdisk)/initramfs طرحی برای بارگذاری یک فایلسیستم ریشه موقت در حافظه است که ممکن است به عنوان بخشی از فرآیند راهاندازی لینوکس استفاده شود. initrd و initramfs به دو روش مختلف برای رسیدن به این هدف اشاره میکنند اما کار یکسانی انجام میدهند. هر دو معمولاً برای آمادهسازی قبل از اینکه فایلسیستم ریشه واقعی بتواند mount شود استفاده میشوند.
root@server1:~# cd /boot/
root@server1:/boot# ls -l
total 107160
-rw-r--r-- 1 root root 1443598 Jul 20 07:11 abi-4.10.0-28-generic
-rw-r--r-- 1 root root 1443962 Nov 9 12:56 abi-4.10.0-40-generic
-rw-r--r-- 1 root root 204970 Jul 20 07:11 config-4.10.0-28-generic
-rw-r--r-- 1 root root 204970 Nov 9 12:56 config-4.10.0-40-generic
drwxr-xr-x 5 root root 4096 Nov 29 00:17 grub
-rw-r--r-- 1 root root 41799650 Nov 29 00:15 initrd.img-4.10.0-28-generic
-rw-r--r-- 1 root root 41801572 Nov 29 00:17 initrd.img-4.10.0-40-generic
-rw-r--r-- 1 root root 182704 Jan 28 2016 memtest86+.bin
-rw-r--r-- 1 root root 184380 Jan 28 2016 memtest86+.elf
-rw-r--r-- 1 root root 184840 Jan 28 2016 memtest86+_multiboot.bin
-rw------- 1 root root 3718582 Jul 20 07:11 System.map-4.10.0-28-generic
-rw------- 1 root root 3722376 Nov 9 12:56 System.map-4.10.0-40-generic
-rw-r--r-- 1 root root 7398656 Nov 26 02:37 vmlinuz-4.10.0-28-generic
-rw------- 1 root root 7407392 Nov 9 12:56 vmlinuz-4.10.0-40-generic
چیزی که هسته ما را برای راهاندازی میکند initrd.img-4.10.0-40-generic است که در طول فرآیند بوت RAM را پر میکند. فراموش نکنید که هر نسخه هسته به initrd خود با همان نسخه نیاز دارد. اکنون نوبت هسته است که بارگذاری شود. اما داستان خود را دارد، هسته باید به نوعی فشرده شود تا در RAM جا شود. اول بیایید با درس اصطلاحات شروع کنیم:
از نسخههای بسیار اولیه هسته، روشهایی برای فشردهسازی آن وجود داشت. با گذشت زمان و رشد هسته و نیازهای جدید و مسائل عملکرد، روشهای مختلف مانند gzip، bzip2، LZMA، XZ، LZO استفاده شد. همه ما با ابزارهای فشردهسازی آشنا هستیم و حداقل با یکی از آنها مانند RAR، Zip، 7-Zip، ... کار کردهایم. مانند سایرین، فشردهسازی XZ یک برنامه فشردهسازی با فرمت فایل خودش است. این با الگوریتمهای فشردهسازی LZMA/LZMA2 که توسط معروف 7-zip استفاده میشود ادغام شده است، با این حال، آنها سازگار نیستند. برای آزمون LPI ما درخواست شده است که از وجود آن آگاه باشیم و آن را دوباره زمانی که در مورد هسته در درسهای بعدی صحبت میکنیم خواهیم دید.
در روزهای قدیم کامپیوترها با کمبود حافظه کافی مواجه بودند، بنابراین باید راهی برای جا دادن و پر کردن RAM با هسته از پیش کامپایل شده قبل از mount شدن fs ریشه وجود میداشت. zImage نامی بود که برای فراخوانی هسته از پیش کامپایل شده و فشرده شده کوچک استفاده میشد. zImage بسیار کوچک بود و فقط در 512k حافظه جا میشد.
کمکم با رشد هسته و بزرگتر شدن حافظهها، 512k کافی نبود. بنابراین bzImage آمد و اگر بیش از 512k zImage دارید، به "Big zImage" (zImage بزرگ) نامیده میشود. امروزه zImage فقط ممکن است در برخی از سیستمهای لینوکس تعبیه شده دیده شود و bzImage ممکن است بیشتر استفاده شود. bzImage به ابزار فشردهسازی خاصی مانند bzip2 اشاره نمیکند، bzImage در زیر درو ممکن است از ابزارهای مختلفی برای فشردهسازی استفاده کند. آن را فعلاً نگه دارید و در درسهای بعدی به این موضوع باز خواهیم گشت.
در /lib/modules/ میتوانید پوشههایی را ببینید که شامل ماژولهای هر هسته است:
root@server1:~# cd /lib/modules
root@server1:/lib/modules# ls -l
total 8
drwxr-xr-x 5 root root 4096 Nov 26 02:46 4.10.0-28-generic
drwxr-xr-x 5 root root 4096 Nov 29 00:16 4.10.0-40-generic
root@server1:/lib/modules# ls -l 4.10.0-40-generic/
total 4956
lrwxrwxrwx 1 root root 40 Nov 9 13:46 build -> /usr/src/linux-headers-4.10.0-40-generic
drwxr-xr-x 2 root root 4096 Nov 9 13:10 initrd
drwxr-xr-x 14 root root 4096 Nov 29 00:14 kernel
-rw-r--r-- 1 root root 1166900 Nov 29 00:16 modules.alias
-rw-r--r-- 1 root root 1150091 Nov 29 00:16 modules.alias.bin
-rw-r--r-- 1 root root 7317 Nov 9 12:56 modules.builtin
-rw-r--r-- 1 root root 9142 Nov 29 00:16 modules.builtin.bin
-rw-r--r-- 1 root root 523389 Nov 29 00:16 modules.dep
-rw-r--r-- 1 root root 741387 Nov 29 00:16 modules.dep.bin
-rw-r--r-- 1 root root 285 Nov 29 00:16 modules.devname
-rw-r--r-- 1 root root 196852 Nov 9 12:56 modules.order
-rw-r--r-- 1 root root 429 Nov 29 00:16 modules.softdep
-rw-r--r-- 1 root root 558199 Nov 29 00:16 modules.symbols
-rw-r--r-- 1 root root 680971 Nov 29 00:16 modules.symbols.bin
drwxr-xr-x 3 root root 4096 Nov 29 00:14 vdso
و در نهایت خود هسته کجاست؟
root@server1:~# cd /usr/src/
root@server1:/usr/src# ls -l
total 16
drwxr-xr-x 27 root root 4096 Aug 1 04:23 linux-headers-4.10.0-28
drwxr-xr-x 7 root root 4096 Aug 1 04:23 linux-headers-4.10.0-28-generic
drwxr-xr-x 27 root root 4096 Nov 29 00:14 linux-headers-4.10.0-40
drwxr-xr-x 7 root root 4096 Nov 29 00:14 linux-headers-4.10.0-40-generic