zoukankan      html  css  js  c++  java
  • 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:

  • 相关阅读:
    怎么在myeclipse中怎么集成Tomcat。
    JSP .基础概念
    继承
    封装
    什么是面向对象
    数据排序
    开发的套路
    Javabean规范
    转发和重定向
    md5加密
  • 原文地址:https://www.cnblogs.com/hhds/p/15501841.html
Copyright © 2011-2022 走看看