假设我下载了一个 SRPM 的文件,又不想要修订这个文件内的源代码与相关的设置值, 那么我可以直接编译并安装吗?当然可以!利用 rpmbuild 配合选项即可。选项主要有下面两个:

    不过,要注意的是,这两个选项都没有修改过 SRPM 内的设置值,仅是通过再次编译来产生 RPM 可安装软件文件而已。 一般来说,如果编译的动作顺利的话,那么编译过程所产生的中间暂存盘都会被自动删除,如果发生任何错误, 则该中间文件会被保留在系统上,等待使用者的除错动作!

    问:请由 http://vault.centos.org/ 下载正确的 CentOS 版本中, 在 updates 软件库当中的 ntp 软件 SRPM,请下载最新的那个版本即可,然后进行编译的行为。答:目前 (2015/09) 最新的版本为:ntp-4.2.6p5-19.el7.centos.1.src.rpm 这一个,所以我是这样作的:

    • 先下载软件:wget
    • 再尝试直接编译看看:rpmbuild —rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm
    • 上面的动作会告诉我还有一堆相依软件没有安装~所以我得要安装起来才行:yum install libcap-devel openssl-devel libedit-devel pps-tools-devel autogen autogen-libopts-devel
    • 再次尝试编译的行为:rpmbuild —rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm
    • 最终的软件就会被放置到:/root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-19.el7.centos.1.x86_64.rpm
      上面的测试案例是将一个 SRPM 文件抓下来之后,依据你的系统重新进行编译。一般来说,因为该编译可能会依据你的系统硬件而最优化, 所以可能性能会好一些些,但是…人类根本感受不到那种性能优化的效果~所以并不建议你这么作。此外, 这种情况也很能发生在你从不同的 Linux distribution 所下载的 SRPM 拿来想要安装在你的系统上,这样作才算是有点意义。

    一般来说,如果你有需要用到 SRPM 的文件,大部分的原因就是…你需要重新修改里面的某些设置,让软件加入某些特殊功能等等的。 所以啰,此时就得要将 SRPM 拆开,编辑一下编译配置文件,然后再予以重新编译啦!下个小节我们来玩玩修改设置的方式!

    SRPM 既然含有 source code ,那么其中必定有配置文件啰,所以首先我们必需要知道,这个 SRPM 在进行编译的时候会使用到哪些目录呢?这样一来才能够来修改嘛! 不过从 CentOS 6.x 开始 (当然包含我们的 CentOS 7.x 啰),因为每个用户应该都有能力自己安装自己的软件,因此 SRPM 安装、设置、编译、最终结果所使用的目录都与操作者的主文件夹有关~鸟哥假设你用 root 的身份来进行 SRPM 的操作, 那么你应该就会使用到下列的目录喔:

    Tips 早期要使用 SRPM 时,必须是 root 的身份才能够使用编译行为,同时源代码都会被放置到 /usr/src/redhat/ 目录内喔! 跟目前放置到 /~username/rpmbuild/ 的情况不太一样!

    此外,在编译的过程当中,可能会发生不明的错误,或者是设置的错误,这个时候就会在 /tmp 下面产生一个相对应的错误文件,你可以根据该错误文件进行除错的工作呢! 等到所有的问题都解决之后,也编译成功了,那么刚刚解压缩之后的文件,就是在 /root/rpmbild/{SPECS, SOURCES, BUILD} 等等的文件都会被杀掉,而只剩下放置在 /root/rpmbuild/RPMS 下面的文件了!

    由于 SRPM 需要重新编译,而编译的过程当中,我们至少需要有 make 与其相关的程序,及 gcc, c, c++ 等其他的编译用的程序语言来进行编译,更多说明请参考第二十一章源代码所需基础软件吧。 所以,如果你在安装的过程当中没有选取软件开发工具之类的软件,这时就得要使用上一小节介绍的 yum 来安装就是了! 当然,那个 "Development Tools" 的软件群组请不要忘记安装了!

    问:尝试将上个练习下载的 ntp 的 SRPM 软件直接安装到系统中 (不要编译),然后查阅一下所有用到的目录为何?答:

    如前一个小节的练习,我们知道在 /root/rpmbuild/SOURCES 里面会放置原始文件 (tarball) 以及相关的修补档 (patch file), 而我们也知道编译需要的步骤大抵就是 ./configure, make, make check, make install 等,那这些动作写入在哪里呢? 就在 SPECS 目录中啦!让我们来瞧一瞧 SPECS 里面的文件说些什么吧!

    1. [root@study ~]# cd /root/rpmbuild/SPECS
    2. [root@study SPECS]# vim ntp.spec
    3. # 1\. 首先,这个部分在介绍整个软件的基本相关信息!不论是版本还是释出次数等。
    4. Summary: The NTP daemon and utilities # 简易的说明这个软件的功能
    5. Name: ntp # 软件的名称
    6. Version: 4.2.6p5 # 软件的版本
    7. Release: 19%{?dist}.1 # 软件的释出版次
    8. # primary license (COPYRIGHT) : MIT # 下面有很多 # 的注解说明!
    9. .....(中间省略).....
    10. License: MIT and BSD and BSD with advertising and GPLv2
    11. Group: System Environment/Daemons
    12. Source0: http://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-4.2/ntp-%{version}.tar.gz
    13. Source1: ntp.conf # 写 SourceN 的就是源代码!
    14. Source2: ntp.keys # 源代码可以有很多个!
    15. .....(中间省略).....
    16. Patch1: ntp-4.2.6p1-sleep.patch # 接下来则是补丁文件,就是 PatchN 的目的!
    17. Patch2: ntp-4.2.6p4-droproot.patch
    18. .....(中间省略).....
    19. # 2\. 这部分则是在设置相依属性需求的地方!
    20. URL: http://www.ntp.org # 下面则是说明这个软件的相依性,
    21. Requirespost): systemd-units # 还有编译过程需要的软件有哪些等等!
    22. Requirespreun): systemd-units
    23. Requirespostun): systemd-units
    24. Requires: ntpdate = %{version}-%{release}
    25. BuildRequires: libcap-devel openssl-devel libedit-devel perl-HTML-Parser
    26. BuildRequires: pps-tools-devel autogen autogen-libopts-devel systemd-units
    27. .....(中间省略).....
    28. %package -n ntpdate # 其实这个软件包含有很多次软件喔!
    29. Summary: Utility to set the date and time via NTP
    30. Group: Applications/System
    31. Requirespre): shadow-utils
    32. Requirespost): systemd-units
    33. Requirespreun): systemd-units
    34. Requirespostun): systemd-units
    35. .....(中间省略).....
    36. # 3\. 编译前的预处理,以及编译过程当中所需要进行的指令,都写在这里
    37. # 尤其 %build 下面的数据,几乎就是 makefile 里面的信息啊!
    38. %prep # 这部份大多在处理补丁的动作!
    39. %setup -q -a 5
    40. %patch1 -p1 -b .sleep # 这些 patch 当然与前面的 PatchN 有关!
    41. %patch2 -p1 -b .droproot
    42. %build # 其实就是 ./configure, make 等动作!
    43. sed -i 's|$CFLAGS -Wstrict-overflow|$CFLAGS|' configure sntp/configure
    44. export CFLAGS="$RPM_OPT_FLAGS -fPIE -fno-strict-aliasing -fno-strict-overflow"
    45. export LDFLAGS="-pie -Wl,-z,relro,-z,now"
    46. %configure \ # 不就是 ./configure 的意思吗!
    47. --sysconfdir=%{_sysconfdir}/ntp/crypto \
    48. --with-openssl-libdir=%{_libdir} \
    49. --without-ntpsnmpd \
    50. --enable-all-clocks --enable-parse-clocks \
    51. --enable-ntp-signd=%{_localstatedir}/run/ntp_signd \
    52. --disable-local-libopts
    53. echo '#define KEYFILE "%{_sysconfdir}/ntp/keys"' >> ntpdate/ntpdate.h
    54. echo '#define NTP_VAR "%{_localstatedir}/log/ntpstats/"' >> config.h
    55. make %{?_smp_mflags} # 不就是 make 了吗!
    56. .....(中间省略).....
    57. %install # 就是安装过程所进行的各项动作了!
    58. make DESTDIR=$RPM_BUILD_ROOT bindir=%{_sbindir} install
    59. mkdir -p $RPM_BUILD_ROOT%{_mandir}/man{5,8}
    60. sed -i 's/sntp\.1/sntp\.8/' $RPM_BUILD_ROOT%{_mandir}/man1/sntp.1
    61. mv $RPM_BUILD_ROOT%{_mandir}/man{1/sntp.1,8/sntp.8}
    62. rm -rf $RPM_BUILD_ROOT%{_mandir}/man1
    63. .....(中间省略).....
    64. # 4\. 这里列出,这个软件释出的文件有哪些的意思!
    65. %files # 这软件所属的文件有哪些的意思!
    66. %dir %{ntpdocdir}
    67. %{ntpdocdir}/COPYRIGHT
    68. %{ntpdocdir}/ChangeLog
    69. .....(中间省略).....
    70. # 5\. 列出这个软件的更改历史纪录档!
    71. %changelog
    72. * Tue Jun 23 2015 CentOS Sources <bugs@centos.org> - 4.2.6p5-19.el7.centos.1
    73. - rebrand vendorzone
    74. * Thu Apr 23 2015 Miroslav Lichvar <mlichvar@redhat.com> 4.2.6p5-19.el7_1.1
    75. - don't step clock for leap second with -x option (#1191122)
    76. .....(后面省略).....

    要注意到的是 ntp.sepc 这个文件,这是主要的将 SRPM 编译成 RPM 的配置文件,他的基本规则可以这样看:

    • 整个文件的开头以Summary为开始,这部份的设置都是最基础的说明内容;
    • 然后每个不同的段落之间,都以 % 来做为开头,例如 %prep 与 %install 等;
      我们来谈一谈几个常见的 SRPM 设置段落:

    上面几个数据通常都必需要写啦!但是如果你的软件没有相依属性的关系时,那么就可以不需要那个 Requires 啰! 根据上面的设置,最终的文件名就会是“{Name}-{Version}-{Release}.{Arch}.rpm”的样式, 以我们上面的设置来说,文件名应该会是“ntp-4.2.6p5-20.vbird.x86_64.rpm”的样子啰!

    • %description:
      将你的软件做一个简短的说明!这个也是必需要的。还记得使用“ rpm -qi 软件名称 ”会出现一些基础的说明吗? 上面这些东西包括 Description 就是在显示这些重要信息的啦!所以,这里记得要详加解释喔!

    • %prep:
      pre 这个关键字原本就有“在…之前”的意思,因此这个项目在这里指的就是“尚未进行设置或安装之前,你要编译完成的 RPM 帮你事先做的事情”,就是 prepare 的简写啰!那么他的工作事项主要有:

    • 进行软件的补丁 (patch) 等相关工作;

    • 寻找软件所需要的目录是否已经存在?确认用的!
    • 事先创建你的软件所需要的目录,或者事先需要进行的任务;
    • 如果待安装的Linux系统内已经有安装的时候可能会被覆盖掉的文件时,那么就必需要进行备份(backup)的工作了!
      在本案例中,你会发现程序会使用 patch 去进行补丁的动作啦!所以程序的源代码才会更新到最新啊!

    • %build:
      build 就是创建啊!所以当然啰,这个段落就是在谈怎么 make 编译成为可执行的程序啰! 你会发现在此部分的程序码方面,就是 ./configure, make 等项目哩!一般来说,如果你会使用 SRPM 来进行重新编译的行为, 通常就是要重新 ./configure 并给予新的参数设置!于是这部份就可能会修改到!

    • %install:
      编译完成 (build) 之后,就是要安装啦!安装就是写在这里,也就是类似 Tarball 里面的 make install 的意思啰!

    • %files:
      这个软件安装的文件都需要写到这里来,当然包括了“目录”喔!所以连同目录请一起写到这个段落当中!以备查验呢!^_^ !此外,你也可以指定每个文件的类型,包括文档文件 (%doc 后面接的) 与配置文件 (%config 后面接的) 等等。

    • %changelog:
      这个项目主要则是在记录这个软件曾经的更新纪录啰!星号 (*) 后面应该要以时间,修改者, email 与软件版本来作为说明, 减号 (-) 后面则是你要作的详细说明啰!在这部份鸟哥就新增了两行,内容如下:

    1. * Wed Sep 09 2015 VBird Tsai <vbird@mail.vbird.idv.tw>- 4.2.6p5-20.vbird
    2. * Tue Jun 23 2015 CentOS Sources <bugs@centos.org> - 4.2.6p5-19.el7.centos.1
    3. - rebrand vendorzone
    4. ....(下面省略)....

    修改到这里也差不多了,您也应该要了解到这个 ntp.spec 有多么重要!我们用 rpm -q 去查询一堆信息时, 其实都是在这里写入的!这样了解否?接下来,就让我们来了解一下如何将 SRPM 给他编译出 RPM 来吧!

    要将在 /root/rpmbuild 下面的数据编译或者是单纯的打包成为 RPM 或 SRPM 时,就需要 rpmbuild 指令与相关选项的帮忙了!我们只介绍两个常用的选项给您了解一下:

    这个时候系统就会这样做:

    • 先进入到 BUILD 这个目录中,亦即是: /root/rpmbuild/BUILD 这个目录;

    • 在新建的目录里面,针对 SOURCES 目录下的来源文件,也就是 .spec 里面的 Source 设置的那个文件,以 tar 进行解压缩,以我们这个例子来说,则会在 /root/rpmbuild/BUILD/ntp-4.2.6p5 当中,将 /root/rpmbuild/SOURCES/ntp- 等等多个源代码文件进行解压缩啦!

    • 再来开始 %build 及 %install 的设置与编译!

    • 最后将完成打包的文件给他放置到该放置的地方去,如果你的系统是 x86_64 的话,那么最后编译成功的 *.x86_64.rpm文件就会被放置在 /root/rpmbuild/RPMS/x86_64 里面啰!如果是 noarch 那么自然就是 /root/rpmbuild/RPMS/noarch 目录下啰!

    整个步骤大概就是这样子!最后的结果数据会放置在 RPMS 那个目录下面就对啦!我们这个案例中想要同时打包 RPM 与 SRPM , 因此请您自行处理一下“ rpmbuild -ba ntp.spec ”吧!

    1. [root@study ~]# cd /root/rpmbuild/SPECS
    2. [root@study SPECS]# rpmbuild -ba ntp.spec
    3. .....(前面省略).....
    4. Wrote: /root/rpmbuild/SRPMS/ntp-4.2.6p5-20.vbird.src.rpm
    5. Wrote: /root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-20.vbird.x86_64.rpm
    6. Wrote: /root/rpmbuild/RPMS/noarch/ntp-perl-4.2.6p5-20.vbird.noarch.rpm
    7. Wrote: /root/rpmbuild/RPMS/x86_64/ntpdate-4.2.6p5-20.vbird.x86_64.rpm
    8. Wrote: /root/rpmbuild/RPMS/x86_64/sntp-4.2.6p5-20.vbird.x86_64.rpm
    9. Wrote: /root/rpmbuild/RPMS/noarch/ntp-doc-4.2.6p5-20.vbird.noarch.rpm
    10. Wrote: /root/rpmbuild/RPMS/x86_64/ntp-debuginfo-4.2.6p5-20.vbird.x86_64.rpm
    11. Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.xZh6yz
    12. + umask 022
    13. + cd /root/rpmbuild/BUILD
    14. + cd ntp-4.2.6p5
    15. + /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/ntp-4.2.6p5-20.vbird.x86_64
    16. + exit 0
    17. [root@study SPECS]# find /root/rpmbuild -name 'ntp*rpm'
    18. /root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-20.vbird.x86_64.rpm
    19. /root/rpmbuild/RPMS/x86_64/ntpdate-4.2.6p5-20.vbird.x86_64.rpm
    20. /root/rpmbuild/RPMS/x86_64/ntp-debuginfo-4.2.6p5-20.vbird.x86_64.rpm
    21. /root/rpmbuild/RPMS/noarch/ntp-perl-4.2.6p5-20.vbird.noarch.rpm
    22. /root/rpmbuild/RPMS/noarch/ntp-doc-4.2.6p5-20.vbird.noarch.rpm
    23. /root/rpmbuild/SRPMS/ntp-4.2.6p5-20.vbird.src.rpm
    24. # 上面分别是 RPM 与 SRPM 的文件文件名!

    您瞧!嘿嘿~有 vbird 的软件出现了!相当有趣吧!另外,有些文件软件是与硬件等级无关的 (因为单纯的文件啊!),所以如上表所示, 你会发现 ntp-doc-4.2.6p5-20.vbird.noarch.rpm 是 noarch 喔!有趣吧!

    这个就有趣了!我们自己来编辑一下自己制作的 RPM 怎么样?会很难吗?完全不会! 我们这里就举个例子来玩玩吧!还记得我们在前一章谈到 Tarball 与 make 时,曾经谈到的 这个程序吗?现在我们将这个程序加上 Makefile 后, 将他制作成为 main-0.1-1.x86_64.rpm 好吗?那该如何进行呢?下面就让我们来处理处理吧!

    • 制作源代码文件 tarball 产生:
      因为鸟哥的网站并没有直接释出 main-0.2,所以假设官网提供的是 main-0.l 版本之外,同时提供了一个 patch 文件~ 那我们就得要这样作:

    • main-0.1.tar.gz 放在 /root/rpmbuild/SOURCES/

    • main_0.1_to_0.2_patch 放在 /root/rpmbuild/SOURCES/
    • main.spec 自行撰写放在 /root/rpmbuild/SPECS/
      1. # 1\. 先来处理源代码的部份,假设你的 /root/rpmbuild/SOURCES 已经存在了喔!
      2. [root@study ~]# cd /root/rpmbuild/SOURCES
      3. [root SOURCES]# wget http://linux.vbird.org/linux_basic/0520source/main-0.1.tgz
      4. [root@study SOURCES]# wget http://linux.vbird.org/linux_basic/0520source/main_0.1_to_0.2.patch
      5. [root SOURCES]# ll main*
      6. -rw-r--r--. 1 root root 703 Sep 4 14:47 main-0.1.tgz
      7. -rw-r--r--. 1 root root 1538 Sep 4 14:51 main_0.1_to_0.2.patch

    接下来就是 spec 文件的创建啰!

    • 创建 *.spec 的配置文件
      这个文件的创建是所有 RPM 制作里面最重要的课题!你必须要仔细的设置他,不要随便处理!仔细看看吧! 有趣的是,CentOS 7.x 会主动的将必要的设置参数列出来喔!相当有趣! ^_^
    • 编译成为 RPM 与 SRPM
      老实说,那个 spec 文件创建妥当后,后续的动作就简单的要命了!开始来编译吧!
    1. [root@study SPECS]# rpmbuild -ba main.spec
    2. .....(前面省略).....
    3. Wrote: /root/rpmbuild/SRPMS/main-0.1-1.el7.centos.src.rpm
    4. Wrote: /root/rpmbuild/RPMS/x86_64/main-0.1-1.el7.centos.x86_64.rpm
    5. Wrote: /root/rpmbuild/RPMS/x86_64/main-debuginfo-0.1-1.el7.centos.x86_64.rpm

    很快的,我们就已经创建了几个 RPM 文件啰!接下来让我们好好测试一下打包起来的成果吧!

    [root@study ~]# rpm -qi main
    Name : main
    Version : 0.1
    Release : 1.el7.centos
    Architecture: x86_64
    Install Date: Wed 09 Sep 2015 04:29:08 PM CST
    Group : Scientific Support
    Size : 7200
    License : GPLv2
    Signature : (none)
    Source RPM : main-0.1-1.el7.centos.src.rpm
    Build Date : Wed 09 Sep 2015 04:27:29 PM CST
    Build Host : study.centos.vbird
    Relocations : (not relocatable)
    URL :
    Summary : Shows sin and cos value.
    Description :
    This package will let you input your name and calculate sin cos value.

    看到没?属于你自己的软件喔!真是很愉快的啦!

    用很简单的方式,就可以将自己的软件或者程序给他修改与设置妥当!以后你就可以自行设置你的 RPM 啰!当然,也可以手动修改你的 SRPM 的来源文件内容啰!