deb,rpm包打包初尝

DEB

文件目录:
|----DEBIAN

   |-------control

   |-------postinst(postinstallation)

   |-------postrm(postremove)

   |-------preinst(preinstallation)

   |-------prerm(preremove)
  • control : 这个文件主要描述软件包的名称(Package),版本(Version),Installed-Size(大小),Maintainer(打包人和联系方式)以及描述(Description)等,是deb包必须具备的描述性文件,以便于软件的安装管理和索引.
    在这里插入图片描述
    备注:
  • inst是install(安装)的缩写
  • pre是表示XX之前的前缀
  • post是表示XX之后的前缀
  • rm是remove(移除)的缩写
  • preinst文件:Deb包文件解包之前(即软件安装前),将会运行该脚本。可以停止作用于待升级软件包的服务,直到软件包安装或升级完成。
  • postinst文件:负责完成安装包时的配置工作。如新安装或升级的软件重启服务。软件安装完后,执行该Shell脚本,一般用来配置软件执行环境,必须以“#!/bin/sh”为首行。
  • prerm 文件:该脚本负责停止与软件包相关联的daemon服务。它在删除软件包关联文件之前执行。
  • postrm文件:负责修改软件包链接或文件关联,或删除由它创建的文件。软件卸载后,执行该Shell脚本,一般作为清理收尾工作,必须以“#!/bin/sh”为首行

dpkg 详解

  • 打包dpkg -b
# dpkg -b . mydeb-1.deb
第一个参数为将要打包的目录名(.表示当前目录),第二个参数为生成包的名称<.deb file name>
  • 安装(解包并配置) dpkg -i|–install <.deb file name>
# dpkg -i mydeb-1.deb

//强制安装

# dpkg --force-depends -i mydeb-1.deb

解包:
# dpkg --unpack mydeb-1.deb

该命令仅对 “mydeb-1.deb”进行解包操作,不会执行包配置工作。
  • 卸载 dpkg -r|–remove ,删除包,但保留配置文件
# dpkg -r my-deb 
# dpkg -P|--purge my-deb         

该命令删除包,且删除配置文件。

RPM

RPM的文件比较多,逻辑也比较冗杂一些

  • 文件结构
$ tree rpmbuild
rpmbuild
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS

RPM中的参数大多数使用的是宏变量,略不同于普通的脚本参数
在这里插入图片描述
SPECS下是RPM包的配置文件,是RPM打包的“图纸”,这个文件会告诉rpmbuild命令如何去打包。“宏代码”这一列就可以在SPEC文件中用来代指所对应的目录,类似于编程语言中的宏或全局变量。当然~/rpmbuild这个文件夹也是有宏代码的,叫做%_topdir。

打包的过程有点像是流水线,分好几个工序:

  1. 首先,需要把源代码放到%_sourcedir中;
  2. 然后,进行编译,编译的过程是在%_builddir中完成的,所以需要先把源代码复制到这个目录下边,一般情况下,源代码是压缩包格式,那么就解压过来即可;
  3. 第三步,进行“安装”,这里有点类似于预先组装软件包,把软件包应该包含的内容(比如二进制文件、配置文件、man文档等)复制到%_buildrootdir中,并按照实际安装后的目录结构组装,比如二进制命令可能会放在/usr/bin下,那么就在%_buildrootdir下也按照同样的目录结构放置;
  4. 然后,需要配置一些必要的工作,比如在实际安装前的准备啦,安装后的清理啦,以及在卸载前后要做的工作啦等等,这样也都是通过配置在SPEC文件中来告诉rpmbuild命令;
  5. 还有一步可选操作,那就是检查软件是否正常运行;
  6. 最后,生成的RPM包放置到%_rpmdir,源码包放置到%_srpmdir下。
    在这里插入图片描述
    与deb差不多,rpm包在打包时也会包含4个过程,安装前,安装后,卸载前,卸载后.
  • %install阶段
    此阶段包含安装阶段需要执行的命令,即从 %{_builddir} 复制相关文件到 %{buildroot} 目录(通常表示从 ~/rpmbuild/BUILD 复制到 ~/rpmbuild/BUILDROOT/XXX) 目录,并根据需要在 %{buildroot} 中创建必要目录
    在这个目录下可以进行脚本的操作.

下面讲一个例子就会清楚多了
背景:需要打一个增量包(作用就是在已经完成安装的机器上,对现有的某些包的增加和删除),正常情况写,我们应该在rpm包下的SOURCES目录中放我们源码包,在%pre阶段会自动的将源码包解压到%builddir中,但是由于我们是打一个增量包,也就是只完成特定的增加和删除,所以我们可以直接在%builddir(BUILD)中放对应的资源,这个资源在打成rpm包时会被打进包里.So,在.spec文件中的%prep我们这里直接不写任何操作.同理,由于%build阶段是对%builddir文件的编译,我们这里也不需要编译了,.spec中的%build模块依旧不写任何操作.
在上面我们讲过,BUILDROOT目录就是模拟物理机中的根目录,我们不需要关心软件包是怎么实现模拟的,我只需要在进行文件操作的时候,我们想在物理机器上对根目录进行如何的操作改写成对BUILDROOT目录的对等操作即可,比如:我想要在物理机器上的/home/user/目录下写入一些文件进去,那么我们就应该这样写
%{ins_path}是一个宏参数,表示安装的目录

//首先在根目录下创建这个文件目录
%{_mkdir} -p %{buildroot}/home/user/
//其次再对目录进行后续操作
%{_cp} %{builddir}/home/user/* %{buildroot}/home/user/
//上面源文件的位置不知道是不是默认从builddir中的读取的,
即,如果我不写%{builddir},
会不会直接默认从%{builddir}下的home/user目录下读取文件这一点还没验证,
等等在验证吧.姑且先认为必须将源文件路径写完整.

这样及对文件完成了将BUILD目录下的home/user的所有文件复制到BUILDROOT目录的对应目录中. 接下来我们要进行到%post阶段,可以理解为deb包中的postinst阶段,即,安装后的操作.上面已经完成了将安装包中的文件复制到物理机的/home/user目录文件中,所以我们需要将物理机本地的文件复制到特定的安装目录下.这就是整个安装包最为重要的部分,因为这个安装包就是为了完成这个新增操作

%post
for file in `ls /home/user/`
do
	if [ -f %{ins_path}/${file} ];then
		#将安装路径下原来的包进行备份,后面会用到,这个备份操作跟rpm没关系,是我这个业务需要罢了
		cp %{ins_path}/${file} /home/user/${file}.bak
	fi
	#将更新目录下文件复制到安装目录下,这就是新增包的操作!!!
	cp  /home/user/${file} %{ins_path}/
done

%preun阶段就是deb包中的prerm,指在卸载前应该完成的操作.在我这个示例中,要在写在前完成对上面备份的.bak文件重新放回安装目录中,以完成版本的回溯.

for file in `ls /home/user/`
do
	if [ "${file##*.}" = "jar" ];then
		rm -f %{ins_path}/${file}
		if [ -f /home/user/${file}.bak ];then
			#将原安装的文件给他复原回去,以完成版本的回溯
			mv -f /home/user/${file}.bak %{ins_path}/${file}
		fi
	fi
done

对于其他的参数,目前还不是特别了解,所以就先写到这里,等我有了新的理解,我在来更新吧!
详细的rpm介绍参考链接:RPM打包原理、示例、详解及备查


如果文章有的地方写错了,劳烦大佬批评指正,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值