新版的 rpm 已经 将 RPM 与 SRPM 的指令分开了,SRPM 使用的是 rpmbuild 这个指令,而不是 rpm 喔!

利用默认值安装 SRPM 文件 (--rebuid/--recompile)

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

|--|--|

|--rebuild|这个选项会将后面的 SRPM 进行『编译』与『打包』的动作,最后会产生 RPM 的文件,但是产 生的 RPM 文件并没有安装到系统上。当你使用 --rebuild 的时候,最后通常会发现一行字体: Wrote: /root/rpmbuild/RPMS/x86_64/pkgname.x86_64.rpm这个就是编译完成的 RPM 文件啰!这个文件就可以用来安装啦!安装的时候请加绝对路径来安 装即可!|

|--recompile|这个动作会直接的『编译』『打包』并且『安装』啰!请注意, rebuild 仅『编译并打包』而已,而 recompile 不但进行编译跟打包,还同时进行『安装』了!|

安装流程:

  • 先下载软件

wget http://vault.centos.org/7.1.1503/updates/Source/SPackages/ntp-4.2.6p5-19.el7.centos.1.src.rpm

  • 再尝试直接编译看看

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 使用的路径与需要的软件

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

|--|--|

|/root/rpmbuild/SPECS|这个目录当中放置的是该软件的配置文件,例如这个软件的信息参数、设定项目等等都放置在这里;|

| /root/rpmbuild/SOURCES|这个目录当中放置的是该软件的原始文件 (*.tar.gz 的文件) 以及 config 这个配置文件;|

|/root/rpmbuild/BUILD|在编译的过程中,有些暂存的数据都会放置在这个目录当中;|

|/root/rpmbuild/RPMS|经过编译之后,并且顺利的编译成功之后,将打包完成的文件放置在这个目录当 中。里头有包含了 x86_64, noarch.... 等等的次目录。|

|/root/rpmbuild/SRPMS|与 RPMS 内相似的,这里放置的就是 SRPM 封装的文件啰!有时候你想要将你 的软件用 SRPM 的方式释出时, 你的 SRPM 文件就会放置在这个目录中了。|

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

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

# 1. 鸟哥这里假设你用 root 的身份来进行安装的行为喔!
[root@study ~]# rpm -ivh ntp-4.2.6p5-19.el7.centos.1.src.rpm
Updating / installing...
1:ntp-4.2.6p5-19.el7.centos.1 ################################# [100%]
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root
# 会有一堆 warning 的问题,那个不要理它!可以忽略没问题的! # 2. 查阅一下 /root/rpmbuild 目录的内容!
[root@study ~]# ll -l /root/rpmbuild
drwxr-xr-x. 3 root root 39 Sep 8 16:16 BUILD
drwxr-xr-x. 2 root root 6 Sep 8 16:16 BUILDROOT
drwxr-xr-x. 4 root root 32 Sep 8 16:16 RPMS
drwxr-xr-x. 2 root root 4096 Sep 9 09:43 SOURCES
drwxr-xr-x. 2 root root 39 Sep 9 09:43 SPECS # 这个家伙最重要!
drwxr-xr-x. 2 root root 6 Sep 8 14:51 SRPMS [root@study ~]# ll -l /root/rpmbuild/{SOURCES,SPECS}
/root/rpmbuild/SOURCES:
-rw-rw-r--. 1 root root 559 Jun 24 07:44 ntp-4.2.4p7-getprecision.patch
-rw-rw-r--. 1 root root 661 Jun 24 07:44 ntp-4.2.6p1-cmsgalign.patch
.....(中间省略).....
/root/rpmbuild/SPECS:
-rw-rw-r--. 1 root root 41422 Jun 24 07:44 ntp.spec # 这就是重点!

配置文件的主要内容 (*.spec)

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

