从零开始创建自己的deb包

2021-01-05 15:26:46
什么是deb包

deb包是在linux系统下的一种安装包,主要用于ubuntu/debian系统, 由于它是基于tar包的,所以同样会记录着文件的权限信息(读、写、可执行)、所有者、用户组等。

制作deb的方式很多,主要有以下几种:

  • dpkg-deb方式
  • checkinstall方式
  • 使用dh_make方式
  • 修改原有的deb包

由于完全从新制作deb包比较复杂, 所以本次介绍的deb包制作方式为修改原有的deb包以及使用dpkg-deb从零开始制作一个自己的deb包

deb包的组成

control文件:描述软件包的名称(Package),版本(Version),描述(Description)等,是deb包必须剧本的描述性文件,以便于软件的安装管理和索引。为了能将软件包进行充分的管理,可能还具有以下字段:

  • Section:申明软件的类别,常见的有utils, net, mail, text, x11 等;
  • Priority:申明软件对于系统的重要程度,如required, standard, optional, extra等;
  • Essential:申明是否是系统最基本的软件包(选项为yes/no),如果是的话,这就表明该软件是维持系统稳定和正常运行的软件包,不允许任何形式的卸载(除非进行强制性的卸载)
  • Architecture:软件包结构,如基于i386, amd64,m68k, sparc, alpha, powerpc 等;
  • Source:软件包的源代码名称;
  • Depends:软件所依赖的其他软件包和库文件。如果是依赖多个软件包和库文件,彼此之间采用逗号隔开;
  • Pre-Depends:软件安装前必须安装、配置依赖性的软件包和库文件,它常常用于必须的预运行脚本需求;
  • Recommends:这个字段表明推荐的安装的其他软件包和库文件;
  • Suggests:建议安装的其他软件包和库文件。
修改已有deb包
  • 安装依赖
1
sudo apt-get install build-essential debhelper make autoconf automake dpkg-dev fakeroot pbuilder gnupg
  • 获取deb包
1
2
3
4
#下载后的路径在/var/cache/apt/archives
sudo apt-get download mysql-server
#下载的文件
mysql-server_5.5.9999+default_amd64.deb
  • 创建deb包的目录结构

使用mkdir创建一个存放deb包的目录,目录名字可自己取,我创建的目录为mysql_5.5_amd64,接着在mysql_5.5_amd64目录下 下创建DEBIAN目录,如下图所示

1
2
3
4
5
root@localhost:/tmp/mysql_5.5_amd64# pwd
/tmp/mysql_5.5_amd64
root@localhost:/tmp/mysql_5.5_amd64# ls
DEBIAN
root@localhost:/tmp/mysql_5.5_amd64#

接着使用dpkg -X {要解压的deb包路径} {刚刚创建的mysql_5.5_amd64目录} 来解压deb包,解压成功后输出如下信息。

1
2
3
4
5
6
7
8
root@localhost:/tmp# dpkg -X mysql-server_5.5.9999+default_amd64.deb ./mysql_5.5_amd64
./
./usr/
./usr/share/
./usr/share/doc/
./usr/share/doc/mysql-server/
./usr/share/doc/mysql-server/changelog.gz
./usr/share/doc/mysql-server/copyright

上面只是解压了安装的内容,接着使用dpkg -e {要解压的deb包路径} 解压出控制信息(注意要在你创建的目录下解压),如下图所示:

1
2
3
root@localhost:/tmp/mysql_5.5_amd64# dpkg -e ../mysql-server_5.5.9999+default_amd64.deb    
root@localhost:/tmp/mysql_5.5_amd64# ls ./DEBIAN/
control md5sums

从上图可以看到DEBIAN目录下已经有了文件,表明控制信息解压成功。然后就可以修改相关的内容了

修改完安装内容后,我们再回到DEBIAN目录下,记录一下本次修改的日期及更新版本号等,比如修改changelog和control文件的信息
最后使用dpkg -b {创建的mysql_5.5_amd64目录} {要打包的包名} 命令便可将修改后的目录重新打成deb包

