Debian打包的工作原理

2020-08-06 02:42:33

Debian打包可能相当神秘和难以理解。在本指南中,我将简单介绍Debian打包过程及其最重要的概念。

这并不是包装各个方面的完整指南。取而代之的是,我将只介绍足够的基础知识来帮助您开发Debian打包的心理模型,并能够产生有用的结果。

Debian包包含元数据和文件。元数据包含包名称、描述、依赖项列表等。文件被解压缩到文件系统根目录(/)中,因此软件包中的文件路径是绝对路径。

因此,Debian包文件-.deb文件-有点像tar.gz或zip。它实际上不是tar.gz或zip:格式是ar,尽管这并不重要。

因此,Debian打包最简单的形式就是创建一个.deb文件,其中包含您想要放入的元数据和文件。

Debian打包系统实际上由两部分组成。最下面的部分是dpkg,它管理系统的数据库,描述安装了哪些软件包。Dpkg可以安装.deb文件并删除已经安装的软件包。

APT处理从Internet下载.deb文件,以及依赖项解析。Dpkg不会处理这件事。这就是为什么用户通常只与APT交互的原因,尽管dpkg是执行工作核心的部分。

Dpkg-apt关系类似于RHEL/CentOS上的RPM-DNF关系(或旧版本上的RPM-YUM)。

您实际上不需要运行Debian/Ubuntu来创建和检查Debian包!Debian包管理器dpkg也可以在其他操作系统上使用。只是不要指望能够安装任何有用的软件包。

继续安装dpkg,因为本文的其余部分假定您拥有它。

您可以检查Debian软件包最重要的元数据-控件部分-如下所示:

新的Debian包,2.0版。大小为4237584字节:控制档案=3124字节。841字节,20行控制8644字节,79行md5sum包:Passenger-dev来源:Passenger Version:1:6.0.6-1~Xenial1架构:AMD64 Maintainer:Phusion<;[email protected]>;安装大小:41972取决于:ruby2.7|ruby2.6|ruby2.5|ruby2.4|ruby2.3|ruby2.2|ruby2.1|ruby2.0|ruby1.9.1|ruby1.8|ruby1.8|ruby解释器,Passenger(=1:6.0.6-1~exial1)冲突:ruby-Passenger-dev替换:ruby-Passenger-dev提供:ruby-Passenger-dev部分:ruby优先级:可选主页:https://www.phusionpassenger.com/描述:编译nginx模块的依赖项。Phusion是一款Phusion产品,它使Web应用的部署变得非常简单和强大。。这个方便的包提供了编译Nginx模块的开发依赖项。

大多数字段都非常不言自明。有关所有字段的概述,以及对其含义的更深入解释,请参阅Debian策略手册。

除了控制部分,还有更多的元数据。您可以通过将所有元数据提取到文件来查看其他元数据:

上面的代码将元数据解压到当前工作目录的名为Debian的子目录中。对于Passenger-dev包,唯一存在的其他元数据是一个md5sum文件:

Drwxr-xr-x root/root 0 2020-07-14 04:40./drwxr-xr-x root/root 0 2020-07-14 04:40./usr/drwxr-xr-x root/root 0 2020-07-14 04:40./usr/lib/drwxr-xr-x root/root 0 2020-07-14 04:40./usr/lib/Passenger/drwxr-xr-x root/。根/根02020-07-14 04:39./usr/lib/passenger/common/libpassenger_common/drwxr-xr-x根/根02020-07-14 04:39./usr/lib/passenger/common/libpassenger_common/JsonTools/-rw-r--r--根/根785616 2020-07-14 04:39./usr/lib/passenger/common/libpassenger_common/JsonTools/CBindings.o...

对于那些喜欢用更直观的方式检查包裹内容的人,可以去午夜指挥官那里。它是一个基于终端的可视化文件管理器,可以窥视许多类型的档案,包括Debian软件包。

午夜指挥官的Debian软件包支持需要安装dpkg,所以一定要安装它。

…。然后打开一个.deb文件。您应该会看到一个文件列表。以下是它们的意思:

通过选择INFO文件并按F3键来查看该文件,您应该会看到控件元数据的全貌:

创建Debian包的最简单方法是使用FPM。FPM是一种CLI工具。您告诉FPM您希望将哪些元数据和文件放入包中,它就会这样做。

请注意,如果您希望提交包以包含在Linux发行版中,那么使用FPM不是创建Debian包的正确方式。如果那不是你的目标,那么FPM也可以。我们稍后会回到正确的方式。

FPM是用Ruby编写的,因此您可以使用RubyGems包管理器安装它:

要查看它的实际效果,让我们使用FPM创建一个简单的包,其中包含一个名为/usr/share/doc/mypackage/readme.txt的文件,该文件依赖于';curl&39;:

Echo';hello FPM';>;readme.txtfpm\--输入类型目录\-输出类型deb\-名称mypackage\--版本1.0.0\--架构全部\--Package mypackage_1.0.0_all.deb\-依赖curl\readme.txt=/usr/share/doc/mypackage/。

