openSUSE:Packaging Nvidia drivers

跳转至: 导航, 搜索

本页面教您如何 本地 转换 NVIDIA 公司的标准 .bin 安装程序到可在 openSUSE 上使用 YaST2/Zypp 安装的 RPM 软件包。注意,这只是技术教学。知道原子弹怎么造不一定非要造出一颗,造出来也不一定要去投放它。详情见下面的两个警告。创作它的目的仅仅是在于让社区的一些高级编译工种能够协助维护驱动程序。而不是实际分发给下游用户使用。因为你并没有权限这么做。
注意: 本地编译!本教程中使用了构建服务的本地编译程序 osc 以使用它的一些快速工具,但谨记万万不能上传你的成果到构建服务上去。尤其是 NVIDIA 公司分发给个人用户使用的 .bin 驱动包。你可以上传除了驱动包以外的所有东西,在服务器上以 broken 的方式来保存你的其他开源修改。甚至可以提交给 X11:drivers:video 源协助上游有权限的开发者更新。但不能用构建服务或 Packman 私人构建服务 服务器进行实际的编译操作。因为那是违反 NVIDIA 公司的分发策略和构建服务的 黑名单 的。
注意: 本机使用!本法在本地制作出的 RPM 软件包也仅供本人使用。不可进行分发。
从上面大家也看到了,这是一个近乎仅供 RPM 洁癖症候群使用的折腾教学。技术不到位的请参考 NVIDIA 驱动教程 中的安装方法进行安装。

准备工作

你应该了解 openSUSE 中 NVIDIA 驱动命名的方式:

  • nvidia-computeG02-295.49-0.x86_64
  • nvidia-gfxG02-kmp-desktop-295.49_k3.3.4_1-0.x86_64
  • x11-video-nvidiaG02-295.49-0.x86_64

以上是驱动包的完整名称。其中:

  • gfxG02 代表最近三年的显卡驱动,也就是最新的; 同样 gfxG01 代表三年前的中古显卡, gfx 代表六年前的太古显卡。相应地,在 NVIDIA 官网下载的 .bin 包也不相同。
  • kmp-desktop 代表是针对 kernel-desktop 的软件包。同样还有 kmp-default 代表是针对 kernel-default 的软件包。这个不需要手选,编译一次就会编译出针对所有内核款式的内核模块包。
  • 295.49 是驱动的官方版本号。
  • k3.3.4.1 是内核的版本号,k3 代表 3 系内核,3.4.1 是内核的版本号。
  • 0.x86_64 0 代表 spec 范式文件中的 Release: 释出号。x86_64 代表操作系统架构。

前期准备和下载辅助文件

首先你需要一个用于打包的本机初始化环境和一些打包显卡必要的辅助文件。

sudo zypper install osc obs-service-format_spec_file spec-cleaner
  • 你需要下载打包显卡的辅助文件。当然你可以使用:
osc co x11:drivers:video x11-nvidia-gfxG02

但那里面的文件很旧,所以请到这里下载(仅提供 gfxG02 系列最新显卡的辅助文件,其他请到 x11:drivers:video 源中下载):

初始化打包环境

首先你需要在构建服务上有一个私人车库 home:marguerite。这是我们从构建服务获取依赖包和必要的编译配置信息的基础。具体请参考 构建服务教学#工作流程#步骤一 - 登录和一次性本地设定

使用最新稳定版本的内核来编译显卡驱动

(可选)接着你需要:

osc meta prj home:marguerite -e

来编辑你私人车库的元数据文件。以指引 osc 能够正确的从 kernel:stable 源里下载最新的稳定版本内核。而不是使用 12.1 DVD 默认安装的旧版内核编译。上述命令会打开一个文件,在里面添加:

<repository name="openSUSE_12.1">
    <path project="Kernel:stable" repository="standard"/>
    <path project="openSUSE:12.1:Update" repository="standard"/>
    <path project="openSUSE:12.1:Update" repository="standard"/>

在近期的几个内核版本中,由于内核团队使用了 i686 的包格式来编译 i586 的内核,却没有妥善的配置好 i586 的源信息查找 i686 的软件包,因此会导致 i586 的内核出现:

"nothing provides *-devel needed by kernel-syms"

