您好,登錄后才能下訂單哦!
第一部分:程序編譯過程
一、軟件運行環境介紹
應用視角ABI:Application Binary Interface 應用二進制接口,程序應用者面對運行程序的接口,應用程序與調用庫之間的接口。
Linux:ELF(Executable and Linkable Format)
Windows:PE(Portable Executable)
二、軟件編譯過程
??我們獲取應用程序的源碼包后不能直接運行在操作系統平臺,需要通過編譯成不同操作系統支持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模式
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。