انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید

اوبونتو ۲۴٫۰۴ با پشتیبانی بلند مدّت (۱۲ سال) منتشر شد 🎉

نویسنده موضوع: شبه راهنمای خاموش کردن کارت گرافیک انودیا  (دفعات بازدید: 1593 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین جعفر فرقانلوژ

  • High Hero Member
  • *
  • ارسال: 5099
  • جنسیت : پسر
  • اممم . اره دیگه! mehr32
سلام
این مقاله ترجمه ( اندکی تغییر و تصرف ، همچنین منابع برای کوتاهی مقاله حذف شده اند .)مقاله زیر است که با مجوز  MIT منتشر شده است:
https://github.com/bayasdev/nvidia-gpu-off
اگه اصلاحی دارید یا مشکلی دیدید خوشحال میشم همینجا بگید  ;)


راهنمای قطعی برای خاموش کردن کامل گرافیک اختصاصی انویدیا و در نتیجه دوبرابر کردن عمر باتری لپ تاپ در لینوکس.

پیشگفتار

گرافیک های Nvidia در لینوکس به دلیل راه‌انداز های مالکیتی همیشه سردرد ساز بوده اند، اما این مشکل بر روی لپ تاپ ها به دلیل عدم وجود فناوری مدیریت پویای قدرت برای کارت های پیش از Turing و پردازنده های اینتل قدیمی تر از نسل کافی لیک تشدید می شود.

چرا nouveau یا bbswitch جایگزین مناسبی نیستند؟

راه‌انداز متن‌باز "nouveau" که در هسته لینوکس داخلی ساخته شده است، امکانات کافی برای مدیریت پویای قدرت و انتقال پیکربندی ("PRIME offloading") را فراهم می‌کند؛ با این حال، به دلیل محدودیت‌های تحمیل شده توسط انویدیا ، راه‌انداز "nouveau" نمی‌تواند سرعت ساعت کارت گرافیک را کنترل کند، که این باعث کاهش عملکرد کارت گرافیک می‌شود. و عملکرد بدی را به وجود می‌آورد. همچنین، ممکن است باعث مشکلات عدم سازگاری نرم‌افزاری شود (به عنوان مثال در لپتاپ من، باز کردن برنامه‌ی تنظیمات گنوم در حالت nouveau باعث قطعی و تعلیق صفحه کلید تا پنج ثانیه می‌شود ).

نرم‌افزار bbswitch نیز از سال ۲۰۱۳ به بعد بروزرسانی نشده و در برخی سیستم‌ها کاملاً معیوب است.

نیازمندی‌ها:

    - داشتن لپتاپی با فناوری Optimus و کارت گرافیک انویدیا با معماری قبل از Turing.
    - این راهنما برای توزیع‌های لینوکسی با سیستم‌ init مبتنی بر systemd طراحی شده است.

محدودیت‌ها:

این نکته را به‌خاطر داشته باشید که در صورتی که پورت HDMI به کارت گرافیک Nvidia متصل باشد، این پورت کار نخواهد کرد. با این حال همیشه می‌توانید روند توضیح داده شده در این راهنما را برعکس کنید و مجدد گرافیک خود را فعال کنید.

شروع کنیم!
۱) حذف راه‌اندازی مالکیتی Nvidia

لطفاً به مستندات توزیع خود مراجعه کنید تا راه‌انداز انحصاری Nvidia را حذف کنید، اما در اوبونتو می‌توانید این کار را با دستور زیر انجام دهید:

sudo apt-get autoremove --purge *nvidia*

سپس سیستم خود را مجدد راه‌اندازی کنید.


۲) شناسایی رابط‌های ارتباطی

قبل از ادامه‌ی این راهنما، لازم است رابط‌های ارتباطی PCI کارت گرافیک Nvidia را شناسایی کنیم. لطفا دستور زیر را اجرا کنید تا رابط‌های مربوط به کارت گرافیک Nvidia را بیابید:

lspci | grep NVIDIA
در لپتاپ من، خروجی به شکل زیر بود:
01:00.0 VGA compatible controller: NVIDIA Corporation GP106M [GeForce GTX 1060 Mobile]
01:00.1 Audio device: NVIDIA Corporation GP106 High Definition Audio Controller

همانطور که مشاهده می‌کنید، رابط PCI 01:00.0 مربوط به کارت گرافیک و رابط PCI 01:00.1 مربوط به تراشه‌ی صوتی کارت گرافیک است. رابط ها را یادداشت می‌کنیم ، در مراحل بعد به انها نیاز داریم.

۳.۱) نصب بسته‌ی acpi-call-dkms