祝贺你!。您已经创建了您的第一个Debian包。但是拥有一个.deb文件只会给您带来一些好处:您还需要一个APT存储库,因为用户很少与单独的.deb文件交互。我们稍后再谈那件事。

如果您想提交包以包含在Linux发行版中,为什么FPM不是打包的正确方式呢?这是因为发行版希望您完整地描述整个软件包构建过程,而且使用FPM不符合它们的过程标准。

创建程序包文件。在这里,您可以将源树中的文件和编译构件映射到包中的文件。

发行版希望您创建一个所谓的源代码包,其中包含描述步骤1和步骤2的文件。然后,您将源代码包(而不是二进制包)提交给发行版,它们会为您构建二进制包。

如何创建源包,以及正式的Debian打包过程是如何工作的,这超出了本文的范围。在任何情况下,该过程和周围的工具都相当神秘,文档记录很差,坦率地说,这是可用性的噩梦。如果他们不是,你一开始就不会阅读这篇文章。我不推荐使用官方流程或官方工具,除非您的明确目标是对发行版做出贡献。尽可能长时间地坚持走容易的路。

存储库是包含一个或多个软件包(.deb文件)的目录,以及包含以下内容的元数据文件:

单个存储库可以包含多个发行版的包。但请注意,分销的概念应该持保留态度。例如,官方的Ubuntu存储库定义了";bionic&34;,";bionic-update";和";bionic-backports";。对于APT而言,";分发";只是一个名称,以便APT确定要选择哪个子目录。

存储库还可以组织成多个组件。用户可以选择加入特定组件。例如,官方的Ubuntu存储库有组件";main";、";multiverse";、宇宙";等等。

最后,存储库也是按体系结构组织的。APT仅下载适用于当前系统架构的软件包。

让我们来看一个真实的存储库示例。如果我们在Ubuntu系统上查看/etc/apt/Soures.list,则会看到如下行:

如果我们访问archive ve.ubuntu.com/ubuntu,那么我们会看到很多文件。以下是一些有趣的部分:

有许多工具可用于创建APT存储库。但他们中的大多数都不是…。啊哼…。理智:糟糕的文档,糟糕的可用性。

第三方软件包(不属于发行版的软件包)的一个常用托管解决方案是Ubuntu PPAs(个人软件包档案)。然而,我不推荐这样做,因为Ubuntu PPA希望您只上传源包-它们将为您处理构建二进制文件。这意味着您必须使用官方的Debian打包工具,这使得一切都变得非常困难。此外,Ubuntu PPA用户界面非常混乱,其软件包上传过程非常原始、繁琐且不可饶恕。它实际上包括将原始文件上传到FTP服务器,并等待包含构建结果的电子邮件。

我所见过的最友好的开源、自托管解决方案是恰如其分的。只需确保使用1.4版或更高版本即可。早期版本有相当严重的错误。

另一个选择是宾特利。Binty是一种商业托管解决方案。它们为开放源码项目提供免费的计划。与Ubuntu PPA不同的是,它们没有。

APTLY不直接操作您在archive ve.ubuntu.com/ubuntu中看到的那种apt repo文件。相反,它主要在内部数据库上运行。然后,您可以恰当地告诉以APT期望的格式将其内部数据库发布(导出)到APT存储库。

默认情况下,合适的内部数据库存储在~/.aply中。当您告诉Apply发布它的内部数据库时,它默认发布到~/.aply/public。这两个路径都可以通过适当的配置文件进行自定义,但出于本演示的目的,让我们坚持使用默认路径。

所以,让我们看看它的实际行动吧。首先,恰当地告诉您创建一个名为";myrepo";的存储库:

我们现在有一个内部存储库,其中包含一个包。要将其发布到真正的APT存储库,我们必须创建链接到特定存储库的出版物。

我们构建的包与分布和架构无关。因此,假设它属于不可知性分发、主组件和AMD64(Debian对x86_64的名称)体系结构。

APT存储库通常是GPG签名的,但是在这个演示中,我们将跳过签名以避免麻烦。

让我们尝试在Debian或Ubuntu服务器上使用这个APT存储库。我们压缩此repo并将其复制到Debian/Ubuntu服务器:

然后,我们登录到Debian/Ubuntu服务器,将tarball解压到某个位置,并将其添加为apt源文件:

#在Debian/Ubuntu服务器上:mkdir myaptrepo tar-C myaptrepo-xzf myaptrepo.tar.gz echo";deb[ALLOW-INSECURE=YES]文件:$(Pwd)/myaptrepo agnostic main";\|sudo tee/etc/apt/Soures.list.d/myaptrepo.list。

大多数Debian打包文档都是关于Linux发行版的官方打包过程的。由于某些原因,独立软件供应商的用例,或只想将内部应用打包为内部基础设施的人的用例,被广泛忽视。他们不应该是这样的。我希望通过这本指南,您已经能够理解Debian打包,并且我已经帮助您创建了自己的软件包。祝好运!