Debian 打包入门指南
最近笔者忙于为一些 Debian 衍生发行版打包软件包,这些发行版往往都会使用 deb 包作为默认的软件包,作为 Linux 世界两大软件包格式之一(另一个是 RedHat 系的 rpm 包),deb 包的使用场景非常广泛,本篇文章就来教各位读者如何修改现有的软件包并重新构建自己的 deb 包。
环境准备
在开始打包之前,首先需要准备好必须的各种工具,只需要打开终端并输入如下命令:
sudo apt-get install build-essential fakeroot devscripts
这条命令会将 build-essential、fakeroot 和 devscripts 安装到我们的电脑上,之后我们会用到这些软件。
获取软件包
在准备好必须的工具之后,我们还需要获取准备修改的原始软件包,有两种途径可以获取:
- 直接从软件源网站上下载
- 配置 apt 源 并使用 apt source 下载
笔者更喜欢用第一种方式(因为比较方便),不过更正规的方式是使用 apt source
下载,因此接下来就向各位介绍这种方法。
首先,我们需要修改 apt 的软件源列表,因为在默认情况下,apt 不会下载原始软件包。打开 /etc/apt/sources.list
文件,并检查下面的这行代码是否已经取消注释:
deb-src http://httpredir.debian.org/debian unstable main
如果没有,去掉这行的注释,保存并退出,之后运行:
sudo apt update
apt 就会更新刚才取消注释的软件源,以便之后进行下载。
选取软件包
本次我们选取 node-pretty-ms 作为演示,首先使用 apt source
将该软件包下载至本地:
apt source node-pretty-ms
下载完成后,使用 ls 命令查看当前目录,应该会多出三个文件:
node-pretty-ms_7.0.1-1.debian.tar.xz
node-pretty-ms_7.0.1-1.dsc
node-pretty-ms_7.0.1.orig.tar.gz
这三个文件共同构成了 deb 包,其中第一个压缩包中包含了 deb 包的补丁、打包规则等,第二个文件是 deb 包的元数据文件,第三个压缩包则是原始上游源码,要对这个包进行修改,我们可以使用如下命令:
dpkg-source -x node-pretty-ms_7.0.1-1.dsc
这条命令会在当前目录下生成一个名为 node-pretty-ms-7.0.1
的子目录,使用 cd 命令进入该子目录后再使用 ls 命令,即可看到原始 deb 包的结构,最核心的就是 debian 目录,其中包含了制作一个 deb 包所需的各种文件。
lrzlin@LionBattery:~/article/node-pretty-ms-7.0.1/debian$ ls
changelog control copyright docs gbp.conf patches rules salsa-ci.yml source tests upstream watch
其中我们要关注的是下面四个文件:
- changelog 中包含了每次修改的作者、修改内容、时间等信息
- control 中则包含了软件包的名称、维护者、构建依赖等信息
- patches 目录中包含了软件包作者们对上游代码进行的修改
- rules 中是该软件包的构建脚本
这些文件基本就是 deb 包的核心部分,也是我们之后对软件包进行修改主要涉及的部分。
初次构建
浏览完软件包的整体结构之后,我们就可以尝试对该软件包进行构建了,不过在此之前,我们首先需要安装它所需的各种构建依赖,使用如下命令即可:
sudo apt build-dep node-pretty-ms
apt 会自动按照软件包 control 文件中描述的构建依赖帮助我们安装需要的依赖,下载安装完成之后,使用 debuild 命令进行构建:
debuild -b -uc -us
等待命令运行完成后,即可在上级目录找到编译完成的 deb 包。
修改源码
当然,我们本次的目标并不止于原封不动的重新编译 deb 包,毕竟如果这样的话为什么不直接从服务器下载呢?我们要做的是对源码进行修改并重新编译:
cd node-pretty-ms-7.0.1
vim index.js
将其中的
throw new TypeError('Expected a finite number');
修改为
throw new TypeError('Expected a finite number!');
保存并退出,使用如下命令编写日志
dch -i -Dunstable
此处的 unstable 指的是软件发行通道,同时因为我们并非官方的维护者,因此由我们做出的更改会默认加入 * Non maintainer upload.
这样的说明,我们需要在下一行写明我们对源码做的修改:
写完 changelog 之后,就可以退出编辑器,使用如下命令生成补丁:
dpkg-source -b . --commit
输入补丁名称并确认,这条命令就会将我们之前所做的修改保存至 debian/patches
目录下,并在编译源码时自动应用。
完成上述的修改之后,使用如下命令重新生成 dsc 源码
dpkg-source -b .
再次回到上级目录,即可看到新生成的 .dsc
和 debian.tar.xz
文件,这些就是应用了我们之前的修改的新 deb 包,要重新编译,只需要回到源码子目录,并重新输入:
debuild -b -uc -us
接下来坐等收包就好啦!
进阶技巧
使用上面的方式直接进行编译虽然方便,但当我们大规模进行打包的时候就会出现问题了:不同包的依赖不同,反复安装不仅非常麻烦,有时还可能造成依赖计算错误——明明不需要依赖的软件包却成了必须依赖,这样你打出来的软件包可能在本机运作一切正常,可放在别人的机器上却没法正常编译和安装了,这就轮到 pbuilder
和 sbuild
出场了:这些工具可以帮助我们建立一个隔离的环境,类似 chroot
或者 docker
,不过对打包做了更多的特定优化,以下就以 pbuilder
为例作为演示,
要安装 pbuilder
,只需要在终端输入如下指令:
sudo apt install pbuilder
安装完成之后,使用如下命令创建编译环境
sudo pbuilder create
这一步会为我们配置一个完整的环境用于之后的编译,等待创建完成之后,运行如下的命令即可完成编译
pbuilder build node-pretty-ms_7.0.1-1.dsc
这就是关于 deb 打包的简短教程了,至于 pbuilder 更加进阶的用法,就等各位读者进一步挖掘了。
参考文章:
https://wiki.debian.org/BuildingTutorial
https://www.cnblogs.com/Gui-Yue/articles/16967031.html