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

قضیه از اونجا شروع میشه که یک باگ مهم یا Vulnerability تو هسته لینوکس کشف میشه و Community اون مشکل رو حل و نسخه جدید کرنل رو ریلیز میکنه اونجاست که باید برای جلوگیری از هک شدن و یا ضربه خوردن از اون نقطه باید سرو(های) لینوکسی رو آپدیت کنیم. معمولا آپدیت کردن پکیج ها و کرنل وقتی سرور به اینترنت دسترسی داره کار ساده‌ای هست و نیاز به آموزش خاصی نداره اما توی محیط‌های 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پس از این مرحله یک داریکتوری جدید درهمان محل فایل فشرده با نام فایل ایجاد میشود. با دستور 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 را انتخاب نمایید)نام فایل را بدون تغییر (همان .config) نگه داریددر این بخش با انتخاب 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 allyum 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 نسخه کرنل را مشاهده کنیدحالا با موفقیت کرنل آپدیت شد و تا چند روز دیگه که آسیب پذیری جدید کشف و رفع میشه و نسخه جدید کرنل ریلیز میشه دیگه با کرنل سیستم کاری نداریم! ;)