目录
1 引言
当构建一个自定义特性的ubuntu发行版本时,会经常接触deb包,因为它们有助于ubuntu来安装和维护软件,因此了解deb是很有帮助的。由于deb包方面的知识和框架是很大的,无法在本文中概括完,所以本文只针对如何构建包和搭建构建环境,涉及的其他非相关知识不做介绍。
本章中内容如将着重描述:源码编译为deb包的自研包和开源包修改之后的适配包。
2 deb包简介
deb包通常配合APT软件管理系统来使用,它是Debian系统(包含debian和ubuntu)下专属的安装包格式,称为当前在linux下非常主流的一种包管理方式。将包文件信息以及包内容,经过gzip和tar打包而成,处理deb包的经典程序是dpkg,经常是通过apt来运作。
3 deb包的基础应用
3.1 dpkg常用命令
安装
dpkg -i 或者 dpkg --install *.deb
表示安装该软件包,deb包并非平台无关的包,deb包与主机架构需要对应,才能安装使用,在安装的过程中终端将打印相应的步骤信息,在出错时也方便调试。
事实上,deb包的安装分为了两个阶段:先解压压缩包,然后进行配置。这两个步骤可以分开处理。
移除
dpkg -r 或者 dpkg --remove
表示从系统中移除一个deb包,但是保留其配置文件、维护文件以及用户数据,仅相当于停用程序,下次安装可继续使用。
dpkg -P package_name 或者 dpkg –purge : 表示从系统中移除一个deb包,同时,删除所有包相关的文件。
信息查看
dpkg -L
列出某个已安装deb包的文件清单,包含所有安装的软件,但是不包含控制信息。需要注意的是,这一选项需要目标是已安装软件,packge只需要包名而不需要带.deb后缀的全名。
dpkg -c 或者 dpkg --content
显示目标包安装文件的详细信息,包括权限,大小等等,与-L选项不同的是不需要安装即可查看,对于查看其它架构下的deb很方便。
解包
sudo dpkg-deb -R package_full_name target_dir
这条命令会将deb包的信息解压到target_dir目录下,就可以看到deb包所有相关文件信息了。
4 deb包的编译
编译deb包通常需要准备三部分内容:控制信息(DEBIAN目录)、安装内容(模拟root目录)、源码;
debian目录下需要应用的内容:
DEBIAN目录下一般都是一些控制文件,也可以用debian命名,该目录下的文件含义:
- control : deb包的描述文件,包含了很多供dpkg、apt-get、apt-cache等包管理工具进行管理时所使用的许多变量。
- copyright : 顾名思义,这个文件包含了上游软件的版权以及许可证信息,如果你常年混迹于开源社区,那么开源协议和版权是需要牢记在心的。
- changeLog : 版本变更信息,对于一个需要长期维护的软件,版本变更信息的跟踪是非常有必要的。
- rules : 每一个rules文件,就像其他的Makefile一样,包含若干的规则,每一列规则都定义了一些对于deb包的操作,主要作用是控制源码包的编译安装等行为。
- patches:
- 其他脚本 : 常见的脚本文件有preinst、prerm、postinst、postrm,分别代表脚本的执行时机为:解压包之前执行、卸载之前执行、安装之后执行、卸载之后执行,这些脚本可以很方便地对目标环境进行一些配置,以方便安装的执行
安装内容目录设置:
情况1:如果是将已经编译好的输出文件打包,则要构建模拟的root目录,用于安装到指定目标平台的位置;
情况2:若是自研包打包,则在rules文件中指定安装位置即可。
如下所示为情况1的deb包解包后的内容,编译输出文件已经放在etc,lib,usr中,安装时候也是按照设置的位置在目标平台上安装。
root@test:~/test$ ls
DEBIAN etc lib usr
如下所示为情况2的deb包解包后的内容,可以看到debian包集成在源码中,用于控制tree的编译
tree-1.8.0# ls
CHANGES LICENSE README color.c doc hash.c json.c tree tree.h xml.c
INSTALL Makefile TODO debian file.c html.c strverscmp.c tree.c unix.c
4.1 自研deb包的编译
自研deb包如情况2所示,在准备好“源码+makefile文件+debian”之后,在x86架构上编译出arm架构的deb的包,方法只需两步:
构建编译环境
针对目标平台为32位架构:mk-build-deps -i --build-arch amd64 --host-arch armhf
针对目标平台为64位架构:mk-build-deps -i --build-arch amd64 --host-arch arm64
编译
针对目标平台为32位架构:dpkg-buildpackage --host-arch armhf
针对目标平台为64位架构:dpkg-buildpackage --host-arch arm64
完成这两步操作之后,即可生成对应的deb包
4.2 适配deb包的编译
适配包是在开源包的基础之上构建,所以也需要经过两步:构建编译环境和编译,值得注意的是:
源码补丁存储在 debian/patches/* ,并将补丁的顺序记录于 debian/patches/series 文件
4.3 编译输出文件打包
编译文件制作deb包如情况1所示,在准备好“debian+包含编译文件的模拟rootfs目录”之后,在x86架构上编译出arm架构的deb的包,方法只需一步:
针对目标平台为32位架构:dpkg-deb -b deb_direcitory/ demo_1.0.0-1.0_arm64.deb
针对目标平台为64位架构:dpkg-deb -b deb_direcitory/ demo_1.0.0-1.0_armhf.deb
dpkg-deb -b指令会根据提供的源码目录创建一个deb包。
5 虚拟包——virtual package
5.1 意义
虚拟软件包用于声明一组软件包中任何一个包的通用名称,这组所有软件包都提供相似的基本功能。例如,tin和trn程序都是新闻阅读器,而系统中并不需要安装两个新闻阅读器,只需要安装其中一个即可。因此,这两个包都提供了称为新闻阅读器的“虚拟软件包”。同样,smail和sendmail都提供了邮件传输代理的功能。可以称它们提供了“邮件传输代理”虚拟包。如果安装了任何一个,则此虚拟软件包将使系统满足任何依赖于邮件传输代理程序安装的程序。
5.2 参考
debian定义的虚拟包:https://www.debian.org/doc/packaging-manuals/virtual-package-names-list.yaml
我们选择安装其中一个虚拟包:x-display-manager,则显示如下提示:这个功能只需要安装例表中的某个一,则可提供虚拟包的功能。
root@test:~/test# apt install x-display-manager
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package x-display-manager is a virtual package provided by:
lightdm 1.30.0-0ubuntu4~20.04.1
gdm3 3.36.3-0ubuntu0.20.04.3
xdm 1:1.1.11-3ubuntu2
wdm 1.28-24build1
slim 1.3.6-5.1ubuntu2
sddm 0.18.1-1ubuntu2
nodm 0.13-5
lxdm 0.5.3-2.1
You should explicitly select one to install.
6 注意事项
在交叉编译中比较常见的一些参数就是build、host和target了,正确的理解这三者的含义对于交叉编译是非常重要的,其含义为:
--build=编译该软件所使用的平台
--host=该软件将运行的平台
--target=该软件所处理的目标平台
举例:
若要在x86下编译一个运行于arm上的编译器gcc,这个gcc产生mips平台的目标代码。那么配置方式是:
--build=x86 --host=arm --target=mips
所以:
build:自动测试在用平台名称,若无法检测出来则需要指定。
host:若无指定,自动使用build的结果。
build和host相同时表示本地编译,若不相同则表示两方交叉编译——cross toolchain
build、host和target均不相同时则表示三方交叉编译——canadian cross toolchain
参考
https://blog.csdn.net/qq_28643619/article/details/86667719
https://www.debian.org/doc/manuals/maint-guide/start.zh-cn.html
http://www.downeyboy.com/2019/05/28/mk_deb_pack_series_0/
https://blog.csdn.net/docblue/article/details/40683085