加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

Linux SRPM包及其应用(超详细)

发布时间:2020-12-14 02:17:23 所属栏目:Linux 来源:网络整理
导读:前面章节介绍了 RPM 包的安装,现在我们说说 SRPM 包。 SRPM 包是什么呢?SRPM 包中的软件不再是经过编译的二进制文件,而是源码文件,所以你可以认为 SRPM 包是软件以源码形式发布之后,再封装成 RPM 包格式的。 不过,既然是将源码文件封装成 RPM 包格式,
前面章节介绍了 RPM 包的安装,现在我们说说 SRPM 包。

SRPM 包是什么呢?SRPM 包中的软件不再是经过编译的二进制文件,而是源码文件,所以你可以认为 SRPM 包是软件以源码形式发布之后,再封装成 RPM 包格式的。

不过,既然是将源码文件封装成 RPM 包格式,那么它的安装方法既不和 RPM 包软件安装方法一致,也不和源码包软件安装方法一样,我们需要单独学习它的安装方法。

我们依然下载 apache 的 SRP M包,来看看 SRPM 包的安装方法。需要注意的是 SRPM 包的命名规则,其实和 RPM 包的命名规则是一致的,只是多了".src"这个标志。比如"MySQL-5.5.29-2.el6.src.rpm",采用"包名-版本-发行版本.软件发行商.src.rpm"这样的方式命名。

SRPM 包管理需要使用命令 rpmbuild,默认这个命令没有安装,需要手工安装。命令如下:

[root@localhost~]#rpm-ivh/mnt/cdroin/Packages/rpm-build-4.8.0-27.el6.i686.rpm
Preparing...
###################
[100%]
1:rpm-build
###################
[100%]


SRPM 包有两种安装方式:
  • 利用 rpmbuild 命令直接安装;
  • 利用 *.spec 文件安装。

我们分别介绍。

rpmbuild命令安装

如果我们只想安装 SRPM 包,而不用修改源代码,那么它的安装方式还是比较简单的,命令如下:

[root@localhost ~]# rpmbuild [选项] 包全名

选项:
  • -rebuild:编译 SRPM 包,不会自动安装,等待手工安装;
  • -recompile:编译 SRPM 包,同时安装;

需要注意的是,虽然 SRPM 包内是源码包,但毕竟是采用 RPM 包封装的,所以依然会有依赖性,这时需要先安装它的依赖包,才能正确安装。我们使用如下命令编译 SRPM 包的 apache。

[root@localhost ~]# rpmbuild - rebuild httpd-2.2.15-5.el6.src.rpm
warning: InstallSourcePackage at: psm.c:244: Header V3 RSA/SHA256 Signature,key
ID fd431d51: NOKEY
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root
#警告为mockbuild用户不存在,使用root代替。这里不是报错,不用紧张
…省略部分输出…
Wrote: /root/rpmbuild/RPMS/i386/ httpd-2.2.15-5.el6.i386.rpm
Wrote: /root/rpmbuild/RPMS/i386/httpd-devel-2.2.15-5.el6.i386.rpm
Wrote: /root/rpmbuild/RPMS/noarch/httpd-manual-2.2.15-5.el6.noarch.rpm
Wrote: /root/rpmbuild/RPMS/i386/httpd-tools-2.2.15-5.el6.i386.rpm
Wrote: /root/rpmbuild/RPMS/i386/ mod_ssl-2.2.15-5.el6.i386.rpm
#写入RPM包的位置,只要看到,就说明编译成功
Executing(%clean): /bin/sh -e/var/tmp/rpm-tmp.Wb8TKa
+ umask 022
+ cd/root/rpmbuild/BUILD
+ cd httpd-2.2.15
+ rm -rf /root/rpmbuild/BUILDROOT/httpd-2.2.15-5.el6.i386
+ exit 0
Executing(-clean): /bin/sh -e/var/tmp/rpm-tmp.3UBWql
+ umask 022
+ cd/root/rpmbuild/BUILD
+ rm-rf httpd-2.2.15
+ exit 0

exit 0 是编译成功的标志,同时命令会自动删除临时文件。编译之后生成的软件包在哪里呢?当然在当前目录下了。在当前目录下会生成一个 rpmbuild 目录,所有编译之后生成的软件包者都存在这里。

