• RPM包制作


                 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://mumaren.blog.51cto.com/4180778/971507

    在实际的应用之中,二进制包的使用显得有些麻烦,最好的办法还是将源码包制作成为RPM包,放进yum仓库,再使用类似于puppet来进行管理工作。这样会方便许多,做运维的,你懂的。

    其实,制作RPM软件包并不是一件复杂的工作,其中的关键在于编写SPEC软件包描述文件。下面我详细说明一下RPM软件包的制作过程。

    一个RPM包的制作主要有这几个步骤:

    1 计划好你想做什么。有的rpm包是一个软件,但有的例如cacti是一大堆的网页文件。是纯粹的文件还是库文件还是软件源码。

    2 获取软件包原材料。例如二进制包等,要最原始的

    3 给需要的软件打补丁

    4 制作一个可以指定安装路径的rpm包(较麻烦,不讲)

    5 考虑升级关系

    6 规划好依赖关系 写SPEC文件,整体过程写进去

    7 制作开始。有的还有证书签署:使用GPG密钥签署RPM软件包。可以使用rpmbuild -ba -sign name.spec一步完成构建和签署软件包。使用rpm --resign name-version.rpm添加或更改GPG签名

    8 测试

    其中的重点是SPEC文件的书写

    ######################################

    第一步:设定目录(需大写) 、工作目录(红帽6中还有buildroot

    1 设置制作目录、需要的目录结构 (注意: 一定不能使用root用户进行,至于为什么知道么?)

    rpm包的制作(building)是在一个类似于工作空间的地方,这个工作空间的默认地址是 /usr/src/redhat,因为默认权限是root,所以一般自定义一个目录。

    这就是为 rpm-build 提供的目录结构. 

    1. /usr/src/redhat/ 
    2.  
    3. |-- BUILD 
    4.  
    5. |-- RPMS 
    6.  
    7. |   |-- i386 
    8.  
    9. |   `-- ... 
    10.  
    11. |-- SOURCES 
    12.  
    13. |   |-- foo-1.2.tar.gz 
    14.  
    15. |   |-- foo-1.2-add_feature.patch 
    16.  
    17. |   `-- foo-1.2-change_default.patch 
    18.  
    19. |-- SPECS 
    20.  
    21. |   `-- foo.spec 
    22.  
    23. `-- SRPMS 

    BUILD: 源代码解压,编译的车间,自己不用放东西,里面放什么不用管

    RPMS: 里面还有不同的平台的子目录,生成的rpm包就在这里,可以用rpm交叉编译编译其他平台的

    SOURCES: 原材料的位置

    SPECS:spec文件的存放位置

    SRPMS:src格式的rpm包存放的位置,没有平台相关性了,没有子目录了

    2 把源程序放在指定位置

    即创建一个包含RPM文件的.tar.gz文件。这个 目录还让创建档案文件更加简单。该.tar.gz文件需要位于名为rpmbuild/SOURCES的目录下。你还需要一个.specs文件,这个文件包 含所有建立RPM包的规范说明。该.specs文件是RPM包的核心组件,里面包括全部文件的 指示,RPM包中的文件按照这些指示进行安装。该.specs文件应该放置在一个SPECS目录下。

    3 rpmbuild命令:

    目录结构知道之后就需要了解一下rpmbuild命令了

    当spec文件创建好之后就是时候完成最终的工作了。请使用根目录用户身份安装rpmbuild命令。在Red Hat中,请用yum install rpm-build完成这项工作。接下来,请确保所有的文件都呆在正确的地方。Tar存档文件必须位于创建软件包的当前用户帐户的~/rpmbuild /SOURCES 目录下,demo.spec文件必须位于~/rpmbuild/SPECS目录下。现在你可以用rpmbuild -ba test.spec命令来创建软件包了。这会在/usr/src/redhat/RPMS目录下创建你的RPM文件。

    --------------------------------------------------------------------------------------------------------------

    #注释:

    如何更改rpmbuild的制作目录:

    rpmbuild --showrc | grep macrofiles

    macrofiles这个宏定义这些宏到底在什么文件中设定,类似于profile等

    这么多最后一个匹配的生效:家目录下隐藏的rpmmacros文件

    在家目录重新定义一次即可不适用系统自带的

    实际上是_topdir定义

    _usrsrc定义的又在_src下

    更改的话在自己的家目录下建一个.rpmmacros

    里面直接写:

    %_topdir    /home/xxx/rpmbuild

    退出 再

    mkdir -pv rpmbuild/{BUILD,RPMS,SOURCES,SPECSSRPMS}

    -------------------------------------------------------------------------------------------

    ##########################################

    第二步:创建spec文件:这一步是最重要的!

    一个spec文件主要由几个段落组成:

    introduction section介绍段:

    prep section准备阶段:

    build section编译阶段:

    build section编译阶段:

    install section 安装阶段:

    clean section:清理段

    files section:文件段

    changelog section:改变段

    每一个阶段以%加阶段名开始

    事先注意:

    1注意,spec 文件很多信息都是取自宏指令,如果没有明确指定,就会继承 /usr/lib/rpm/macros 和其它相关宏指令的文件.

    introduction section介绍段:

    就是rpm -qi可以查询出来的那一段

    先看看一个软件包的信息: -qi查询

    1. %define name foo # 名字 
    2.  
    3. %define version 16 #version 
    4.  
    5. Name: %{name} #name 就是使用的上面的宏指令 
    6.  
    7. Version: %{version} #version 也是使用的上面的宏指令 
    8.  
    9. Release: 1 
    10.  
    11. License: GPL 
    12.  
    13. Group: Applications/Productivity # 软件是哪个组的,更多信息查看 /usr/share/doc/rpm-version/GROUPS 
    14.  
    15. URL: http://www.mysqlops.com 
    16.  
    17. Source: ftp://www.mysqlops.com/pub/xxx.tar.gz 
    18.  
    19. Patch0: foo-1.2-change_default.patch 
    20.  
    21. Patch1: foo-1.2-add_feature.patch 
    22.  
    23. PreReq: unzip # 安装前需要什么 
    24.  
    25. Requires: pam # 安装后需要什么 
    26.  
    27. BuildPreReq: gcc >= 2.96 #打包前需要什么 
    28.  
    29. BuildRoot: %{_tmppath}/%{name}-root # 准备源码文件的 chroot 的目录 
    30.  
    31. Summary: A fictional open source package for the offering. #摘要 
    32.  
    33. %description #描述 

    relocatable:是否可以更改安装位置

    summary:简单的说明信息

    Version:中间不能使用横线

    release后面还有关于平台的宏:%{?dist},?带判断,只是rpm包制作者自己制作的次数,rpm包的发行号

    Group:支持的可以less  /usr/share/doc/rpm-xxx/GROUP下查看 需要明确知道

    Vendor:制作者的提供商

    Source:也支持宏

    BuildRoot:rpmbuild生成的文件在这个目录之下,和chroot感觉类似

    BuildRequires:依赖关系

    prep section准备阶段:

    %prep 这部分其它是由一些参数来组成一个 shell 脚本来从 SOURCES 中解压源码和应用补丁到 BUILD 目录中来准备下面的编译.
    和 %prep 相关的宏指令
    %setup
    %patch

    例:

    1. %prep  
    2. %setup -q   #提取源码到 BUILD 目录; -q 指不显示输出(quietly)  
    3. %patch0 -p1  # 应用 patch0  
    4. %patch1 -p1 -b .orig   # 应用 Patch1 但是存下源文件成 .oring 的后缀  
    5. unzip foo_data.zip   # 接下来解压 zip 文件 

    build section编译阶段:

    %build 是编译和准备软件,运行象一个 shell 脚本,它运行在上下文目录指定的源码目录.在编译过程中,调用脚本 .config 在本地的目录(%configure 中配置的).
    和 %build 相关的宏
    %configure  # 可以通过运行 rpm -eval %configure 来看它的设置

    例:

    1. %build  
    2. %configure –enable-shared  
    3. CFLAGS=-O2 make 

    或者直接用%configure来做,类似于%setup

    ?_smp_mflags 判断是否是smp对称多处理器

    install section 安装阶段:

    %install开头:

    先删除,为了此前安装的影响这一次

    make DESTDIR指定安装目录

    find_lang先不管

    %install 是用来做 rpm 安装所有需要的文件.这些打包的文件会复制到前面的讲的 BuildRoot 中的目录树中.通常这个目录是使用的 /var/tmp 中.
    $RPM_BUILD_ROOT 参数来设置 BuildRoot.主要不能使用真实目录来设置的主要原因是,在编译的过程中有可能会有文件替换到你系统中的文件引起系统
    和软件问题.对其它的文件路径象在 %{_mandir}, %{_bindir} , %{_sysconfdir} 等等,都是使用预先定义的宏来指定的.
    默认都是跑在这个 RPM_BUILD_ROOT 目录下的.
    例: 

    1. %install 
    2.  
    3. rm -rf $RPM_BUILD_ROOT   # 默认的$RPM_BUILD_ROOT 是 /var/tmp/%{name}-root 
    4.  
    5. make DESTDIR=$RPM_BUILD_ROOT install   # 指定安装文件的路径 
    6.  
    7. install -m644 foo.8 ${RPM_BUILD_ROOT}/%{_mandir}/man8/foo.8 

    注释:

    脚本段:安装之后有时候还有这一段Scriptlets

    这些选项可以让你动态的使用 shell 脚本来控制安装和删除,
    %pre,%post  是用脚本运行在包安装后,注意没法交互
    %preun,%postun  用脚本运行在包删除时
    rpm -q –scripts packagename # 可以看到脚本的信息

    例如:

    1. %pre 
    2.  
    3. groupadd -g 201 foo 
    4.  
    5. useradd -g foo -s /bin/false -d /var/foo -M foo 
    6.  
    7. %post 
    8.  
    9. /sbin/ldconfig 
    10.  
    11. chkconfig --add food 
    12.  
    13. %preun 
    14.  
    15. if [  = 0 ] 
    16.  
    17. then 
    18.  
    19.      service food stop > /dev/null 2>&1 
    20.  
    21.      chkconfig --del food 
    22.  
    23. fi 
    24.  
    25. %postun 
    26.  
    27. if [  = 0 ] 
    28.  
    29. then 
    30.  
    31.      userdel foo 
    32.  
    33.      groupdel foo 
    34.  
    35. else 
    36.  
    37.      /sbin/ldconfig 
    38.  
    39.      service food condrestart > /dev/null 2>&1 
    40.  
    41. fi 

    注意,在这个当中的数字,如果是 1 是指是第一次安装,如果是 2 是指也许是升级.如果是 0 在 %postun , 是指被完全的删除.

    例如httpd在安装后增加用户等

    有%pre安装前

    %post安装后

    %preun卸载前

    %postun卸载后,不需要留空即可

    旁注:install可以当做cp用

    -----------------------------------------------------------------------------------------

    clean section:清理段

    %clean 是用来清理 build 后的临时文件,主要是怕这些旧的文件影响以后编译.主要是要删除 $RPM_BUILD_ROOT 和运行 make clean .
    例:


    1. %clean  
    2. rm -rf $RPM_BUILD_ROOT  
    3. make clean  

    files section:文件段

    defattr 定义默认权限

    %files 任何打包的文件,都需要在这个包的详细的文件列表中,如果是目录,包的所有者的全部目录都在中间,%dir 来指定空目录,可以用
    %files -f /tmp/dyanmic_filelist 来指定一个文件列表.默认 %config 会替换掉配置,给原来的配置修改名字为 .rpmorig,
    如果不想修改的话,就用%config(noreplace) 就会给新的配置文件名字命名为 .rpmnew.
    %defattr(mode,user,group)
    %attr(mode,user,group) filename
    %config  配置文件
    %doc 文档
    例: 

    1. %files 
    2. %defattr(-,root,root) 
    3. %config /etc/foo.conf # 指定了才能在更新和删除时有用 
    4. /usr/sbin/food 
    5. /usr/bin/foo 
    6. %doc README # 目录是在 /usr/share/doc/%{name}-%{version} 
    7. %doc /usr/share/man/man8/food.8 
    8. /usr/share/foo/ 
    9. %dir /var/lock/foo/  # 空的目录 

    changelog section:改变段

    %changelog 是记录包的修改,比如加入一个新的补丁,修改配置,日志使用 data +”%a %b %d %Y”,
    需要显示包的日志改变的信息可以使用 rpm-q –changelog.例:

    %changelog
    ? Mon Aug 5 2002 Elvis Presley

    #########################################

    第三步:制作RPM

    rpmbuild命令

    过程可以分阶段

    -bb    制作成二进制

    -bs    源码形式

    -ba    源码和二进制两种形式

    -bl    制作后检测buildroot生成但没有包含到rpm包中的文件,注意如果生成未包含进去会出错

    -bc    只执行到%

    -bi    只执行到%install段

    -bp    只执行到%prep段

    本文出自 “mumaren野猪地” 博客,请务必保留此出处http://mumaren.blog.51cto.com/4180778/971507

  • 相关阅读:
    PHP开发学习门户改版效果图投票
    怎样用js得到当前页面的url信息方法(JS获取当前网址信息)
    java 获取当期时间之前几小时的时间
    超人学院Hadoop大数据技术资源分享
    plsql导入一个目录下全部excel
    UML简单介绍
    Mod in math
    父母之爱子,则为之计深远是什么意思?_百度知道
    2014创客118新年大爬梯_活动行-国内最好的活动报名及售票平台!
    北京创客空间 BEIJING MAXPACE的小站
  • 原文地址:https://www.cnblogs.com/cnland/p/2922590.html
Copyright © 2020-2023  润新知