[root@study ~]# cd /root/rpmbuild/SPECS
[root@study SPECS]# vim ntp.spec
# 1. 首先,这个部分在介绍整个软件的基本相关信息!不论是版本还是释出次数等。
Summary: The NTP daemon and utilities # 简易的说明这个软件的功能
Name: ntp # 软件的名称
Version: 4.2.6p5 # 软件的版本
Release: 19%{?dist}.1 # 软件的释出版次
# primary license (COPYRIGHT) : MIT # 底下有很多 # 的批注说明!
.....(中間省略).....
License: (MIT and BSD and BSD with advertising) and GPLv2
Group: System Environment/Daemons
Source0: http://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-4.2/ntp-%{version}.tar.gz
Source1: ntp.conf # 写 SourceN 的就是原始码!
Source2: ntp.keys # 原始码可以有很多个!
.....(中間省略).....
Patch1: ntp-4.2.6p1-sleep.patch # 接下来则是补丁文件,就是 PatchN 的目的!
Patch2: ntp-4.2.6p4-droproot.patch
.....(中間省略)..... # 2. 這部分則是在設定相依屬性需求的地方!
URL: http://www.ntp.org # 底下则是说明这个软件的相依性,
Requires(post): systemd-units # 还有编译过程需要的软件有哪些等等!
Requires(preun): systemd-units
Requires(postun): systemd-units
Requires: ntpdate = %{version}-%{release}
BuildRequires: libcap-devel openssl-devel libedit-devel perl-HTML-Parser
BuildRequires: pps-tools-devel autogen autogen-libopts-devel systemd-units
.....(中間省略).....
%package -n ntpdate # 其实这个软件包含有很多次软件喔!
Summary: Utility to set the date and time via NTP
Group: Applications/System
Requires(pre): shadow-utils
Requires(post): systemd-units
Requires(preun): systemd-units
Requires(postun): systemd-units
.....(中間省略)..... # 3.编译前的预处理,以及编译过程当中所需要进行的指令,都写在这里
# 尤其 %build 底下的数据,几乎就是 makefile 里面的信息!
%prep # 这部分大多在处理补丁的动作!
%setup -q -a 5
%patch1 -p1 -b .sleep # 这些 patch 当然与前面的 PatchN 有关!
%patch2 -p1 -b .droproot
.....(中間省略).....
%build # 其实就是 ./configure, make 等动作!
sed -i 's|$CFLAGS -Wstrict-overflow|$CFLAGS|' configure sntp/configure
export CFLAGS="$RPM_OPT_FLAGS -fPIE -fno-strict-aliasing -fno-strict-overflow"
export LDFLAGS="-pie -Wl,-z,relro,-z,now"
%configure \ # 不就是 ./configure 的意思吗!
--sysconfdir=%{_sysconfdir}/ntp/crypto \
--with-openssl-libdir=%{_libdir} \
--without-ntpsnmpd \
--enable-all-clocks --enable-parse-clocks \
--enable-ntp-signd=%{_localstatedir}/run/ntp_signd \
--disable-local-libopts
echo '#define KEYFILE "%{_sysconfdir}/ntp/keys"' >> ntpdate/ntpdate.h
echo '#define NTP_VAR "%{_localstatedir}/log/ntpstats/"' >> config.h make %{?_smp_mflags} # 不就是 make 了吗!
.....(中間省略)..... %install # 就是安装过程所进行的各项动作了!
make DESTDIR=$RPM_BUILD_ROOT bindir=%{_sbindir} install mkdir -p $RPM_BUILD_ROOT%{_mandir}/man{5,8}
sed -i 's/sntp\.1/sntp\.8/' $RPM_BUILD_ROOT%{_mandir}/man1/sntp.1
mv $RPM_BUILD_ROOT%{_mandir}/man{1/sntp.1,8/sntp.8}
rm -rf $RPM_BUILD_ROOT%{_mandir}/man1
.....(中間省略)..... # 4. 这里列出,这个软件释出的文件有哪些的意思!
%files # 这软件所属的文件有哪些的意思!
%dir %{ntpdocdir}
%{ntpdocdir}/COPYRIGHT
%{ntpdocdir}/ChangeLog
.....(中间省略)..... # 5. 列出这个软件的更改历史纪录文件!
%changelog
* Tue Jun 23 2015 CentOS Sources <bugs@centos.org> - 4.2.6p5-19.el7.centos.1
- rebrand vendorzone * Thu Apr 23 2015 Miroslav Lichvar <mlichvar@redhat.com> 4.2.6p5-19.el7_1.1
- don't step clock for leap second with -x option (#1191122)
.....(后面省略).....

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

  1. 整个文件的开头以 Summary 为开始,这部份的设定都是最基础的说明内容;
  2. 然后每个不同的段落之间,都以 % 来做为开头,例如 %prep 与 %install 等;

我们来谈一谈几个常见的 SRPM 设定段落:

  • 系统整体信息方面:
