Ubuntu 18.04配置prime-select切换/关闭独立显卡

时间:2024-02-29 19:40:56

Ubuntu 16.04里面装nvidia显卡的时候,默认会装上nvidia-prime,这样用prime-select命令就可以选择打开还是关闭独立显卡。Ubuntu 18.04里面改变了之前用update-alternative的方式进行prime-select的方法,变成用blacklist+grub cmmand+systemd service的方法,用nouveau进行电源管理,然后我装了之后并不能成功工作,所以配置了一下,还原成用bbswitch进行电源管理的方法,虽然切换显卡需要重启,不过还是比不work要好多了。

安装Ubuntu 18.04时可能遇到的问题

在安装Ubuntu18.04的时候,就可能遇到显卡驱动的问题。我在创建启动盘(用dd或者UltraISO),从U盘启动之后,不管是在启动菜单里面选择"Try Ubuntu 18.04.1 LTS”还是“Install Ubuntu 18.04.1 LTS”,看到Ubuntu的界面之后系统很快就会卡住,问题可是是nouveau导致的。一个简单粗暴的解决办法是在选择Try还是Install的时候,编辑Install的启动命令,移动光标到Install那一条,按e,在linux /boot/vmlinuz-.... ro quiet splash那一行最后面加上nomodset,然后按F10启动。这样可以禁止内核加载独立的显卡驱动,代价是安装界面的分辨率会变得很低,所以选择Install,这样可以不显示top panel。

安装完Ubuntu之后,在安装独立显卡之前,有可能还是会遇到系统界面卡住的问题,也可以用上面的方法进入系统,安装NVIDIA显卡之后再重启就可以正常启动。

禁用独立显卡

如果只是想禁用独立显卡的话,可以用下面的步骤。
1.禁用nvidia-fallback.service

# systemctl disable nvidia-fallback.service

2.把nouveau加入blacklist(NVIDIA显卡驱动安装的时候会在/etc/modprobe.d/新建一个文件把nouveau加到blacklist,如果没有或者没有作用的话可以使用下面的方式)

# vim /etc/default/grub // 打开/etc/default/grub
//找到GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
//在splash后面加上nouveau.blacklist=1
# update-grub 

3.使用bbswitch作为电源管理

安装bbswitch-dkms

# apt install bbswitch-dkms

编辑/etc/modules,加入一行

bbswitch

编辑/etc/modprobe.d/bbswitch.conf,加入一行

modprobe bbswitch load_state=0 unload_state=1

4.重启

Ubuntu 18.04的prime-select

阅读prime-select的源码可以得知它切换为intel显卡禁用NVIDIA显卡的时候主要做了下面几件事:
1.在grub的GRUB_CMDLINE_LINUX_DEFAULT参数里面加了一条nouveau.runpm=0,禁止nouveau进行电源管理
2.在‘/etc/modprobe.d’目录下创建了一个/etc/modprobe.d/blacklist-nvidia.conf,写入了以下内容

blacklist nvidia
blacklist nvidia-drm
blacklist nvidia-modeset
alias nvidia off
alias nvidia-drm off
alias nvidia-modeset off

3.使用update-initramfs -u更新了一下rootfs文件
4.systemctl enable nvidia-prime-boot.service,在nvidia-fallback.service之后执行,其中的命令是echo OFF > /sys/kernel/debug/vgaswitcheroo/switchnvidia-fallback.service的作用是加载nouveau模块

在启动nvidia显卡的时候,进行了以下工作:
1.删除grub的GRUB_CMDLINE_LINUX_DEFAULT参数里面的nouveau.runpm=0
2.删除在‘/etc/modprobe.d’目录下的/etc/modprobe.d/blacklist-nvidia.conf
3.使用update-initramfs -u更新了一下rootfs文件
4.systemctl diasble nvidia-prime-boot.service`

这样的话主要的更改内容有三个:
1.注释掉更改grub命令的代码
2.将nvidia-fallback.service改为加载bbswitch模块
3.更改nvidia-prime-boot.service,改为使用bbswitch关闭独立显卡echo "OFF" >> /proc/acpi/bbswitch

更改prime-select使其正常工作

如果想要用prime-select来进行切换显卡的话,可以更改一下相关的文件,因为主要的问题在于nouveau作为电源管理并不成功,将其改为bbswitch就行了。
1.更改/lib/systemd/system/nvidia-fallback.service

找到

ExecStart=-/sbin/modprobe nouveau

改为

ExecStart=-/sbin/modprobe bbswitch

然后确保nvidia-fallback.service没有被disable

# systemctl enable nvidia-fallback.service

2.更改/lib/systemd/system/nvidia-prime-boot.service`

ExecStart=/bin/sh -c "echo OFF > /sys/kernel/debug/vgaswitcheroo/switch"

改成

ExecStart=/bin/sh -c "echo OFF > /proc/acpi/bbswitch"

3.更改/usr/bin/prime-select

_diable_nviida函数的下面两行注释掉

//usr/bin/prime-select
self._add_boot_params(self._grub_cmdline_start, self._grub_path, boot_params)
self._update_grub()

_enable_nvidia函数的下面三行注释掉


self._remove_boot_params(self._grub_cmdline_start,
                             self._grub_path, [\'nouveau.runpm\', \'video=VGA\'])
self._update_grub()


参考


更改日志

  • 2018.08.30 创建