Linux軟件包管理-rpm命令總結

第一部分:程序編譯過程

一、軟件運行環境介紹

  1. 操作系統內核、庫、程序都爲二進制文件,應用程序能否跨平臺運行主要看該程序依賴的調用的二進制庫文件是否兼容。
  2. 開發視角API:Application Program Interface 應用程序接口,程序員面對編程接口。應用系統與操作系統間的接口
  3. 應用視角ABI:Application Binary Interface 應用二進制接口,程序應用者面對運行程序的接口,應用程序與調用庫之間的接口。

    Linux:ELF(Executable and Linkable Format)

    Windows:PE(Portable Executable)

  4. 解決方案:統一應用程序開發時調用庫接口標準,即:統一API的標準,POSIX標準:Portable Operating System 可移執操作系統。遵循該標準的應用程序代碼只需要在相應用的操作系統平臺下重新編譯即可安裝使用。該標準依然是API層面的兼容性解決方案。

二、軟件編譯過程

  我們獲取應用程序的源碼包後不能直接運行在操作系統平臺,需要通過編譯成不同操作系統支持ABI的纔有運行在不同的操作系統平臺上

程序源代碼 --> 預處理 --> 編譯 --> 彙編 --> 鏈接

1.預處理: 根據程序源代碼中的預處理指令格式化源代碼並輸出爲.i結尾的文件爲編譯做準備

2.編譯: 對預處理文件進行編譯,生成了彙編文件,基於.i文件中的預編譯指令生成.s文件,裏面保存的是彙編代碼

3.彙編: 對彙編文件進行編譯,生成了目標文件,基於編譯過程生成的.s文件裏的彙編代碼轉換成二進制機器碼,最後輸出爲.o文件

4.鏈接: 對目標文件進行鏈接,生成可執行文件,將彙編生成的二進制文件及程序調用的庫文件鏈接打包生成執行文件,鏈接分爲兩種因此編譯分爲兩種:一種是靜態編譯,一種是動態編譯

• 靜態編譯:
將程序調用的第三方庫文件一起找包生成可執行文件,特點是安裝時將依賴的第三方庫文件一起釋放安裝,解決目標操作系統平臺因沒有依賴的庫文件而運行失敗的問題。但是靜態鏈接生成的可執行程序體積較大,如果程序更新則需要重新再次編譯。靜態庫後綴爲.a文件
• 動態編譯:
只是對程序調用的第三方庫文件做個鏈接,並不真正將依賴的庫文件打包在可執行文件內,而是做一個動態鏈接。在目標系統程序運行時調用目標操作系統中的庫就可以,但如果沒有依賴的庫的則會運行失敗。動態庫爲.so文件

5.GCC編譯過程

• 預處理:生成預編譯文件(.文件):gcc –E hello.c –o hello.i
(對hello.c文件進行預處理,生成了hello.i 文件)
• 編譯:生成彙編代碼(.s文件):gcc –S hello.i –o hello.s
(對預處理文件進行編譯,生成了彙編文件 )
• 彙編:生成目標文件(.o文件):gcc –c hello.s –o hello.o
(對彙編文件進行編譯,生成了目標文件)
• 鏈接:生成可執行文件:gcc hello.o –o hello
(對目標文件進行鏈接,生成可執行文件)

三、Linux系統中應用程序介紹

  系統內安裝的程序分兩部分存儲信息,一部分爲程序的元數據信息,另一部分有應用程序數據。

1.程序的元數據:

  系統內安裝的rpm程序包信息(名稱,版本,依賴性,描述等 )都被註冊在rpm數據庫內,每次安裝rpm包都會查詢數據庫程序是否已經存在,如果存在則rpm包管理器則會反饋不同的信息。該數據庫位於/var/lib/rpm

Ø 程序包名稱及版本
Ø 依賴關係
Ø 功能說明 

Ø 包安裝後生成的各文件路徑及校驗碼信息
rpm 系統出了問題,不能安裝和查詢,可能會是數據庫出現問題,可以使用下面命令重建