[root@localhost ~]# ls /root/rpmbuild/
BUILD RPMS SOURCES SPECS SRPMS

rpmbuild 目录下有几个子目录,我们用表格说明其中保存了哪些文件,如表 1 所示。

表 1 子目录的作用
文件名 文件内容
BUILD 编译过程中产生的数据保存位置
RPMS 编译成功后,生成的RPM包保存位置
SOURCES 从SRPM包中解压出来的源码包(*.tar.gz)保存位置
SPECS 生成的设置文件的安装位置。第二种安装方法就是利用这个文件进行安装的
SRPMS 放置SRPM包的位置

编译好的 RPM 包已经生成在 /root/rpmbuild/RPMS/ 目录下。

[root@localhost ~]#ll /root/rpmbuild/RPMS/i386/ 总用量3620
-rw--r--r-- 1 root root 3039035 11月19 06:30 httpd-2.2.15-5.el6.i386.rpm
-rw--r--r-- 1 root root 154371 11月19 06:30 httpd-devel-2.2.15-5.el6.i386.rpm
-rw--r--r-- 1 root root 124403 11月19 06:30 httpd-tools-2.2.15-5.el6.i386.rpm
-rw--r--r-- 1 root root 383539 11月19 06:30 mod_ssl-2.2.15-5.el6.i386.rpm

其实,rpmbuild 命令就是先把 SRPM 包解开,得到源码包;然后进行编译,生成二进制文件;最后把二进制文件重新打包生成 RPM 包。

利用*.spec文件安装

想利用 *.spec 文件安装,当然需要先把 SRPM 包解开才能获取。可以利用 rpmbuild 命令解开 SRPM 包,但是这样不就和上一种方法冲突了吗?可以使用 rpm-i 命令解开 SRPM 包,命令如下:

[root@localhost ~]# rpm -i httpd-2.2.15-5.el6.src.rpm

选项:
  • -i: 安装。不过对 *src.rpm 包只会解开后放置到当前目录下的 rpmbuild 目录下,而不会安装

这时在当前目录下也会生成 rpmbuild 目录,不过只有 SOURCES 和 SPECS 两个子目录。其中,SOURCES 目录中放置的是源码;SPECS 目录中放置的是设置文件,我们现在要利用设置文件进行安装。接下来生成 RPM 包文件,命令如下:

[root@localhost ~]# rpmbuild -ba/root/rpmbuild/SPECS/httpd.spec

选项:
  • -ba: 编译,同时生成 RPM 包和 SRPM 包;
  • -bb: 编译,仅生成 RPM 包;

命令执行完成后,也会在 /root/rpmbuild/ 目录下生成 BUILD、RPMS、SOURCES、SPECS 和 SRPMS 目录,RPM 包放在 RPMS 目录中,SRPM 包生成在 SRPMS 目录中。这时安装 RPM 包即可。

两种安装 SRPM 包的方法使用一种就行,大家可以选用白己喜欢的方式。

RPM包的深入应用

查询软件包帮助信息

有这样一个问题:在 Vim 的配置文件中如何注释?实际上,Vim 的配置文件存放于用户的宿主目录下,默认文件名为".vimrc",可以写入"set nu"等设置命令,问题是写入此配置文件中的命令如何注释使其不生效。

一般来讲,Linux 系统或系统软件的配置文件可以在行首使用"#"符号来注释,但是当用"#"注释了 Vim 的配置文件保存退出后,编辑文件时发生了这样的情况:

[root@localhost ~]# vi /etc/inittab
Error detected while processing /root/.vimrc: line 1:
E488: Trailing characters: # set nu

系统提示错误,所以并不是 Vim 的有效注释符号。

诸如此类问题,应如何查询得到结果?思路:Linux 中安装的软件包大多包含应用示例或说明文档,可以査找到其内容,就可以知道此问题的答案了。

1) 査找系统中所有Vim的安装包。

[root@localhost ~]# rpm -qa|grep vim
vim-minimal-7.0.109-3 vim-common-7.0.109-3 vim-enhanced-7.0.109-3