参数 参数意义
Summary 本软件的主要说明,例如上表中说明了本软件是针对 NTP 的软件功能与工具等啦!
Name 本软件的软件名称 (最终会是 RPM 文件的档名构成之一)
Version 本软件的版本 (也会是 RPM 档名的构成之一)
Release 这个是该版本打包的次数说明 (也会是 RPM 档名的构成之一)。由于我们想要动点手脚,所以请将 『 19%{?dist}.1 』修改为『 20.vbird 』看看
License 这个软件的授权模式,看起来涵盖了所有知名的 Open source 授权啊!!
Group 这个软件在安装的时候,主要是放置于哪一个软件群组当中 (yum grouplist 的特点!);
URL 这个原始码的主要官方网站;
SourceN 这个软件的来源,如果是网络上下载的软件,通常一定会有这个信息来告诉大家这个原始档的来源! 此外,如果有多个软件来源,就会以 Source0, Source1... 来处理原始码喔!
PatchN 就是作为补丁的 patch file 啰!也是可以有好多个!
BuildRoot 设定作为编译时,该使用哪个目录来暂存中间文件 (如编译过程的目标文件/链接文件等档)。

上述为必须要存在的项目,底下为可使用的额外设定值

|--|--|

|Requires|如果你这个软件还需要其他的软件的支持,那么这里就必需写上来,则当你制作成 RPM 之后,系统 就会自动的去检查啦!这就是『相依属性』的主要来源啰!|

|BuildRequires|编译过程中所需要的软件。Requires 指的是『安装时需要检查』的,因为与实际运作有关,这个 BuildRequires 指的是『编译时』所需要的软件,只有在 SRPM 编译成为 RPM 时才会检查的项目。|

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


  • %description:

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


  • %prep:

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

  1. 进行软件的补丁 (patch) 等相关工作;
  2. 寻找软件所需要的目录是否已经存在?确认用的!
  3. 事先建立你的软件所需要的目录,或者事先需要进行的任务
  4. 如果待安装的 Linux 系统内已经有安装的时候可能会被覆盖掉的文件时,那么就必需要进行备份(backup)的工作了!

  • %build:

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


  • %install:

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


  • %files:

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


  • %changelog:

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

SRPM 的编译指令 (-ba/-bb)

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

[root@study ~]# rpmbuild -ba ntp.spec <==编译并同时产生 RPM 与 SRPM 文件
[root@study ~]# rpmbuild -bb ntp.spec <==仅编译成 RPM 文件

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

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

  2. 依照 *.spec 文件内的 Name 与 Version 定义出工作的目录名称,以我们上面的例子为例,那么系统就会 在 BUILD 目录中先删除 ntp-4.2.6p5 的目录,再重新建立一个 ntp-4.2.6p5 的目录,并进入该目录;

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

  4. 再来开始 %build 及 %install 的设定与编译!

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

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

[root@study ~]# cd /root/rpmbuild/SPECS
[root@study SPECS]# rpmbuild -ba ntp.spec
.....(前面省略).....
Wrote: /root/rpmbuild/SRPMS/ntp-4.2.6p5-20.vbird.src.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-20.vbird.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/noarch/ntp-perl-4.2.6p5-20.vbird.noarch.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/ntpdate-4.2.6p5-20.vbird.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/sntp-4.2.6p5-20.vbird.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/noarch/ntp-doc-4.2.6p5-20.vbird.noarch.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/ntp-debuginfo-4.2.6p5-20.vbird.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.xZh6yz
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd ntp-4.2.6p5
+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/ntp-4.2.6p5-20.vbird.x86_64
+ exit 0 [root@study SPECS]# find /root/rpmbuild -name 'ntp*rpm'
/root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-20.vbird.x86_64.rpm
/root/rpmbuild/RPMS/x86_64/ntpdate-4.2.6p5-20.vbird.x86_64.rpm
/root/rpmbuild/RPMS/x86_64/ntp-debuginfo-4.2.6p5-20.vbird.x86_64.rpm
/root/rpmbuild/RPMS/noarch/ntp-perl-4.2.6p5-20.vbird.noarch.rpm
/root/rpmbuild/RPMS/noarch/ntp-doc-4.2.6p5-20.vbird.noarch.rpm
/root/rpmbuild/SRPMS/ntp-4.2.6p5-20.vbird.src.rpm
# 上面分别是 RPM 与 SRPM 的文件档名!

