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

2020-07-16 10:04:34
前面章節介紹了 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,預設這個命令沒有安裝,需要手工安裝。命令如下:

[[email protected]~]#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 包,而不用修改原始碼,那麼它的安裝方式還是比較簡單的,命令如下:

[[email protected] ~]# rpmbuild [選項] 包全名

選項:
  • -rebuild:編譯 SRPM 包,不會自動安裝,等待手工安裝;
  • -recompile:編譯 SRPM 包,同時安裝;

需要注意的是,雖然 SRPM 包內是原始碼包,但畢竟是採用 RPM 包封裝的,所以依然會有依賴性,這時需要先安裝它的依賴包,才能正確安裝。我們使用如下命令編譯 SRPM 包的 apache。

[[email protected] ~]# 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 目錄,所有編譯之後生成的軟體包者都存在這裡。

[[email protected] ~]# 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/ 目錄下。

[[email protected] ~]#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 包,命令如下:

[[email protected] ~]# rpm -i httpd-2.2.15-5.el6.src.rpm

選項:
  • -i: 安裝。不過對 *src.rpm 包只會解開後放置到當前目錄下的 rpmbuild 目錄下,而不會安裝

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

[[email protected] ~]# 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 的組態檔儲存退出後,編輯檔案時發生了這樣的情況:

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

系統提示錯誤,所以並不是 Vim 的有效註釋符號。

諸如此類問題,應如何查詢得到結果?思路:Linux 中安裝的軟體包大多包含應用範例或說明文件,可以査找到其內容,就可以知道此問題的答案了。

1) 査找系統中所有Vim的安裝包。

[[email protected] ~]# 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"的檔案)。

[[email protected] ~]# 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 組態檔範例,査看其內容。

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

當看到此檔案中"作者""最後更新日期"等資訊前面的雙引號時,我們就清楚了它一定是 Vim 組態檔的注釋符號。

這是一個在應用 Linux 時碰到的問題,很有代表性,像常見的設定網路伺服器(如 DNS、DHCP 等),査找它們的組態檔範例,都可以採用類似方法。解決此類問題要多利用系統軟體本身的幫助資訊,使用 RPM 査詢命令。

RPM資料庫問題

有時 RPM 資料庫也會出現故障,其結果是當安裝、刪除、査詢軟體包時,請求無法執行,此時需要重建資料庫。

首先,刪除當前的 RPM 資料庫。

[[email protected] ~]# rm -f/var/lib/rpm/_db.*

其次,重建資料庫。

[[email protected] -]# rpm -rebuilddb

這一步需要花費一定的時間來完成。

駭客入侵系統後,有時為混淆雛,避免管理員通過 RPM 包校驗功能檢測出問題,會更改 RPM 資料庫(從理論上來講,當系統被入侵後,一切都將不再可信),此時我們可按照以下步驟對檔案進行檢測。

1) 對於要檢査的檔案或命令,找出它屬於哪個軟體包。

[[email protected] ~]# rpm -qf/etc/rc.d/init.d/smb
samba-3.0.23c-2


2) 使用 -dump 選項査看每個檔案的資訊,使用 grep 命令提取對應檔案資訊。

[[email protected] ~]# 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) 檢査實際的檔案,看內容是否被更改過。

[[email protected] ~]# ls -l /etc/rc.d/init.d/smb -rwxr-xr-x 1 root root 2087 Sep 2 2006/etc/rc.d/init.d/smb
[[email protected] ~]# 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檔案進行檢査。

[[email protected]~]# 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 資料庫。