前面两篇文章已经介绍了rpm 包的制作,本文将介绍另一种打包结构和方法,即deb打包;rpm包主要用于Redhat系列,如Fedora 和Centos等发行版本,而deb包主要用于debian系列,如Ubuntu等。

deb包的结构

deb包里面的结构:DEBIAN目录 和 软件具体安装目录(模拟 / 根目录)(如etc, usr, opt, tmp等)。在DEBIAN目录中至少有control文件,除此之外还可能有postinst(postinstallation)、postrm(postremove)、preinst(preinstallation)、prerm(preremove)、copyright (版权)、changlog (修订记录)和conffiles等。本文接下来会简单介绍一下control 文件,至于其它可选文件什么作用,本文就不再赘述了;

下面我们就以xtrans-dev_1.3.5-1_all.deb为例来介绍control文件都有哪些内容,首先通过命令获取到control 文件如下:

root@ubuntu:/zhb# dpkg -e xtrans-dev_1.3.5-1_all.deb ./DEBIAN
root@ubuntu:/zhb# cd DEBIAN/
root@ubuntu:/zhb/DEBIAN# ll
total 16
drwxr-xr-x 2 root root 4096 Nov  4  2014 ./
drwxr-xr-x 6 root root 4096 Sep 23 07:56 ../
-rw-r--r-- 1 root root  808 Nov  4  2014 control
-rw-r--r-- 1 root root 1186 Nov  4  2014 md5sums

我们可以看到该deb文件中DEBIAN 目录下包含control 文件和md5sums文件。其中control文件是必不可以少的管理文件,我们通过cat命令查看该control 文件内容如下:

Package: xtrans-dev   //包名称
Source: xtrans        //软件包的源代码名称;
Version: 1.3.5-1      //版本信息
Architecture: all     //是该程序可运行的CPU架构,如基于i386, amd64,powerpc等;
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> //打包人和联系方式
Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org> //原维护者和联系方式
Installed-Size: 374   //安装后占用空间大小
Section: x11          //申明软件的类别,常见的有utils, net, mail, text, x11等;
Priority: optional    //声明这个包的优先级(大部分的时候使用optional(可选的))。
Multi-Arch: foreign   
Description: X transport library (development files)  //软件包描述xtrans includes a number of routines to make X implementationstransport-independent; at time of writing, it includes support for UNIXsockets, IPv4, IPv6, and DECnet..xtrans is not actually a library in itself; it includes .c files which arethen used in the compilation of X servers, libraries, et al..More information about X.Org can be found at:<URL:http://www.X.org>.This module can be found atgit://anongit.freedesktop.org/git/xorg/lib/libxtrans

这里需要注意的是,每个deb 包中都必须包含control文件,但是该文件的内容有的字段描述是可选的,也就是并不是固定的。所以你在看别的deb文件时,看到的control文件内容很可能是不完全一样的。

如本文开头所说deb包里面的结构除了包含DEBIAN目录外,还有软件具体安装目录,这个目录下就是存放我们真正需要安装的文件,还是以xtrans-dev_1.3.5-1_all.deb 为例,我们来看看该deb包安装的内容;为了看的更清楚,我们首先创建一个空的xtrans目录,执行如下命令:

root@ubuntu:/zhb# mkdir xtrans
root@ubuntu:/zhb# dpkg -X xtrans-dev_1.3.5-1_all.deb ./xtrans
root@ubuntu:/zhb# cd xtrans/
root@ubuntu:/zhb/xtrans# ll
total 12
drwxr-xr-x 3 root root 4096 Nov  4  2014 ./
drwxr-xr-x 6 root root 4096 Sep 23 08:10 ../
drwxr-xr-x 4 root root 4096 Nov  4  2014 usr/

再来看看usr 目录结构如下:
Deb 包制作理论实践篇-编程知识网

可以看出该deb文件的软件具体安装目录包含9个目录(或子目录)和17个文件,这些在安装该deb包时,都会按照该目录结构安装到系统中;如该deb包将会安装到系统的/usr目录下。

dpkg 命令介绍

  • 制作deb包: dpkg -b mydeb mydeb.deb
#第一个参数为将要打包的目录名,
#第二个参数为生成包的名称

该命令就是打包deb用到的一个重要命令,后面我们通过dpkg打包就会用到它;

  • 解压deb包中所要安装的目录文件: dpkg -X mydeb.deb mydeb
# 第一个参数为所要解压的deb包,这里为 mydeb.deb
# 第二个参数为将deb包解压到指定的目录,这里为 mydeb

这个命令我们在前面已经用到过了;

  • 解压控制信息到当前目录下的DEBIAN子目录中: dpkg -e xxx.deb ./DEBIAN
# 第一个参数为所要解压的deb包,这里为 mydeb.deb
# 第二个参数为将deb包解压到指定的目录,这里为 mydeb

这个命令我们在前面已经用到过了;

  • 安装前根据deb文件查看软件包安装内容 : dpkg -c xxx.deb
参数为所要查看的deb包,这里为 mydeb.deb
  • 安装后根据包名查看: dpkg -L mydeb
参数为所要查看的软件包名,这里为 mydeb,这个软件包名就是control文件中Package字段值
  • 查看某个文件属于哪个deb包: dpkg -S filepath
参数为所要查看的文件名,这里为 filepath
  • 移除deb包 dpkg -r mydeb
参数为所要删除的软件包名,这里为 mydeb

deb 包制作

针对debain系列的OS,我们在安装或升级最新软件时,有时不见得能找到我们需要的deb包,这时就需要我们自己根据需要打包deb包,本文将介绍以下三种方式来进行打包;

方法一:dpkg利用源码制作

利用源代码方式打包deb文件,在工作中可能是最多的一种,首先我们需要到官网或者github去下载我们需要的源代码,本文就以之前我在工作中遇到的升级dropbear为例来说明该打包方式;

第一步:去github 下载源代码,路径:https://github.com/mkj/dropbear

第二步:解压dropbear-master.zip并进入dropbear目录

root@ubuntu:/zhb# unzip -q dropbear-master.zip
root@ubuntu:/zhb# cd dropbear-master/

在dropbear 目录下我们看到了debain 目录(这时我们应该窃喜…),这里面就有我们打包deb文件需要的一些文件,包括control文件,下面我们来看该目录列表,如下所示:
Deb 包制作理论实践篇-编程知识网从上图可以看到除了包括control文件,还包括implicit、changelog等文件,此外还包含rules文件。

注:这里如果没有debain目录,我们就需要执行dh_make 命令生成debian 目录,如 dh_make-s -e zhb_2011_nuaa@126.com -f …/dropbear-master.tar.bz2 生成debian 目录,然后修改control文件和rules(指定编译参数,可不修改)。

第三步:生成deb包,执行如下命令:

root@ubuntu:/zhb/dropbear-master# dpkg-buildpackage -rfakeroot -b -uc
这里 '-rfakeroot' 指定命令使用 fakeroot 程序来模仿 root 权限 (来实现所有者(ownership)目的),'-uc' 表示 "Don't cryptographically sign the changelog", '-b' 代表只建立二进制包.

这时会报如下错误:Deb 包制作理论实践篇-编程知识网因为没有configure文件,于是我们先生成configure文件,执行如下命令:

root@ubuntu:/zhb/dropbear-master# autoconf   //生成configure 文件
root@ubuntu:/zhb/dropbear-master# autoheader //生成config.h.in 文件
root@ubuntu:/zhb/dropbear-master# dpkg-buildpackage -rfakeroot -b -uc //再次执行制作deb包命令;

这时如果一切顺利,我们就可以在上一级目录,本例即/zhb目录下看到对应的deb文件了。如下:
Deb 包制作理论实践篇-编程知识网

第四步:安装测试,执行如下命令:

root@ubuntu:/zhb# doprbear -V     //安装前检查版本
doprbear: command not found       //看到该提示表示之前没有装过root@ubuntu:/zhb# dpkg -i dropbear_2019.78-0.1_amd64.deb  //安装root@ubuntu:/zhb# dropbear -V    //安装后再检查
Dropbear v2019.78                //看到最新版本,表示安装成功了

到这里表示通过dpkg源码打包deb方式就结束啦,接下来再介绍另一种dpkg打包方式;

方法二:dpkg利用旧的deb包

自己创建deb所需目录结构(控制信息和安装内容),然后打包,一般使用这种方法来修改已有的deb包,而不是新建deb包,本文就以前面xtrans-dev_1.3.5-1_all.deb包来说明该打包方式:

第一步:解压安装目录或内容到指定目录,执行如下命令

root@ubuntu:/zhb# dpkg -X xtrans-dev_1.3.5-1_all.deb  ./xtrans

第二步:解包控制信息到之指定目录下的DEBIAN

root@ubuntu:/zhb# dpkg -e xtrans-dev_1.3.5-1_all.deb  ./xtrans/DEBIAN

