0x00 引言
Debian下的安装包后缀名.deb,Unix服务器的安装包后缀名一般为.rpm 。本文主要研究如何打这两种包。
0x01 rpm打包
rpm打包默认是以源码打包的形式,当然也可以利用这种机制实现非源码打包。
1 | 1 环境搭建 |
1、环境搭建
这里以centos7为rpm打包平台,具体的环境配置已经在仓库里面,可以自行查阅资料[1]。
2、基础知识构建
2.1、rpm打包文件结构
rpmdev-setuptree命令由工具rpmdevtools提供,可以直接在/root/rpmbuild/目录下生成rpm打包所需的目录结构。下面具体描述各个文件夹的作用:
1 | $ tree /root/rpmbuild |
- SOURCES - 如果是用源码打包,则只需要将源码的tar.gz文件存放于此即可;
- BUILD - rpmbuild工具会自行将SOURCES目录中的源码在此处解压,该文件无需手动修改,具体编译方法需要在SPECS下的.spec文件中描述;
- SPECS - 需要人工操作的只有该文件夹,里面可以存放各种rpm打包规则的.spec文件,后面详细介绍;
- RPMS - 当打包完成,会在此处生成release与debug版的.rpm包;
- SRPMS - 当打包完成,会在此处生成源码.rpm包;
- *BUILDROOT - 该目录是在SPECS打包过程中自动生成的,其重要性是最后打完的包需要安装的文件及其路径都以该目录为模板。
2.2、rpm目录路径宏
各路径宏参考文献[2]
目录 | 宏代码 | 用途 |
---|---|---|
/root/rpmbuild/SOURCES | %_sourcedir | 保存源码包(如 .tar 包)和所有 patch 补丁 |
/root/rpmbuild/BUILD | %_builddir | 源码包被解压至此,并在该目录的子目录完成编译 |
/root/rpmbuild/BUILDROOT | %_buildrootdir | 保存 %install 阶段安装的文件 |
/root/rpmbuild/SPECS | %_specdir | 保存 RPM 包配置(.spec)文件 |
/root/rpmbuild/RPMS | %_rpmdir | 生成/保存二进制 RPM 包 |
/root/rpmbuild/SRPMS | %_srcrpmdir | 生成/保存源码 RPM 包(SRPM) |
2.3、rpm常用路径宏
各路径宏参考文献[2]
路径 | 宏 |
---|---|
/etc | %{_sysconfdir} |
/usr | %{_prefix} |
%{_prefix} | %{_exec_prefix} |
%{_exec_prefix}/bin | %{_bindir} |
%{_exec_prefix}/%{_lib} | %{_libdir} |
%{_exec_prefix}/libexec | %{_libexecdir} |
%{_exec_prefix}/sbin | %{_sbindir} |
/var/lib | %{_sharedstatedir} |
%{_prefix}/share | %{_datarootdir} |
%{_datarootdir} | %{_datadir} |
%{_prefix}/include | %{_includedir} |
/usr/share/info | %{_infodir} |
/usr/share/man | %{_mandir} |
/var | %{_localstatedir} |
%{_sysconfdir}/rc.d/init.d | %{_initddir} |
/var | %{_var} |
%{_var}/tmp | %{_tmppath} |
/usr | %{_usr} |
%{_usr}/src | %{_usrsrc} |
lib (lib64 on 64bit multilib systems) | %{_lib} |
%{_datadir}/doc | %{_docdir} |
%{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch} | %{buildroot} |
%{buildroot} | $RPM_BUILD_ROOT |
2.4、SPEC文件执行流程
1 | # 升级时完整执行流程: |
3、源码打包示例
SPECS撰写方法参考文献[3],这里以最后实现的一个rpm项目打包为例。首先要在/root/rpmbuild/SPECS/目录下新建一个.spec文件,并且内部需要实现一些字段,下面解释各个部分的作用:
1 | # 项目名 |
最后只需要执行生成rpm包的指令:
1 | rpmbuild -ba '.spec文件路径' |
4、非源码打包示例
如果无源码,只有一些已经编译完成的链接库与可执行文件,则可以借用打包机制,跳过编译步骤,直接将需要打入rpm包的文件拷贝到/root/rpmbuild/BUILDROOT/目录下:
1 | # rpm进行实际打包准备工作的阶段 |
最后只需要执行生成rpm包的指令:
1 | rpmbuild -ba '.spec文件路径' |
0x02 deb打包
虽然deb打包的网上资料较少,但是实际上也是能实现源码与非源码打包的,并且天然支持CMake。可以参考下debian维护手册[4]。
打包方法总共有三种:
- debuild - 这种方法较复杂但是做的事情最多。该方法会创建上传Debian软件包所需的所有文件。它首先运行 dpkg-buildpackage,然后在创建的 .changes 文件上运行 lintian(假设安装了 lintian,这是一个 Debian 上面的包质量的检测工具),最后根据需要对 .changes 和/或 .dsc 文件进行签名。
- dpkg-buildpackage - debuild方法的第一步,如果不做签名等复杂操作,这个方法足矣
- dpkg-deb - 这种方法是为了快速打包,并且只能非源码打包,但并不是常用的方法,相比之下,还是使用dpkg-buildpackage更好
1
2
3
4
5
6
7
8
9
101 环境搭建
2 基础知识
2.1 deb打包文件结构
2.2 debian/control文件详解
2.3 debian/rules文件详解
2.4 debian/install文件详解
2.5 deb打包钩子脚本执行流程
2.6 deb打包时环境变量
3 源码打包示例
4 非源码打包示例
1、环境搭建
1 | # debuild环境 |
2、基础知识
2.1、deb打包文件结构
debian / DEBIAN 目录可以使用dh_make工具自动生成。下面具体描述debian文件夹各文件的作用:
1 | # 首先新建一个 <包名>-<版本号> 的目录 |
将debian目录尽量简化,打包示例中的debian目录结构如下:
1 | debian |
2.2、debian/control文件详解
control文件是最重要的,这边给出打包示例中control文件的详细内容:
1 | Source: ctest # 这就是根据tar.gz包名自动生成的项目名 |
2.3、debian/rules文件详解
还有一个很重要的文件就是rules,在不知道如何使用的情况下,使用初始化的rules文件即可。
rules文件本质上是一个Makefile文件,这个Makefile文件定义了创建deb格式软件包的规则。打包工具按照rules文件指定的规则,完成编译,将软件安装到临时安装目录,清理编译目录等操作,并依据安装到临时目录的文件来生成deb格式的软件包。
1 |
|
实际上rules文件的dh语言是由debhelper工具来解析的,不要看上面只有短短一行语句,但实际上它的进化简化过程很漫长:
2.4、debian/install文件详解
还有一个文件对于非源码打包作用很大,即debian/install。如果你的软件包需要那些标准的make install没有安装的文件,你可以把文件名和目标路径写入 debian/install文件,它们将被 dh_install安装:
1 | # 假设有个空文件的tar.gz包,文件结构如下 |
install的初始位置就是在打包根目录下,install文件可以这样写(注意install文件的属性、所属者必须与其他文件一致):
1 |
|
2.5、deb打包钩子脚本执行流程
1 | # 首次安装某deb包时,执行dpkg -i test_v1.deb安装,DEBIAN下面控制脚本按如下顺序执行: |
2.6、deb打包时环境变量
1 | # 包名 |
3、源码打包示例
deb源码打包只能使用debuild / dpkg-buildpackage的方法,其特点就是能够直接识别CMakeLists.txt文件,并自动编译。现以一个实例程序展示源码打包的流程:
1 | # 使用dh_make自动生成debian包,选择'single' 'Y' |
4、非源码打包示例
非源码打包可以使用debian/install文件安装或者打包目录下的文件结构,前者可在钩子脚本指定安装位置,后者可在用户安装deb包的时候自动放入对应的文件系统中。
1 | # 在打包根目录下新建1.md 2.md |
0x03 dpkg基础 知识
1 | 1 常用命令 |
1、常用命令
1 | # 安装 |
2、路径释义
- /var/lib/dpkg/status: 查看包当前状态
- /var/lib/dpkg/info/: 包含安装包的配置文件(钩子脚本都能在此修改)
0x04 引用文献
[1]https://github.com/JailbreakFox/Linux-sh-package/blob/master/Centos/Centos%20Mini.md
[2]https://blog.csdn.net/get_set/article/details/53453320
[3]https://www.cnblogs.com/SQL888/p/5776442.html
[4]https://www.debian.org/doc/manuals/maint-guide/index.zh-cn.html