در اوبونتو، دبیان و توزیع‌های زیر شاخه انها از دستور زیر استفاده کنید:

sudo apt install acpi-call-dkms
در آرچ لینوکس و توزیع‌های مشابه، این بسته با نام acpi_call-dkms شناخته می‌شود، بنابراین از دستور زیر استفاده کنید:

sudo pacman -S acpi_call-dkms
اگر توزیع دیگری دارید. لطفا به مستندات یا مخازن مربوطه آن مراجعه کنید.


۳.۲) یافتن فراخوانی ACPI مناسب برای شما

قبل از ادامه‌ی راهنما، لازم است که دستور زیر را اجرا کنید:

sudo modprobe acpi_call
در اوبونتو، دبیان و توزیع‌های زیر شاخه آن، لطفاً دستور زیر را اجرا کنید:

sudo /usr/share/doc/acpi-call-dkms/examples/turn_off_gpu.sh
در آرچ لینوکس و توزیع‌های زیر شاخه آن، دستور زیر را اجرا کنید:

sudo /usr/share/acpi_call/examples/turn_off_gpu.sh
خروجی من به شکل زیر بود:
Trying \_SB.PCI0.P0P1.VGA._OFF: failed
Trying \_SB.PCI0.P0P2.VGA._OFF: failed
Trying \_SB_.PCI0.OVGA.ATPX: failed
Trying \_SB_.PCI0.OVGA.XTPX: failed
Trying \_SB.PCI0.P0P3.PEGP._OFF: failed
Trying \_SB.PCI0.P0P2.PEGP._OFF: failed
Trying \_SB.PCI0.P0P1.PEGP._OFF: failed
Trying \_SB.PCI0.MXR0.MXM0._OFF: failed
Trying \_SB.PCI0.PEG1.GFX0._OFF: failed
Trying \_SB.PCI0.PEG0.GFX0.DOFF: failed
Trying \_SB.PCI0.PEG1.GFX0.DOFF: failed
Trying \_SB.PCI0.PEG0.PEGP._OFF: works!
Trying \_SB.PCI0.XVR0.Z01I.DGOF: failed
Trying \_SB.PCI0.PEGR.GFX0._OFF: failed
Trying \_SB.PCI0.PEG.VID._OFF: failed
Trying \_SB.PCI0.PEG0.VID._OFF: failed
Trying \_SB.PCI0.P0P2.DGPU._OFF: failed
Trying \_SB.PCI0.P0P4.DGPU.DOFF: failed
Trying \_SB.PCI0.IXVE.IGPU.DGOF: failed
Trying \_SB.PCI0.RP00.VGA._PS3: failed
Trying \_SB.PCI0.RP00.VGA.P3MO: failed
Trying \_SB.PCI0.GFX0.DSM._T_0: failed
Trying \_SB.PCI0.LPC.EC.PUBS._OFF: failed
Trying \_SB.PCI0.P0P2.NVID._OFF: failed
Trying \_SB.PCI0.P0P2.VGA.PX02: failed
Trying \_SB_.PCI0.PEGP.DGFX._OFF: failed
Trying \_SB_.PCI0.VGA.PX02: failed

همانطور که مشاهده می‌کنید، \_SB.PCI0.PEG0.PEGP._OFF فراخوانی ACPI صحیح برای لپتاپ من بود. لطفاً فراخوانی ACPI مناسب برای دستگاه خود را یادداشت کنید.

۴) قرار دادن nouveau در لیست سیاه و بارگذاری acpi-call-dkms

با دستور زیر فایل /etc/modprobe.d/blacklist.conf را باز کنید:
sudo nano /etc/modprobe.d/blacklist.conf

و به انتهای فایل، محتوای زیر را اضافه کنید ( در ویرایشگر نانو میتوانید با ctrl+x و زدن اینتر تغییرات را ذخیره کنید):

blacklist nouveau
فایل /etc/modules را باز کنید با دستور زیر باز کنید :
sudo nano /etc/modules
و در انتهای آن،  acpi_call را اضافه کنید. به عبارت دیگر، باید این فایل به شکل زیر باشد:


# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
acpi_call
( این محتوای فایل نه جزو مقاله هست نه من نوشتم ولی chatGPT تضمین داده که محتوا بعد ویرایش همونه ، ترجمه رو تحریف و تکمیل کرد  :D)

۵) خاموش کردن کارت گرافیک در زمان راه‌اندازی سیستم

برای راه‌اندازی خودکار، از systemd-tmpfiles استفاده خواهیم کرد.

فایل /etc/tmpfiles.d/acpi_call.conf را با دستور زیر ویرایش  و محتوای زیر را در انتهای آن اضافه کنید:
sudo nano /etc/tmpfiles.d/acpi_call.conf