rpm --initdb:如果事先沒有數據庫,則會新建一個,如果已經存在數據庫則不進行任何操作
rpm –rebuilddb:重新構建數據庫,會覆蓋原有數據庫

2.應用程序數據:

  應用程序數據纔是我們真正使用的能夠被向操作系統提請爲進程的程序文件

3.庫文件:

  Linux下很多應用程序都是動態編譯生成的,因此會很多程序都依賴系統提供的基本庫文件,而且很多應用程序間也存在着依賴關係,爲系統提供了高效規範的處理這些依賴關係將所有可用庫文件名及文件路徑 映射關係以模塊化的配置文件形式存在指定位置,並向用戶提供了應用程序與庫文件之間依賴關係查詢的命令接口,具體如下:

Ø 配置文件位置:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf 
Ø 緩存文件位置:/etc/ld.so.cache 
Ø ldd命令:查看二進制程序所依賴的庫文件 例:ldd /usr/bin/cat
Ø 管理及查看本機裝載的庫文件
        • ldconfig加載配置文件中指定的庫文
    • ldconfig -p顯示本機已經緩存的所有可用庫文件名及文件路徑映射關係

4.rpm包介紹

1.rpm包名稱
包名稱-[功能備註]-主版本號.次版本號.修正號-編譯次數-發行商定製的發行版本號-硬件架構平臺.rpm
    Ø 功能備註:tools工具包、devel開發包、libs庫、utils功能包、
    Ø 主版本號:功能模塊或架構上有大的變更
    Ø 次版本號:功能模塊加強
    Ø 修正號:bug修復
2. rpm包結構:
    Ø RPM包內的程序文件
    Ø RPM的元數據,如名稱,版本,依賴性,描述等
    Ø 安裝或卸載時運行的腳本 (用於定製配置文件,如創建用戶等)

第二部分:程序包管理

  rpm程序包管理工具將編譯好的應用程序的各組成文件打包一個或幾個程序包文件,從而 方便快捷地實現程序包的安裝、卸載、查詢、升級和校驗等管理操作

一.rpm選項介紹

  rpm程序包管理工具的選項比較多,這裏還是總結一下rpm的man手冊內各選項之間的搭配關係。我們可以把rpm的選項分爲三個級別來理解記憶,一級爲包管理類選項命令行內必選選項,二級爲可選的功能性微調選項,三級輔助通用選項:-v顯示詳細信息、-h顯示處理進度

1.一級包管理類必選選項:

-i安裝、-e卸載、-U -F升級、-V校驗、-q查詢

查詢、校驗操作都可以搭配[select-options]
包的安裝、升級操作都可以搭配[install-options]
包卸載操作搭配的選項則比較混亂我們只需記住-e

2.二級功能性微調可選選項:

安裝選項、查詢選項、校驗選項、選擇選項,詳細信息見文章最後的微調選項附錄部分

3.一、二級選項搭配關係:

1.包查詢操作:搭配選擇項或查詢選項
rpm {-q|--query} [select-options] [query-options]
2.包校驗操作:搭配選擇項或校驗選項
rpm {-V|--verify} [select-options] [verify-options]
3.包安裝操作:搭配安裝選項
rpm {-i|--install} [install-options] PACKAGE_FILE …
4.包重新安裝:搭配安裝選項
rpm {--reinstall} [install-options] PACKAGE_FILE ...
5.包升級操作:搭配安裝選項
rpm {-U|--upgrade} [install-options] PACKAGE_FILE …
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
6.包卸載操作:
rpm {-e|--erase} [--allmatches] [--justdb] [--nodeps] [--noscripts][--notriggers] [--test] PACKAGE_NAME ...

4.通用選項:卸載、安裝都適用

通用選項可以輔助安裝、卸載等一級選項更詳細的顯示rpm的處理過程

