
چند ماه پیش، وقتی داشتم روی لپتاپم (یه 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) اولین جاهایی هستن که باید چک کنید.
برای اینکه مطمئن شم کدوم درایور داره کار میکنه، این دستور رو اجرا کردم:
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 رو بهجای درایور اختصاصی NVIDIA تست کنم. Nouveau یه درایور سبکتره و گاهی برای مدیریت انرژی بهتر عمل میکنه. برای این کار، اول باید درایور NVIDIA رو غیرفعال میکردم. این دستور رو زدم تا ماژولهای NVIDIA رو بلکلیست کنم:
echo "blacklist nvidia" | sudo tee -a /etc/modprobe.d/blacklist-nvidia.conf
ولی یه ارور گرفتم: Permission denied. بعد از کمی تحقیق، فهمیدم باید از tee درست استفاده کنم. دستور رو اصلاح کردم و این بار کار کرد. بعد initramfs رو آپدیت کردم:
sudo update-initramfs -u
سیستم رو ریاستارت کردم و دوباره وضعیت درایورها رو چک کردم. اما NVIDIA هنوز فعال بود! یه جای کار اشتباه بود.
برای اینکه بفهمم چرا NVIDIA غیرفعال نمیشه، این دستور رو زدم:
lsof /dev/nvidia*
خروجی نشون داد که سرور گرافیکی (Xorg) داره از NVIDIA استفاده میکنه. فکر کردم اگه Xorg رو بکشم، مشکل حل میشه. پس زدم:
sudo kill -9 15517
و یهو صفحه سیاه شد! سیستم به صفحه لاگین برگشت و دوباره Xorg اجرا شد. فهمیدم که نمیتونم توی محیط گرافیکی این کار رو بکنم. باید به یه محیط متنی (TTY) میرفتم.
با زدن 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 "Device"\n Identifier "NVIDIA Card"\n Driver "nouveau"\n Option "AccelMethod" "glamor"\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 میره و همهچیز عالیه!
این ماجرا بهم چند درس مهم یاد داد:
شما چه تجربهای با درایورهای گرافیک داشتین؟ توی کامنتها برام بنویسین! اگه سوالی هم دارین، خوشحال میشم کمک کنم.
جمعبندی: مشکل فریز سیستم من به خاطر درایور NVIDIA بود. با تغییر به درایور Nouveau و بهینهسازی تنظیمات، تونستم مشکل رو حل کنم و حالا سیستمم بدون فریز suspend و hibernate میکنه!