w /proc/acpi/call - - - - \\_SB.PCI0.PEG0.PEGP._OFF
لطفاً \_SB.PCI0.PEG0.PEGP._OFF را با فراخوانی ACPI خود که در مرحله ۳.۲ دریافت کرده‌اید، جایگزین کنید. اما فراموش نکنید که باید بک اسلش را قرار دهید.

سپس با استفاده از دستور

sudo update-initramfs -u -k all
تغییرات را ذخیره کرده و سیستم خود را راه‌اندازی مجدد کنید.

۶.۱) تلاش برای حذف رابط های PCI

بعد از راه‌اندازی مجدد، کارت گرافیک Nvidia شما باید به وسیله‌ی فراخوانی ACPI خاموش شود. اما عدم حذف رابط های PCI آن ممکن است به مشکلات پایداری منجر شود. بنابراین برای هر یک از رابط های PCI که در مرحله ۲ دریافت کرده‌اید، باید دستورات زیر را اجرا کنید.

sudo echo 1 > /sys/bus/pci/devices/[PCI bus here]/remove

برای لپتاپ من باید این کار را انجام دهید:
sudo echo 1 > /sys/bus/pci/devices/0000\:01\:00.0/remove
sudo echo 1 > /sys/bus/pci/devices/0000\:01\:00.1/remove
در این مرحله، با بک اسلش ها به دقت برخورد کنید.

حال می‌توانید دوباره lspci را اجرا کنید تا بررسی کنید که گرافیک انویدیا دیگر در سیستم شما وجود ندارد.

نتیجه

مصرف برق لپتاپ من از ۳۰ وات برای تماشای ویدئوی Youtube با راه‌انداز اختصاصی ، به ده وات در حالت مجتمع  رسید.

امیدوارم این راهنما بتواند به شما کمک کند :D


حالش را ببرید ! ( یا مثل انجمن های دیگه : اگه بهتون کمک کرد لایک کنید . اما چون پسندیدن نداریم در انجمن به مقاله اصلی ستاره بدید.

اگه ناظران این مقاله رو مفید میدونید بی زحمت سنجاقش کنید
دیگر به انجمن باز نخواهم گشت شاید جایی با این نام پیدام کنید اگه کاری با من دارید : qxc9966@protonmail.com

آفلاین جعفر فرقانلوژ

  • High Hero Member
  • *
  • ارسال: 5099
  • جنسیت : پسر
  • اممم . اره دیگه! mehr32
راستی پروژه زیر هم فکر کنم مال همین نویسنده مقاله است :
https://github-com.translate.goog/bayasdev/envycontrol?_x_tr_sl=en&_x_tr_tl=fa&_x_tr_hl=fa&_x_tr_pto=wapp
امتحانش نکردم ولی فکر میکنم چیز کاربردی باشه و کارش هم همینه
دیگر به انجمن باز نخواهم گشت شاید جایی با این نام پیدام کنید اگه کاری با من دارید : qxc9966@protonmail.com

آفلاین دانیال بهزادی

  • ناظر انجمن
  • *
  • ارسال: 19532
  • جنسیت : پسر
  • Urahara Kiesuke
    • وبلاگ
این رو ویکی کنید لطفاً
اگه این ارسال بهت کمک کرد، دنبال دکمهٔ تشکر نگرد. به جاش تو هم به جامعهٔ آزادت کمک کن

آفلاین جعفر فرقانلوژ

  • High Hero Member
  • *
  • ارسال: 5099
  • جنسیت : پسر
  • اممم . اره دیگه! mehr32
دیگر به انجمن باز نخواهم گشت شاید جایی با این نام پیدام کنید اگه کاری با من دارید : qxc9966@protonmail.com

آفلاین Dragon-

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 5082
  • جنسیت : پسر
چنتا مرحله رو می‌تونید بهتر انجام بدید.
برای مثال می‌تونید مستقیم به lspci بگید فقط دستگا‌ه‌هایی رو نشون بده که vendor id اونها برابر 10de هست. vendor id شرکت nvidia اینه.
lspci -d 10de:
اون دو نقطه جلو 10de لازمه.

برای اینکه فراخوان acpi مناسب برای غیرفعال کردن چیپ گرافیک انویدیا رو پیدا کنید،  اسکریپت  turn_off_gpu.sh رو اجرا کردید. این اسکریپت یه لیست از فراخوان‌های acpi شناخته شده رو امتحان می‌کنه تا ببینه کدوم کار میده و نتیجه رو به شما میگه. می‌تونید خروجی این اسکریپت رو بدید به grep تا دنبال کلمه works بگرده. اینجوری لازم نیست توی اون لیست بلند ببینید کدوم فراخوان کار کرده.
منظورم این هست:
sudo /usr/share/doc/acpi-call-dkms/examples/turn_off_gpu.sh  | grep works

۶.۱) تلاش برای حذف رابط های PCI

بعد از راه‌اندازی مجدد، کارت گرافیک Nvidia شما باید به وسیله‌ی فراخوانی ACPI خاموش شود. اما عدم حذف رابط های PCI آن ممکن است به مشکلات پایداری منجر شود. بنابراین برای هر یک از رابط های PCI که در مرحله ۲ دریافت کرده‌اید، باید دستورات زیر را اجرا کنید.

sudo echo 1 > /sys/bus/pci/devices/[PCI bus here]/remove

برای لپتاپ من باید این کار را انجام دهید:
sudo echo 1 > /sys/bus/pci/devices/0000\:01\:00.0/remove
sudo echo 1 > /sys/bus/pci/devices/0000\:01\:00.1/remove
در این مرحله، با بک اسلش ها به دقت برخورد کنید.

حال می‌توانید دوباره lspci را اجرا کنید تا بررسی کنید که گرافیک انویدیا دیگر در سیستم شما وجود ندارد.
این دستوراتی که نوشتید؛ کاری که فکر می‌کنید رو انجام نمیدن.
redirect‌ها تحت تاثیر sudo قرار نمی‌گیرن. در نتیجه اگه دستورات بالا با کاربری به غیر از کاربر روت اجرا بشن، خطای Permission Denied می‌گیرید.

برای اینکه عدد ۱ توی اون فایل remove نوشته بشه، می‌تونید دستورات رو به این شکل اصلاح کنید:
echo 1 | sudo tee /sys/bus/pci/devices/[PCI bus here]/remove

که برای شما میشه این:
echo 1 | sudo tee /sys/bus/pci/devices/0000\:01\:00.0/remove
echo 1 | sudo tee /sys/bus/pci/devices/0000\:01\:00.1/remove

اگه اشتباه نکنم مرحله ۶ رو باید هر بار بعد از بوت شدن سیستم اجرا کنید. ولی به جای اینکار، بهتره چنتا قانون برای udev بنویسید که هر وقت این خطوط pci رو دید، اونها رو غیرفعال کنه. مثلا این برای شما باید کار بده:
ACTION=="add", KERNEL=="0000:01:00.0", SUBSYSTEM=="pci", RUN+="/bin/sh -c 'echo 1 > /sys/bus/pci/devices/0000:01:00.0/remove'"
ACTION=="add", KERNEL=="0000:01.00.1", SUBSYSTEM=="pci", RUN+="/bin/sh -c 'echo 1 > /sys/bus/pci/devices/0000:01:00.1/remove'"
چون دستورات مشخص شده توسط udev با دسترسی روت اجرا میشن، redirect‌ها اینجا کار میدن و لازم نیست از tee استفاده کنید.

این دو خط رو می‌تونید توی یه فایل داخل مسیر /etc/udev/rules.d/ قرار بدید. مثلا این (مهمه پسوند فایل rules. باشه)
/etc/udev/rules.d/99-disable-nvidia-pci.rules

در نهایت initramfs رو دوباره ایجاد کنید. اینجوری کار‌های لازم همون اوایل فرایند بوت شدن انجام میشه.
اگه از initramfs tools (پیش‌فرض دبیان) برای ایجاد initramfs استفاده می‌کنید، این‌شکلی:
sudo update-initramfs -u

اگه از dracut (پیش‌فرض فدورا و rhel) استفاده می‌کنید، به این شکل:
sudo dracut -f

اگه هم با mkinitcpio (پیش‌فرض آرچ) اینکار رو انجام می‌دید، این رو بزنید:
sudo mkinitcpio -P

یه راه‌اندازی مجدد هم لازمه.
« آخرین ویرایش: 30 تیر 1402، 11:58 ب‌ظ توسط Dragon- »
میدونید که زکات علم نشر آن است

آفلاین جعفر فرقانلوژ

  • High Hero Member
  • *
  • ارسال: 5099
  • جنسیت : پسر
  • اممم . اره دیگه! mehr32
البته این ترجمه هست من ننوشتمش ولی خوب برای من که بدون عیب  کار کرده ولی اگه فکر میکنید این کامل تره فردا ویرایش میکنم به ویکی هم اضافه میکنمش
دیگر به انجمن باز نخواهم گشت شاید جایی با این نام پیدام کنید اگه کاری با من دارید : qxc9966@protonmail.com