Ø -v verbose顯示詳細信息,可以多個v疊加,顯示不同級別的詳細信息
Ø -h 顯示包管理程序的處理進度

二、包管理操作

1.程序包安裝

程序安裝過程:

Ø 執行安裝前的腳本文件,如創建用戶、創建必要的目錄、權限設置
Ø 解包將各種文件複製到相應的目錄。
Ø rpm包安裝完後會自動註冊在RPM公共數據庫中/var/lib/rpm,便於後期卸載、查詢操作

語法:
rpm {-i|--install} [install-options] PACKAGE_FILE…

--test: 測試安裝,但不真正執行安裝,即dry run模式
--nodeps:忽略依賴關係,強制定包
--force 強行安裝
--replacepkgs | replacefiles 替換包或文件 用於。替換原有包,覆蓋安裝。
--nosignature: 不檢查來源合法性 
--nodigest:不檢查包完整性 
--noscripts:不執行程序包腳本 
     %pre: 安裝前腳本        --nopre 
     %post: 安裝後腳本       --nopost 
     %preun: 卸載前腳本      --nopreun 
     %postun: 卸載後腳本     --nopostun 

常用選項組合

Ø 覆蓋原有包:修改因包文件被誤刪除導致重新安裝失敗
rpm -ivh tree-1.7.0-15.el8.x86_64.rpm --replacepkgs
Ø 覆蓋原有文件:
rpm -ivh tree-1.7.0-15.el8.x86_64.rpm --replacefiles
Ø 跳過包簽名校驗
rpm -ivh tree-1.7.0-15.el8.x86_64.rpm --nosignature

實用小技巧

判斷一個軟件包是否存在,如果不存在則安裝相應的軟件包
rpm -q tree > /dev/null ||rpm -ivh ../../BaseOS/Packages/tree-1.7.0-15.el8.x86_64.rpm

2.程序包卸載

語法:
rpm {-e|--erase} [--allmatches] [--justdb] [--nodeps] [--noscripts]

Ø --allmatches 卸載所有匹配的包,匹配指定的關鍵字的包全部卸載
Ø --justdb  
Ø --nodeps 忽略依賴關係強行卸載
Ø --noscripts 執行卸載過程中不執行卸載腳本

小提示: 當包卸載時,對應的配置文件不會刪除, 以FILENAME.rpmsave形式保留 如httpd的http.conf文件

3.程序包升級

語法:

upgrade:安裝有舊版程序包,則“升級” 如果不存在舊版程序包,則“安裝”

rpm {-U|--upgrade} [install-options] PACKAGE_FILE...

freshen:安裝有舊版程序包,則“升級”如果不存在舊版程序包,則不執行升級操作

rpm {-F|--freshen} [install-options] PACKAGE_FILE...

4.程序包降級

降級一般用於業務測試軟件版本切換,或業務節點升級出現異常執行版本回退操作,實際上就是正常安裝舊版程序包,但需要同時--oldpackage --force兩個微調選項,升級後兩個版包並存。可以根據實際需要決定是否卸載新版包。

rpm -ivh tree-1.6.0-10.el7.x86_64.rpm --oldpackage --force

小提示: 如果只有--oldpackage會提示文件衝突,需同時指定 --replacefiles進行文件替換。此時通過rpm -q查詢會發現兩個版本軟件並存的現象,但後安裝的應用程序文件覆蓋了原有應用程序文件,軟件確實降級成功。原因:-i是安裝操作會將新的軟件版本信息註冊到rpm數據庫。因此卸載、查詢操作需要加版本號纔可以。

5.程序包查詢

坦白說個人認爲rpm包管理工具查詢功能在工作中用得最多了,當然yum也有查詢功能,但是不大衆的包還得yum與rpm配合來用

語法:rpm {-q|--query} [select-options] [query-options]

常用選項組合

