rpm构建流程学习总结

rpm构建流程

学习链接:
b站马哥: https://www.bilibili.com/video/BV1ai4y1N7gp
RedHat:
https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/8/html/packaging_and_distributing_software/index

制作过程

  1. introduction section
  2. prep section |解压,宏,
    %prep
    %setup
  3. build section
    %build
  4. install section
    %install
  5. clean section
    %clean
    rm -rf %{buildroot}
  6. 脚本段 在install之后
    %pre 安装前
    %post 安装后
    %preun 卸载前
    %postun 卸载后

1 install
2 upgrade
0 remove
7. file section
%file
定义文件如何包含进rpm包,包含哪些文件,文件的权限,这些文件被当作什么 %doc %dir %config(noreplace) .rpmnew .orig

主要目录【标准化的工作空间】

  • SOURCES |源码包,Unzip to BUILD
  • SPEC | .spec文件
  • BUILD |解压到该目录
  • BUILDROOT |安装软件后,以该目录为根生成的路径 files[] 把buildroot里有用的部分拿出来,放到rpm里 最后clean会清除 buildroot、build
  • RPMS
  • SRPMS

BuildRequires
制作软件包需要的依赖 gcc binutils
Requires
安装软件包需要的依赖

Tips:

  1. release 指第几次制作,跟version无关

  2. 制作过程:
    rpm build:首先解压SOURCE里的文件到BUILD,在BUILD里生成一个子目录,编译过程会跳到子目录里去执行./config/make,编译之后安装,不是安装到系统上,而是安装到一个临时目录中去,install安装到buildroot目录下,把buildroot目录当作操作系统目录。下一步:file section ,rpm 命令根据file section中列出的文件,把BUILD目录中的那些file文件压缩成rpm包。打包完成后执行clean过程,清除BUILDROOT和BUILD目录。
    BUILDROOT里除了debug的文件,其他的都必须做进rpm包

  3. %prep
    解压到BUILD,cd进去,设置一些环境变量,设置一些宏,为编译做准备
    %setup -q 像是prep的扩展
    -q 静默模式 不显示过程 以最少输出显示
    %patch打补丁

    %setup -q -a 1
    -a 1 ==> unpack source1 after change directory 先cd到build目录下 ?
    -b 2 ==> befor
    -c creat %{BUILD}/%Name-%Version
    -T 不展开 Disable the automatic unpacking of the archives

  4. %build
    ./configure
    --etcdir="%{_sysconfdir}"
    --mandir="%{_mandir}"
    --il8n="0"
    --scrip="0"
    %{_make} %{?_smp_mflags} ==>对称多处理器上,可以加快编译过程

  5. %install
    %{__rm} -rf %{buildroot} 删除之前安装的,没有也不影响
    %{__make} install DESTDIR="%{buildroot}"
    %find_lang %{name}
    在buildroot目录下会生成一堆
    6。 %clean
    %{__rm} -rf %{buildroot}
    清理此前制作过程中的buildroot

    rpmbuild --clean xxx.spec可以执行spec的clean过程

  6. %file
    %defattr(-,root,root,-) 权限
    %doc 文档
    %config %{_sysconfigdir}/axelrc 配置文件
    /usr/local/bin/axel
    %dir 目录
    %conf(noraplace) 指的是新的配置文件是否替换,如果原来的旧的配置没有修改,会替换,修改了,不会替换,会把原来的改成比如xxx.conf.orig,再去生成新的。

    • usr/src下的debug是不用包含进来的
    • %attr(0755, root, root) /etc/rc.d/init.d/nginx %attr表示单个属性,如果不这样写,会继承默认属性 %defattr (-,root,root,-)
      %attr(-,root,-) - ==> 保持原有的
  7. rpmbuild --showrc|grep _tmppath

rpmdev-setuptree命令相当于 mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
#家目录 vi ~/.rpmmacros
%_topdir %(echo `pwd`)/rpmbuild
%{?_smp_flag}  ?:有的话就用,没有的话就不用

rpmbuild

  • -ba all ==> bb + bs

  • -bb 表示制作二进制格式的rpm包

  • -bc %build

  • -bp %prep

  • -bi %install

  • -bl check 有多余的文件或者文件没有被放到rpm包里都会error。==>
    Check the listing of filee for the RPM and generate errors if the buildroot is missing any of the file to be installed.

  • -bs 表示制作源码格式的rpm包 src.rpm


rpm常用命令

  • netstat -tnlp 查看端口

  • rpm -ivh xxx.rpm 安装

  • rpm -qi xxx.rpm 查看rpm包信息

  • rpm -e xxx.rpm 卸载

  • rpm -Uvh xxx.rpm 升级

  • rpm2cpio xxx.src.rpm > xxx.cpio 解包
    rpm2cpio xx | cpio -t
    rpm2cpio xx | cpio -id 展开在当前目录下

  • xxx.src.rpm 对源码包rebuild
    rpmbuild --rebuild xxx.src.rpm

  • tar -xf xx.tar -C /var/tmp
    jcf/zcf 压缩
    tar -jcf xxx.tar.bz2 xxx/*

  • lftp ip 一个下载工具,支持很多访问文件的协议:ftp, ftps, http, https, hftp, fish

  • rpm -K |-- checksig 检查签名 所以构建要有数字签名 非对称加密 openssl gpg
    PGP OpenPGP ===> GUN PG

  • 对rpm签名使用gpg命令
    gpg --gen-key
    gpg --list-keys
    gpg --export -a 'xxx' > RPM-GPG-KEY-MAGE 导出公钥
    rpm --addsign xx.rpm 签名

    rpm --import RPM-GPG-KEY-MAGE
    rpm -K xxx.rpm 检查签名rpm --checksig xx.rpm
    rpm -api xxx.rpm Signature 可以看到签名信息
    制作过程中签名
    ~/.rpmmacros
    %_signature gpg
    %_gpg_name MAGE


最好在普通用户下执行rpmbuild,防止spec文件里写一些rm -rf /

spec文件编写

  1. TagName: value

  2. 用户自定义宏
    %define macro_name value
    %{macro_name} %macro_name

  3. # 注释 注释里不能使用% 非要使用的话 %%

  4. 不可省略
    Name
    Version
    Release
    Group ==> /usr/share/doc/rpm-4.11.3/GROUPS
    关于公司

    • Vender
      -URL
      -Package
      License

    Summary
    %description

    -Requires 安装时
    -Provide 能力,未定义则使用Name
    -BuildRequires 编译时

    buildroot 安装时作为假想的根目录 %{}/%{name}-%{version}-%{release} == $RPM_BUILD_ROOT

    Source1: 必须位于SOURCE 可能是链接 但是不会去跟着下载
    Source2:
    ...

    Patch1:
    Patch2:

原文地址:https://www.cnblogs.com/hhds/p/15501841.html