Linux程序包管理
在早期我們使用源代碼的方式安裝軟件時,都需要先把源程序代碼編譯成可執行的二進制應用程序,然后進行安裝。意味著每次安裝軟件都需要經過 預處理
–> 編譯 –> 匯編–> 鏈接, 這個復雜的過程。為簡化安裝步驟,程序提供商就在特定的系統上面編譯好相關程序的安裝文件并進行打包,提供給人們下載,我們只需要根據自己的系統去下載相應的安裝包進行安裝即可,這里可以對比理解,windows和linux在程序包方面有類似的方面,都是由程序開發者將應用程序編譯好打包供需要的人下載,不同的地方是windows平臺應用程序的開發者是將應用程序編譯打包成二進制格式的可執行程序,而linux平臺應用程序開發者則是將應用程序編譯打包成rpm格式的軟件包。
那么既然應用程序都被打包,肯定需要一樣工具來管理程序包,這個工具就叫做程序包管理器.
什么是程序包管理器?
顧名思義“程序包管理器”,主要作用肯定是對軟件程序包進行管理的一種工具,那么我們在學習的時候就這理解。在Linux上,程序包管理器是用于管理Linux下軟件包的軟件,其主要功能是:
將編譯好的程序好的程序打包成一個文件或多個文件,可用于實現軟件的安裝、卸載升級、查詢等功能。
常見的程序包管理器有哪些?
兩大主流:
debian:deb,dpt。debian系。deb管理器,程序包以dpt結尾。
edhat:rpm,rpm。rhel系。 rpm管理器,程序包以rpm結尾。
程序包的組成部分以及安裝之后的存放路徑
– 二進制程序
存放路徑:/bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin
– 庫文件
存放路徑:/lib64,/usr/lib64,/usr/local/lib64等
– 配置文件
存放路徑:/etc或者conf目錄中
– 幫助文件
存放路徑:/usr/share/man,/usr/local/share/man等
rpm包命名方式
-
name-VERSION-release.arch.rpm
-
VERSION:major.minor.release 依次是主版本號.次版本號.發行號
??release.arch:rpm自身的發行號.平臺編號 -
常見的arch:
??x86(32位):i386,i486,i586,i686
??x86_64(64位):x64,x86_64,amd64
eg:
??zsh-5.0.2-14.el7.x86_64.rpm
???5.0.2:5(主版本號).0(次版本號).2(發行號)
???14.el7.x86_64:14(rpm自身的發行號).el7(表示適用redhat 7).x86_64(適用64位操作系統) -
分包機制:對于一個程序來說,其可能有很多功能,包括常用功能和非常用功能,弱把所有的功能打包到一塊兒,無疑程序包增大許多,一些普通用戶無需使用的功能都需一并下載安裝,無形之中造成了資源的浪費,所以,程序包在打包時就出現了分包機制,主要分為主包和支包。
eg:
??zlib-1.2.7-15.el7.x86_64.rpm –>主包
??zlib-devel-1.2.7-15.el7.x86_64.rpm –>支包
??zlib-static-1.2.7-15.el7.x86_64.rpm –>支包
管理程序包的方式:
使用報管理器:rpm
使用前端管理工具:yum,dnf
獲取程序包的途徑
-
系統發行版的光盤或官方的服務器
?CentOS鏡像:
???http://mirrors.aliyun.com
???http://mirrors.sohu.com
???http://mirrors.163.com -
項目官方站點
-
第三方組織
?Fedora-EPEL
?搜索引擎:
?? http://pkgs.org
??http://rpmfind.net
??http://rpm.pbone.net -
自己制作
CentOS系統上rpm命令管理程序包:
包括安裝、卸載、升級、查詢、校驗、數據庫維護
-
安裝:
??rpm {-i|–install} [install-options] PACKAGE_FILE …
?????-v: verbose
?????-vv:
?????-h: 以#顯示程序包管理執行進度;每個#表示2%的進度
??rpm -ivh PACKAGE_FILE…
[root@Daniel Packages]# rpm -qa lshw [root@Daniel Packages]# echo $? 0 [root@Daniel Packages]# rpm -ivh lshw-B.02.17-5.el7.x86_64.rpm 準備中... ################################# [100%] 正在升級/安裝... 1:lshw-B.02.17-5.el7 ################################# [100%] [root@Daniel Packages]# rpm -qa lshw lshw-B.02.17-5.el7.x86_64 [root@Daniel Packages]# rpm -e lshw [root@Daniel Packages]# rpm -qa lshw [root@Daniel Packages]# echo $? 0 [root@Daniel Packages]#
[install-options] --test: 測試安裝,但不真正執行安裝過程;dry run模式; --nodeps:忽略依賴關系; --replacepkgs: 重新安裝; --nosignature: 不檢查來源合法性; --nodigest:不檢查包完整性; --noscipts:不執行程序包腳本片斷; %pre: 安裝前腳本; --nopre %post: 安裝后腳本; --nopost %preun: 卸載前腳本; --nopreun %postun: 卸載后腳本; --nopostun
[root@Daniel Packages]# rpm -ivh --test unixODBC-2.3.1-11.el7.x86_64.rpm 準備中... ################################# [100%] [root@Daniel Packages]# rpm -qa unixODBC [root@Daniel Packages]# rpm -ivh --test unixODBC-2.3.1-11.el7.x86_64.rpm 準備中... ################################# [100%] [root@Daniel Packages]# rpm -qa unixODBC [root@Daniel Packages]# rpm -ivh unixODBC-2.3.1-11.el7.x86_64.rpm 準備中... ################################# [100%] 正在升級/安裝... 1:unixODBC-2.3.1-11.el7 ################################# [100%] [root@Daniel Packages]# rpm -qa unixODBC-2.3.1-11.el7.x86_64 [root@Daniel Packages]#
-
升級
?rpm {-U|–upgrade} [install-options] PACKAGE_FILE …
?rpm {-F|–freshen} [install-options] PACKAGE_FILE …
?upgrage:安裝有舊版程序包,則“升級”;如果不存在舊版程序包,則“安裝”;
?freeshen:安裝有舊版程序包,則“升級”;如果不存在舊版程序包,則不執行升級操作;
??rpm -Uvh PACKAGE_FILE …
??rpm -Fvh PACKAGE_FILE …
[root@Daniel Packages]# rpm -Uvh unixODBC-2.3.1-11.el7.x86_64.rpm 準備中... ################################# [100%] 正在升級/安裝... 1:unixODBC-2.3.1-11.el7 ################################# [100%] [root@Daniel Packages]# rpm -fvh unixODBC-2.3.1-11.el7.x86_64.rpm rpm:--hash (-h) 選項只能在軟件包安裝和擦除時指定 [root@Daniel Packages]# rpm -Fvh unixODBC-2.3.1-11.el7.x86_64.rpm [root@Daniel Packages]# echo $? 0 [root@Daniel Packages]#
--oldpackage:降級; --force: 強行升級;
??注意:(1) 不要對內核做升級操作;Linux支持多內核版本并存,因此,對直接安裝新版本內核;
?????(2) 如果原程序包的配置文件安裝后曾被修改,長級時,新版本的提供的同一個配置文件并不會直接覆蓋老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留;
-
查詢:
rpm {-q|--query} [select-options] [query-options] [select-options] -a: 所有包 -f: 查看指定的文件由哪個程序包安裝生成 -p /PATH/TO/PACKAGE_FILE:針對尚未安裝的程序包文件做查詢操作 --whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個包所提供; --whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴; [query-options] --changelog:查詢rpm包的changlog -c: 查詢程序的配置文件 -d: 查詢程序的文檔 -i: information -l: 查看指定的程序包安裝后生成的所有文件; --scripts:程序包自帶的腳本片斷 -R: 查詢指定的程序包所依賴的CAPABILITY; --provides: 列出指定程序包所提供的CAPABILITY; 用法: -qi PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE -qpi PACKAGE_FILE, -qpl PACKAGE_FILE, ... -qa
[root@Daniel Packages]# rpm -qi time Name : time Version : 1.7 Release : 45.el7 Architecture: x86_64 Install Date: 2016年02月21日 星期日 19時41分51秒 Group : Applications/System Size : 47926 License : GPLv2+ Signature : RSA/SHA256, 2014年07月04日 星期五 13時33分47秒, Key ID 24c6a8a7f4a80eb5 Source RPM : time-1.7-45.el7.src.rpm Build Date : 2014年06月12日 星期四 21時29分00秒 Build Host : worker1.bsys.centos.org Relocations : (not relocatable) Packager : CentOS BuildSystem < Vendor : CentOS URL : Summary : A GNU utility for monitoring a program's use of system resources Description :The GNU time utility runs another program, collects information aboutthe resources used by that program while it is running, and displaysthe results. [root@Daniel Packages]# rpm -qf /etc/grub.d/ grub2-tools-2.02-0.29.el7.centos.x86_64 [root@Daniel Packages]# rpm -ql time /usr/bin/time/usr/share/doc/time-1.7 /usr/share/doc/time-1.7/AUTHORS /usr/share/doc/time-1.7/COPYING /usr/share/doc/time-1.7/ChangeLog /usr/share/doc/time-1.7/NEWS /usr/share/doc/time-1.7/README /usr/share/info/time.info.gz
-
卸載:
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ... -e:表示擦除,卸載 --allmatcher:表示所有匹配到的 --nodeps:不依賴,表示僅卸載當前包 --noscripts:卸載時不執行腳本 --notriggers:卸載時不執行觸發器 --test:卸載測試,并不真正卸載
[root@Daniel Packages]# rpm -qa unixODBC unixODBC-2.3.1-11.el7.x86_64 [root@Daniel Packages]# rpm -e --test unixODBC 錯誤:依賴檢測失?。?nbsp; libesoobS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libmimerS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libnn.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libodbccr.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libodbcdrvcfg1S.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libodbcdrvcfg2S.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libodbcminiS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libodbcnnS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libodbctxtS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 liboplodbcS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 liboraodbcS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libsapdbS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libtdsS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libtemplate.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 unixODBC(x86-64) = 2.3.1-11.el7 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 [root@Daniel Packages]# rpm -e --test unixODBC --nodeps [root@Daniel Packages]# rpm -qa unixODBC [root@Daniel Packages]# rpm -e unixODBC 錯誤:依賴檢測失?。?nbsp; libesoobS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libmimerS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libnn.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libodbccr.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libodbcdrvcfg1S.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libodbcdrvcfg2S.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libodbcminiS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libodbcnnS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libodbctxtS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 liboplodbcS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 liboraodbcS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libsapdbS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libtdsS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libtemplate.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 unixODBC(x86-64) = 2.3.1-11.el7 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 [root@Daniel Packages]# rpm -e unixODBC --nodeps [root@Daniel Packages]# echo $? 0
-
校驗:
?rpm {-V|–verify} [select-options] [verify-options]
??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
?包來源合法性驗正及完整性驗正:
?完整性驗正:SHA256
?來源合法性驗正:RSA
?公鑰加密:
?對稱加密:加密、解密使用同一密鑰;
?非對稱加密:密鑰是成對兒的,
?public key: 公鑰,公開所有人
?secret key: 私鑰, 不能公開
?導入所需要公鑰:
??rpm –import /PATH/FROM/GPG-PUBKEY-FILE
CentOS 7發行版光盤提供的密鑰文件:RPM-GPG-KEY-CentOS-7
原創文章,作者:Daniel-W,如若轉載,請注明出處:http://www.www58058.com/17055
已置頂,歡迎加入免檢家庭
@stanley:感謝老師