Arman Feyzi
Arman Feyzi
خواندن ۵ دقیقه·۵ سال پیش

کامپایل کرنل لینوکس و نصب آن در CentOS 7

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

آپدیت کرنل لینوکس در محیط‌های LAN
آپدیت کرنل لینوکس در محیط‌های LAN

یکی از روشهایی که برای آپدیت کرنل لینوکس تو محیط شبکه داخلی شرکت (LAN) که ازش استفاده میکنم دانلود و کامپایل سورس کرنل لینوکس رو یه ماشین مجازی (یا خود سرور مورد نظر) هستش که بطور کلی شامل 3 بخش اصلی میشه:

  • کامپایل سورس کرنل
  • نصب از طریق YUM و یا بصورت مستقیم با استفاده از rpm فایلها
  • تغییر کرنل پیشفرض سرور لینوکس در هنگام لود شدن OS

مراحل زیر رو میتونید برروی یک سرور لینوکسی تستی یا خارج از شبکه داخلی انجام بدید و نهایتا فایل های rpm ایجاد شده رو به سرور مورد نظر (یا در سرور repository) انتقال بدید و نصب کنید

قبل از شروع مطمئن بشید که حداقل 20 گیگابایت فضای خالی در مسیر root سیستم دارید، برای بررسی میشه با دستور df -h میزان فضای خالی رو بررسی کرد.


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

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

با دستور uname –r میتونید نسخه فعلی کرنل نصب شده رو مشاهده کنید

ابتدا باید چند پکیج و build tools لازم که برای کامپایل سورس کرنل نیاز است را برروی سیستم نصب نماییم اما قبل از آن برای cache شدن پکیج های فعلی موجود در repository یک بار با دستور sudo yum makecache کش YUM را آپدیت میکنیم.

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

$ sudo yum install ncurses-devel make gcc bc openssl-devel flex bison

پس از نصب Build Tools باید 2 پکیج دیگر نیز نصب گردد

$ sudo yum install elfutils-libelf-devel rpm-build
از نصب کامل همه پکیج ها اطمینان حاصل نمایید
از نصب کامل همه پکیج ها اطمینان حاصل نمایید

تمامی پکیج های لازم نصب شده اند حالا باید سورس آخرین نسخه کرنل لینوکس از سایت https://www.kernel.org دانلود کنیم و سپس فایل زیپ دانلود شده با دستور زیر از حالت فشرده خارج کنیم

$ tar xvf linux-5.1.10.tar.xz
دانلود سورس کرنل لینوکس
دانلود سورس کرنل لینوکس
دانلود کرنل لینوکس با کامند wget
دانلود کرنل لینوکس با کامند wget

پس از این مرحله یک داریکتوری جدید درهمان محل فایل فشرده با نام فایل ایجاد میشود. با دستور cd linux-5.1.10 دایرکتوری فعلی به داریکتوری جدید تغییر دهید.

محتویات دایرکتوری همانند تصویر بالا باشد
محتویات دایرکتوری همانند تصویر بالا باشد

در این مرحله یک بار دیگر دستور uname –r را وارد کنید و سپس دستور زیر را باتوجه به نسخه فعلی کرنل سیستم خودتان (دستور uname –r ) تغییر داده و اجرا نمایید

sudo cp -v /boot/config-3.10.0-957.el7.x86_64 .config

حالا با دستور make menuconfig تنظیمات لازم جهت ایجاد پکیج نصبی را در فایل .config اعمل میکنیم، بعد از لجرای این دستور یک برنامه جهت انتخاب و تغییر بخشهای مختلف کرنل نمایش داده می شود که میتون آنها تغییر داد اما ما در این مرحله تمامی تنظیمات پیشفرض را بدون تغییر اعمال خواهیم کرد.

تنظیمات پیشفرض را با استفاده از منوی save را در فایل .config ذخیره میکنیم و سپس از از این wizard خارج میشویم (مراحل به ترتیب تصاویر زیر)

$ make menuconfig
در این بخش میتوانید ماژول‌ها و قسمت های مختلف را برای کامپایل شخصی سازی کرد (بدون اعمال تغییرات Save را انتخاب نمایید)
در این بخش میتوانید ماژول‌ها و قسمت های مختلف را برای کامپایل شخصی سازی کرد (بدون اعمال تغییرات Save را انتخاب نمایید)
نام فایل را بدون تغییر (همان .config) نگه دارید
نام فایل را بدون تغییر (همان .config) نگه دارید
در این بخش با انتخاب Exit از Wizard خارج شوید
در این بخش با انتخاب Exit از Wizard خارج شوید
خروجی نهایی این مرحله
خروجی نهایی این مرحله

