قضیه از اونجا شروع میشه که یک باگ مهم یا Vulnerability تو هسته لینوکس کشف میشه و Community اون مشکل رو حل و نسخه جدید کرنل رو ریلیز میکنه اونجاست که باید برای جلوگیری از هک شدن و یا ضربه خوردن از اون نقطه باید سرو(های) لینوکسی رو آپدیت کنیم. معمولا آپدیت کردن پکیج ها و کرنل وقتی سرور به اینترنت دسترسی داره کار سادهای هست و نیاز به آموزش خاصی نداره اما توی محیطهای LAN و سرورهایی که به اینترنت دسترسی ندارن قضیه یکم تفاوت داره، تو این پست یکی از روشهای استاندارد این فرایند رو براتون توضیح دادم.
یکی از روشهایی که برای آپدیت کرنل لینوکس تو محیط شبکه داخلی شرکت (LAN) که ازش استفاده میکنم دانلود و کامپایل سورس کرنل لینوکس رو یه ماشین مجازی (یا خود سرور مورد نظر) هستش که بطور کلی شامل 3 بخش اصلی میشه:
مراحل زیر رو میتونید برروی یک سرور لینوکسی تستی یا خارج از شبکه داخلی انجام بدید و نهایتا فایل های 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
پس از این مرحله یک داریکتوری جدید درهمان محل فایل فشرده با نام فایل ایجاد میشود. با دستور 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
پس از آن با دستور make rpm-pkg پکیج نصبی کرنل ایجاد خواهد شد، این مرحله زمانبر خواهد بود
پس از انجام این مرحله 3 فایل با پسوند rpm در مسیر ~/rpmbuild/RPM/x86_64 ایجاد خواهد شد
برای نصب کرنل جدید در سروهای 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 مجددا چک کرد.
درصورتی که عملیات نصب از طریق 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 نسخه کرنل را مشاهده کنید
حالا با موفقیت کرنل آپدیت شد و تا چند روز دیگه که آسیب پذیری جدید کشف و رفع میشه و نسخه جدید کرنل ریلیز میشه دیگه با کرنل سیستم کاری نداریم! ;)