Ø rpm -q httpd 查詢是系統是否已經安裝某包,多版並存時需指定版本號
Ø rpm -q httpd-tools --scripts查看安裝包內的腳本文件
Ø rpm -qa|grep httpd all查看所有已安裝的包並過濾
Ø rpm -qc httpd cofig查看某應用的配置文件位置
Ø rpm -qd httpd doc查看某應用的幫助文檔位置
Ø rpm-qf /etc/passwd 查看某文件來自於哪個rpm包
Ø rpm -qi setup-2.8.71-10.el7.noarch查看已安裝包的詳細信息
Ø rpm -ql httpd-tools 查看已安裝包產生的文件列表
Ø rpm -qpl yum-4.0.9.2-5.el8.noarch.rpm 查看未安裝的rpm包內文件列表
Ø rpm -qpi yum-4.0.9.2-5.el8.noarch.rpm 查看未安裝的rpm包的元數據信息

功能查詢

這個能力查詢功能是最長用的了

Ø --whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個包所提供 
Ø --whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴
Ø -R:查詢指定的程序包所依賴的CAPABILITY 

技巧舉例:

Ø rpm -q httpd --provides:列出httpd提供的CAPABILITY(能力)
Ø rpm -q httpd --whatprovides:查詢httpd這個能力是來自於哪個程序包
Ø rpm -q bash --whatprovides 查詢bash命令是由哪個包提供的
Ø rpm -q bash --whatrequires 查詢都有哪些包依賴bash這個能力

6.程序包校驗

這個包校驗雖然簡單,但在實際應用過程中可要注意涉及安全問題,尤其是現在網絡ISP爲了提供用戶體驗可能出現域名劫持,或HTTPS階段代理,如果我們使用yum下載安裝rpm包的過程中出現了域名劫持,然後yum客戶端倉庫配置文件配置了gpgcheck=1,gpgkey也配置了網上獲取,則如果yum源服務器域名被劫持了,那麼在第一次使有yum的時候非法的key會被自動導入到系統,即使開了gpgcheck功能也是枉然。這裏有個知識點要先確實一下:數據簽名技術,rpm包驗證也就是基本數據簽名技術。與微軟的數字簽名技術是一樣的

大概原理是將官方對rmp包做hash得到散列值A,然後用私鑰加密散列值得到的密文信息做爲額外屬性攜帶在rpm包中,客戶端拿到rpm包後將rpm包的數據部分做hash計算得到散列值B,然後再用官方發而的公鑰解密rpm包中攜帶的密文得到原始散列A,如果A=B則認爲該rpm包從官方發佈至今未做任何修改,並且一定是官方發佈的,否則公鑰無法解密密文得到A。

官方發佈的安裝包採用的是非對稱密鑰加密技術,私鑰加密碼公鑰解密-數字簽名的技術,公鑰導入系統後再安裝官方的rpm就不會出現簽名告警了,如果系統中沒有導入官方公鑰或已經導入公鑰但每次安裝rpm包都提供簽名告警那就真要注意了

公鑰管理:

官方的公鑰隨光盤攜帶,需要導入系統:
Ø 安裝公鑰:rpm --import RPM-GPG-KEY-CentOS-7
Ø 搜索公鑰:rpm -qa "*pubkey*"
Ø 查看公鑰:rpm -qi gpg-pubkey-f4a80eb5-53a7ff4b
Ø CentOS中存儲位置爲:/etc/pki/rpm-gpg
Ø 卸載公鑰:rpm -e gpg-pubkey

校驗程序文件屬性變化:從系統安裝到查詢時間點開始計算髮生變化就會顯示打上下標記

S file Size differs 
M Mode differs (includes permissions and file type) 
5 digest (formerly MD5 sum) differs 
D Device major/minor number mismatch 
L readLink(2) path mismatch 
U User ownership differs 
G Group ownership differs 
T mTime differs 
P capabilities differ 
rpm -V tree 

rpm解包操作

rpm2cpio /misc/cd/BaseOS/Packages/tree-1.7.0-15.el8.x86_64.rpm |cpio -idv ./

三、rpm微調選項

