nouveau 驱动与 nvidia 驱动共存并实现切换

在上一篇文章中提到,由于 3.13 和 3.14 内核对 nvidia 闭源驱动的支持不佳,因此我尝试了各种方法来让我的 nvidia 显卡正常工作。当时的其中一个设想就是干脆使用 nouveau+Intel 的驱动组合,在经过最近几天的反复尝试之后,我最终采用了一种更灵活的方式,那就是让 nouveau 驱动与 nvidia 驱动共存,并实现灵活切换。

其实没什么技术含量,如果像我一样用的是 Gentoo,需要在内核中进行如下配置:

Device Drivers  --->
	Graphics support  --->
	<*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->
		<M> Nouveau (nVidia) cards

记得一定要去掉 nvidia 的 FrameBuffer 支持,否则可能无法正常运行 X。内核配置完成后,重新编译内核并安装。对于二进制发行版,就直接跳过这一步。

接着,在 /etc/modprobe.d 下面的配置文件中,删除所有带有 blacklist nvidiablacklist nouveau 的行。另外,为了保险起见,也请删除 /etc/X11/xorg.conf

然后,配置一下 grub2,在内核那一行添加一个内核参数 modprobe.blacklist=XXX,比如我的菜单项如下:

menuentry 'Gentoo GNU/Linux with Nvidia' --class gentoo --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-f0cc0adb-a9d2-4711-8d10-b8952882997c' {
	load_video
	insmod gzio
	insmod part_gpt
	insmod ext2
	set root='hd2,gpt2'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd2,gpt2 --hint-efi=hd2,gpt2 --hint-baremetal=ahci2,gpt2  613a406f-0f4d-4216-b3ca-f5d2841f7db9
	else
	  search --no-floppy --fs-uuid --set=root 613a406f-0f4d-4216-b3ca-f5d2841f7db9
	fi
	echo	'载入 Gentoo Linux ...'
	linux	/vmlinuz-3.13.3 root=UUID=f0cc0adb-a9d2-4711-8d10-b8952882997c ro rootflags=subvol=gentoo quiet init=/usr/lib/systemd/systemd modprobe.blacklist=nouveau
	echo	'载入初始化内存盘...'
	initrd /initramfs-3.13.3.img
}

menuentry 'Gentoo GNU/Linux with Nouveau' --class gentoo --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-f0cc0adb-a9d2-4711-8d10-b8952882997c' {
	load_video
	insmod gzio
	insmod part_gpt
	insmod ext2
	set root='hd2,gpt'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd2,gpt2 --hint-efi=hd2,gpt2 --hint-baremetal=ahci2,gpt2  613a406f-0f4d-4216-b3ca-f5d2841f7db9
	else
	  search --no-floppy --fs-uuid --set=root 613a406f-0f4d-4216-b3ca-f5d2841f7db9
	fi
	echo	'载入 Gentoo Linux ...'
	linux	/vmlinuz-3.13.3 root=UUID=f0cc0adb-a9d2-4711-8d10-b8952882997c ro rootflags=subvol=gentoo quiet init=/usr/lib/systemd/systemd modprobe.blacklist=nvidia
	echo	'载入初始化内存盘...'
	initrd /initramfs-3.13.3.img
}

第一个菜单项表示使用 nvidia+Intel 驱动,第二个表示使用 nouveau+Intel 驱动。这种方法已在 Gentoo 和 Linux Deepin 测试通过,理论上应该适用于所有发行版。而且当前版本的 bumblebee 似乎也已经能管理 nouveau 驱动了。

不过需要注意的是,对于二进制发行版,要让 nouveau 驱动正常渲染的话,可能还需要安装其他模块包,如 nouveau-dri 等。

由于这是我初步的测试,可能还有疏漏和错误,欢迎指正。

另外,也可参考 Gentoo wiki 的方法,但是这种方法可能并不通用。