پس از آن با دستور make rpm-pkg پکیج نصبی کرنل ایجاد خواهد شد، این مرحله زمانبر خواهد بود

این مرحله خیلی طول میکشه (خییییلی)
این مرحله خیلی طول میکشه (خییییلی)

پس از انجام این مرحله 3 فایل با پسوند rpm در مسیر ~/rpmbuild/RPM/x86_64 ایجاد خواهد شد


نصب از طریق YUM و یا بصورت مستقیم با استفاده از rpm فایلها

برای نصب کرنل جدید در سروهای centos میتوان بطور مستقیم (نصب از طریق دستور rpm) و یا از طریق yum این کار انجام پذیرد، در روش اول فایل ها به سرور موردنظر منتقل شده و با دستور rpm –iUv کرنل را نصب میکنیم

sudo rpm -iUv ~/rpmbuild/RPMS/x86_64/*.rpm

در صورت اضافه کردن پکیج به repository local نیز میتوان با دستور yum update kernel نسخه جدید را نصب نمود، البته قبل از این دستور از آپدیت بودن کش yum سرورتان مطمئن شودید.

درصورت نیاز با دستورهای زیر یکبار دیگر کش را بروزرسانی نمایید

yum clean all
yum repolist all

بعد از اتمام مرحله نصب نیاز است تا یک بار سیستم reboot گردد، بعد از راه اندازی مجدد سیستم میتوان نسخه کرنل را با دستور uname –r مجددا چک کرد.

نسخه آپدیت شده کرنل
نسخه آپدیت شده کرنل



تغییر کرنل پیشفرض سرور لینوکس در هنگام لود شدن OS

درصورتی که عملیات نصب از طریق yum صورت بگیرد بصورت پیشفرض لینوکس یک منو به boot menu اضافه میکند تا کاربر بتواند در هنگام روشن شدن سیستم کرنل مورد نظر را نتخاب نماید و سیستم عامل با آن کرنل لود شود. بعد از نصب و راه‌‌اندازی مجدد سیستم (درصورتی که از putty برای اتصال به سرور استفاده می کنید) شما نمیتوانید مرحله بوت شدن سیستم را مشاهده نمایید و بصورت پیشفرض سیستم با همان کرنل قبلی لود میشه. برای جلوگیری از این قضیه میتونیم با تغییر در کانفیگ بوت سیستم نسخه کرنل پیشفرض زمان بوت سیستم رو تغییر بدیم. ابتدا با کمک دستور grep میتوان لیستی از کرنل های موجود را به ترتیب مشاهده نمود

$ grep '^menuentry' /bbot/grub2/grub.cfg
این لیست رو مثل یک لیست تو برنامه نویسی درنظر بگیرید که معمولا اندیس از صفر شروع میشه
به نمونه ای که در تصویر بالا مشاهده میکنید دقت کنید، تو این لیست کرنل جدیدتر (نسخه 5.1.10 ) در ابتدای لیست قرار گرفته پس اندیس آن صفر 0 خواهد بود

حالا با یک ادیتور همانند vi فایل vi /etc/default/grub را ویرایش نمایید و مقدار DEFAULT_GRUP=save را به اندیس موردنظر (در این مثال به صفر) تغییر دهید و فایل را ذخیره نمایید

DEFAULT_GRUP=0

پس از آن برای اعمال تغیررات در boot config باید دستور زیر را وارد نمایید

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

پس از اتمام بروزرسانی میتوانید سیستم را reboot نمایید و با دستور uname –r نسخه کرنل را مشاهده کنید

حالا با موفقیت کرنل آپدیت شد و تا چند روز دیگه که آسیب پذیری جدید کشف و رفع میشه و نسخه جدید کرنل ریلیز میشه دیگه با کرنل سیستم کاری نداریم! ;)

لینوکسlinuxآپدیتامنیتkernel
سعی می‌کنم مطالبی رو که در پروژه های مختلف باهاشون کار میکنم رو بنویسم
شاید از این پست‌ها خوشتان بیاید