Arch下使用bbswitch彻底禁用双显卡笔记本的独立显卡

起手先喷一下宏碁。我有一台i3 2367m+gt620m的砖头超薄本,一直以来都是禁用独显用的,结果我手贱升级了下最新的BIOS,狗血的事情发生了,BIOS里禁用独显的选项就这么消失了!我当时就惊呆了,想刷回旧版本BIOS结果提示不允许刷比当前旧的版本,墙内墙外找了一圈解决办法,折腾一下午无果,找我雪反编译一下把版本检验的汇编去了,大雪神不愿意帮我!遂只能琢磨Arch下怎么把独显禁用了。

在Arch Wiki的Nvidia Optimus页面(https://wiki.archlinux.org/index.php/NVIDIA_Optimus ),介绍了几种双显卡在Linux下工作的解决方案,我们的目标很明确,直接禁用独显,在第一段Disabling switchable graphics里介绍了可以通过BIOS(去nmdACER)或者通过安装acpi_call这个模块,执行其提供的turn_off_gpu.sh来关闭。我之前看了半天误以为他会把我核显GPU也关了,就无视了,后来才发现Discrete GPU就是独显。

然后我在Bumblebee( https://wiki.archlinux.org/index.php/Bumblebee)页面找到了一个bbswitch的组件,在Bumblebee中bbswitch只扮演一个用以切换双显卡的角色,而什么时候该切换则是Bumblebee其他部分执行。单独一个bbswitch已经契合了我的需求,感谢Bumblebee开发者将此工具独立出来。先将安装过程记录如下。

首先安装bbswitch包,arch已将其归入官方源,可以直接安装,其github地址:https://github.com/Bumblebee-Project/bbswitch,其他发行版可能需要clone代码make。
bbswitch作为一个模块存在,安装后可以使用

$ modprobe bbswitch

将其加载,

$ rmmod bbswitch

将其卸载,加载后可以使用

$ cat /proc/acpi/bbswitch 

查看其独立显卡运行状态。
关闭/开启独立显卡的指令为

$ tee /proc/acpi/bbswitch <<<OFF
$ tee /proc/acpi/bbswitch <<<ON

若执行关闭后查看状态仍为ON,可能是因为独立显卡的驱动仍在运行,无法关闭。可以通过dmesg查询错误信息:

$ dmesg |tail -1
bbswitch: device 0000:01:00.0 is in use by driver 'nouveau', refusing OFF

我们可以将驱动nouveau模块卸载

$ rmmod nouveau

由于bbswitch所起的作用实际上是维持独立显卡的目前状态,而开关独立显卡的功能在bumblebee其他部分,所以我们单独使用bbswitch需要进行一些配置。

首先,bbswitch有两个基本参数可用,load_state和unload_state。含义为当bbswitch模块被加载时要执行的动作和bbswitch模块被卸载时要执行的动作。可用参数值-1,0,1分别表示维持独立显卡当前状态,关闭独显,打开独显。所以我们加载时使用

$ modprobe bbswitch load_state=0

卸载时使用

$ echo 1 | tee /sys/module/bbswitch/parameters/unload_state

即可达到开启bbswitch时关闭独显,卸载bbswitch时打开独显的效果。也可以直接加载时使用

$ modprobe bbswitch load_state=0 unload_state=1

卸载时就可以不特定指定unload_state。

我们还可以在/etc/modprobe.d/中新建一个bbswitch.conf
内容为

options bbswitch load_state=0 unload_state=1

这样,我们加载bbswitch模块时,modprobe就会自动从该文件读取出这两个参数。

至此,禁用独显的功能已经实现了,我们肯定希望开机就自动禁用独显,关机前再自动打开独显。bbswitch的github页面给出了UpStart等通用init程序的开机启动方法

/etc/init/bbswitch.conf

description "Save power by disabling nvidia on Optimus"
author "Lekensteyn <lekensteyn@gmail.com>"
start on runlevel [2345]
stop on runlevel [016]
pre-start exec /sbin/modprobe bbswitch load_state=0 unload_state=1
pre-stop exec /sbin/rmmod bbswitch

而Arch Linux使用systemd,我们需要按systemd的写法去写一个关机前启用独显的服务

/etc/systemd/system/poweroff-enable-nvidia.service

[Unit]
Description=Enable NVIDIA card when poweroff
DefaultDependencies=no

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo ON > /proc/acpi/bbswitch'

[Install]
WantedBy=shutdown.target

然后通过systemctl enable --now启动这个服务。

再把bbswitch加入开机启动的模块列表:

/etc/modules-load.d/bbswitch.conf

# Load bbswitch at boot
bbswitch

最后还要记得将独显驱动直接加入黑名单

/etc/modprobe.d/blacklist.conf

blacklist nouveau

至此,大功告成!

参考:
https://github.com/Bumblebee-Project/bbswitch
https://wiki.archlinux.org/index.php/Bumblebee
https://wiki.archlinux.org/index.php/NVIDIA_Optimus
https://wiki.archlinux.org/index.php/Hybrid_graphics
https://wiki.archlinux.org/index.php/Kernel_modules
https://wiki.archlinux.org/index.php/Systemd
http://www.linuxidc.com/Linux/2014-11/109232.htm
http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html
http://www.linuxidc.com/Linux/2015-05/117640.htm


title: Arch下使用bbswitch彻底禁用双显卡笔记本的独立显卡
time: 2018-01-25 22:25
tags: Arch,Linux,禁用独立显卡
category: Study

标签: Arch 禁用独立显卡

发表评论: