ویرگول
ورودثبت نام
پویا سلیمی
پویا سلیمیطراح و توسعه دهنده نرم افزار
پویا سلیمی
پویا سلیمی
خواندن ۵ دقیقه·۸ ماه پیش

ماجراهای من و درایور گرافیک: سفری برای حل مشکل فریز اوبونتو

چند ماه پیش، وقتی داشتم روی لپ‌تاپم (یه ASUS X550V که چند سالی همراهم بوده) کار می‌کردم، با یه مشکل عجیب روبه‌رو شدم: هر وقت در لپ‌تاپ رو می‌بستم یا سیستم رو suspend می‌کردم، فریز می‌کرد! صفحه سیاه می‌شد و مجبور می‌شدم با نگه داشتن دکمه پاور خاموشش کنم. این مشکل منو کلافه کرده بود، چون نمی‌تونستم به‌راحتی سیستم رو به حالت خواب ببرم و باید همیشه خاموشش می‌کردم. توی این پست بلاگ، می‌خوام داستان ماجراجویی‌ام برای پیدا کردن مشکل و حلش رو باهاتون به اشتراک بذارم. اگه شما هم با مشکلات مشابه روبه‌رو شدین، شاید این داستان به کارتون بیاد!

اولین سرنخ: چرا سیستم فریز می‌کنه؟

اولین چیزی که به ذهنم رسید این بود که مشکل از سخت‌افزاره. شاید GPU یا RAM مشکل داره؟ اما وقتی یه تست سریع با memtest86 روی RAM انجام دادم، همه‌چیز اوکی بود. پس باید یه جای دیگه دنبال مشکل می‌گشتم. چون این مشکل فقط موقع suspend یا hibernate پیش می‌اومد، فکر کردم ممکنه به درایور گرافیک ربط داشته باشه. لپ‌تاپ من یه گرافیک هیبریدی داره: یه Intel HD Graphics 530 برای کارهای روزمره و یه NVIDIA GeForce GTX 950M برای کارهای سنگین‌تر.

برای شروع، تصمیم گرفتم یه نگاه به لاگ‌های سیستم بندازم. دستور زیر رو زدم تا ببینم موقع suspend چه اتفاقی می‌افته:

sudo dmesg | tail -n 50

توی لاگ‌ها، یه خط مشکوک دیدم که به nvidia-persistenced اشاره داشت: Failed to lock PID file. این سرویس مربوط به درایور NVIDIA بود و انگار یه مشکلی باهاش وجود داشت. اینجا بود که فهمیدم احتمالاً درایور NVIDIA مقصره!

نکته: اگه سیستم‌تون موقع suspend یا hibernate فریز می‌کنه، لاگ‌های کرنل (dmesg) و لاگ‌های بوت قبلی (journalctl -b -1) اولین جاهایی هستن که باید چک کنید.

بررسی درایور: NVIDIA یا Intel؟

برای اینکه مطمئن شم کدوم درایور داره کار می‌کنه، این دستور رو اجرا کردم:

lspci -k | grep -EA3 'VGA|3D|Display'

خروجی نشون داد که گرافیک اینتل با درایور i915 کار می‌کنه، ولی NVIDIA هنوز با درایور nvidia فعاله:

01:00.0 3D controller: NVIDIA Corporation GM107M [GeForce GTX 950M] (rev a2) Kernel driver in use: nvidia

اینجا بود که تصمیم گرفتم درایور NVIDIA رو غیرفعال کنم و ببینم اگه فقط از گرافیک اینتل استفاده کنم، مشکل حل می‌شه یا نه. اما یه مشکل دیگه پیش اومد: وقتی سعی کردم ماژول‌های NVIDIA رو حذف کنم، سیستم کرش کرد!

یه ایده جدید: تست با درایور Nouveau

بعد از چند ساعت کلنجار رفتن و سرچ کردن، فهمیدم که می‌تونم درایور متن‌باز nouveau رو به‌جای درایور اختصاصی NVIDIA تست کنم. Nouveau یه درایور سبک‌تره و گاهی برای مدیریت انرژی بهتر عمل می‌کنه. برای این کار، اول باید درایور NVIDIA رو غیرفعال می‌کردم. این دستور رو زدم تا ماژول‌های NVIDIA رو بلک‌لیست کنم:

echo &quotblacklist nvidia&quot | sudo tee -a /etc/modprobe.d/blacklist-nvidia.conf

ولی یه ارور گرفتم: Permission denied. بعد از کمی تحقیق، فهمیدم باید از tee درست استفاده کنم. دستور رو اصلاح کردم و این بار کار کرد. بعد initramfs رو آپدیت کردم:

sudo update-initramfs -u

