背景和问题
自ubuntu 18.04以后,N卡的切换工具prime-select不再使用bbswitch,开始以update-initramfs方式进行显卡切换。不得不说,这种切换方式又慢还需要重启才能生效。更糟心的是,在集显模式下无法完全关闭N卡,造成严重的发热和续航问题。
经过开发人员努力,在10月的nvidia版本,不再使用修改该方法进行切换显卡,而是通过runtime pm在集显模式下关闭N卡。
具体情况可见 https://bugs.launchpad.net/ubuntu/+source/nvidia-prime/+bug/1778011
但是,经过测试,在集显模式下,N卡仍然没被完全关闭,可能是linux内核的bug。可见 https://devtalk.nvidia.com/default/topic/1032482/linux/optimus-on-ubuntu-18-04-is-a-step-backwards-but-i-found-the-first-good-solution/7 的第100楼。
解决方法
那么,目前的情况下,我的方法是通过bbswitch手动关闭N卡,解决发热和续航问题。
首先,你要安装 bbswitch-dkms: sudo apt install bbswitch-dkms
第二,你需要切换到集显模式: sudo prime-select intel ,然后注销或重启
第三,切换到集显模式后,通过tail /var/log/gpu-manager-switch.log ,可以看到最后一行有类似 Setting power control to "auto" in /sys/bus/pci/devices/0000:01:00.0/power/control 这样的输出。其中0000:01:00代表独显的PCI地址。
第四,根据上面的输出,我们先反向操作,先手动开启独显。sudo sh -c "echo on > /sys/bus/pci/devices/0000:01:00.0/power/control" ,其中000:01:00.0这个值要根据前面的输出来。
第五,用bbswitch来关闭独显,sudo modprobe bbswitch load_state=0 unload_state=1
第六,我们验证一下是否成功,lspci | grep VGA,我们看到N卡后面是rev ff,表示N卡被完全关闭了。
扩展:
你可以将第四和第五缩写成一句 sudo sh -c "echo on >/sys/bus/pci/devices/0000:01:00.0/power/control; modprobe bbswitch load_state=0 unload_state=1"。或者,你可以将这句命令写成服务或脚本,来更快地手动执行。
自ubuntu 18.04以后,N卡的切换工具prime-select不再使用bbswitch,开始以update-initramfs方式进行显卡切换。不得不说,这种切换方式又慢还需要重启才能生效。更糟心的是,在集显模式下无法完全关闭N卡,造成严重的发热和续航问题。
经过开发人员努力,在10月的nvidia版本,不再使用修改该方法进行切换显卡,而是通过runtime pm在集显模式下关闭N卡。
具体情况可见 https://bugs.launchpad.net/ubuntu/+source/nvidia-prime/+bug/1778011
但是,经过测试,在集显模式下,N卡仍然没被完全关闭,可能是linux内核的bug。可见 https://devtalk.nvidia.com/default/topic/1032482/linux/optimus-on-ubuntu-18-04-is-a-step-backwards-but-i-found-the-first-good-solution/7 的第100楼。
解决方法
那么,目前的情况下,我的方法是通过bbswitch手动关闭N卡,解决发热和续航问题。
首先,你要安装 bbswitch-dkms: sudo apt install bbswitch-dkms
第二,你需要切换到集显模式: sudo prime-select intel ,然后注销或重启
第三,切换到集显模式后,通过tail /var/log/gpu-manager-switch.log ,可以看到最后一行有类似 Setting power control to "auto" in /sys/bus/pci/devices/0000:01:00.0/power/control 这样的输出。其中0000:01:00代表独显的PCI地址。
第四,根据上面的输出,我们先反向操作,先手动开启独显。sudo sh -c "echo on > /sys/bus/pci/devices/0000:01:00.0/power/control" ,其中000:01:00.0这个值要根据前面的输出来。
第五,用bbswitch来关闭独显,sudo modprobe bbswitch load_state=0 unload_state=1
第六,我们验证一下是否成功,lspci | grep VGA,我们看到N卡后面是rev ff,表示N卡被完全关闭了。
扩展:
你可以将第四和第五缩写成一句 sudo sh -c "echo on >/sys/bus/pci/devices/0000:01:00.0/power/control; modprobe bbswitch load_state=0 unload_state=1"。或者,你可以将这句命令写成服务或脚本,来更快地手动执行。