select-options 作爲包查詢、校驗操作的微調選項

 [PACKAGE_NAME]
 [-a,--all [SELECTOR]] [-f,--file FILE]
 [-g,--group GROUP] {-p,--package PACKAGE_FILE]
 [--hdrid SHA1] 
     [--pkgid MD5] 
     [--tid TID]
 [--querybynumber HDRNUM] 
     [--triggeredby PACKAGE_NAME]
 [--whatprovides CAPABILITY] 查詢指定的CAPABILITY由哪個程序包提供
     [--whatrequires CAPABILITY] 查詢哪些程序包依賴此CAPABILITY
 [--whatrecommends CAPABILITY]
     [--whatsuggests CAPABILITY]
 [--whatsupplements CAPABILITY] 
     [--whatenhances CAPABILITY]
 [--whatobsoletes CAPABILITY] 
     [--whatconflicts CAPABILITY]

query-options 作爲包查詢操作的微調選項

General: 常規查詢選項 
 [--changelog] 顯示包的更改記錄
     [--changes]  
     [--dupes] 
     [-i,--info]顯示包信息
 [--last] 
     [--qf,--queryformat QUERYFMT] 
     [--xml]

Dependencies:
 [--conflicts] 
     [--enhances] 
     [--obsoletes] 
     [--provides]
 [--recommends] 
     [-R,--requires] 
     [--suggests] 
     [--supplements]

Files:文件類查詢
 [-c,--configfiles] 查詢已安裝包的配置文件存儲位置 例:rpm -qc bash
     [-d,--docfiles] 查詢已安裝包的幫助文檔存儲位置 例:rpm -qd bash
     [--dump] 
     [--fileclass] 查詢已安裝包相關文件的類型 rpm -q bash --fileclass
 [--filecolor] 
     [--fileprovide]
     [--filerequire] rpm -q yum --filerequire
     [--filecaps]
 [--filesbypkg] 
     [-l,--list] 查看包相關的文件列表
     [-s,--state] 查看包相關的文件狀態
 [--noartifact] 
     [--noghost] 
     [--noconfig

Scripts and triggers:
 [--filetriggers] 
     [--scripts] 查看包安裝前後執行的腳本 rpm -q bash --scripts
     [--triggers,--triggerscripts]

verify-options

 [--nodeps] 不校驗軟件的依賴關係
     [--nofiles] 
     [--noscripts]
 [--nodigest] 
     [--nosignature] 不校驗數字簽名
 [--nolinkto] 
     [--nofiledigest] 
     [--nosize] 
     [--nouser]
 [--nogroup] 
     [--nomtime] 
     [--nomode] 
     [--nordev]
 [--nocaps]

install-options

 [--allfiles] 所有包
     [--badreloc] 
     [--excludepath OLDPATH]
 [--excludedocs] 
     [--force] 強制安裝,--replacefiles和—replacepkgs的綜合體
     [-h,--hash]
 [--ignoresize] 
     [--ignorearch] 忽略硬件架構平臺
     [--ignoreos] 忽略操作系統
 [--includedocs] 
     [--justdb] 更新數據庫,當不變動任何文件
 [--nodeps] 忽略依賴關係直接安裝
     [--nodigest] 不校驗包完整性
     [--noplugins] 
 [--nocaps] 
     [--noorder] 
     [--noverify] 
 [--nosignature] 忽略驗數字簽名,用於安裝第三方包
     [--noscripts] 不執行軟件包內的安裝前後腳本
     [--notriggers] 
 [--oldpackage] 用於軟件包降級
     [--percent] 安裝時顯示完成度百分比
     [--prefix NEWPATH] 指定安裝目錄,把文件放到指定的目錄下
 [--relocate OLDPATH=NEWPATH] 把本來會放到原目錄下的文件改放到新目錄。
 [--replacefiles] 替換文件
     [--replacepkgs] 替換包
 [--test] 測試安裝,但不真正執行安裝,即dry run模式 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章