相關理論介紹
爲什麼需要RPM包來管理程序?
由於Linux真正可以執行的程序一定是二進制文件,因爲機器只能識別二進制數字,而程序員在開發時多是使用高級語言進行編程的,所以要想這些程序能夠在Linux上運行,源代碼必須最終被編譯成二進制文件。但是二進制應用程序的文件的構成也是複雜的,如果單獨安裝管理應用程序,並記錄程序相關的文檔,配置文件,會很不方便,所以需要對這些編譯後的二進制文件打包處理,因此就有了RPM包和PRM包管理器。
二進制應用程序的組成部分:
二進制文件:/bin, /sbin, /usr/bin, /usr/sbin
庫文件:/linb, /lib64, /usr/lib6
配置文件:/etc
幫助文件:manaul, info,README.txt, INSTALL.txt
常見程序包管理器有:
debian:deb, dpt
redhat: rpm,
rpm: Redhat Package Manager
RPM程序包管理:
功能:將編譯好的應用程序的各組成文件打包成一個或幾個程序包文件,從而方便快捷地實現程序包的安裝、卸載、查詢、升級和校驗等管理操作。
1、程序的組成清單 (每個包獨有)
文件清單
安裝或卸載時運行的腳本
2、數據庫(公共)
程序包名稱及版本
依賴關係;
功能說明;
安裝生成的各文件的文件路徑及校驗碼信息;
管理程序包的方式:
使用包管理器:rpm
使用前端工具:yum, dnf
獲取程序包的途徑:
(1) 系統發的光盤或官方的服務器;
CentOS鏡像:
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
(2) 項目官方站點,如apache官方站點www.apache.org
(3) 第三方組織:
Fedora-EPEL
搜索引擎:
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
RPM程序包管理器
RPM主要能實現對rpm包安裝、升級、卸載、查詢、校驗等功能。
安裝:
rpm {-i|--install} [install-options] PACKAGE_FILE ... -ivh:安裝包, v顯示安裝進度, -ivvh: vv的作用是詳細顯示安裝了哪些文件, 還有vvv --nodeps:忽略依賴關係強制安裝, 可能導致軟件功能不正常 --test:測試安裝,但不會正真安裝;dry run模式 --replacepkgs:強制重新安裝 --no scripts: 不執行程序包腳本片段 %pre: 安裝前腳本;--nopre %post: 安裝後腳本; --nopost %preun: 卸載前腳本; --nopreun %postun: 卸載後腳本; --nopostun [root@node2 Packages]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm warning: zsh-4.3.10-7.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Preparing... ########################################### [100%] 1:zsh ########################################### [100%] #顯示進度 [root@node2 Packages]# rpm -ivh --replacepkgs zsh-4.3.10-7.el6.x86_64.rpm #重新安裝 warning: zsh-4.3.10-7.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Preparing... ########################################### [100%] 1:zsh ########################################### [100%] [root@node2 Packages]# rpm -ivh php-5.3.3-38.el6.x86_64.rpm warning: php-5.3.3-38.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY error: Failed dependencies: #由於被依賴的包沒有安裝,所以導致安裝失敗,此時需先安裝被其依賴的包,纔可繼續安裝;或強制忽略依賴關係 php-cli(x86-64) = 5.3.3-38.el6 is needed by php-5.3.3-38.el6.x86_64 php-common(x86-64) = 5.3.3-38.el6 is needed by php-5.3.3-38.el6.x86_64 [root@node2 Packages]# rpm -ivh --nodeps php-5.3.3-38.el6.x86_64.rpm #強制忽略後,可以完成安裝,但程序不一定可以正常運行 warning: php-5.3.3-38.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Preparing... ########################################### [100%] 1:php ########################################### [100%] [root@node2 Packages]# rpm -ivh --test httpd-2.2.15-39.el6.centos.x86_64.rpm #測試安裝不會真正安裝程序包 warning: httpd-2.2.15-39.el6.centos.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Preparing... ########################################### [100%] package httpd-2.2.15-39.el6.centos.x86_64 is already installed [root@node2 Packages]# rpm -q httpd-2.2.15-39.el6.centos.x86_64.rpm #測試安裝並沒有正真安裝程序包 package httpd-2.2.15-39.el6.centos.x86_64.rpm is not installed
升級:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ... rpm {-F|--freshen} [install-options] PACKAGE_FILE ... upgrage:安裝有舊版程序包,則“升級”;如果不存在舊版程序包,則“安裝”(有則升級,無則安裝); freeshen:安裝有舊版程序包,則“升級”;如果不存在舊版程序包,則不執行升級操作(有則升級,無則不管); 格式:選項和普通安裝時的選項一致: rpm -Uvh PACKAGE_FILE ... rpm -Fvh PACKAGE_FILE ... --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被誰所依賴 [root@node2 Packages]# rpm -qa #可查看系統安裝過的所有的包 [root@node2 Packages]# rpm -qf /etc/passwd #查看/etc/passwd 由那個包提供 setup-2.8.14-20.el6_4.1.noarch [root@node2 Packages]# rpm -q --whatprovides passwd #查詢那個包提供了passwd功能 passwd-0.77-4.el6_2.2.x86_64 [root@node2 Packages]# rpm -q --whatrequires passwd #查詢passwd功能被誰依賴 usermode-1.102-3.el6.x86_64 [root@node2 //]# rpm -q php-com #查詢php-com有否安裝 package php-com is not installed [root@node2 //]# rpm -ql -p /mnt/cdrom/Packages/php-common-5.3.3-38.el6.x86_64.rpm #指定路徑,查找還未安裝的php-common包 warning: /mnt/cdrom/Packages/php-common-5.3.3-38.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY /etc/php.d /etc/php.d/curl.ini /etc/php.d/fileinfo.ini /etc/php.d/json.ini /etc/php.d/phar.ini /etc/php.d/zip.ini /etc/php.ini /usr/lib64/php
常用組合:
-qi PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE
-qpi PACKAGE_FILE, -qpl PACKAGE_FILE, ...
-qa
卸載:
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE [root@node2 ~]# rpm -q zsh zsh-4.3.11-4.el6.centos.x86_64 [root@node2 ~]# rpm -e zsh #卸載zsh程序包,如果成功卸載不會有任何輸出 [root@node2 ~]# rpm -q zsh #已經卸載成功 package zsh is not installed
校驗:
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
數據庫重建:
[root@centos7 rpm]# ls /var/lib/rpm #數據庫相關文件 Basenames __db.001 __db.003 Group Name Packages Requirename Sigmd5 Conflictname __db.002 Dirnames Installtid Obsoletename Providename Sha1header Triggername rpm {--initdb|--rebuilddb} initdb: 初始化 如果事先不存在數據庫,則新建之;否則,不執行任何操作; rebuilddb:重建 無論當前存在與否,直接重新創建數據庫; [root@node2 //]# echo '###' >> /etc/httpd/conf/httpd.conf #向httpd.conf末尾追加一行 [root@node2 //]# rpm -V httpd #對比httpd安裝包的元數據,查看httpd相關文檔是否有變化 S.5....T. c /etc/httpd/conf/httpd.conf #S, 5,T 表明其有改動過 [root@node2 Packages]# rpm -ivh --replacepkgs zsh-4.3.10-7.el6.x86_64.rpm #未導入gpgkey,安裝時候會有warning提示信息 warning: zsh-4.3.10-7.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Preparing... ########################################### [100%] 1:zsh ########################################### [100%] [root@node2 Packages]# rpm --import /mnt/cdrom/RPM-GPG-KEY-CentOS-6 #導入gpgkey [root@node2 Packages]# rpm -ivh --replacepkgs zsh-4.3.10-7.el6.x86_64.rpm #不再有warning Preparing... ########################################### [100%] 1:zsh ########################################### [100%]
Yum介紹
RPM包管理器在安裝rpm包時,如果有包的安裝存在依賴關係,則得首先安裝被其依賴的包,有時候包與包之間的依賴關係複雜,使用RPM來手動安裝包,就變得非常痛苦和低效。
Yum(Yellowdog Updater Modified): 是一前端包管理軟件,基於RPM包管理,能夠從指定服務器下載PRM包,並且自動判斷依賴關係,並自動安裝所有被依賴的包,無需頻繁的一次次下載,安裝。
yum repository: yum repo(yum倉庫)
存儲了衆多rpm包,以及包的相關的元數據文件(放置於特定目錄下:repodata,所以repodata所在的目錄就是yum 倉庫要指向的路徑)
每次啓動yum命令時,都連接yum服務器調取取元數據(通過對比校驗碼確認是否有數據更改,決定是否要下載,更新本地過時的緩存)
yum客戶端:
配置文件:
/etc/yum.conf:爲所有倉庫提供公共配置 ,一般無需修改
/etc/yum.repos.d/*.repo:爲倉庫的指向提供配置,如果文件名字不以.repo結果,則該倉庫不會被應用
倉庫指向的定義:
[repositoryID] #倉庫ID name=name for this repository #倉庫名稱 baseurl=url://path/to/repository/ #指定倉庫的路徑 enabled={1|0} #1代表啓用 gpgcheck={1|0}#是否檢查源的合法性,驗證簽名信息 gpgkey=ur1 #指明密鑰文件 enablegroups={1|0} failovermethod={roundrobin|priority} 默認爲:roundrobin,意爲隨機挑選;priority 從第一個開始查找 cost= 默認爲1000 相關命令: 顯示倉庫列表: repolist [all|enabled|disabled]
顯示程序包:
list
# yum list [all | glob_exp1] [glob_exp2] [...]
# yum list {available|installed|updates} [glob_exp1] [...]
[root@node2 ~]# yum list httpd Loaded plugins: fastestmirror, refresh-packagekit, security Loading mirror speeds from cached hostfile Installed Packages httpd.x86_64 2.2.15-39.el6.centos @LocalCD/$releasever Available Packages httpd.x86_64 2.2.15-45.el6.centos
安裝程序包:
install package1 [package2] [...]
reinstall package1 [package2] [...] (重新安裝)
升級程序包:
update [package1] [package2] [...]
downgrade package1 [package2] [...] (降級)
檢查可用升級:
check-update
卸載程序包:
remove | erase package1 [package2] [...]
查看程序包information:
info [...]
包組管理的相關命令:
* groupinstall group1 [group2] [...]
* groupupdate group1 [group2] [...]
* grouplist [hidden] [groupwildcard] [...]
* groupremove group1 [group2] [...]
* groupinfo group1 [...]
yum grouplist #查看源裏面的所有包組
yum groupinstall "Development tools"
yum groupinfo "Development tools"
清理本地緩存:
yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
常用yum clean all, yum通常會自動刪除已安裝的包的緩存
構建緩存:
makecache
yum的命令行選項:
--nogpgcheck:禁止進行gpg check;
-y: 自動回答爲“yes”;
-q:靜默模式;
--disablerepo=repoidglob:臨時禁用此處指定的repo,(即便配置文件中已經啓用,命令模式優先於配置文件)
--enablerepo=repoidglob:臨時啓用此處指定的repo;
--noplugins:禁用所有插件;
練習:使用本地光盤搭建一個Yum倉庫,利用Yum安裝程序包
第一步:掛載光盤,找到Repodata目錄
[root@node2 /]# mount /dev/cdrom /mnt/cdrom/ mount: block device /dev/sr0 is write-protected, mounting read-only [root@node2 /]# ls /mnt/cdrom/ #Repodata所在的目錄就是倉庫要指向的路徑,裏面定義了包與包之間的依賴關係 [root@node2 /]# ll /mnt/cdrom/ total 712 -r--r--r-- 2 root root 14 Oct 24 2014 CentOS_BuildTag dr-xr-xr-x 3 root root 2048 Oct 24 2014 EFI -r--r--r-- 2 root root 212 Nov 28 2013 EULA -r--r--r-- 2 root root 18009 Nov 28 2013 GPL dr-xr-xr-x 3 root root 2048 Oct 24 2014 images dr-xr-xr-x 2 root root 2048 Oct 24 2014 isolinux dr-xr-xr-x 2 root root 686080 Oct 24 2014 Packages -r--r--r-- 2 root root 1354 Oct 20 2014 RELEASE-NOTES-en-US.html dr-xr-xr-x 2 root root 4096 Oct 24 2014 repodata -r--r--r-- 2 root root 1706 Nov 28 2013 RPM-GPG-KEY-CentOS-6 -r--r--r-- 2 root root 1730 Nov 28 2013 RPM-GPG-KEY-CentOS-Debug-6 -r--r--r-- 2 root root 1730 Nov 28 2013 RPM-GPG-KEY-CentOS-Security-6 -r--r--r-- 2 root root 1734 Nov 28 2013 RPM-GPG-KEY-CentOS-Testing-6 -r--r--r-- 1 root root 3380 Oct 24 2014 TRANS.TBL [root@node2 /]#
第二步:自定義xxx.repo文件,並配置,並禁用系統自帶的.repo文件
[root@node2 yum.repos.d]# cat local.repo [LocalCD] name="local CD" baseurl=file:///mnt/cdrom #定義了yum倉庫的路徑 gpgcheck=no #不做包合法性檢查 enabled=1 #啓用此yum源,如果沒有此行,也會默認啓用 [root@node2 yum.repos.d]# ls CentOS-Base.repo CentOS-Debuginfo.repo CentOS-fasttrack.repo CentOS-Media.repo CentOS-Vault.repo local.repo [root@node2 yum.repos.d]# mv CentOS-Base.repo{,.bak} #J將系統自帶的倉庫配置文件改名後,就可以停用它
第三步:檢查yum倉庫能否正常使用
[root@node2 yum.repos.d]# yum repolist Loaded plugins: fastestmirror, refresh-packagekit, security Loading mirror speeds from cached hostfile repo id repo name status LocalCD "local CD" 6,518 repolist: 6,518 [root@node2 yum.repos.d]# yum install zsh #嘗試yum install zsh, 出現如下信息即代表正常 Loaded plugins: fastestmirror, refresh-packagekit, security Setting up Install Process Loading mirror speeds from cached hostfile Resolving Dependencies --> Running transaction check ---> Package zsh.x86_64 0:4.3.10-7.el6 will be installed --> Finished Dependency Resolution Dependencies Resolved ============================================================================================================================================================================================= Package Arch Version Repository Size ============================================================================================================================================================================================= Installing: zsh x86_64 4.3.10-7.el6 LocalCD 2.1 M Transaction Summary ============================================================================================================================================================================================= Install 1 Package(s) Total download size: 2.1 M