- 目录及概述
- 第零章、计算机概论
- 0.1 电脑:辅助人脑的好工具
- 0.2 个人电脑架构与相关设备元件
- 0.3 数据表示方式
- 0.4 软件程序运行
- 0.5 重点回顾
- 0.6 本章习题
- 0.7 参考资料与延伸阅读
- 第一章、Linux是什么与如何学习
- 1.1 Linux是什么
- 1.2 Torvalds的Linux发展
- 1.3 Linux当前应用的角色
- 1.4 Linux 该如何学习
- 1.5 重点回顾
- 1.6 本章习题
- 1.7 参考资料与延伸阅读
- 第二章、主机规划与磁盘分区
- 2.1 Linux与硬件的搭配
- 2.2 磁盘分区
- 2.3 安装Linux前的规划
- 2.4 重点回顾
- 2.5 本章习题
- 2.6 参考资料与延伸阅读
- 第三章、安装 CentOS7.x
- 3.1 本练习机的规划--尤其是分区参数
- 3.2 开始安装CentOS 7
- 3.3 多重开机安装流程与管理(Option)
- 3.4 重点回顾
- 3.5 本章习题
- 3.6 参考资料与延伸阅读
- 第四章、首次登陆与线上求助
- 4.1 首次登陆系统
- 4.2 文字模式下指令的下达
- 4.3 Linux系统的线上求助man page与info page
- 4.4 超简单文书编辑器: nano
- 4.5 正确的关机方法
- 4.6 重点回顾
- 4.7 本章习题
- 4.8 参考资料与延伸阅读
- 第五章、Linux 的文件权限与目录配置
- 5.1 使用者与群组
- 5.2 Linux 文件权限概念
- 5.3 Linux目录配置
- 5.4 重点回顾
- 5.5 本章练习
- 5.6 参考资料与延伸阅读
- 第六章、Linux 文件与目录管理
- 6.1 目录与路径
- 6.2 文件与目录管理
- 6.3 文件内容查阅
- 6.4 文件与目录的默认权限与隐藏权限
- 6.5 指令与文件的搜寻
- 6.6 极重要的复习!权限与指令间的关系
- 6.7 重点回顾
- 6.8 本章习题:
- 6.9 参考资料与延伸阅读
- 第七章、Linux 磁盘与文件系统管理
- 7.1 认识 Linux 文件系统
- 7.2 文件系统的简单操作
- 7.3 磁盘的分区、格式化、检验与挂载
- 7.4 设置开机挂载
- 7.5 内存交换空间(swap)之创建
- 7.6 文件系统的特殊观察与操作
- 7.7 重点回顾
- 7.8 本章习题 - 第一题一定要做
- 7.9 参考资料与延伸阅读
- 第八章、文件与文件系统的压缩,打包与备份
- 8.1 压缩文件的用途与技术
- 8.2 Linux 系统常见的压缩指令
- 8.3 打包指令: tar
- 8.4 XFS 文件系统的备份与还原
- 8.5 光盘写入工具
- 8.6 其他常见的压缩与备份工具
- 8.7 重点回顾
- 8.8 本章习题
- 8.9 参考资料与延伸阅读
- 第九章、vim 程序编辑器
- 9.1 vi 与 vim
- 9.2 vi 的使用
- 9.3 vim 的额外功能
- 9.4 其他 vim 使用注意事项
- 9.5 重点回顾
- 9.6 本章练习
- 9.7 参考资料与延伸阅读
- 第十章、认识与学习BASH
- 10.1 认识 BASH 这个 Shell
- 10.2 Shell 的变量功能
- 10.3 命令别名与历史命令
- 10.4 Bash Shell 的操作环境:
- 10.5 数据流重导向
- 10.6 管线命令 (pipe)
- 10.7 重点回顾
- 10.8 本章习题
- 10.9 参考资料与延伸阅读
- 第十一章、正则表达式与文件格式化处理
- 11.1 开始之前:什么是正则表达式
- 11.2 基础正则表达式
- 11.3 延伸正则表达式
- 11.4 文件的格式化与相关处理
- 11.5 重点回顾
- 11.6 本章习题
- 11.7 参考资料与延伸阅读
- 第十二章、学习 Shell Scripts
- 12.1 什么是 Shell scripts
- 12.2 简单的 shell script 练习
- 12.3 善用判断式
- 12.4 条件判断式
- 12.5 循环 (loop)
- 12.6 shell script 的追踪与 debug
- 12.7 重点回顾
- 12.8 本章习题
- 第十三章、Linux 帐号管理与 ACL 权限设置
- 13.1 Linux 的帐号与群组
- 13.2 帐号管理
- 13.3 主机的细部权限规划:ACL 的使用
- 13.4 使用者身份切换
- 13.5 使用者的特殊 shell 与 PAM 模块
- 13.6 Linux 主机上的使用者讯息传递
- 13.7 CentOS 7 环境下大量创建帐号的方法
- 13.8 重点回顾
- 13.9 本章习题
- 13.10 参考资料与延伸阅读
- 第十四章、磁盘配额(Quota)与进阶文件系统管理
- 14.1 磁盘配额 (Quota) 的应用与实作
- 14.2 软件磁盘阵列 (Software RAID)
- 14.3 逻辑卷轴管理员 (Logical Volume Manager)
- 14.4 重点回顾
- 14.5 本章习题
- 14.6 参考资料与延伸阅读
- 第十五章、例行性工作调度(crontab)
- 15.1 什么是例行性工作调度
- 15.2 仅执行一次的工作调度
- 15.3 循环执行的例行性工作调度
- 15.4 可唤醒停机期间的工作任务
- 15.5 重点回顾
- 15.6 本章习题
- 第十六章、程序管理与 SELinux 初探
- 16.1 什么是程序 (process)
- 16.2 工作管理 (job control)
- 16.3 程序管理
- 16.4 特殊文件与程序
- 16.5 SELinux 初探
- 16.6 重点回顾
- 16.7 本章习题
- 16.8 参考资料与延伸阅读
- 第十七章、认识系统服务 (daemons)
- 17.1 什么是 daemon 与服务 (service)
- 17.2 通过 systemctl 管理服务
- 17.3 systemctl 针对 service 类型的配置文件
- 17.4 systemctl 针对 timer 的配置文件
- 17.5 CentOS 7.x 默认启动的服务简易说明
- 17.6 重点回顾
- 17.7 本章习题
- 17.8 参考资料与延伸阅读
- 第十八章、认识与分析登录文件
- 18.1 什么是登录文件
- 18.2 rsyslog.service :记录登录文件的服务
- 18.3 登录文件的轮替(logrotate)
- 18.4 systemd-journald.service 简介
- 18.5 分析登录文件
- 18.6 重点回顾
- 18.7 本章习题
- 18.8 参考资料与延伸阅读
- 第十九章、开机流程、模块管理与 Loader
- 19.1 Linux 的开机流程分析
- 19.2 核心与核心模块
- 19.3 Boot Loader: Grub2
- 19.4 开机过程的问题解决
- 19.5 重点回顾
- 19.6 本章习题
- 19.7 参考资料与延伸阅读
- 第二十章、基础系统设置与备份策略
- 20.1 系统基本设置
- 20.2 服务器硬件数据的收集
- 20.3 备份要点
- 20.4 备份的种类、频率与工具的选择
- 20.5 鸟哥的备份策略
- 20.6 灾难复原的考虑
- 20.7 重点回顾
- 20.8 本章习题
- 20.9 参考资料与延伸阅读
- 第二十一章、软件安装:源代码与 Tarball
- 20.1 开放源码的软件安装与升级简介
- 21.2 使用传统程序语言进行编译的简单范例
- 21.3 用 make 进行宏编译
- 21.4 Tarball 的管理与建议
- 21.5 函数库管理
- 21.6 检验软件正确性
- 21.7 重点回顾
- 21.8 本章习题
- 21.9 参考资料与延伸阅读
- 第二十二章、软件安装 RPM, SRPM 与 YUM
- 22.1 软件管理员简介
- 22.2 RPM 软件管理程序: rpm
- 22.3 YUM 线上升级机制
- 22.4 SRPM 的使用 : rpmbuild (Optional)
- 22.5 重点回顾
- 22.6 本章习题
- 22.7 参考资料与延伸阅读
- 第二十三章、X Window 设置介绍
- 23.1 什么是 X Window System
- 23.2 X Server 配置文件解析与设置
- 23.3 显卡驱动程序安装范例
- 23.4 重点回顾
- 23.5 本章习题
- 23.6 参考资料与延伸阅读
- 第二十四章、Linux 核心编译与管理
- 24.1 编译前的任务:认识核心与取得核心源代码
- 24.2 核心编译的前处理与核心功能选择
- 24.3 核心的编译与安装
- 24.4 额外(单一)核心模块编译
- 24.5 以最新核心版本编译 CentOS 7.x 的核心
- 24.6 重点回顾
- 24.7 本章习题
- 24.8 参考资料与延伸阅读
22.4 SRPM 的使用 : rpmbuild (Optional)
22.4 SRPM 的使用 : rpmbuild (Optional)
谈完了 RPM 类型的软件之后,再来我们谈一谈包含了 Source code 的 SRPM 该如何使用呢?假如今天我们由网络上面下载了一个 SRPM 的文件,该如何安装他?又,如果我想要修改这个 SRPM 里面源代码的相关设置值,又该如何订正与重新编译呢? 此外,最需要注意的是,新版的 rpm 已经将 RPM 与 SRPM 的指令分开了,SRPM 使用的是 rpmbuild 这个指令,而不是 rpm 喔!
22.4.1 利用默认值安装 SRPM 文件 (--rebuid/--recompile)
假设我下载了一个 SRPM 的文件,又不想要修订这个文件内的源代码与相关的设置值, 那么我可以直接编译并安装吗?当然可以!利用 rpmbuild 配合选项即可。选项主要有下面两个:
--rebuild | 这个选项会将后面的 SRPM 进行“编译”与“打包”的动作,最后会产生 RPM 的文件,但是产生的 RPM 文件并没有安装到系统上。当你使用 --rebuild 的时候,最后通常会发现一行字体: Wrote: /root/rpmbuild/RPMS/x86_64/pkgname.x86_64.rpm 这个就是编译完成的 RPM 文件啰!这个文件就可以用来安装啦!安装的时候请加绝对路径来安装即可! |
--recompile | 这个动作会直接的“编译”“打包”并且“安装”啰!请注意, rebuild 仅“编译并打包”而已,而 recompile 不但进行编译跟打包,还同时进行“安装”了! |
不过,要注意的是,这两个选项都没有修改过 SRPM 内的设置值,仅是通过再次编译来产生 RPM 可安装软件文件而已。 一般来说,如果编译的动作顺利的话,那么编译过程所产生的中间暂存盘都会被自动删除,如果发生任何错误, 则该中间文件会被保留在系统上,等待使用者的除错动作!
问:请由 http://vault.centos.org/ 下载正确的 CentOS 版本中, 在 updates 软件库当中的 ntp 软件 SRPM,请下载最新的那个版本即可,然后进行编译的行为。答:目前 (2015/09) 最新的版本为:ntp-4.2.6p5-19.el7.centos.1.src.rpm 这一个,所以我是这样作的:
- 先下载软件: 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 文件抓下来之后,依据你的系统重新进行编译。一般来说,因为该编译可能会依据你的系统硬件而最优化, 所以可能性能会好一些些,但是...人类根本感受不到那种性能优化的效果~所以并不建议你这么作。此外, 这种情况也很能发生在你从不同的 Linux distribution 所下载的 SRPM 拿来想要安装在你的系统上,这样作才算是有点意义。
一般来说,如果你有需要用到 SRPM 的文件,大部分的原因就是...你需要重新修改里面的某些设置,让软件加入某些特殊功能等等的。 所以啰,此时就得要将 SRPM 拆开,编辑一下编译配置文件,然后再予以重新编译啦!下个小节我们来玩玩修改设置的方式!
22.4.2 SRPM 使用的路径与需要的软件
SRPM 既然含有 source code ,那么其中必定有配置文件啰,所以首先我们必需要知道,这个 SRPM 在进行编译的时候会使用到哪些目录呢?这样一来才能够来修改嘛! 不过从 CentOS 6.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 文件就会放置在这个目录中了。 |
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 软件直接安装到系统中 (不要编译),然后查阅一下所有用到的目录为何?答:
# 1\. 鸟哥这里假设你用 root 的身份来进行安装的行为喔!
[[email protected] ~]# 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 目录的内容!
[[email protected] ~]# 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
[[email protected] ~]# 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 # 这就是重点!
22.4.3 配置文件的主要内容 (*.spec)
如前一个小节的练习,我们知道在 /root/rpmbuild/SOURCES 里面会放置原始文件 (tarball) 以及相关的修补档 (patch file), 而我们也知道编译需要的步骤大抵就是 ./configure, make, make check, make install 等,那这些动作写入在哪里呢? 就在 SPECS 目录中啦!让我们来瞧一瞧 SPECS 里面的文件说些什么吧!
[[email protected] ~]# cd /root/rpmbuild/SPECS
[[email protected] 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 <[email protected]> - 4.2.6p5-19.el7.centos.1
- rebrand vendorzone
* Thu Apr 23 2015 Miroslav Lichvar <[email protected]> 4.2.6p5-19.el7_1.1
- don't step clock for leap second with -x option (#1191122)
.....(后面省略).....
要注意到的是 ntp.sepc 这个文件,这是主要的将 SRPM 编译成 RPM 的配置文件,他的基本规则可以这样看:
- 整个文件的开头以Summary为开始,这部份的设置都是最基础的说明内容;
- 然后每个不同的段落之间,都以 % 来做为开头,例如 %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 的简写啰!那么他的工作事项主要有:
- 进行软件的补丁 (patch) 等相关工作;
- 寻找软件所需要的目录是否已经存在?确认用的!
- 事先创建你的软件所需要的目录,或者事先需要进行的任务;
- 如果待安装的Linux系统内已经有安装的时候可能会被覆盖掉的文件时,那么就必需要进行备份(backup)的工作了!
在本案例中,你会发现程序会使用 patch 去进行补丁的动作啦!所以程序的源代码才会更新到最新啊!
- %build:
build 就是创建啊!所以当然啰,这个段落就是在谈怎么 make 编译成为可执行的程序啰! 你会发现在此部分的程序码方面,就是 ./configure, make 等项目哩!一般来说,如果你会使用 SRPM 来进行重新编译的行为, 通常就是要重新 ./configure 并给予新的参数设置!于是这部份就可能会修改到!
- %install:
编译完成 (build) 之后,就是要安装啦!安装就是写在这里,也就是类似 Tarball 里面的 make install 的意思啰!
- %files:
这个软件安装的文件都需要写到这里来,当然包括了“目录”喔!所以连同目录请一起写到这个段落当中!以备查验呢!^_^ !此外,你也可以指定每个文件的类型,包括文档文件 (%doc 后面接的) 与配置文件 (%config 后面接的) 等等。
- %changelog:
这个项目主要则是在记录这个软件曾经的更新纪录啰!星号 (*) 后面应该要以时间,修改者, email 与软件版本来作为说明, 减号 (-) 后面则是你要作的详细说明啰!在这部份鸟哥就新增了两行,内容如下:
%changelog
* Wed Sep 09 2015 VBird Tsai <[email protected]>- 4.2.6p5-20.vbird
- only rbuild this SRPM to RPM
* Tue Jun 23 2015 CentOS Sources <[email protected]> - 4.2.6p5-19.el7.centos.1
- rebrand vendorzone
....(下面省略)....
修改到这里也差不多了,您也应该要了解到这个 ntp.spec 有多么重要!我们用 rpm -q 去查询一堆信息时, 其实都是在这里写入的!这样了解否?接下来,就让我们来了解一下如何将 SRPM 给他编译出 RPM 来吧!
22.4.4 SRPM 的编译指令 (-ba/-bb)
要将在 /root/rpmbuild 下面的数据编译或者是单纯的打包成为 RPM 或 SRPM 时,就需要 rpmbuild 指令与相关选项的帮忙了!我们只介绍两个常用的选项给您了解一下:
[[email protected] ~]# rpmbuild -ba ntp.spec <==编译并同时产生 RPM 与 SRPM 文件
[[email protected] ~]# rpmbuild -bb ntp.spec <==仅编译成 RPM 文件
这个时候系统就会这样做:
先进入到 BUILD 这个目录中,亦即是: /root/rpmbuild/BUILD 这个目录;
依照 *.spec 文件内的 Name 与 Version 定义出工作的目录名称,以我们上面的例子为例,那么系统就会在 BUILD 目录中先删除 ntp-4.2.6p5 的目录,再重新创建一个 ntp-4.2.6p5 的目录,并进入该目录;
在新建的目录里面,针对 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 ”吧!
[[email protected] ~]# cd /root/rpmbuild/SPECS
[[email protected] 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
[[email protected] 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 的文件文件名!
您瞧!嘿嘿~有 vbird 的软件出现了!相当有趣吧!另外,有些文件软件是与硬件等级无关的 (因为单纯的文件啊!),所以如上表所示, 你会发现 ntp-doc-4.2.6p5-20.vbird.noarch.rpm 是 noarch 喔!有趣吧!
22.4.5 一个打包自己软件的范例
这个就有趣了!我们自己来编辑一下自己制作的 RPM 怎么样?会很难吗?完全不会! 我们这里就举个例子来玩玩吧!还记得我们在前一章谈到 Tarball 与 make 时,曾经谈到的 main 这个程序吗?现在我们将这个程序加上 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\. 先来处理源代码的部份,假设你的 /root/rpmbuild/SOURCES 已经存在了喔!
[[email protected] ~]# cd /root/rpmbuild/SOURCES
[[email protected] SOURCES]# wget http://linux.vbird.org/linux_basic/0520source/main-0.1.tgz
[[email protected] SOURCES]# wget http://linux.vbird.org/linux_basic/0520source/main_0.1_to_0.2.patch
[[email protected] 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 制作里面最重要的课题!你必须要仔细的设置他,不要随便处理!仔细看看吧! 有趣的是,CentOS 7.x 会主动的将必要的设置参数列出来喔!相当有趣! ^_^
[[email protected] ~]# cd /root/rpmbuild/SPECS
[[email protected] 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 <[email protected]> 0.2
- build the program
- 编译成为 RPM 与 SRPM
老实说,那个 spec 文件创建妥当后,后续的动作就简单的要命了!开始来编译吧!
[[email protected] 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
很快的,我们就已经创建了几个 RPM 文件啰!接下来让我们好好测试一下打包起来的成果吧!
- 安装/测试/实际查询
[[email protected] ~]# yum install /root/rpmbuild/RPMS/x86_64/main-0.1-1.el7.centos.x86_64.rpm
[[email protected] ~]# rpm -ql main
/usr/local/bin/main <==自己尝试执行 main 看看!
[[email protected] ~]# 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.
# 看到没?属于你自己的软件喔!真是很愉快的啦!
用很简单的方式,就可以将自己的软件或者程序给他修改与设置妥当!以后你就可以自行设置你的 RPM 啰!当然,也可以手动修改你的 SRPM 的来源文件内容啰!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论