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