openSUSE:Packaging Nvidia drivers
目录
准备工作
你应该了解 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 代表操作系统架构。
前期准备和下载辅助文件
首先你需要一个用于打包的本机初始化环境和一些打包显卡必要的辅助文件。
- 你需要一个 构建服务 帐号来在本地使用 osc
- 你需要从 openSUSE:Tools 源中安装 osc。
- 命令行
sudo zypper install osc obs-service-format_spec_file spec-cleaner
- 你需要下载打包显卡的辅助文件。当然你可以使用:
osc co x11:drivers:video x11-nvidia-gfxG02
但那里面的文件很旧,所以请到这里下载(仅提供 gfxG02 系列最新显卡的辅助文件,其他请到 x11:drivers:video 源中下载):
- 你需要从 NVIDIA 官方网站 下载 .bin 格式的显卡驱动。
初始化打包环境
首先你需要在构建服务上有一个私人车库 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 *
来使它们能够被构建服务认识。
然后链接出一个 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
重启。