前面两篇文章已经介绍了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/
可以看出该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文件,下面我们来看该目录列表,如下所示:
从上图可以看到除了包括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' 代表只建立二进制包.
这时会报如下错误:因为没有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文件了。如下:
第四步:安装测试,执行如下命令:
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并回车,然后需要我们输入软件包的描述:
回车接下来会进入如下界面,这里我们输入 3 修改一下版本信息:
回车进入如下界面,其实这里修改信息本质就是在写control文件,这里我们直接回车不做其它修改,实际根据需要修改即可:
这是没有其它错误的的话,就会在当前目下生成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 //安装
看到这些信息,表示我们已经打包并安装成功;按照前面说的,我们解压看看生成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
好啦,本文就介绍到这里了,如果有写的不对或不周的地方欢迎指正 ,谢谢阅读~