کرنل پنیک، چگونه هنگام kernel panic پنیک نزنیم؟
در دنیای آی تی، لینوکس در همه جا استفاده میشود. حتما امروز هم از لینوکس استفاده کردهاید، حتی اگر متوجه آن نشده باشید. اگر اطلاعات کافی در مورد لینوکس داشته باشید، قاعدتا باید بدانید که لینوکس در واقع یک کرنل است. کرنل قسمت اصلی سیستم عامل است که وظیفه ارتباط بین سخت افزار و پروسهها را به عهده دارد.
در این مقاله در مورد یکی از خطاهای اصلی کرنل یعنی کرنل پنیک (Kernel Panic) خواهید خواند. حتی عبارت کرنل پنیک ممکن است باعث ایجاد استرس شود اما اگر دانش کافی در مورد آن داشته باشید میتوانید آرامش خود را حفظ کنید. هر مدیر سیستم یا سیس ادمین (SysAdmin) حداقل چند بار با این موقعیت مواجه شده است، اما نصب مجدد سیستم عامل هیچگاه نباید گزینه اول شما برای حل مشکل کرنل پنیک باشد.
کرنل پنیک چیست؟
کرنل پنیک یکی از مشکلات متعددی است که ممکن است هنگام بوت سرور لینوکس اتفاق بیفتد. به زبان ساده، کرنل پنیک زمانی اتفاق میافتد که کرنل بارگذاری نشده و سرور بوت نشود. در پروسه بوت سرور، کرنل به صورت مستقیم بارگذاری نمیشود، ابتدا initramfs در حافظه رم لود شده و به کرنل vmlinuz اشاره میکند، سپس سیستم عامل بوت میشود. اگر initramfs به هر دلیلی (مثل آپدیت یا نصب پکیج) پاک یا خراب شود، با کرنل پنیک مواجه میشویم.
هنگام پروسه بوت لینوکس، ابتدا گراب بعد از mbr لود میشود. سپس کرنل باید در حافظه رم بارگذاری شود تا سیستم عامل استارت شود، اما کرنل روی فضای ذخیره سازی (هارد) قرار دارد (/boot/vmlinuz) که هنوز مونت نشده است. قبل از مونت شدن هیچ فایلی قابلیت اجرا ندارد، حتی کرنل. برای حل این مشکل ابتدا initramfs/initrd در رم بارگذاری شده و پارتیشن /boot را بصورت فقط خواندنی () مونت میکند. در مرحله بعد دیسک در پارتیشن / مونت شده و پروسه ادامه پیدا میکند.
در این پروسه فایلهای کرنل و init file system که در آدرس زیر قابل مشاهده هستند از اهمیت بالایی برخوردارند.
# ls -lrth /boot/
چرا کرنل پنیک انفاق میفتند؟
در مواقع زیر کرنل پنیک خواهیم داشت:
- اگر فایل initramfs خراب شده باشد.
- اگر فایل initramfs به درستی برای کرنل ساخته نشده باشد (هر کرنل، فایل initramfs مربوط به خود را دارد).
- اگر کرنل جدید پشیبانی نشود یا به درستی نصب نشده باشد.
- اگر آپدیتهای اخیر باگ داشته باشد.
- اگر ماژول جدید نصب شده باشد اما ایمیج initrd با آخرین ماژول نصب شده ساخته نشده باشد.
عیب یابی کرنل پنیک
حالا که با فایل مربوط به کرنل پنیک آشنا شدید، دیگر هنگام دیدن این ارور پنیک نمیزنید. کرنل همیشگی خود را انتخاب کنید، در صورت وجود خطا و کرنل پنیک، تصویر زیر را مشاهده خواهید کرد:
برای حل مشکل، مجددا سیستم را ریبوت کرده و این بار در لیست گراب گزینه ایمیج rescue را انتخاب کنید. سیستم عامل شما بوت میشود.
سپس به فولدر /boot بروید. همینطور که مشاهده میکنید فایل initramfs فقط برای rescue وجود دارد و برای کرنل مورد نظر شما وجود ندارد. برای ساخت این فایل برای کرنل، ابتدا با دستور زیر از نسخه کرنل خود مطمئن شوید.
#uname -r
سپس با دستور زیر فایل initramfs جدید را برای کرنل خود بسازید.
#dracut -f <initrd-image> <kernal-version>
در صورتی که از قبل فایل initramfs برای کرنل شما وجود داشته باشد، ممکن است هنگام ساخت آن با خطای زیر روبرو شوید:
در این صورت با دستور زیر فایل مربوطه را ایجاد کنید:
#mkinitrd --force <initrd-Image> <Kernel-Version>
کرنل پنیک سرور هنگام کار
گرچه کرنل پنیک اکثرا هنگام بوت سرور (بعد از آپدیت و اعمال تغییرات) رخ میدهد، امکان کرنل پنیک حین کار سرور هم وجود دارد. تنظیمات پیشفرض لینوکس هنگام کرنل پنیک، عدم ریبوت سرور و انتظار برای تکنسین فنی سرور است تا با مراجعه به سرور خروجی ترمینال را بررسی کرده و اقدامات لازم را انجام دهد.
برای یک سرور عملیاتی (production) انتظار میرود تا در صورت کرنل پنیک، سیستم به صورت خودکار ریبوت شود؛ با امید اینکه مجددا بدون ارور بوت شده و در کمترین زمان به حالت عملیاتی برگردد. اما برای یک سرور غیرعملیاتی یا staging شاید رغبتی به ریبوت نباشد، بلکه بررسی خروجی ترمینال کمکی به فهمیدن علت کرنل پنیک کمک کند.
رفتار سرور هنگام کرنل پنیک با مقدار متغیر kernel.panic در /etc/sysctl.conf کنترل میشود. مقدار این متغیر را میتوانید با دستور زیر مشاهده کنید. این مقدار به صورت پیشفرض صفر است که به معنی عدم راه اندازی مجدد سرور هنگام کرنل پنیک است.
# cat /proc/sys/kernel/panic
0
برای ریبوت سرور هنگام کرنل پنیک، عددی غیر از صفر انتخاب کنید. این مقدار بیانگر زمانی (ثانیه) است که بعد از آن سرور ریست خواهد شد.
# echo "30" > /proc/sys/kernel/panic
# cat /proc/sys/kernel/panic
30
اگر نیاز به دامپ کرش کرنل (Kernel Crash Dump) دارید، مقدار این متغیر را به اندازه کافی زیاد انتخاب کنید تا حافظه شما بطور کامل دامپ شود. ۳۰ ثانیه برای سرورهایی با حافظه نسبتا متوسط مناسب است.
تغییرات مذکور موقت بوده و بعد از ریبوت سرور به مقدار پیش فرض برمیگردد. برای ذخیره تغییرات بصورت دائمی، مقدار را در فایل sysctl.conf مشخص کنید.
# echo "kernel.panic = \"30\"" >> /etc/sysctl.conf
نتیجه گیری
حالا که با علت کرنل پنیک هنگام بوت سرور لینوکس آشنا شدید، هنگام مواجه شدن با آن ترس گذشته را ندارید. چراکه حالا میدانید چطور این مشکل را رفع کنید. البته هنگام بوت لینوکس ممکن است با ارورهای زیادی برخورد کنید، که این مقاله فقط ارور کرنل پنیک را مورد بررسی قرار داد. بنابراین هرچه بیشر دانش خود را در این زمینه افزایش دهید، پنیک کمتری میزنید!