使用dpkg-deb
1
2
3
4
5
6
7
8
9
10
root@localhost:/tmp# tree mydeb/
mydeb/
├── DEBIAN
│   ├── control
│   ├── postinst
│   └── postrm
└── usr
└── local

3 directories, 3 files

其中,usr/local目录表示该软件被安装后所在你文件系统中的目录,如果你想让软件安装到你文件系统中的/usr/lib目录下,那你可以建立/usr/lib目录结构代替我的usr/local目录结构。 然后分别给予postinst、postrm、control、等文件可执行权限,chmod +x postinst、postrm、control。

其中control文件所包含信息如下:

1
2
3
4
5
6
7
8
9
Package: MyDeb
Version: 1.0.0
Section: free
Priority: optional
Essential: no
Architecture: amd64
Maintainer: tiger
Provides: Mydeb
Description: mydeb

若以后想升级这个deb包,可以修改该包的版本号Version,值得注意的是Architecture,可以通过 dpkg -l命令来查看已安装的deb包持支的架构,或者输入lscpu查看处理器信息,若想支持所有架构,可以填入all属性,如果Architecture属性与当前处理器架构属性不匹配 的话,deb包将无法成功安装,且control的属性信息必须以字母或者数字开头,control文件需要多留出一个空行,不然可能导致打包出错

postinst文件包含信息如下

1
2
3
4
#!/bin/sh
if [ "$1" = "upgrade" ] || [ "$1" = "install" ];then
echo "install"
fi

当安装了该deb包以后,系统会默认执行postinst脚本,通常我们利用该脚本来搭建一些为软件执行的环境(如创建目录、修改权限等),值得注意的是该文件首行必须填#!/bin/sh,且应该给此文件可执行权限。 我这里写的比较简单,判断第一个参数,仅供参考。

postrm文件包含信息如下:

1
2
3
4
5
6
#!/bin/sh
if [ "$1" = "upgrade" ] ; then
echo "upgrade"
elif [ "$1" = "remove" ] || [ "$1" = "purge" ] ; then
echo "remove"
fi

当卸载了该deb包以后,系统会默认执行postrm脚本,通常我们利用该脚本来清理环境,值得注意的是该文件首行必须填#!/bin/sh,且应该给此文件可执行权限。 我这里写的比较简单,判断第一个参数,仅供参考。

当备齐了制作deb包的基本原材料之后我们便可以开始制作属于自己的deb包了,首先cd进入 mydeb目录下,也就是DEBIAN及home文件夹所在的目录,接着输入如下命令来构建软件包。

1
sudo dpkg-deb -b ../mydeb ../mydeb_1.0.0_amd64.deb

其中dpkg-deb是构建deb包命令,-b参数表示要构建一个deb包,../mydeb参数表示要构建deb包原材料的路径,../mydeb_1.0.0_amd64.deb参数表示将该deb包构建在当前目录的上级目录中, 一般我们构建deb包的名字都会遵循这么一个原则,其命名方式为:软件名称+软件版本号+该软件所支持的处理器架构,如我软件名为mydeb,版本号为1.0.0,所支持的处理器架构为amd64。

制作好自己的deb包后我们需要验证一下是否真的制作成功,我们可以输入”dpkg -c mydeb_1.0.0_amd64.deb”命令查看已制作的deb包文件内容:

输入”dpkg –info mydeb_1.0.0_amd64.deb”命令查看deb包信息:

下面我将该deb包拷贝到imx6ull的文件系统下,并在deb包目录下输入”dpkg -i mydeb_1.0.0_amd64.deb”命令以安装软件,其中-i 参数表示安装软件,即install,并且在安装完软件之后可以输入“dpkg -s mydeb”命令查看是否安装了软件

或者输入”dpkg -l”命令罗列出系统已经安装的软件,查看你的软件是否在已安装软件列表里面。

验证安装完成之后我们进入mydeb软件所在目录(该目录是我们在构建deb包的时候对应的目录:/usr/local)
到此,制作deb包的基本流程已介绍完毕。