C語言中文網
首頁 > 編程筆記 > Linux筆記 閱讀:2,363

Linux SRPM包及其應用(超詳細)

前面章節介紹了 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命令安裝

如果我們只想安裝 SRPM 包,而不用修改源代碼,那么它的安裝方式還是比較簡單的,命令如下:

[root@localhost ~]# rpmbuild [選項] 包全名

選項:
需要注意的是,雖然 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

選項:
這時在當前目錄下也會生成 rpmbuild 目錄,不過只有 SOURCES 和 SPECS 兩個子目錄。其中,SOURCES 目錄中放置的是源碼;SPECS 目錄中放置的是設置文件,我們現在要利用設置文件進行安裝。接下來生成 RPM 包文件,命令如下:

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

選項:
命令執行完成后,也會在 /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 數據庫。

所有教程

優秀文章

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo