我的 Debian testing/unstable 之前显卡驱动用的是 nvidia-kernel-legacy-2.6.15-1-686-smp 和 nvidia-glx-legacy。前几天 etch 内核升级成 2.6.16-2-686-smp,原来的驱动起不了 X,于是策划把 nvidia 的驱动换成与 2.6.16-2-686-smp 内核兼容的版本。之前使用 legacy 版驱动的原因是只有这个版本的 glx 支持 xorg,对应 2.6-686-smp 内核最新的是 1.0-7174。而最近 unstable 里新的 1.0-8762 非 legacy 版驱动也支持 xorg 了,并且包含我选用的内核版本,于是试图安装这个非 legacy 的驱动。但是在用 nvidia-glx 替换原来的 nvidia-glx-legacy 的过程中出现了这个错误:
Unpacking nvidia-glx (from .../nvidia-glx_1.0.8762-2_i386.deb) ...
dpkg-divert: `diversion of /usr/lib/xorg/modules/extensions/libGLcore.a to /usr/lib/nvidia/libGLcore.a.xlibmesa by nvidia-glx' clashes with `diversion of /usr/lib/xorg/modules/extensions/libGLcore.a to /usr/lib/nvidia/libGLcore.a.xlibmesa by nvidia-glx-legacy'
dpkg: error processing /var/cache/apt/archives/nvidia-glx_1.0.8762-2_i386.deb (--unpack):
subprocess pre-installation script returned error exit status 2
Errors were encountered while processing:
/var/cache/apt/archives/nvidia-glx_1.0.8762-2_i386.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
然后我试图换回 nvidia-glx-legacy,却也发生类似的错误,无法安装。就算尝试 apt-get 的 –force-yes 选项还是 dpkg 的 –force-all 选项都无法进行下去。无奈只能暂时用 nv 的驱动进 X,屏幕整个朝右偏了10个像素左右,经常把滚动条挡住,十分不爽。
有热心人建议直接安装 nvidia 官方提供的驱动包,但为了图个统一,没有实行。google 后据称是 nvidia-glx 和 nvidia-glx-legacy 两个包的关系没被设定成冲突,导致可以被同时安装。回忆当时的安装过程,我很有可能试图先装 nvidia-glx 然后再删除 nvidia-glx-legacy,于是就稀里糊涂得再没有卸载 legacy 包的情况下直接安装非 legacy 包,后来因为它们互相冲突,后者安装失败,随即我把原来的包也删除了。但是很不幸 dpkg 的 diversion 中的信息却没有被复原,同时残留有 by nvidia-glx 和 by nvidia-glx-legacy 的信息。于是无论新安装 nvidia-glx 还是还原 nvidia-glx-legacy 都会在检查 diversion 的时候出错,无法继续安装,正如上面出错信息所示。
解决方法自然就从 dpkg-divert 命令着手了:找到无效的 diversion 信息,然后删除。man dpkg-divert 以后推测解决方法为:先用 dpkg-divert –list | grep nvidia 查看相关的 diversion,然后用 dpkg-divert –remove 删掉。过后再安装 nvidia-glx 就一切正常了。不过不敢保证这个方法有没有副作用,哈哈。
结论:1、先删旧包后装新包;2、出错信息很重要,一定要仔细分析,并且 google、man 之。我 google 了半天,从我看的懂的语言看大概还没有人对这个问题给出可行的解决方法,hoho,算是原创吧。