《Linux系統》之"深入淺出"(一)軟件包管理機制RPM

在window系統下,我們只需要點擊軟件的安裝程序,然後傻瓜式的連續點擊下一步下一步即可;想卸載的話,我們只需要去控制面板裏選擇我們要卸載的軟件,然後點擊卸載按鍵,是非常的方便。但是在安全係數上,就沒有Linux系統高了。

那麼,如何在Linux系統上安裝我們想要的軟件呢?又如何對已經安裝的軟件進行升級或者是卸載呢?

一、 軟件包管理技術的簡介

爲了使用戶更方便的在Linux系統上管理應用程序,Red Hat公司和Debian Linux社羣各自開發了一個管理機制,來幫助用戶管理Linux系統上的應用程序,比如安裝,升級或者卸載。讓用戶不再煩惱Linux系統上的程序管理(最開始的程序安裝,要通過原始代碼來安裝,又要編譯,有要檢查環境的,特別麻煩)。

1、RPM與YUM

RPM這個機制最早是又RedHat公司開發出來的,後來由於特別好用,因此許多Linux廠商就使用這個機制來做爲軟件安裝的管理方式,包括Fedora,CentOS,SuSe等等知名的Linux廠商。而RPM在管理軟件的依賴關係上有一些短板,因此RedHat又在RPM機制上推出了YUM線上升級技術,來管理軟件的依賴性。

2、DPKG與APT

這個機制最早是由DebianLinux設社羣開發的。通過這個機制,Debian提供的軟件就可以輕鬆的安裝成功,同時還可以記錄安裝後的軟件資訊。只要是衍生字Debian的其他Linux版本,都是用了dpkg這種機制來管理軟件,如B2D,Ubuntu等。同樣的問題,dpkg機制也是有的,那就是在管理軟件的依賴關係上。不過,Debian後來推出了APT線上升級技術,來彌補dpkg的不足。

distribution 代表 軟件管理機制 使用指令 線上升級機制(指令)
Red Hat/Fedora RPM rpm, rpmbuild YUM (yum)
Debian/Ubuntu DPKG dpkg APT (apt-get)

 

3、軟件包的命名規則

如:mariadb-10.0.15-linux-i686.rpm

第一部分:表示軟件名稱

第二部分:表示版本信息,通常最前面的數字表示版本號,如10,後面的小數字表示此版本的小改動次數

第三部分:表示適用的操作平臺

二、RPM的使用

1、RMP的安裝原理

rpm的使用,其實很簡單,只需要熟知幾個選項和語法,就可以用來安裝軟件了。不過,我們仍然要知道rpm的安裝原理。

我們使用rpm來安裝一個應用程序時,rpm會先讀取該應用程序的文檔內記載的預設參數內容,然後用來與Linux系統的環境做對比,找出是否有依賴的程序尚未安裝。如果有依賴的程序,且尚未安裝,則提示用戶需要什麼程序。

如果Linux系統環境合格,rpm就會將該程序安裝到Linux系統上。安裝過程中,該程序相關的資訊信息就會被寫入/var/lib/rpm目錄下的資料庫中(這個目錄很重要的)。而該程序的核心文件會默認放置在下面的目錄中。

/etc 一些配置文檔存儲的目錄,例如 /etc/ssh
/usr/bin 一些可執行文件的目錄
/usr/lib 一些程式使用的動態函數庫
/usr/share/doc 一些基本的程序使用手冊和說明文檔
/usr/share/man 一些 man page 文檔

這裏說明一下資料庫,以後如果對軟件升級,版本的比較信息就來源於這裏,還有,我們可能會經常查詢系統已經安裝的程序,也是從這裏進行查詢的。

2、RPM查詢軟件包

在Linux系統上安裝一個程序之前,我們在習慣上,會先查詢是否安裝過這款程序,如果安裝過,我們就不用再安裝了,如果沒有安裝過,我們再去安裝,這是一個好習慣。

