显卡驱动作死(续)显卡控制切换脚本化

准备工作

首先确保直接使用 nVidia 闭源驱动能够正常工作,同时 bumblebee 也是能够正常工作的。

系统版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
                  -`                    orange@BiGOranGe 
.o+` ----------------
`ooo/ OS: Arch Linux x86_64
`+oooo: Host: Aspire VN7-591G V1.15
`+oooooo: Kernel: 5.0.13-arch1-1-ARCH
-+oooooo+: Uptime: 2 hours, 4 mins
`/:-:++oooo+: Packages: 2054 (pacman)
`/++++/+++++++: Shell: zsh 5.7.1
`/++++++++++++++: Resolution: 1920x1080
`/+++ooooooooooooo/` DE: Deepin
./ooosssso++osssssso+` WM: Mutter(DeepinGala)
.oossssso-````/ossssss+` Theme: Adapta [GTK2/3]
-osssssso. :ssssssso. Icons: Numix-Circle [GTK2/3]
:osssssss/ osssso+++. Terminal: deepin-terminal
/ossssssss/ +ssssooo/- Terminal Font: Noto Mono for Powerline 12
`/ossssso+/:- -:/+osssso+- CPU: Intel i5-4210H (4) @ 3.500GHz
`+sso+:-` `.-/+oso: GPU: Intel 4th Gen Core Processor
`++:. `-/+/ GPU: NVIDIA GeForce GTX 860M
.` `/ Memory: 2633MiB / 7898MiB

nVidia 版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sun May 12 23:14:07 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.74 Driver Version: 418.74 CUDA Version: 10.1 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 860M Off | 00000000:01:00.0 Off | N/A |
| N/A 49C P0 N/A / N/A | 5MiB / 2004MiB | 0% Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 11362 G /usr/lib/Xorg 4MiB |
+-----------------------------------------------------------------------------+

编写脚本

1
nvim /usr/local/bin/nvch.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#/usr/bin/bash
# function:change nvidia driver,bumblebee or use nvidia driver directively
if [[ $1 == "n" ]] # use nvidia driver
then
sudo systemctl disable bumblebeed # 取消 bumblebee 的开机启动
echo | yay -Rnsc bumblebee # 卸载 bumblebee
echo "Bumblebee was removed"
sudo cp /etc/X11/xorg.conf.bak /etc/X11/xorg.conf # 直接使用 nVidia 驱动需要配置 xorg
echo "xorg.conf was created"
sudo cp /home/orange/Software/desktop/nvidia-settings-nvidia.desktop /usr/share/applications/nvidia-settings.desktop # 这里是直接使用 nVidia 时 nvidia-setting 的打开方式
echo "desktop file created"
sudo sed -i 's/^VDPAU_DRIVER=va_gl/VDPAU_DRIVER=nvidia/' /etc/environment # 环境变量设置 vdpau 为 nVidia
echo "environment VDPAU_DRIVER now is nvidia"
#sed -i 's/^#hw=vdpau/hw=vdpau/' /home/orange/.config/mpv/mpv.conf # 设置 mpv 使用 nVidia 显卡硬解码,缓解 CPU 占用率
#sed -i 's/^#profile=gpu-hq/profile=gpu-hq/' /home/orange/.config/mpv/mpv.conf
sed -i 's/^#gpu-api=vulkan/gpu-api=vulkan/' /home/orange/.config/mpv/mpv.conf
sed -i 's/^#vo=vdpau/vo=vdpau/' /home/orange/.config/mpv/mpv.conf
echo "mpv.conf now is nVidia"
elif [[ $1 == "b" ]]
then
echo | yay -S bumblebee primus lib32-primus # 安装 bumblebee 及 primus
echo "Bumblebee & primus was installed"
sudo systemctl enable bumblebeed # 开机启动 bumblebee
echo "Bumblebee.service was enabled"
sudo mv /etc/X11/xorg.conf /etc/X11/xorg.conf/bak # bumblebee 会自动管理 xorg,所以将 xorg 配置文件直接备份,以备在切换为直接使用 nVidia 驱动时使用
echo "xorg.conf was deleted"
sudo cp /home/orange/Software/desktop/nvidia-settings-bumblebee.desktop /usr/share/applications/nvidia-settings.desktop # 这里是使用 bumblebee 时 nvidia-setting 的打开方式
echo "desktop file created"
sudo sed -i 's/^VDPAU_DRIVER=nvidia/VDPAU_DRIVER=va_gl/g' /etc/environment # 设置环境变量 vdpau 为 intel 集成显卡
echo "environment VDPAU_DRIVER now is #"
#sed -i 's/^hw=vdpau/#hw=vdpau/' /home/orange/.config/mpv/mpv.conf # 取消 mpv 用 nVidia 解码的方式,否则 mpv 会无法打开
#sed -i 's/^profile=gpu-hq/#profile=gpu-hq/' /home/orange/.config/mpv/mpv.conf
sed -i 's/^gpu-api=vulkan/#gpu-api=vulkan/' /home/orange/.config/mpv/mpv.conf
sed -i 's/^vo=vdpau/#vo=vdpau/' /home/orange/.config/mpv/mpv.conf
echo "mpv.conf now is #"
fi