第三步:修改其中内容

这里我们修改版本号为1.3.5-2以及在usr/share/doc/xtran-dev目录下创建一个INSTALL文件,执行命令如下:

root@ubuntu:/zhb# cd xtrans/DEBIAN
root@ubuntu:/zhb/xtrans/DEBIAN# vi control   //修改Version信息,即Version: 1.3.5-2,wq退出保存
root@ubuntu:/zhb/xtrans/DEBIAN# cd ../usr/share/doc/xtrans-dev/
root@ubuntu:/zhb/xtrans/usr/share/doc/xtrans-dev# touch INSTALL   //创建INSTALL文件

第四步:重新打包,执行如下命令

root@ubuntu:/zhb# dpkg -b xtrans xtrans-dev_1.3.5-2_all.deb
dpkg-deb: building package 'xtrans-dev' in 'xtrans-dev_1.3.5-2_all.deb'.

这时我们发现该目录下就会生成xtrans-dev_1.3.5-2_all.deb如下:

root@ubuntu:/zhb# tree |grep xtrans-dev_
├── xtrans-dev_1.3.5-1_all.deb      //之前的
└── xtrans-dev_1.3.5-2_all.deb      //本次生成的
root@ubuntu:/zhb# 

这种方式是不是很简单,接下来再介绍另外这一种打包方式;

方法三: 使用checkinstall方法创建deb包

通常Linux我们利用源码编译安装软件都是./configure && make && make install;接下来介绍的方法将采用自己的指令 checkinstall 来代替 make install。其他两个指令保留下来跟以前一样,因此,现在这个指令序列使用 CheckInstall 变成 ./configure && make && checkinstall。checkinstall 不仅可以生成deb包, 还可以生成rpm包,使用简单,但是不灵活,功能粗糙,只做介绍,不推荐使用;接下来我们还是以dropbear为例来说明;前面几步都是和dpkg 打包deb是一样的,如下:

第一步:下载源码,同方法一

第二步:解压,同方法一

第三步:执行autoconf & autoheader ,因为经过方法一,我们知道需要执行这两条命令;

第四步:生成Makefile文件并执行make

root@ubuntu:/zhb/dropbear-master# ./configure --prefix /usr
root@ubuntu:/zhb/dropbear-master# make -j8  

第五步:安装checkinstall 工具(已经安装则跳过)

root@ubuntu:/zhb/dropbear-master# apt-get install checkinstall

第六步:打包

root@ubuntu:/zhb/dropbear-master# checkinstall -D make install

我们会看到如下界面,输入y并回车,然后需要我们输入软件包的描述:
Deb 包制作理论实践篇-编程知识网

回车接下来会进入如下界面,这里我们输入 3 修改一下版本信息:
Deb 包制作理论实践篇-编程知识网
回车进入如下界面,其实这里修改信息本质就是在写control文件,这里我们直接回车不做其它修改,实际根据需要修改即可:

Deb 包制作理论实践篇-编程知识网
这是没有其它错误的的话,就会在当前目下生成deb包,如下:
Deb 包制作理论实践篇-编程知识网
第七步:安装验证

root@ubuntu:/var/lib/dpkg# apt-get remove dropbear --purge //这里我们使用另一种方式把之前安装的dropbear卸载掉
root@ubuntu:/var/lib/dpkg# dpkg -l dropbear       //查看dropbear信息 
dpkg-query: no packages found matching dropbear   //提示没有该安装包,表示卸载完成root@ubuntu:/zhb/dropbear-master# dpkg -i dropbear_2019.80-1_amd64.deb  //安装

安装完成后我们查看一下dropbear包信息,如下:
Deb 包制作理论实践篇-编程知识网

看到这些信息,表示我们已经打包并安装成功;按照前面说的,我们解压看看生成deb包control文件信息,如下:

root@ubuntu:/zhb/dropbear-master# dpkg -e dropbear_2019.80-1_amd64.deb ./test/DEBIAN
root@ubuntu:/zhb/dropbear-master# cd test/DEBIAN/
root@ubuntu:/zhb/dropbear-master/test/DEBIAN# cat control
Package: dropbear
Priority: extra
Section: checkinstall
Installed-Size: 896
Maintainer: root@ubuntu
Architecture: amd64
Version: 2019.80-1
Provides: dropbear
Description: zhaihaibo test package 2019-09-27

好啦,本文就介绍到这里了,如果有写的不对或不周的地方欢迎指正 ,谢谢阅读~