2) 査询安装包的内容,査找是否有应用示例文件,看英文含义,"minimal"为最小应用软件包,"common"为通用的基础软件包,"enhanced"为増强功能的软件包。我们在这里先査看"virrvcommon"软件包安装到系统中的文件是否有示例文件(如包含关键字"example"或"sample"的文件)。

[root@localhost ~]# rpm -ql vim-common|grep example
/usr/share/vim/vim70/gvimrc_example.vim
/usr/share/vim/vim70/macros/urm/examples
/usr/share/vim/vim70/vimrc_example.vim

根据査找到的文件名称,判断"vimrc_example.vim"应为 Vim 配置文件示例,査看其内容。

[root@localhost ~]# head -4 /usr/share/vim/vim70/ vimrc_example.vim
"An example for a vimrc file.
"
"Maintainer:
Bram Moolenaar <Bram@vim.org>
"Last change:
2006 Aug 12

当看到此文件中"作者""最后更新日期"等信息前面的双引号时,我们就清楚了它一定是 Vim 配置文件的注释符号。

这是一个在应用 Linux 时碰到的问题,很有代表性,像常见的配置网络服务器(如 DNS、DHCP 等),査找它们的配置文件示例,都可以采用类似方法。解决此类问题要多利用系统软件本身的帮助信息,使用 RPM 査询命令。

RPM数据库问题

有时 RPM 数据库也会出现故障,其结果是当安装、删除、査询软件包时,请求无法执行,此时需要重建数据库。

首先,删除当前的 RPM 数据库。

[root@localhost ~]# rm -f/var/lib/rpm/_db.*

其次,重建数据库。

[root@localhost -]# rpm -rebuilddb

这一步需要花费一定的时间来完成。

黑客入侵系统后,有时为混淆雛,避免管理员通过 RPM 包校验功能检测出问题,会更改 RPM 数据库(从理论上来讲,当系统被入侵后,一切都将不再可信),此时我们可按照以下步骤对文件进行检测。

1) 对于要检査的文件或命令,找出它属于哪个软件包。

[root@localhost ~]# rpm -qf/etc/rc.d/init.d/smb
samba-3.0.23c-2


2) 使用 -dump 选项査看每个文件的信息,使用 grep 命令提取对应文件信息。

[root@localhost ~]# rpm -ql -dump samba|grep /etc/rc.d/init.d/smb
/etc/rc.d/init.d/smb 2087 1157165946 b1c26e5292157a83cadabe851bf9b2f9 0100755 root root 1 0 0X

其中,"2087"为文件中最初的字符数,"b1c26e5292157a83cadabe851bf9b2f9"为 smb 文件内容的 MD5 校验值,"0755 root root"为文件权限及所有者、所属组。

3) 检査实际的文件,看内容是否被更改过。

[root@localhost ~]# ls -l /etc/rc.d/init.d/smb -rwxr-xr-x 1 root root 2087 Sep 2 2006/etc/rc.d/init.d/smb
[root@localhost ~]# md5sum /etc/rc.d/init.d/smb
b1c26e5292157a83cadabe851bf9b2f9 /etc/rc.d/init.d/smb

检测文件大小、所有者、所属组、权限、MD5 校验值是否匹配。

4) 在我们的实验中,系统的 /etc/rc.d/init.d/smb 文件的信息和通过 rpm-ql-dump Samba 命令获取的信息是一致的,所以我们系统中的文件并没有被入侵与更改。如果确信 RPM 数据库遭到了修改,就要基于从光盘或者其他值得信赖的来源处获得的Samba RPM文件进行检査。

[root@localhost~]# rpm -ql --dump -p /mnt/cdrom/Fedora/RPMS/samba-3.0.23c-2.i386.rpm | grep /etc/rc.d/init.d/smb
warning: samba-3.0.23c-2.i386.rpm: Header V3 DSA signature: NOKEY,key ID 412a&62
/etc/rc.d/init.d/smb 2087 1157165946 b1c26e5292157a83cadabe851 bf9b2f9 0100755 root root 1 0 0 X

如果得到的结果与基于 RPM 数据库运行的命令结果不同,就可以判断 RPM 数据库已被更改,需要修正文件错误和系统漏洞,重建 RPM 数据库。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读