Deb包制作
dpkg是deb系(debian,ubuntu以及其他使用.deb包的发行版)主要的软件包管理程序,apt包管理器是基于dpkg实现
一.deb包基本结构预览
1.源码包结构说明
deb源码包主要由debian目录以及项目源码组成,debian目录下包含软件包的所有信息,比如包版本信息,安装构建依赖,安装构建执行的脚本等,可以理解成将rpm系的spec文件分解到了一个文件夹下。
参考如下结构(地址:https://github.com/streadway/hello-debian)
young@young:~/lq/makedeb$ tree hello-debian/
hello-debian/
├── debian
│ ├── changelog
│ ├── compat
│ ├── control
│ ├── copyright
│ ├── install
│ └── rules
├── hello.c
├── Makefile
└── README.md
debian/changelog
1.每个源码包必须包含changelog
2.记录了codename,版本号,发行日志,开发人员签名,发行日期等重要信息
3.版本号必须递增,且必须填写一次发行日志
4.urgency重要程度一般有low
/medium
/high
/critical
hello-debian (0.0.2-1) UNRELEASED; urgency=low
* Next build
-- builder <builder@wheezy-builder> Mon, 24 Mar 2014 16:05:35 +0100
debian/copyright
1.每个deb包安装后都会有对应的一个copyright文件放在/usr/share/doc/PACKAGE/目录下
2.默认创建的、安装的一般都是GPL-V2协议的copyright
3.自建软件包时,也应该有一个copyright文件放到debian/目录下,可以按需选择协议
debian/control
1.记录了源码文件和其所生成的二进制包(可生成多个二进制包,即多个Package字段)的所有信息,包括安装依赖,源码编译依赖,软件包描述等,
Source: hello-debian #源码包名
Section: utils #所属组件
Priority: extra #重要程度
Maintainer: Full Name <yourname@example.com> #维护者
Build-Depends: debhelper (>= 8.0.0) #构建依赖
Standards-Version: 3.9.3 #版本号
Vcs-Git: git@github.com:streadway/hello-debian.git #源码地址
Vcs-Browser: http://github.com/streadway/hello-debian
Package: hello-debian #构建出的二进制包名
Section: utils
Priority: extra
Architecture: any #适用架构,arm64/amd64等
Depends: ${shlibs:Depends}, ${misc:Depends} #安装依赖
Description: Example package maintenance (under 60 chars) #软件描述
The build output from a repository listing the steps to setup a debian
package in a long-format under 80 characters per line.
debian/rules
1.类似makefile的描述编译规则的文件
2.必须在rules中完成源码编译和二进制包打包工作
3.执行make -f debian/rules args... 或 ./debian/rules args应该保持一致
4.rules中最重要的的几个方法,在编包过程中会由dpkg-buildpackage调用这几个方法:
clean, binary, binary-arch, binary-indep, build, build-arch and build-indep
debian/xxx.install
1.xxx为生成的二进制包名,如果只生成一个二进制包,命名为install文件即可;该文件用于将源码包里的内容拷贝到deb包中,类似 install -D
命令
2.这个文件是dh_install命令调用
#install 文件例子
usr/lib/xxx /usr/lib/
debian/xxx.postinst
1.文件命名参考install,
2.安装后执行,用得比较多——可用来配置、启动你的程序
3.需要可执行权限
4.可以像普通shell脚本一样写。最好借用标准的postinst模板,然后自己重写其中的安装后执行的函数
debian/xxx.preinst
1.文件命名参考install,软件安装前执行,可用来提前清理或检查环境
2.也最好采用模板来改
debian/xxx.prerm
文件命名参考install,卸载前执行,用来停止服务、进程准备卸载
debian/xxx.postrm
1.文件命名参考install,卸载后执行,用来清理残余文件
debian/xxx.template
1.一个语言国际化模板,用来翻译显示文本
debian/patches/
1.这个目录仅在debian/source/format文件中写的是3.0 (quilt)时会有,用来存放quilt管理的所有补丁。quilt是一种针对debian软件包的本地版本控制管理工具。
二.从源码开始打deb包
1.找到合适的源码
比如 https://github.com/Hummer12007/brightnessctl
,将tar.gz源码包下载到本地并且解压
2.创建debian文件夹
重命名源码包和解压的文件夹,命名为brightness-0.7.tar.gz和brightness-0.7
进入文件夹,使用dh_make自动生成debian模板文件夹,-e参数为email
dh_make -e ditvelo@xxx.com -f ../brightnessctl-0.7.tar.gz
执行完之后文件夹下面就生成了debian模板文件夹,
3.按需修改debian目录文件
debian目录下有很多.ex结尾的文件,我们不需要,全部删除
然后使用常用的编包命令为 dpkg-buildpackage -us -uc
看是否能够编译通过(-us -uc作用是不做签名),这条命令会自动帮我们执行 参考 3 的 4.4.2. Default rules file
说明的步骤,你也可以手动一步一步执行
发现 dh_auto_clean 步骤报错误,dh_auto_xxx 实际也是调用源码下的Makefile,检查发现在源码目录执行 make clean
就会报错,不推荐修改源码,所以我们在rules文件里面重写 dh_auto_clean 部分
改完再次执行 dpkg-buildpackage -us -uc
编译,发现报dh_usrlocal: error: debian/brightnessctl/usr/local/bin/brightnessctl is not a directory dh_auto_configure,源码的Makefile将编译后的二进制文件放入了 /usr/local/ 下,根据debian文档,该区域仅为本地管理员使用,所以有两种修改方法
(1).将二进制安装到其他目录,比如 /usr/ 下
(2).在rules下添加规则确保在构建时不调用 dh_usrlocal
这里采用第一种方法,rules文件在 dh $@
下添加如下内容,用于覆盖 dh_auto_clean,dh_auto_configure,编译可以正常通过
override_dh_auto_clean:
rm -f brightnessctl
rm -f config.mk
override_dh_auto_configure:
./configure --prefix=/usr/ --udev-dir=/lib/udev/rules.d
在源码上级目录我们能找到打包好的deb包
三.deb二进制包结构
使用 dpkg-deb -R brightnessctl_0.7-1_arm64.deb brightnessctl
解压刚刚打的deb包到 brightnessctl 目录,deb包结构如下
brightnessctl
├── DEBIAN
│ ├── control
│ └── md5sums
├── lib
│ └── udev
│ └── rules.d
│ └── 90-brightnessctl.rules
└── usr
├── bin
│ └── brightnessctl
└── share
├── doc
│ └── brightnessctl
│ ├── changelog.Debian.gz
│ ├── copyright
│ └── README.Debian
└── man
└── man1
└── brightnessctl.1.gz
软件包安装(无论Windows还是Linux)的本质是将文件解压或者编译拷贝到系统恰当的目录,如上deb包的结构,除DEBIAN目录外,其他文件/夹都会解压到系统根目录
下面对DEBIAN目录下几个重要的文件进行说明
1.软件包安装后,DEBIAN下的文件会按照一定规则存放到 /var/ 目录下
2.DEBIAN/control文件是根据源码debian/control文件修改而来,只包含deb包的信息
3.生成的md5sums记录了除DEBIAN目录外其他文件的摘要值
4.当deb包包含 etc/ 目录(etc目录用于存放系统配置文件)时,DEBIAN目录还会生成conffile文件,里面记录的就是etc下的配置文件位置,当更新软件包时,包管理器从conffile读取配置文件列表,重新计算每个文件的md5值,然后和存放在 /var 目录下的 md5sum 文件记录的md5进行对比,用于判断配置文件是否被修改,如果没有修改则将新包的配置文件覆盖老的配置文件,如果配置文件被修改则会弹出交互页面询问是保留原配置还是使用新包的配置文件
5.一个源码包生成多个deb包时debian/xxx.xxx(比如xxx.postinst)文件会被重命名成xxx(比如postinst)
四.制作二进制/临时包
参考deb二进制包结构,我们可以创建一个文件夹,把这个文件夹当作根目录,然后创建对应的文件夹并将文件放进去,手动创建DEBIAN目录和DEBIAN下的control,md5sum,postinst,prerm(按需创建)等文件,然后使用root权限或fakeroot(确保deb包中的文件属于root,不用root或fakeroot时文件权限很可能存在问题)重新打包