长篇分享

Debian 打包入门指南

最近笔者忙于为一些 Debian 衍生发行版打包软件包,这些发行版往往都会使用 deb 包作为默认的软件包,作为 Linux 世界两大软件包格式之一(另一个是 RedHat 系的 rpm 包),deb 包的使用场景非常广泛,本篇文章就来教各位读者如何修改现有的软件包并重新构建自己的 deb 包。

环境准备

在开始打包之前,首先需要准备好必须的各种工具,只需要打开终端并输入如下命令:

 sudo apt-get install build-essential fakeroot devscripts

这条命令会将 build-essential、fakeroot 和 devscripts 安装到我们的电脑上,之后我们会用到这些软件。

获取软件包

在准备好必须的工具之后,我们还需要获取准备修改的原始软件包,有两种途径可以获取:

  1. 直接从软件源网站上下载
  2. 配置 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

其中我们要关注的是下面四个文件:

  1. changelog 中包含了每次修改的作者、修改内容、时间等信息
  2. control 中则包含了软件包的名称、维护者、构建依赖等信息
  3. patches 目录中包含了软件包作者们对上游代码进行的修改
  4. 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 .

再次回到上级目录,即可看到新生成的 .dscdebian.tar.xz 文件,这些就是应用了我们之前的修改的新 deb 包,要重新编译,只需要回到源码子目录,并重新输入:

debuild -b -uc -us

接下来坐等收包就好啦!

进阶技巧

使用上面的方式直接进行编译虽然方便,但当我们大规模进行打包的时候就会出现问题了:不同包的依赖不同,反复安装不仅非常麻烦,有时还可能造成依赖计算错误——明明不需要依赖的软件包却成了必须依赖,这样你打出来的软件包可能在本机运作一切正常,可放在别人的机器上却没法正常编译和安装了,这就轮到 pbuildersbuild 出场了:这些工具可以帮助我们建立一个隔离的环境,类似 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

对这篇文章感觉如何?

太棒了
0
不错
0
爱死了
0
不太好
1
感觉很糟
0

You may also like

Leave a reply

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理

More in:长篇分享

内核

rootfs initramfs kexec 与 Linux 启动过程

作为 Debian 用户,在使用 apt 更新系统时偶尔会发现某次安装更新的时间特别长,这往往出现在较大版本的更新中,仔细观察后就会发现,这个耗时极长的操作并不是安装某个软件,而是对一个名为 init […]
教程

安卓逆向:签名校验对抗

本文介绍了应用签名校验的原理和常见的签名校验特征,以及签名校验对抗的方法。其中包括了核心破解插件、一键过签名工具、手撕签名校验、PM代理、IO重定向和模拟器检测、反调试检测以及Frida检测等。本文为逆向爱好者提供了一些反制签名校验的思路和方法,并介绍了一些常见的签名校验技术。标签:安卓逆向、签名校验、反调试检测、IO重定向、模拟器检测、Frida检测。
开源项目

Pandora:一个让你呼吸顺畅的ChatGPT

本文介绍了一款名为Pandora的开源项目,它是一款用于解决国内用户使用ChatGPT时遇到的种种问题的客户端。本文详细介绍了Pandora的功能特性、安装方法、部署方式以及Docker部署方法。
教程

安卓逆向:动态调试指南

本文详细介绍了安卓逆向工程中的动态调试过程。通过阐述各种工具的使用、动态调试环境的配置、获取debug权限、端口转发以及开启adb调试权限、下断点和使用Jeb附加调试进程等步骤,为您提供了一份详尽的动态调试教程。