案例(以pam包為例)
制作patch(1~5)
--1 準備需要的rpm源碼包,最終會獲得一個src.rpm包
yumdownload --source pam
或者 wget http://xxxx.xxxx.com/pam-1.1.5-0.17.2.src.rpm
--2 解壓,并把已經有的更新檔打到源碼中(可見,rpm包的構成就是 基線代碼+針對基線代碼各版本的patch)
rpm -ivh pam-1.1.5-0.17.2.src.rpm (生成~/rpmbuild目錄)
rpmbuild -bp ~/rpmbuild/SPECS/anaconda.spec (在rpmbuild中生成BUILD BUILDROOT RPMS SOURCES SPECS SRPMS)
--3 備份BUILD中的源碼
cp -R ~/rpmbuild/Linux-PAM-1.1.5 ~/rpmbuild/Linux-PAM-1.1.5.bak
--4 在~/rpmbuild/Linux-PAM-1.1.5中進行想做的修改
--5 制作patch
diff -Nur ~/rpmbuild/BUILD/Linux-PAM-1.1.5.bak ~/rpmbuild/BUILD/Linux-PAM-1.1.5 > new.patch
把patch打入生成新的rpm包(6~7)
--6 重構項目
mv new.patch ~/rpmbuild/SOURCES
vim ~/rpmbuild/SPECS/pam.spec 【修改版本号,patch資訊,changelog等】
rpmbuild -ba ~/rpmbuild/SPECS/pam.spec (把目前的所有patch打到基線上)
--7 擷取所有輸出
重構後,會生成如下rpm包(這裡把新版本定為0.17.99)
/var/tmp/build-root/standard-x86_64/usr/src/packages/SRPMS/pam-1.1.5-0.17.99.src.rpm
/var/tmp/build-root/standard-x86_64/usr/src/packages/RPMS/x86_64/pam-devel-1.1.5-0.17.99.x86_64.rpm
/var/tmp/build-root/standard-x86_64/usr/src/packages/RPMS/x86_64/pam-doc-1.1.5-0.17.99.x86_64.rpm
/var/tmp/build-root/standard-x86_64/usr/src/packages/RPMS/x86_64/pam-1.1.5-0.17.99.x86_64.rpm
使用新的rpm包(8)
--8 更新pam(更新動作不要解析依賴關系,是以隻要基線版本OK,即使目标環境上什麼都沒有,也能更新!)
rpm -Uvh pam-1.1.5-0.17.99.x86_64.rpm
rpm的使用
1)yum search xxx
使用此指令羅列成出來的所有軟體中,字尾表示适用于不同的架構。
而其中以noarch結尾的表示,軟體和架構無關,一般情況下,這樣的包都是“腳本”。
2)xxx.rpm --- 編譯好的軟體包
xxx.src.rpm --- 未編譯的軟體包(源碼包)
3)xxx-1.1.1-n.i386.rpm
軟體名-版本号-第n此對外釋出.架構.rpm包類型
4) rpm的優點:
1)rpm包裡面有編譯好的程式和配置檔案,不需要重新編譯;
2)rpm包解壓的時候會檢查系統硬碟容量、作業系統版本等,確定可用性;
3)rpm包裡面有相關文檔
5)rpm包中有記錄依賴關系的檔案,包在解壓的時候會去驗證以來關系,并在本機上查找相應的依賴是否安裝,如果沒有則報錯!等待解決依賴關系
(這就是rpm讓人诟病的“軟體的屬性依賴”)
6)如何解決rpm的屬性依賴問題 -----> yum
為了友善軟體的重複利用,很多軟體都是以動态庫的方式對外提供,比如pam
這也是為什麼很多時候能看到xxx.rpm和xxx-devel.rpm兩個包,帶devel的是給開發者使用的,裡面有“靜态庫”或者“動态庫”
同屬于某個軟體,rpm是可直接使用的編譯好的軟體,devel.rpm是開發使用的相關庫
7)yum的工作流程
yum會先下載下傳目标rpm包;然後解析rpm包中的依賴關系檔案,再把依賴關系發送到yum源(伺服器)上;伺服器端會根據依賴關系檔案下發所有相關的
依賴包;最後把所有的依賴rpm包按照順序安裝好。
8)/var/lib/rpm:rpm的資料庫就在這個目錄下
1)軟體更新時,各個版本之間的比較,在這裡找;
2)系統已經安裝了哪些軟體,在這裡找;
3)軟體的數字簽名,也在這裡找;
其實就相當于rpm的私有資料庫
9)rpm下載下傳軟體的相關内容都放在什麼地方:
/etc : 配置檔案存放的地方
/usr/bin : 可執行檔案
/usr/lib : 動态庫
/usr/share/doc : 基本的軟體使用手冊和說明檔案
/usr/share/man : man page檔案
(注:可見,rpm是按照linux的套路來配置設定一個軟體的相關檔案的)
10)rpm的基本指令
-i -- (install)安裝rpm包
-v -- (verbose)安裝細節
-h -- 友善可視化
-qa -- 列出已安裝的所有軟體
-qf filename -- 檢視某個檔案由那個軟體産生(一般用來操作配置檔案,以确定配置檔案屬于那個軟體包)
-q xxx -- 檢視是否安裝了xxx
-ql xxx -- 檢視xxx軟體檔案的目錄(比如執行程式在哪,配置檔案在哪,說明書在哪)
-qc xxx -- xxx軟體的所有配置檔案清單
-qd xxx -- xxx軟體的說明書清單
-qR xxx -- xxx軟體依賴的檔案在哪
安裝本地包: rpm -ivh xxx.rpm
安裝多個包: rpm -ivh xxx.rpm yyy.rpm *.rpm
安裝網絡上的包: rpm -ivh http://xxx.com/dir/xxx.rpm
11) rpm的其他指令(放在最後)
--nodeps 依賴關系解決不了,但還是一定要安裝(可能會出現依賴包缺失,軟體用不起來)
--replacefiles 強制替換現有的軟體殘留檔案,比如已經解除安裝xxx軟體了,但是解除安裝時候還有一些殘留的配置
檔案,此時安裝就會提示“由于某個軟體已經在本機上存在,是以安裝失敗”,這個時候就可以
直接替換掉(替換動作不可逆)
--replacepkgs 強制安裝軟體,比如某個軟體已經安裝了,這時候可以直接替換掉原有的軟體
--force --replacefiles + --replacepkgs , 簡單粗暴,強制安裝
--test 測試是否能夠安裝,如果不可,羅列原因(隻測試,不安裝)
--justdb 更新軟體在資料庫中的資料
--nosignature 跳過數字簽名檢查
--prefix <dir> 重定向軟體安裝目錄,比如預設是以根目錄作為軟體的安裝根目錄,這裡可以重定向/home目
錄作為軟體安裝的根目錄,伴随效應就是會在/home目錄下單獨建立一套目錄
--noscripts 不執行rpm自帶的一些安裝腳本,僅安裝軟體(可能會造成目前軟體不在資料庫裡)
12)從CD光牒安裝某個軟體的流程
挂載CD光牒,使用: mount /dev/cdrom /media
找出檔案的實際路徑:find /media -name 'pam-devel*'
測試此軟體是否具有相依性: rpm -ivh pam-devel... --test
直接安裝: rpm -ivh pam-devel...
卸除CD光牒: umount /dev/cdrom
13)使用rpm更新軟體(而不是yum,一般還是使用yum)
-Uvh 如果未安裝,則安裝,并更新;如果已安裝,則更新
-Fvh 如果未安裝,不安裝,
一般是先下載下傳最新版本的rpm包,然後使用上面的指令執行最新版本的包
14)數字簽名
[root@www ~]# rpm -Va
[root@www ~]# rpm -V 已安裝的軟體名稱
[root@www ~]# rpm -Vp 某個 RPM 檔案的檔名
[root@www ~]# rpm -Vf 在系統上面的某個檔案
選項不參數:
-V :後面加的是軟體名稱,若該軟體所噸的檔案被更劢過,才會列出來;
-Va :列出目前系統上面所有可能被更劢過的檔案;
-Vp :後面加的是檔案名,列出該軟體内可能被更劢過的檔案;
-Vf :列出某個檔案是否被更劢過~
範例一:列出你的 Linux 内的 logrotate 這個軟體是否被更劢過?
[root@www ~]# rpm -V logrotate
# 如果沒有出現仸何訊息,恭喜你,該軟體所提供的檔案沒有被更劢過。
# 如果有出現仸何訊息,才是有出現狀況啊!
範例二:查詢一下,你的 /etc/crontab 是否有被更劢過?
[root@www ~]# rpm -Vf /etc/crontab
S.5....T c /etc/crontab
# 瞧!因為有被更劢過,是以會列出被更劢過的資訊類型!
15) 使用rpm解除安裝軟體
rpm -e
如果要解除安裝的軟體被其他軟體使用,那麼會報錯,當然,可以使用--nodeps來強制解除安裝,但是别的軟體可能就用不了了
使用rpm更新資料庫
rpm --rebuilddb
rpmbuild(使用 軟體源碼建構rpm包)
1) rpm指令處理rpm包,rpmbuild處理srpm包
2) rpmbuild --rebuild xxx.src.rpm ---------- 把src.rpm整體編譯并打包成rpm包,不安裝!
rpmbuild --recomplie xxx.src.rpm ---------- 把src.rpm整體編譯并打包成rpm包,并且安裝!
yumdownloader下載下傳之後
#rm -rf /root/rpmbuild
#rpm -i ***.src.rpm
#cd /root/rpmbuild
#rpmbuild -bp SPECS/**.spec
修改部分rpm包,并重新釋出iso
1)下載下傳目的ISO,裝機
2)找到對應的rpm包
3)修改
3.1 解壓
rpm -ivh config-os-cloudedge-1.0-2.src.rpm
3.2 修改
(可選)查詢filename屬于哪個rpm包:rpm -qf filename
(可選)安裝所有依賴:yum-builddep -y config-os-cloudedge.spec
(可選)展開源碼:rpmbuild -bp config-os-cloudedge-1.0-2.src.rpm
(可選)vim /SPEC/
3.3 制作新rpm包
rpmbuild -ba config-os-cloudedge.spec
新的包出現在RPMS目錄中,這裡為config-os-cloudedge-1.0-2.h1.x86_64.rpm