一个打包自己软件的范例

  • 制作原始码文件 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. 先来处理原始码的部份,假设你的 /root/rpmbuild/SOURCES 已经存在了喔!
[root@study ~]# cd /root/rpmbuild/SOURCES
[root@study SOURCES]# wget http://linux.vbird.org/linux_basic/0520source/main-0.1.tgz
[root@study SOURCES]# wget http://linux.vbird.org/linux_basic/0520source/main_0.1_to_0.2.patch
[root@study SOURCES]# ll main*
-rw-r--r--. 1 root root 703 Sep 4 14:47 main-0.1.tgz
-rw-r--r--. 1 root root 1538 Sep 4 14:51 main_0.1_to_0.2.patch

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


  • 建立 *.spec 的配置文件

这个文件的建置是所有 RPM 制作里面最重要的课题!你必须要仔细的设定他,不要随便处理!仔 细看看吧!

[root@study ~]# cd /root/rpmbuild/SPECS
[root@study SPECS]# vim main.spec
Name: main
Version: 0.1
Release: 1%{?dist}
Summary: Shows sin and cos value.
Group: Scientific Support
License: GPLv2
URL: http://linux.vbird.org/
Source0: main-0.1.tgz # 这两个档名要正确喔!
Patch0: main_0.1_to_0.2.patch %description
This package will let you input your name and calculate sin cos value. %prep
%setup -q
%patch0 -p1 # 要用来作为 patch 的动作! %build
make clean main # 编译就好!不要安装! %install
mkdir -p %{buildroot}/usr/local/bin
install -m 755 main %{buildroot}/usr/local/bin # 这才是顺利的安装行为! %files
/usr/local/bin/main %changelog
* Wed Sep 09 2015 VBird Tsai <vbird@mail.vbird.idv.tw> 0.2
- build the program

  • 编译成为 RPM 与 SRPM

老实说,那个 spec 文件建置妥当后,后续的动作就简单的要命了!开始来编译吧!

[root@study SPECS]# rpmbuild -ba main.spec
.....(前面省略).....
Wrote: /root/rpmbuild/SRPMS/main-0.1-1.el7.centos.src.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/main-0.1-1.el7.centos.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/main-debuginfo-0.1-1.el7.centos.x86_64.rpm

  • 安装/测试/实际查询
[root@study ~]# yum install /root/rpmbuild/RPMS/x86_64/main-0.1-1.el7.centos.x86_64.rpm
[root@study ~]# rpm -ql main
/usr/local/bin/main <==自己尝试执行 main 看看! [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 : http://linux.vbird.org/
Summary : Shows sin and cos value.
Description :
This package will let you input your name and calculate sin cos value.
# 看到没?属于你自己的软件喔!真是很愉快的啦!

最新文章

  1. 学习笔记 ACCESS 延迟注入
  2. easyui datagrid 分页略解
  3. 状态压缩 HDU 1565
  4. 将filenames里的每个字符串输出到out文件对象中注意行首的缩进
  5. ie无法下载 无法打开该internet站点.请求的站点不可用或无法找到.请稍后重试
  6. PHP Fileinfo组件越界内存破坏漏洞
  7. Selenium索引
  8. 使用MapReduce将HDFS数据导入到HBase(一)
  9. Swift开发常用知识点
  10. firewall服务配置
  11. String StringBuffer StringBulider 详细看https://www.cnblogs.com/su-feng
  12. ProtoBuf使用指南(C++)
  13. 【Java每日一题】20170313
  14. thinkphp模板中,checkbox回显问题
  15. 记录清除wnTKYg挖矿工木马(守护进程ddg.xxxx)的过程
  16. chfn是用来改变你的finger讯息
  17. Logger级别和输出的地方
  18. java编程 求和
  19. vue子组件传参给父组件
  20. jvm(1)类的加载(三)(线程上下文加载器)

热门文章

  1. Spark Mllib里的本地矩阵概念、构成(图文详解)
  2. c# 串口操作
  3. Fleet-运行一个高可用的服务
  4. Spring事务的5种隔离级别
  5. zuul 自定义路由映射规则
  6. Docker 给运行中的容器添加映射端口
  7. Linux下如何修改用户默认目录
  8. javase基础-Helloword
  9. jsoup获取网页属性
  10. 洛谷 P2323 [HNOI2006]公路修建问题