您好,登錄后才能下訂單哦!
在linux有很多類的軟件包管理機制,但是在redhat、centos這類版本的系統中,都會使用一種相同的機制,就是rpm軟件包管理機制,當然,還有其它版本的linux使用的不同機制:
debian:使.deb文件,dpkg包管理器
redhat:使用.rpm文件,rpm包管理器
軟件包在使用中又分類兩種(源碼包和二進制包):
源碼包:一般是提供了一些源碼模塊和編譯腳步組合起來的壓縮文件,命令格式如:
name-version.tar.{gz|bz2|xz} 等,這里列舉出來一個源碼包:
[root@localhost ~]# ls -l tengine-1.4.2.tar.gz
-rw-r--r-- 1 root root 1185902 Aug 15 18:57 tengine-1.4.2.tar.gz
二進制rpm包:實現被編譯包的,功能模塊事先已經被設置好的軟件,命令格式如:
rpm包的組成:
主包:
name-version-release.arch.rpm 例如:
bind-9.7.1-1.e15.i586.rpm
子包:
name-toolname-9.7.1-1.e15.i586.rpm 例如:
bind-libs-9.7.1-1.e15.i586.rpm
bind-utils-9.7.1-1.e15.i586.rpm
包名格式:
name-version-release.arch.rpm
bind-major.minor.release-release.arch.rpm
版本號說明:
主版本號:軟件包有重大改進
此版本號:某個子功能發生重大變化
發行號:修正了部分bug,調整了一點功能
軟件管理器的核心功能:
1、制作軟件包;
2、安裝、卸載、升級、查詢、校驗;
注意:rpm包自身有依賴關系,及安裝軟件包時需要先安裝其依賴的軟件包
軟件包工具分類:
前段工具:yum,apt-get
后端工具:rpm,dpt
rpm命令:
rpm rpmduild
rpm數據庫:/var/lib/rpm
注意:/var/lib/rpm中的某些文件如果只是被破壞,可以通過命令來創建或初始化數據庫,但是文件如果都被刪除,其數據庫信息將無法恢復,因此,要時常對此做備份
rpm命令使用方法:
1、安裝:
rpm -i /PATH/TO/PACKAGE_FILE 注意:這里是軟件包文件的路徑
-h:以#符號顯示進度,每個#符號表示2%進度
-v:顯示詳細過程
-vv:顯示更為詳細的過程
rpm -ivh /PATH/TO/PACHAGE_FILE 提示:這里一般組合使用顯示其安裝狀態
--nodeps:忽略依賴關系;
--replacepkgs:重新安裝,替換原有安裝;
--replacefiles:會替換原有文件;
--force:強行安裝,可以實現重裝或降級;
--nosgnature:不檢查來源的合法性
--nodigest:不檢查完整性
--noscripts:不執行程序包腳步
%pre:安裝前腳步;--nopre
%post:安裝后腳本;--nopost
%preun:卸載前腳步;--nopre
%postun:卸載后腳步;--nopost
注意:有時對于來源不明的軟件包,可以使用以上選項來防止軟件包里的危險程序
2、升級:
rpm -Uvh /PATH/TO/NEW_PACKAGE_FILE:如果裝有老版本的,則升級,否則重裝
rpm -Fvh /PATH/TO/NEW_PACKAGE_FILE:如果有老版本的,則升級,否則退出
--oldpackage:降級
注意事項:
1、不要對系統內核進行升級或降級安裝,Linux執行多內核并存,因此直接安裝新內核即可
2、如果對kernel升級,升級前如果改變了原內核中配置文件,那么升級后,原內核的配置文件將被重命名為filename.rpmnew的文件,而使用新內核的文件
3、查詢
rpm -q PACKAGE_NAME:查詢指定包是否已經安裝
rpm -qa:查看已經安裝的所有軟件包
rpm -qi PACKAGE_NAME:查詢指定包的安裝包的說明信息;
rpm -ql PACKAGE_NAME:查詢指定包安裝后生成的文件列表;
rpm -qc PACKAGE_NAME:查詢指定包安裝后生成配置文件;
rpm -qd PACKAGE_NAME:查詢指定包安裝的幫助文件;
rpm --scripts PACKAGE_NAME:查詢指明包中包含的腳步
rpm -qf /PATH/TO/SOMEFILE:查詢指定的文件是由哪個rpm包安裝以后生成的;
rpm --whatprovides CAPABILTTY :查詢關鍵字或命令是由哪個包替換
rpm --whatrequires CAPABILTTY:查詢指定包或命令是被哪個包所依賴
如果包尚未安裝,我們需要查詢其說明信息、安裝以后會生成的文件:
rpm -qpi /PATH/TO/PACKAGE_FILES 查看軟件包文件信息
rpm -qpl /PATH/TO/PACKAGE_FILES 查看軟件包安裝后生成哪些文件
如果安裝后的文件有所丟失,而又有配置而不像重裝去覆蓋文件,可以通過工具處理:
rpm2cpio 包文件|cpio -itv 預覽包文件
rpm2cpio 包文件|cpio -idv “*.conf” 展開包文件
注意:里面可以是特定路徑或者文件通配符
rpm --scripts /PACKAGE_NAME:查詢包生成的腳步文件
-R:查詢指定的程序包所依賴庫及軟件
--provides:列出指定程序包提供的工具、命令
--changelog:查詢rpm包的更改信息
4、卸載
rpm -e PACKAGENAME
rpm --erase PACKAGENME
--nodeps:忽略依賴關系任然卸載
--test:只是測試卸載過程,并不真正卸載
--noscripts:卸載時不運行過程腳步
--notriggers:不啟動觸發器
--allmatches:卸載全部與其相配的文件
5、校驗
rpm -V PACKNAME PACKAGE_NAME
信息說明:
S 表示軟件更改信息
M 顯示權限信息
5 顯示加密信息
D 顯示主次設備號
L 顯示鏈接路徑數
U 顯示包用戶
G 顯示包用戶組
T 顯示更改時間
p 顯示更新對比屬性
6、校驗軟件包來源合法性,及軟件包完整性:
密鑰文件:
/etc/pki/rpm-gpg/目錄下:
RPM-GPG-KEY-readhat-release
RPM-GPG-KEY-centos-release
檢查軟件包的完整性:
rpm -K /path/to/rpmfile
信息說明:
dsp, gpg:驗證來源合法性,也即驗證前面字段,可以使用--nosignature略過此項
sha1, md5:驗證軟件包完整性,可以使用--nodigest,略過此項
在此之前需要有公鑰的存在,可以使用命令導入公鑰:
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
卸載公鑰:
rpm -qa gpg-pubkey* 找出公鑰名稱
rpm -e gpg-pubkey...... 卸載公鑰
7、重建數據庫
數據庫文件路徑:/var/lib/rpm/
使用命令重建:
rpm
--rebuilddb:重建數據庫,一定會重新建立;
--initdb:初始化數據庫,沒有才建立,有就不建立;
案例:
#掛載CentOS鏡像到/mnt/iso文件夾
[root@mzf ~]# mount /dev/cdrom /mnt/iso/ mount: block device /dev/sr0 is write-protected, mounting read-only
#cd進入/mnt/iso目錄
[root@mzf ~]# cd /mnt/iso/ [root@mzf iso]# pwd /mnt/iso
#查看軟件包存放在Packages中
[root@mzf iso]# ls CentOS_BuildTag EULA p_w_picpaths Packages repodata RPM-GPG-KEY-CentOS-Debug-6 RPM-GPG-KEY-CentOS-Testing-6 EFI GPL isolinux RELEASE-NOTES-en-US.html RPM-GPG-KEY-CentOS-6 RPM-GPG-KEY-CentOS-Security-6 TRANS.TBL
#cd到此Packages目錄中
[root@mzf iso]# cd Packages/
#找出tree軟件
[root@mzf Packages]# find ./ -name "tree-1.5.3-3.el6.x86_64.rpm" ./tree-1.5.3-3.el6.x86_64.rpm
#發現已經安裝
[root@mzf Packages]# rpm -ivh tree-1.5.3-3.el6.x86_64.rpm Preparing... ########################################### [100%] package tree-1.5.3-3.el6.x86_64 is already installed
#那就先卸載此文件
[root@mzf Packages]# rpm -e tree
#再次安裝,顯示進度安裝成功
[root@mzf Packages]# rpm -ivh tree-1.5.3-3.el6.x86_64.rpm Preparing... ########################################### [100%] 1:tree ########################################### [100%]
#安裝zsh發現已經被安裝過
[root@mzf Packages]# rpm -ivh zsh-4.3.11-4.el6.centos.2.x86_64.rpm Preparing... ########################################### [100%] package zsh-4.3.11-4.el6.centos.2.x86_64 is already installed
#使用--force強制安裝并覆蓋之前的安裝
[root@mzf Packages]# rpm -ivh --force zsh-4.3.11-4.el6.centos.2.x86_64.rpm Preparing... ########################################### [100%] 1:zsh ########################################### [100%]
#查詢bind是否已經安裝,發現只是一些庫和工具
[root@mzf Packages]# rpm -qa | grep '^bind' bind-libs-9.8.2-0.47.rc1.el6.x86_64 bind-utils-9.8.2-0.47.rc1.el6.x86_64
#安裝一個服務器配置,顯示此包依賴于bind-9.8.2-0.47.rc1.el6 包
[root@mzf Packages]# rpm -ivh bind-chroot-9.8.2-0.47.rc1.el6.x86_64.rpm error: Failed dependencies: bind = 32:9.8.2-0.47.rc1.el6 is needed by bind-chroot-32:9.8.2-0.47.rc1.el6.x86_64
#那么可以選擇一起安裝,也可以忽略、強制安裝
[root@mzf Packages]# rpm -ivh --nodeps --force bind-chroot-9.8.2-0.47.rc1.el6.x86_64.rpm Preparing... ########################################### [100%] 1:bind-chroot warning: group named does not exist - using root warning: group named does not exist - using root%) warning: group named does not exist - using root%) warning: group named does not exist - using root%)
說明:雖然裝上了,但是顯示一些錯誤信息,因為沒有主配置文件,這里我們還是一起安裝
[root@mzf Packages]# rpm -ivh bind-9.8.2-0.47.rc1.el6.x86_64.rpm Preparing... ########################################### [100%] 1:bind warning: /etc/sysconfig/named created as /etc/sysconfig/named.rpmnew ########################################### [100%]
#卸載剛才安裝的軟件
[root@mzf Packages]# rpm -e bind-chroot #沒有信息就說明已經安裝成功
#檢驗軟件包來源合法性,這里顯示正常
[root@mzf Packages]# rpm -K bind-chroot-9.8.2-0.47.rc1.el6.x86_64.rpm bind-chroot-9.8.2-0.47.rc1.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
#而檢驗是通過公鑰文件來處理的,如果沒有這些文件,將會檢查失效
[root@mzf Packages]# ls /etc/pki/rpm-gpg/ RPM-GPG-KEY-CentOS-6 RPM-GPG-KEY-CentOS-Debug-6 RPM-GPG-KEY-CentOS-Security-6 RPM-GPG-KEY-CentOS-Testing-6
#通過命令導入密鑰:
[root@mzf Packages]# rpm --import /mnt/iso/RPM-GPG-KEY-CentOS-6
#查看剛才安裝的密鑰
[root@mzf Packages]# rpm -qa | grep 'gpg.*key' gpg-pubkey-c105b9de-4e0fd3a3
#卸載此密鑰
[root@mzf Packages]# rpm -e gpg-pubkey
如果安裝過的軟件的某些文件被刪除或者破壞,如何只恢復指定文件而不重裝?
#查看tree執行文件的路徑
[root@mzf Packages]# which tree /usr/bin/tree
#刪除出tree執行文件
[root@mzf Packages]# rm -f /usr/bin/tree
#再次執行已經找不到此命令
[root@mzf Packages]# tree -bash: tree: command not found
#通過rpm2cpio將rpm包生成的文件列表寫成數據流傳給cpio查看
[root@mzf Packages]# rpm2cpio ./tree-1.5.3-3.el6.x86_64.rpm | cpio -tv -rwxr-xr-x 1 root root 41136 Jan 14 2015 ./usr/bin/tree drwxr-xr-x 2 root root 0 Jan 14 2015 ./usr/share/doc/tree-1.5.3 -rw-r--r-- 1 root root 18009 Aug 13 2004 ./usr/share/doc/tree-1.5.3/LICENSE -rw-r--r-- 1 root root 4167 Oct 20 2009 ./usr/share/doc/tree-1.5.3/README -rw-r--r-- 1 root root 3375 Jan 14 2015 ./usr/share/man/man1/tree.1.gz
#根據上面顯示時說明展開默認在當前當文件夾
#那么我們切換到家目錄
[root@mzf Packages]# cd
#只展開出tree命令
[root@mzf~]#rpm2cpio /mnt/iso/Packages/tree-1.5.3-3.el6.x86_64.rpm | cpio -idv ./usr/bin/tree ./usr/bin/tree 132 blocks
#拷貝這個命令到原來tree命令所在的目錄
[root@mzf ~]# cp usr/bin/tree /usr/bin/tree
#發現tree命令又可以使用了
[root@mzf ~]# tree . ├── anaconda-ks.cfg ├── checkdisk.sh
重建庫文件
#查詢庫文件
[root@mzf ~]# ls /var/lib/rpm/ Basenames __db.001 __db.003 Dirnames Group Name Packages Provideversion Requirename Sha1header Triggername Conflictname __db.002 __db.004 Filedigests Installtid Obsoletename Providename Pubkeys Requireversion Sigmd5
#備份移動庫文件
[root@mzf ~]# mkdir backup [root@mzf ~]# mv /var/lib/rpm/* backup/
#已經沒有任何庫文件
[root@mzf ~]# ls /var/lib/rpm/
#初始化庫文件
[root@mzf ~]# rpm --initdb [root@mzf ~]# ls /var/lib/rpm/ __db.001 __db.002 __db.003 __db.004 Packages
#重建庫文件
[root@mzf ~]# rpm --rebuilddb [root@mzf ~]# ls /var/lib/rpm/ Packages
#查詢已經失效
[root@mzf ~]# rpm -qa 說明:這里的重建只是重新生成庫文件,但以前的記錄已經沒有了,這時我們還原
#將剛才的文件再次移動到/var/lib/rpm下
[root@mzf ~]# mv -f backup/* /var/lib/rpm/
#查詢之前安裝的軟件,發現可以查看了
[root@mzf ~]# rpm -qa | grep '^bind.*' bind-libs-9.8.2-0.47.rc1.el6.x86_64 bind-9.8.2-0.47.rc1.el6.x86_64
bind-utils-9.8.2-0.47.rc1.el6.x86_64
注意:這里如果只是一點文件或者鎖文件破壞,還可以使用重建數據庫拯救,但是如果/var/lib/rpm里的文件都被刪除了,就算重建了,記錄是找不回來的,這時就需要對庫文件進行備份了
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。