两个不同的 desktop 文件内容:

nvidia-settings-bumblebee.desktop

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[Desktop Entry]
Type=Application
Encoding=UTF-8
Name=NVIDIA X Server Settings Bumblebee
Comment=Configure NVIDIA X Server Settings
Exec=optirun -b none /usr/bin/nvidia-settings -c :8
Icon=/usr/share/pixmaps/nvidia-settings.png
Categories=__NVIDIA_SETTINGS_DESKTOP_CATEGORIES__

# Translations provided by Sun Microsystems
Name[de]=NVIDIA X-Server-Einstellungen
Name[es]=Valores de configuración del servidor NVIDIA X
Name[fr]=Paramètres du serveur X NVIDIA
Name[it]=NVIDIA X Server Settings
Name[ja]=NVIDIA X サーバー設定
Name[ko]=NVIDIA X 서버 설정
Name[pt_BR]=Configurações do NVIDIA X Server
Name[zh_CN]=NVIDIA X 服务器设置
Name[zh_HK]=NVIDIA X 伺服器設定
Name[zh_TW]=NVIDIA X 伺服器設定
Comment[de]=Konfigurieren der NVIDIA X-Server-Einstellungen
Comment[es]=Establezca los valores de configuración del servidor NVIDIA X
Comment[fr]=Configurer les paramètres du serveur X NVIDIA
Comment[it]=Configura NVIDIA X Server Settings
Comment[ja]=NVIDIA X サーバー設定を構成します
Comment[ko]=NVIDIA X 서버 설정 구성
Comment[pt_BR]=Definir &configurações de gerenciamento de usuário...
Comment[zh_CN]=配置 NVIDIA X 服务器设置
Comment[zh_HK]=配置 NVIDIA X 伺服器設定
Comment[zh_TW]=配置 NVIDIA X 伺服器設定

nvidia-settings-nvidia.desktop

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[Desktop Entry]
Categories=__NVIDIA_SETTINGS_DESKTOP_CATEGORIES__
Comment=Configure NVIDIA X Server Settings
Comment[de]=Konfigurieren der NVIDIA X-Server-Einstellungen
Comment[es]=Establezca los valores de configuración del servidor NVIDIA X
Comment[fr]=Configurer les paramètres du serveur X NVIDIA
Comment[it]=Configura NVIDIA X Server Settings
Comment[ja]=NVIDIA X サーバー設定を構成します
Comment[ko]=NVIDIA X 서버 설정 구성
Comment[pt_BR]=Definir &configurações de gerenciamento de usuário...
Comment[zh_CN]=配置 NVIDIA X 服务器设置
Comment[zh_HK]=配置 NVIDIA X 伺服器設定
Comment[zh_TW]=配置 NVIDIA X 伺服器設定
Encoding=UTF-8
Exec=/usr/bin/nvidia-settings
Icon=/usr/share/pixmaps/nvidia-settings.png
Name=NVIDIA X Server Settings Nvidia
Name[de]=NVIDIA X-Server-Einstellungen
Name[es]=Valores de configuración del servidor NVIDIA X
Name[fr]=Paramètres du serveur X NVIDIA
Name[it]=NVIDIA X Server Settings
Name[ja]=NVIDIA X サーバー設定
Name[ko]=NVIDIA X 서버 설정
Name[pt_BR]=Configurações do NVIDIA X Server
Name[zh_CN]=NVIDIA X 服务器设置
Name[zh_HK]=NVIDIA X 伺服器設定
Name[zh_TW]=NVIDIA X 伺服器設定
Type=Application

赋予脚本可执行权限

1
sudo chmod +x /usr/local/bin/nvch.sh

使用方式

1
2
nvch n     # 切换为直接使用 nVidia 闭源驱动的方式
nvch b # 切换为使用 bumblebee 的省电方式

注意事项

切换显卡驱动方式之后需要重启才能生效

后记

脚本中 mpv 配置那一段是个人需要所配置的,因为 CPU 集显性能在现在看有一点不够用,导致看较大(5GB以上)视频会掉帧,同时整个电脑会卡顿,CPU 被吃满,所以此时需要使用 nVidia 显卡来打开 mpv。在此之前也有尝试过使用 bumblebee 的方式来通过 primusrun 或者 optirun 来给 mpv 加速获取高性能,但因为 mpv 使用的方式无法使用 bumblebee 来资持的,所以就想到了这么一个算是比较难看的办法。