Linux で切り替え可能なグラフィック Nvidia/Intel


多くのラップトップには 2 つのグラフィックスがあります.電力を節約する Intel と、より優れたパフォーマンスを提供する Nvidia.

切り替え可能なグラフィック、PRIME、Bumblebee、nvidia-xrun を使用するには several options があります.

これらのプログラムはどれも完全に機能するものではなく、常に問題があります.たとえば、Nvidia はまだバックグラウンドでアクティブであるため、省電力は行われないか、Nvidia は動作しますが、何らかの問題があります (Steam のゲームが動作しないか、うまく動作しません).

最後に、任意のビデオ ゲームをプレイすることを選択し、必要に応じて Nvidia を無効にする方法を見つけます.

Archlinux Nvidia guide に従って、Nvidia を有効および無効にする Ansible プレイブックを作成しました

---
- name: Nvidia DRM switch (disable)
  hosts: localhost
  become: yes
  tasks:

    - name: X11
      ansible.builtin.file:
        path: /etc/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf
        state: absent

    - name: SDDM
      blockinfile:
        path: /usr/share/sddm/scripts/Xsetup
        insertafter: |
          #!/bin/sh
          # Xsetup - run as root before the login dialog appears
        block: ""

    - name: GRUB
      ansible.builtin.lineinfile:
        path: /etc/default/grub
        regexp: '^GRUB_CMDLINE_LINUX_DEFAULT='
        line: GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet resume=/dev/mapper/Vol-swap"
      register: grub

    - name: Modules
      ansible.builtin.lineinfile:
        path: /etc/mkinitcpio.conf
        regexp: '^MODULES='
        line: MODULES=()
      register: modules

    - name: Backlist modules
      blockinfile:
        path: /etc/modprobe.d/blacklist.conf
        block: |
          blacklist nvidia
          blacklist nvidia_modeset
          blacklist nvidia_uvm
          blacklist nvidia_drm
    - name: Re-generate the grub.cfg
      ansible.builtin.command: grub-mkconfig -o /boot/grub/grub.cfg
      when: grub.changed

    - name: Re-generate image
      ansible.builtin.command: mkinitcpio -P
      when: modules.changed



---
- name: Nvidia DRM switch (enable)
  hosts: localhost
  become: yes
  tasks:

    - name: X11
      ansible.builtin.copy:
        src: "{{ playbook_dir }}/10-nvidia-drm-outputclass.conf"
        dest: /etc/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf
        owner: root
        group: root
        mode: '0644'

    - name: SDDM
      blockinfile:
        path: /usr/share/sddm/scripts/Xsetup
        insertafter: |
          #!/bin/sh
          # Xsetup - run as root before the login dialog appears
        block: |
          xrandr --setprovideroutputsource modesetting NVIDIA-0
          xrandr --auto
    - name: GRUB
      ansible.builtin.lineinfile:
        path: /etc/default/grub
        regexp: '^GRUB_CMDLINE_LINUX_DEFAULT='
        line: GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet resume=/dev/mapper/Vol-swap nvidia-drm.modeset=1"
      register: grub

    - name: Modules
      ansible.builtin.lineinfile:
        path: /etc/mkinitcpio.conf
        regexp: '^MODULES='
        line: MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)
      register: modules

    - name: Re-generate the grub.cfg
      ansible.builtin.command: grub-mkconfig -o /boot/grub/grub.cfg
      when: grub.changed

    - name: Re-generate image
      ansible.builtin.command: mkinitcpio -P
      when: modules.changed


変更にはラップトップの再起動が必要ですが、私は毎日プレイするわけではないので、この問題は許容範囲内です.

バッテリーを使用しているときに実行するコマンドがさらに 2 つあります.

# echo '\_SB.PCI0.PEG0.PEGP._OFF' > /proc/acpi/call
# rmmod nvidia


これらのコマンドは、バッテリーを使用して 3 ~ 4 時間増加します./etc/acpi/handler.sh に追加して自動的に実行する方法を研究します.