rpm的查詢是我們最常用的一項功能,我們可以查詢很多關於已裝程序或未裝程序的信息,它可以在/var/lib/rpm這個目錄的資料庫進行查詢,也可以查詢未安裝的rpm文檔內的信息。

常用寫法:

[root@study ~]# rpm -qa                                                                 <==查詢系統內已安裝程序
[root@study ~]# rpm -q【licdR】 【已安裝的程序名】                  <==查詢系統內某個已安裝程序的信息 
[root@study ~]# rpm -q【f】 【系統內的文檔名】                         <==查詢系統內某個已安裝程序 
[root@study ~]# rpm -qp【licdR】 【未安裝的程序名稱】             <==查詢系統內某個未安裝RPM文檔

常用的選項參數介紹:

-q :用於查詢指定的程序是否已經安裝 
-qa :列出所有已經安裝在Linux系統下的程序名稱
-qi :列出該程序的詳細信息 ,如版本號,發行時間,安裝時間等
-ql :列出該程序所有的文檔與目錄
-qc :列出該程序的所有配置文件 (通常是指在 /etc/ 底下的文件)
-qd :列出該程序的所有說明文檔 (指與 man 有關的文件)
-qR :列出與該程序有關的依賴軟件所含的文件 (Required 的意思)
-qf :找出指定文件屬於哪一個已經安裝的程序 

應用案例1:查詢Linux中是否安裝了jdk1.8

[root@master bin]# rpm -q jdk1.8
jdk1.8-1.8.0_172-fcs.x86_64
[root@master bin]# rpm -q jdk
package jdk is not installed                 <==由此可見,必須指定軟件名稱,可以不用加上版本號

應用案例2:查詢Linux系統下安裝的的所有軟件

[root@master bin]# rpm -qa | more                     <==可以藉助 more指令來分頁顯示
control-center-2.28.1-39.el6.x86_64
m17n-db-punjabi-1.5.5-1.1.el6.noarch
valgrind-3.8.1-3.2.el6.x86_64
libreport-newt-2.0.9-19.el6.centos.x86_64
iso-codes-3.16-2.el6.noarch
xorg-x11-drv-vmmouse-12.9.0-10.el6.x86_64
......
[root@master bin]# rpm -qa | grep jdk          <==可以藉助 grep指令來指定關鍵字,適用於不知道軟件全名的情況下
java-1.7.0-openjdk-1.7.0.45-2.4.3.3.el6.x86_64
jdk1.8-1.8.0_172-fcs.x86_64
java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.x86_64

應用案例3:查看軟件jdk1.8的所有目錄和文檔

[root@master bin]# rpm -ql jdk1.8 | more  
/usr
/usr/java
/usr/java/jdk1.8.0_172-amd64
/usr/java/jdk1.8.0_172-amd64/.java
/usr/java/jdk1.8.0_172-amd64/.java/.systemPrefs
.......:   
<==可以看出該程序到底提供了多少文件與目錄,也可以用於追蹤程序的資料

應用案例4:查看軟件jdk1.8的信息詳情。

[hyxy@master 桌面]$ rpm -qi jdk1.8
Name        : jdk1.8                       Relocations: /usr/java 
Version     : 1.8.0_172                         Vendor: Oracle Corporation
Release     : fcs                           Build Date: 2018年03月29日 星期四 13
.....................

應用案例5:若要成功安裝 jdk1.8 ,它還需要什麼文檔的幫助?      

[hyxy@master 桌面]$ rpm -qR jdk1.8         
/bin/basename  
/bin/cat  
/bin/cp  
....<== 選項-qR只能查詢已經成功安裝的軟件所需要的文檔,未安裝的請參考應用案例7

應用案例6:查詢 /bin/sh文檔是哪個軟件提供的

[hyxy@master test]$ rpm -qf /bin/sh
bash-4.1.2-15.el6_4.x86_64

應用案例7::查詢剛剛上傳的RPM 軟件需要什麼必須的文檔

[hyxy@master test]$ rpm -qpR jdk-8u172-linux-x64.rpm 
/bin/basename  
/bin/cat  
/bin/cp 

3、RPM安裝軟件包

