Debian是linux史上的一个非常重要的发行版(话说,笔者写这篇博客时使用的系统就是Debian 8.6,嘿嘿~~在工作中使用debian这两年来,感觉debina是异常稳定哦,注意是异常稳定,至少我这里从来没有出现过各种奇怪的灵异现象~~),这个发行版本是很多Linux的上游版本,比如Ubuntu等著名发行版。Debian的地位的取得不仅仅是因为它创造了一个坚如磐石的Linux发行版,更多的原因在于它确立了一种Linux世界的应用包的构建,发行,管理一套流程的规范和标准,这就是deb包标准(Linux世界有两大软件包标准,一个是RPM,另一个就是DEB)。本篇博文就梳理下有关deb包的各种知识。
需要说明的是,本篇博文的内容整理自debian的官方handbook,debian people,debian wiki的一些文章,文章中图比较多,如果看不清楚,请下载下来查看哦。Debian的handbook我已经上传的到我的百度网盘,大家可以下载(你也可以去官方下载,但是网速好像不太好):
链接: https://pan.baidu.com/s/1qYfJDvQ 密码: c2r7
debian people的链接如下:
https://people.debian.org/~srivasta/MaintainerScripts.html(信息非常全面,建议看这个)
https://wiki.debian.org/MaintainerScripts
××××××××××××××××××××××××××××××××××××××××××××分割线××××××××××××××××××××××××××××××××××××××××××××××××××××
Deb包的组成结构
Deb包都是以deb为后缀名的文件,并且按照debian项目的定义,deb包有两种形式:binary和source。顾名思义,binary就是二进制格式的,这个格式的包中的内容全部都是二进制的,也就是源代码经过编译之后的,可执行或者可链接平台相关的二进制文件。source格式的就是包中有程序的源代码,这部分的内容在安装到机器上之前是需要进行编译的。下面,我们将这两个类型的包都进行一下结构分析。
Binary格式
想要查看一个deb包中的都有哪些内容,可以使用ar这个命令(命令具体用法请man),下面我们以unetbootin_575-1_amd64.deb这个包为例看下这个包中都有那些内容:
首先,我们使用ar命令查看其中内容:
可以看到,这个 包中的有三个文件,现在我们使用ar命令将这些内容解压出来:
现在我们已经把包中的内容解压出来了,我们发现多了debian-binary,control.tar.gz,data.tar.gz这三个文件,其中有两个是压缩文件。我们首先来查看debian-binary这个文件是什么:
原来这个文件是一个纯文本文件,内容只有2.0这个字符串。这里的2.0是什么意思呢?这个的意思是这个deb包使用的格式版本,自2015之后的deb格式全面升级到2.0版本了。这个是开发者在使用debian官方工具打包的时候自动生成的。
现在,我们来看下剩下的2个压缩是什么。首先我们查看control.tar.gz中的内容:
我们把control压缩包中的内容解压到control目录下,并且这个目录下生成了4个文件。我们挨个看下,首先查看control文件:
可以看到,这个control文件也是一个纯文本文件,并且其中的内容记述了这个包的各种详细信息,比如包名,版本,支持的架构,维护者,安装大小,依赖,建议安装包,功能描述等等重要信息。这些信息都是给系统包管理工具看的(准确来说是dpkg工具,后面我们会介绍它)。可以这么理解,这个control文件就向一个deb安装包的身份证件,其中包含了关于这个包的详细说明,至于这些每项说明是什么含义,我们后面会详细说明。
接下来我们再来看看md5sum文件:
这个文件也是一个纯文本文件,从名字上可以看出,这个文件应该是一个MD5摘要的记录文件,用于核验文件是不是被篡改了。这个文件中记录了这个包会安装的所有文件的md5校验值。
接下来,我们在看看postinst这个文件:
这个文件是一个POSIX的脚本文件,看到其中的执行内容是由dh_installmenu工具自动添加的,主要用于更新debian的menu系统,关于debian menu system的信息请查看:
https://www.debian.org/doc/packaging-manuals/menu.html/
因为这部分的内容是打包工具自动添加的,因此内容我们可以暂时不去关心。需要注意的是这个文件的作用,从名字上看这个文件就是在安装完成之后做的事情(postinst = post install),实时上确实如此。
同样滴,postrm这个文件就是在remove之后执行的脚本文件,内容如下:
到此,我们就弄清楚了control压缩包中的内容了。现在我们看下data压缩包中的内容是什么,我们把这个包中的内容解压到data目录下: