起手先喷一下宏碁。我有一台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