سیستم رو ری‌استارت کردم و دوباره وضعیت درایورها رو چک کردم. اما NVIDIA هنوز فعال بود! یه جای کار اشتباه بود.

یه اشتباه بزرگ: کشتن Xorg!

برای اینکه بفهمم چرا NVIDIA غیرفعال نمی‌شه، این دستور رو زدم:

lsof /dev/nvidia*

خروجی نشون داد که سرور گرافیکی (Xorg) داره از NVIDIA استفاده می‌کنه. فکر کردم اگه Xorg رو بکشم، مشکل حل می‌شه. پس زدم:

sudo kill -9 15517

و یهو صفحه سیاه شد! سیستم به صفحه لاگین برگشت و دوباره Xorg اجرا شد. فهمیدم که نمی‌تونم توی محیط گرافیکی این کار رو بکنم. باید به یه محیط متنی (TTY) می‌رفتم.

رفتن به TTY و حذف درایور NVIDIA

با زدن Ctrl + Alt + F2 به TTY رفتم و با نام کاربری و رمزم لاگین کردم. اونجا سرور گرافیکی رو متوقف کردم:

sudo systemctl stop gdm

بعد ماژول‌های NVIDIA رو حذف کردم:

sudo rmmod nvidia_drm nvidia_modeset nvidia

این بار کار کرد! حالا وقتش بود که درایور nouveau رو لود کنم:

sudo modprobe nouveau

ولی یه ارور گرفتم: Unknown symbol in module. بعد از کلی سرچ، فهمیدم که باید کرنلم رو آپدیت کنم. کرنل جدید رو نصب کردم:

sudo apt install linux-generic-hwe-22.04

سیستم رو ریبوت کردم و دوباره تست کردم. این بار Nouveau لود شد! وضعیت رو چک کردم:

lspci -k | grep -EA3 'VGA|3D|Display'

و بالاخره دیدم:

Kernel driver in use: nouveau

تست نهایی: آیا مشکل حل شد؟

حالا که Nouveau فعال بود، وقت تست suspend و hibernate بود. این دستور رو زدم:

systemctl suspend

و برای اولین بار، سیستم فریز نکرد! چند بار دیگه تست کردم و حتی hibernate رو هم امتحان کردم:

systemctl hibernate

همه‌چیز عالی بود! فهمیدم که درایور NVIDIA مشکل‌ساز بوده و با تغییر به Nouveau، مشکل فریز حل شد.

آخرین قدم‌ها: بهینه‌سازی و تنظیمات

بعد از حل مشکل فریز، یه مشکل دیگه پیش اومد: سیستم گاهی لگ می‌زد. برای بهینه‌سازی Nouveau، شتاب سخت‌افزاری رو فعال کردم:

echo -e 'Section &quotDevice&quot\n Identifier &quotNVIDIA Card&quot\n Driver &quotnouveau&quot\n Option &quotAccelMethod&quot &quotglamor&quot\nEndSection' | sudo tee /etc/X11/xorg.conf.d/20-nouveau.conf

و مدیریت انرژی GPU رو تنظیم کردم:

echo high | sudo tee /sys/class/drm/card0/device/power_dpm_force_performance_level

لگ‌ها کمتر شد و سیستم روان‌تر کار کرد. در نهایت، تصمیم گرفتم suspend رو کامل غیرفعال کنم و فقط از hibernate استفاده کنم. تنظیمات رو توی فایل /etc/systemd/logind.conf تغییر دادم:

HandleLidSwitch=hibernate SuspendMode=ignore

حالا با بستن در لپ‌تاپ، سیستم به hibernate می‌ره و همه‌چیز عالیه!

درس‌هایی که گرفتم

این ماجرا بهم چند درس مهم یاد داد:

  • لاگ‌ها بهترین دوستتن: همیشه لاگ‌های سیستم رو چک کن تا سرنخ پیدا کنی.
  • درایورها می‌تونن دردسرساز باشن: اگه با suspend یا hibernate مشکل داری، درایور گرافیک رو تست کن.
  • صبوری کلید موفقیته: حل مشکلات سیستمی گاهی زمان‌بره، ولی با تست و خطا می‌تونی به جواب برسی.

شما چه تجربه‌ای با درایورهای گرافیک داشتین؟ توی کامنت‌ها برام بنویسین! اگه سوالی هم دارین، خوشحال می‌شم کمک کنم.

جمع‌بندی: مشکل فریز سیستم من به خاطر درایور NVIDIA بود. با تغییر به درایور Nouveau و بهینه‌سازی تنظیمات، تونستم مشکل رو حل کنم و حالا سیستمم بدون فریز suspend و hibernate می‌کنه!

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