错误。openSUSE 工厂版已经做出了相应修复,11.4/12.1/Tumbleweed 暂时还没有官方修复。当前的 workaround 是:

11.4/Tumbleweed,在上述的 Kernel:stable 下面再添加一行 path,内容为:

<path project="home:munix9:Kernel:11.4" repository="openSUSE_11.4"/> 或
<path project="home:munix9:Kernel:Tumbleweed" repository="openSUSE_Tumbleweed"/>
根据 <repository name="openSUSE_11.4"> 来选择

12.1 替换上述的 Kernel:stable project 为:

home:MargueriteSu:Kernel:stable:i586:fix:12.1

详情参考:openSUSE 打包邮件列表

编译过程

创建和链接软件包

首先进入到你的私人车库所在目录:

cd /home/marguerite/Public/home:marguerite

然后创建一个新的软件包:

osc mkpac x11-video-nvidiagfxG02

把下载到的辅助文件解压到这个目录里。把官方网站下载到的 .bin 驱动放到这个目录下。然后使用:

osc add *

来使它们能够被构建服务认识。

注意: 注意最前面的警告,不要照抄命令,这会把 .bin 文件也添加进去的,之后 osc ci 的时候就会上传它到服务器。实际上你应该用的方法是一个一个添加。

然后链接出一个 nvidia-gfxG02

osc linkpac home:marguerite x11-nvidia-gfxG02 home:marguerite nvidia-gfxG02

重复上述步骤。

准备 pci_ids

该文件主要说明新版本的显卡新增了哪些驱动的支持。每个新版本都需要对它进行相应的增删。

如果是自用,且没有打包洁癖的话,这个文件可以不动。

使用:

sh NVIDIA-Linux-*.bin -x //注意,x 为小写。且要放在 .bin 后面。

里解压缩官方的 .bin 文件,进去会找到一个名为 README.txt 的文件,打开它,查找 Appendix A. Supported NVIDIA GPU Products 和 A2. NVIDIA QUADRO GPUS,对比 pci_ids-%{version} 来更新里面的内容。

更新日志

osc vc nvidia-gfxG02.changes
osc vc x11-video-nvidiagfxG02.changes

可以分别书写更新日志。更新日志的内容在类似这样的 发布说明 中。照搬就可以了。两个 changelog 的内容都一样

本地编译

osc build openSUSE_12.1 x86_64 nvidia-gfxG02.spec --local
osc build openSUSE_12.1 x86_64 x11-video-nvidiagfxG02.spec --local

一般如果使用上面提供的下载点下载的文件,是不会有任何问题的。若是从 x11:drivers:video 下载的辅助文件,可能需要对照 打包检查 页面来修复一些 rpmlint 警告。

可以安全忽略的 rpmlint 警告

补丁

近期的 NVIDIA 驱动和内核有点冲突,一般此类消息你不会是第一个知道的。

所以去 官方论坛的 pre-release/beta 版 瞧一瞧,最热门的帖子里都是这些东西。有些帖子提供了修复。

所以按照前面教的 sh NVIDIA-Linux-*.bin -x 方法解压,复制一个到 NVIDIA-Linux-*.orig,在其中的一个里完成改动后:

diff -urN NVIDIA-Linux-*.orig NVIDIA-Linux-* 补丁名.patch

关于补丁的命名:

fix-for-upstream-kernel-内核版本号-补丁实际做的事,比如fix-build.patch

记得在 spec 范式文件中的 Patch*: *.patch 上面要写一行注释:

#FIX-FOR-UPSTREAM 这个补丁做了什么事的简要介绍

这样后续的维护者就知道它做了什么事,后续的更新是否要移除它,等等。

更多请参考:补丁教程


测试

从编译临时目录中复制编译好的显卡 RPM 到别的目录:

cp -r /var/tmp/build/home/abuild/rpmbuild/RPM/x86_64/* ./
cp -r /var/tmp/build/home/abuild/rpmbuild/SRPM/* ./

添加 Kernel:stable 源:

sudo zypper ar -f http://download.opensuse.org/repositories/Kernel:/stable/standard/ Kernel:stable

然后更新内核:

sudo zypper up kernel-desktop

接着不要重启,安装显卡 RPM:

sudo rpm -Uvh *.rpm

重启。