這個得強調一下,使用RPM安裝軟件包時,必須要獲取root身份。

基本語法:rpm  [-ivh]   軟件包名

選項解析:

-i : 安裝的含義
-v:安裝過程中顯示詳情
-h:以進度條的形式顯示安裝進度

應用案例1:

[root@master test]# rpm -ivh jdk-8u172-linux-x64.rpm 
Preparing...                ########################################### [100%]
   1:jdk1.8                 ########################################### [100%]
Unpacking JAR files...
    tools.jar...
    plugin.jar...
    javaws.jar...
    deploy.jar...
    rt.jar...
    jsse.jar...
    charsets.jar...
    localedata.jar...
[root@master test]# 

通常在安裝軟件包的時候,這三個選項就夠了,如果有軟件依賴關係,會進行提醒需要提前安裝什麼,這樣我們在異議解決問題的時候,就會了解很多東西。不過,我們也可以通過一些參數來進行安裝測試、強制安裝、覆蓋安裝、指定安裝路徑等操作。

參數 代表意義
--nodeps 安裝或卸載軟件時,有依賴關係時,可以進行強制安裝或卸載。
有一定的危險性,安裝後可以能造成軟件無法正常使用!
--replacefiles 安裝時,軟件中的某個文件可能已經安裝過,或者版本衝突時,可以進行強制覆蓋操作。
覆蓋操作無法還原,因此要不要覆蓋,請一定要注意!
--replacepkgs 當使用 rpm -ivh *.rpm 安裝一堆軟件時,可能會報某些軟件已經安裝過,此時可以使用此參數進行覆蓋安裝。
--force 相當於--replacefiles和--replacepkgs的綜合體
--test 在安裝前,可以進行安裝測試,查看軟件的依賴關係。rpm -ivh pkgname.i386.rpm --test
--justdb 當某軟件的資料庫破損或者產生錯誤時,可以使用這個參數來進行修復
--prefix 新路徑 用於指定軟件的安裝路徑,不使用默認路徑

4、RPM的升級與更新

格式:rpm -Uvh 軟件包名

使用rpm對軟件進行升級很簡單,只要使用-Uvh選項就可以咯。如果後面指定的安裝包沒有安裝過,就會自動安裝此軟件包,如果安裝過舊版,就會進行升級。

5、RPM卸載安裝包

格式:rpm -e 軟件名稱

當你想卸載某一個軟件時,就可以使用選項【-e】。

不過,一般情況下,安裝某個軟件包後,在Linux系統下,該軟件的名稱並不是軟件包名,因此我們可以通過關鍵字進行查詢該軟件的名稱。如:

[root@master test]# rpm -qa | grep jdk
jdk1.8-1.8.0_172-fcs.x86_64

那麼卸載時就要用到上面顯示的軟件名稱

[root@master test]# rpm -e jdk1.8-1.8.0_172-fcs.x86_64

如果在卸載某軟件A時,發現如下字樣
error: Failed dependencies:
              ................. is needed by .....
則表示,你要卸載的軟件A被某些軟件依賴。那麼就要先卸載其他依賴軟件A的軟件,再回來卸載軟件A。這就好比高樓大廈,8樓依賴7樓,你在銷燬7樓的時候,應該先銷燬八樓一樣。

不過,我們可以通過--nodeps參數來強制卸載軟件A,但是,可能就會影響到其他軟件的使用了。這是你需要考慮的事情。

由於RPM 經常進行安裝、卸載或升級操作等,某些行爲可能會導致 RPM 資料庫 /var/lib/rpm/ 內的文件破損破損。別擔心,我們可以使用 --rebuilddb 這個參數來重建資料庫! 如下:

[root@master test]# rpm --rebuilddb

6、RPM的缺點

由於Linux中的程序大多是小程序。程序與程序之間存在非常複雜的依賴關係。RPM無法解決軟件包的依賴關係。因此我們還是要學習YUM機制,請參考下一篇文章:《Linux系統》之"皮毛系列"(十一)軟件包的線上升級機制YUM

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章