溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Linux 入門學(xué)習(xí)之rpm軟件包管理

發(fā)布時(shí)間:2020-07-08 14:40:09 來源:網(wǎng)絡(luò) 閱讀:1304 作者:mzfiiooooii4455 欄目:數(shù)據(jù)庫

Linux入門之軟件包管理

linux有很多類的軟件包管理機(jī)制,但是在redhat、centos這類版本的系統(tǒng)中,都會使用一種相同的機(jī)制,就是rpm軟件包管理機(jī)制,當(dāng)然,還有其它版本的linux使用的不同機(jī)制:

debian:使.deb文件,dpkg包管理器

redhat:使用.rpm文件,rpm包管理器

 

軟件包在使用中又分類兩種(源碼包和二進(jìn)制包):

源碼包:一般是提供了一些源碼模塊和編譯腳步組合起來的壓縮文件,命令格式如:

name-version.tar.{gz|bz2|xz} 等,這里列舉出來一個(gè)源碼包:

[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

 

二進(jìn)制rpm包:實(shí)現(xiàn)被編譯包的,功能模塊事先已經(jīng)被設(shè)置好的軟件,命令格式如:

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  

版本號說明:

主版本號:軟件包有重大改進(jìn)

此版本號:某個(gè)子功能發(fā)生重大變化

發(fā)行號:修正了部分bug,調(diào)整了一點(diǎn)功能

 

 

軟件管理器的核心功能:

1、制作軟件包;

2、安裝、卸載、升級、查詢、校驗(yàn);

 

注意:rpm包自身有依賴關(guān)系,及安裝軟件包時(shí)需要先安裝其依賴的軟件包

 

軟件包工具分類:

前段工具:yumapt-get

后端工具:rpm,dpt

 

 

rpm命令:

rpm  rpmduild

rpm數(shù)據(jù)庫:/var/lib/rpm

注意:/var/lib/rpm中的某些文件如果只是被破壞,可以通過命令來創(chuàng)建或初始化數(shù)據(jù)庫,但是文件如果都被刪除,其數(shù)據(jù)庫信息將無法恢復(fù),因此,要時(shí)常對此做備份

 

rpm命令使用方法:

1、安裝:

rpm -i /PATH/TO/PACKAGE_FILE     注意:這里是軟件包文件的路徑

-h:以#符號顯示進(jìn)度,每個(gè)#符號表示2%進(jìn)度

-v:顯示詳細(xì)過程

-vv:顯示更為詳細(xì)的過程

 

rpm  -ivh /PATH/TO/PACHAGE_FILE  提示:這里一般組合使用顯示其安裝狀態(tài)

 --nodeps:忽略依賴關(guān)系;

 --replacepkgs:重新安裝,替換原有安裝;

 --replacefiles:會替換原有文件;

 --force:強(qiáng)行安裝,可以實(shí)現(xiàn)重裝或降級;

 --nosgnature:不檢查來源的合法性

 --nodigest:不檢查完整性

 --noscripts:不執(zhí)行程序包腳步

%pre:安裝前腳步;--nopre

%post:安裝后腳本;--nopost

%preun:卸載前腳步;--nopre

%postun:卸載后腳步;--nopost

注意:有時(shí)對于來源不明的軟件包,可以使用以上選項(xiàng)來防止軟件包里的危險(xiǎn)程序

 

2、升級:

rpm  -Uvh  /PATH/TO/NEW_PACKAGE_FILE:如果裝有老版本的,則升級,否則重裝

rpm  -Fvh  /PATH/TO/NEW_PACKAGE_FILE:如果有老版本的,則升級,否則退出

--oldpackage:降級

 

注意事項(xiàng):

1、不要對系統(tǒng)內(nèi)核進(jìn)行升級或降級安裝,Linux執(zhí)行多內(nèi)核并存,因此直接安裝新內(nèi)核即可

2、如果對kernel升級,升級前如果改變了原內(nèi)核中配置文件,那么升級后,原內(nèi)核的配置文件將被重命名為filename.rpmnew的文件,而使用新內(nèi)核的文件

 

3、查詢

rpm  -q  PACKAGE_NAME:查詢指定包是否已經(jīng)安裝

rpm  -qa:查看已經(jīng)安裝的所有軟件包

 

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:查詢指定的文件是由哪個(gè)rpm包安裝以后生成的;

rpm  --whatprovides  CAPABILTTY :查詢關(guān)鍵字或命令是由哪個(gè)包替換

rpm  --whatrequires  CAPABILTTY:查詢指定包或命令是被哪個(gè)包所依賴

 

如果包尚未安裝,我們需要查詢其說明信息、安裝以后會生成的文件:

rpm  -qpi  /PATH/TO/PACKAGE_FILES   查看軟件包文件信息

rpm  -qpl  /PATH/TO/PACKAGE_FILES   查看軟件包安裝后生成哪些文件

 

如果安裝后的文件有所丟失,而又有配置而不像重裝去覆蓋文件,可以通過工具處理:

rpm2cpio 包文件|cpio  -itv 預(yù)覽包文件

rpm2cpio  包文件|cpio  -idv *.conf 展開包文件

注意:里面可以是特定路徑或者文件通配符

 

rpm  --scripts  /PACKAGE_NAME:查詢包生成的腳步文件

 -R:查詢指定的程序包所依賴庫及軟件

 --provides:列出指定程序包提供的工具、命令

 --changelog:查詢rpm包的更改信息

 

4、卸載

rpm  -e  PACKAGENAME

rpm  --erase  PACKAGENME

           --nodeps:忽略依賴關(guān)系任然卸載

           --test:只是測試卸載過程,并不真正卸載  

           --noscripts:卸載時(shí)不運(yùn)行過程腳步

           --notriggers:不啟動觸發(fā)器

           --allmatches:卸載全部與其相配的文件

 

5、校驗(yàn)

rpm  -V  PACKNAME  PACKAGE_NAME

信息說明:

S  表示軟件更改信息

M 顯示權(quán)限信息

5  顯示加密信息

D  顯示主次設(shè)備號

L  顯示鏈接路徑數(shù)

U  顯示包用戶

G  顯示包用戶組

T  顯示更改時(shí)間

p  顯示更新對比屬性

 

6、校驗(yàn)軟件包來源合法性,及軟件包完整性:

密鑰文件:

          /etc/pki/rpm-gpg/目錄下:

          RPM-GPG-KEY-readhat-release

          RPM-GPG-KEY-centos-release

檢查軟件包的完整性:

rpm  -K  /path/to/rpmfile

信息說明:

dsp, gpg:驗(yàn)證來源合法性,也即驗(yàn)證前面字段,可以使用--nosignature略過此項(xiàng)

sha1, md5:驗(yàn)證軟件包完整性,可以使用--nodigest,略過此項(xiàng)

 

在此之前需要有公鑰的存在,可以使用命令導(dǎo)入公鑰:

rpm  --import  /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

 

卸載公鑰:

rpm  -qa  gpg-pubkey*  找出公鑰名稱

rpm  -e   gpg-pubkey......  卸載公鑰

 

7、重建數(shù)據(jù)庫

數(shù)據(jù)庫文件路徑:/var/lib/rpm/

使用命令重建:

rpm

--rebuilddb:重建數(shù)據(jù)庫,一定會重新建立;

--initdb:初始化數(shù)據(jù)庫,沒有才建立,有就不建立;

 

案例:

#掛載CentOS鏡像到/mnt/iso文件夾

[root@mzf ~]# mount /dev/cdrom  /mnt/iso/
mount: block device /dev/sr0 is write-protected, mounting read-only

#cd進(jìn)入/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

#發(fā)現(xiàn)已經(jīng)安裝

[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

#再次安裝,顯示進(jìn)度安裝成功

[root@mzf Packages]# rpm -ivh tree-1.5.3-3.el6.x86_64.rpm 
Preparing...                 ########################################### [100%]
   1:tree             ########################################### [100%]

#安裝zsh發(fā)現(xiàn)已經(jīng)被安裝過

[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強(qiáng)制安裝并覆蓋之前的安裝

[root@mzf Packages]# rpm -ivh --force zsh-4.3.11-4.el6.centos.2.x86_64.rpm 
Preparing...         ########################################### [100%]
   1:zsh          ########################################### [100%]


#查詢bind是否已經(jīng)安裝,發(fā)現(xiàn)只是一些庫和工具

[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

#安裝一個(gè)服務(wù)器配置,顯示此包依賴于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

#那么可以選擇一起安裝,也可以忽略、強(qiáng)制安裝

[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%)

說明:雖然裝上了,但是顯示一些錯(cuò)誤信息,因?yàn)闆]有主配置文件,這里我們還是一起安裝

[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
#沒有信息就說明已經(jīng)安裝成功

#檢驗(yàn)軟件包來源合法性,這里顯示正常

[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

#而檢驗(yàn)是通過公鑰文件來處理的,如果沒有這些文件,將會檢查失效

[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

#通過命令導(dǎo)入密鑰:

[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


 

如果安裝過的軟件的某些文件被刪除或者破壞,如何只恢復(fù)指定文件而不重裝?

#查看tree執(zhí)行文件的路徑

[root@mzf Packages]# which tree
/usr/bin/tree

#刪除出tree執(zhí)行文件

[root@mzf Packages]# rm -f /usr/bin/tree

#再次執(zhí)行已經(jīng)找不到此命令

[root@mzf Packages]# tree
-bash: tree: command not found

#通過rpm2cpiorpm包生成的文件列表寫成數(shù)據(jù)流傳給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

#根據(jù)上面顯示時(shí)說明展開默認(rèn)在當(dāng)前當(dāng)文件夾

#那么我們切換到家目錄

[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

#拷貝這個(gè)命令到原來tree命令所在的目錄

[root@mzf ~]# cp usr/bin/tree /usr/bin/tree

#發(fā)現(xiàn)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/

#已經(jīng)沒有任何庫文件

[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

#查詢已經(jīng)失效

[root@mzf ~]# rpm -qa
說明:這里的重建只是重新生成庫文件,但以前的記錄已經(jīng)沒有了,這時(shí)我們還原

#將剛才的文件再次移動到/var/lib/rpm

[root@mzf ~]# mv -f backup/* /var/lib/rpm/

#查詢之前安裝的軟件,發(fā)現(xiàn)可以查看了

[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

注意:這里如果只是一點(diǎn)文件或者鎖文件破壞,還可以使用重建數(shù)據(jù)庫拯救,但是如果/var/lib/rpm里的文件都被刪除了,就算重建了,記錄是找不回來的,這時(shí)就需要對庫文件進(jìn)行備份了

 

 

 


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI