创建自己的本地安装包的正确方法是什么?

我正在运行一个Ubuntu 12.04 LTS服务器。目前我遇到一个问题,其中一个我使用的软件包有一个令人讨厌的错误。我不想将其删除并从源代码重新构建,而是希望将其集成到Ubuntu/Debian的软件包管理中。
来自ArchLinux的经验告诉我们,我们可以通过复制原始的PKGBUILD文件并进行修改,以便编译出新的软件包。这个过程非常简单,但它会通知软件包管理器,即使该软件包不在本地存储库中。
对于Ubuntu/Debian是否有类似的方法?我能否轻松地基于过时的Ubuntu版本构建我的软件包,并安装这个软件包来替代原始存储库中的软件包?
注意:涉及的软件是libvirt(我至少需要0.9.13,12.04运行的是0.9.8),虽然我希望在评论中得到针对这个特定软件包的解决方案,但我也在寻找更一般的解决方案,以应对未来可能出现的类似问题。
我如何手动组装自己的软件包“困难方式”?最简单的Debian打包指南是什么?相反,我对创建一个软件包不感兴趣,而是希望使用现有资源并将其更新到较新版本。

可能是重复的问题:如何将我的软件添加到Ubuntu中? - Panther
1这并不能回答你的问题,但是更新后的libvirt在Cloud Archive中:https://wiki.ubuntu.com/ServerTeam/CloudArchive - Jorge Castro
1你可以随时从任何地方下载旧版本的软件包,然后手动安装它,而无需重新打包所有内容。 - Thomas Ward
@bodhi.zazen 他想在本地修复一个错误,而不是向Ubuntu提交一个新的软件包。 - Braiam
@Braiam 谢谢,我想我误解了“我想将其集成到Ubuntu/Debian的软件包管理中。” - Panther
2个回答

我会先下载Ubuntu版本的源代码和构建依赖项。
apt-get install dpkg-dev
apt-get build-dep <package>
apt-get source <package>

Ubuntu 版本所基于的未修改上游源代码将被保存在一个名为 _.orig.tar.gz 的文件中(压缩格式可能会有所不同)- 我会将其解压到一个目录中(我们称之为“dir A”),然后将已修复错误版本的源代码下载到另一个目录中(“dir B”),最后为发生变化的部分生成一个补丁。
diff -Nur <dirA> <dirB> >/tmp/upgrade.patch

然后切换到apt-get源解压修改过的Ubuntu版本所在的目录,并应用补丁。
patch -p1 </tmp/upgrade.patch

假设两个上游版本之间没有太多变化,并且它们与Ubuntu打包人员的任何更改都没有冲突,那么这应该可以工作。然后在Ubuntu软件包中编辑debian/changelog以赋予其一个新的版本号,然后使用dpkg-buildpackage命令构建一个定制版本给你使用。

只是为了吹嘘一下,我已经为这种情况创建了一个解决方案。你可以通过2或3个命令下载、解压、构建和重新安装Debian软件包。
这是一个shell脚本debtool,可以通过上述链接在GitHub上找到。
从源代码构建Debian软件包可能很麻烦,特别是在你不想用大量构建依赖项等东西来混乱你的日常驱动程序的情况下。
假设libvirt可通过源代码获取,请运行以下命令:
debtool --download --unpack libvirt

上述命令只是下载了libvirt_0.9.8_all.deb文件,并将其解压到libvirt_0.9.8_all目录中。
或者,您也可以解压当前安装在系统上的libvirt版本。
debtool --unpack libvirt

此时,您应该对目录中的所有文件进行更改。您还可能希望增加软件包的版本号(例如0.9.8-custom1),该版本号位于./libvirt_0.9.8_all/DEBIAN/control中。
现在通过运行以下命令来构建软件包:
debtool --build ./libvirt_0.9.8_all

你的完成包现在位于当前目录下,文件名为libvirt_0.9.8-custom1_all.deb
你可以通过运行debtool --reinst ./libvirt_0.9.8-custom1_all.deb快速重新安装这个包,或者选择一次性构建和重新安装的方式,运行debtool --build --reinst ./libvirt_0.9.8_all

等等

此外,你还可以使用debtool执行其他相关任务。

显示可用版本

如果软件仓库中有多个版本的软件包可用,你可以按照以下方式列出它们:
debtool --show zsh

以上命令将返回以下内容:
zsh 5.0.5-4ubuntu1~ubuntu14.04.1 amd64
zsh 5.0.2-3ubuntu6 amd64

如果您想手动下载软件包,可以使用--show-format选项。
debtool --show --show-format zsh

将返回以下内容:
apt-get download zsh=5.0.5-4ubuntu1~ubuntu14.04.1 -a=amd64
apt-get download zsh=5.0.2-3ubuntu6 -a=amd64

下载Debian存档

您可以按照以下步骤下载最新版本的软件包:

debtool --download zsh

您可以按照以下步骤下载特定版本:
debtool --download zsh=5.0.2-3ubuntu6

解压文件包

您可以在硬盘上解压文件包:

debtool --unpack package.deb

您还可以解压已安装在您的系统上的软件包。
debtool --unpack package

如果您对已安装的文件进行了更改,它们也将被合并。这非常适用于您想要使用不再可从源获取的软件包,或者您想将现有修复程序合并到“修补过的”deb包中的情况。

根据"本地(local)"的具体含义,而且考虑到您可能需要稳定的软件,该过程应该可以扩展到自定义软件仓库(而不是ppa)。请注意,许多重新打包的发行版如Zorin、Mint、Peppermint等都是以这种方式完成的。 - mckenzm