Nvidia不支持KMS已经令人诟病很长时间了,可不支持就是不支持。我们只能通过各种方式,来获得一个在没有KMS情况下完美/半完美的分辨率。有些幸运的人,在通过添加内核参数vga=791/792,就成功让自己的1024×768显示器配合VESA使用最佳分辨率了。而有些Nvidia的显卡BIOS还不太一样,有的在最差的状态下只支持800×600。这样的80×24终端除了复古,没人想要吧。

好在Gentoo的一些牛人,开发了一个vesafb的替代品——uvesafb,已经进入了主线内核,利用它也许就可以令那纠结的Nvidia分辨率稍微改善或彻底解决。由于比尔盖子用的就是Gentoo,而uvesafb的开发者也用Gentoo,再加上Gentoo编译内核很方便,所以就以Gentoo为例了,Ubuntu等请另找教程——比Gentoo省事多了。

安装必要的软件包

首先,需要安装或重新安装两个包,需要下载约70MiB的数据,3G用户需要注意了:

emerge -av klibc v86d

配置内核

然后就可以配置内核了,来到你内核源码的所在地,比如Gentoo是/usr/src/linux,开始配置内核。

Device Drivers  --->
     <*> Connector - unified userspace <-> kernelspace linker  --->
     Graphics support  --->
           <*> Support for frame buffer devices  --->
                [*]   Enable firmware EDID
                      <*>   Userspace VESA VGA graphics support

这样你就具有初步的使用uvesafb的能力了,不过还没完。
安装v86d的时候,v86d会自动保存一份initrd文件到/usr/share/v86d/initramfs,这份initrd是用来支持uvesafb的关键程序。我们还需要把它加入进内核。

General setup  --->
     [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
     #这里的路径要填对啊
     (/usr/share/v86d/initramfs) Initramfs source file(s)
         # 压缩算法。可以不选(None),但建议与你在 Kernel compression mode 中的选项一致。
         Built-in initramfs compression mode (XZ)  --->

这里要特别说明一下,很多Gentoo用户都不喜欢initrd,因为开机必要的东西都已放在内核中,完全不需要额外加载一个initramfs,我也是这种人中的其中一个。但实际上,上面的操作是将一个initrd文件编译进内核——没错,嵌入内核。所以完全不会多出initrd文件,各位用户请放心。

另外我说Built-in initramfs compression mode建议和Kernel compression mode中的选项一致。但并非必须如此。这么做是为了让你initrd文件的压缩算法的内核统一化。当然,如果你不在乎,不压缩或使用不同的压缩算法也是可疑的。

编译内核

好了,现在就编译安装内核吧。这些对你可能是废话。

make -j3
mount /boot 2> /dev/null
make modules_install install

修改引导参数

编辑你的引导配置文件:

# 对于 Grub Legacy,请修改您的引导配置文件,指向新内核
vim /boot/grub/menu.lst

# 对于 Grub2,请修改并重新生成一份引导配置文件
vim /enc/default/grub
grub-mkconfig -o /boot/grub/grub.cfg

# 对于Funtoo,请修改并重新生成一份引导配置
vim /etc/boot.conf
boot-update

那到底编辑什么呢?首先,要把内核参数中的vga=xxx去掉,这会阻止uvesafb的运行。第二,就是增加uvesafb的参数。比如比尔盖子添加的是:

video=uvesafb:1440x900-32,mtrr:3,ywrap

一般的,你只需把1440×900换成你的最佳分辨率即可。

搞定

接着,重启你的电脑,如果配置一切顺利,你将会得到两种结果:

  • 终端机已是最佳分辨率。
    Good luck! 看来你的显卡BIOS还是很有良心的,已经把你显示器的最佳分辨率硬编码了。
  •  终端机的分辨率略有提高,但仍不是最佳分辨率。
    你怎么和比尔盖子一样啊……这说明你的显卡BIOS并没有写入你显示器所用的分辨率。所以uvesafb就找了个最贴近你指定的分辨率,比如比尔盖子指定的1440×900变成了1280×768——反正提高不少了,别扭归别扭,反正比800×600好多啦!