如何将Nvidia驱动程序安装程序转换为deb格式?

每隔一段时间,我都会想尝试一下Nvidia驱动程序的beta版本。今天就发生了这样的情况:295.40版本出现了严重的性能问题,而我想尝试一下全新的XRandR-enabled 302.07版本。
我完全有能力下载安装程序,删除所有存储库安装的驱动文件并安装新版本,但是回到存储库版本实在是太麻烦了。这还意味着每次内核升级后都必须手动重新安装驱动程序。
我们通常给用户的另一个选择是使用PPA,但在这种情况下,我真的很不耐烦。任何PPA要等几天才能获得这个版本,但我需要今天就尝试一下。我已经在媒体中心手动安装了它,现在正在考虑在我的台式机上安装。
那么,如何将安装程序(例如:NVIDIA-Linux-x86-302.07.run)转换为新的nvidia-current/nvidia-current-updates软件包呢?
换个问法可能是:人们是如何打包Nvidia驱动程序的?
3个回答

除非新版本有结构上的差异,否则应该可以重新使用当前的包装。
NEWVERSION=302.13
DIR=nvidia-graphics-drivers-"$NEWVERSION".orig/
## Making a new tarball
mkdir $DIR
# Copy in new run files
cp NVIDIA*.run $DIR
tar --owner=root --group=src -caf nvidia-graphics-drivers_"$NEWVERSION".orig.tar.gz $DIR
rm -r $DIR

## Setting up the packaging source
apt-get source nvidia-graphics-drivers
cd nvidia-graphics-drivers*/
# Remove old run files and copy in new
rm NVIDIA*.run
cp ../NVIDIA*.run .
# This version number should ensure it gets replaced by official version...
dch -v $VERSION-1 "my release"; dch -l~mybuild "local build"; dch -r

## Installing build-dependencies
mk-build-deps
sudo dpkg -i nvidia-graphics-drivers-build-deps*.deb; apt-get install -f

## Building
debuild -us -uc

可能有类似的东西可以用,但是会有很多折腾,我猜这就是为什么 PPA 软件包不能立即发布的原因 ;)

打包新版本有时候确实会有点疯狂。特别是当你改变上游版本号而没有在Debian的控制/更改日志文件中反映出来时。这就是为什么有时候构建软件包可能需要一点时间。此外,PPA(个人软件包档案)有构建分数,用于确定软件包的优先级,因为所有的PPA都使用相同的构建器。 - Thomas Ward
apt-get source接受诸如--diff-only的选项,可以节省下载一个无用的75MiB .orig.tar.gz文件。请参阅我的答案 - Lekensteyn
关于--diff-only的观点很好。我认为这样的指示很快就会过时(例如你在回答中提到的XvMCConfig的包装变化)。我猜你的版本在这方面更加健壮,因为它更具解释性。不过,像往常一样,最可靠的方法是参考Debian的new-maint和policy文档。 - arand
如debian/nvidia-current.README.Debian中所述,您在运行debuild之前应该先运行debclean来更新必需的变量。编辑:看起来debuild会自动运行debclean,所以这似乎是不必要的。 - Axel

正如arand所说,您可以使用现有的源代码包,假设它没有发生太大变化。以下命令将下载一个.run文件,提取和调整现有的源文件,最后进行打包。
通过安装一些构建依赖项来准备安装:
sudo apt-get build-dep nvidia-graphics-drivers
sudo apt-get install execstack # needed but not included with build-deps

为了准备工作,设置一些控制下载文件的变量,并创建一个新目录。
VER=310.19
mkdir nvidia-graphics-drivers-$VER; cd nvidia-graphics-drivers-$VER

如果您尚未下载,可以下载名为NVIDIA-Linux-x86-310.19.run的文件。如果您有一台64位的机器,还应该下载名为NVIDIA-Linux-x86_64-310.19-no-compat32.run的64位安装程序。
wget ftp://download.nvidia.com/XFree86/Linux-x86/$VER/NVIDIA-Linux-x86-$VER.run
wget ftp://download.nvidia.com/XFree86/Linux-x86_64/$VER/NVIDIA-Linux-x86_64-$VER-no-compat32.run

现在检索包装文件,"提取"它,更改版本号并构建不签名的包:
apt-get source --diff-only nvidia-current
gunzip -c *.diff.gz | patch -p1
dch -v $VER-0~local "New upstream release."

此刻写下这篇文章的时候,版本295.40-0ubuntu1.1不能构建310.19,因为打包方式已经改变。原来libXvMCNvidia.*文件已被移除,所以我们需要删除那些包含XvMCConfig的行。
sed -i '/XvMC/d' debian/{*.links*.in,*.install.in,rules}

构建软件包:
dpkg-buildpackage -b -uc -us

如果一切顺利,您现在应该可以使用以下命令安装生成的deb文件:
sudo dpkg -i ../nvidia-current_$VER-*.deb; sudo apt-get install -f

(如果您之前已经安装了nvidia-current,并且没有遇到依赖问题,那么执行“sudo apt-get install -f”命令是可选的)

这些驱动程序实际上依赖于更新的内核等,所以在这种情况下,您可能无法只是重新编译 - 有关完整描述和PPA,请参阅this answer