【Linux相識相知】rpm包管理

来源:http://www.cnblogs.com/liubinsh/archive/2017/09/09/7499114.html
-Advertisement-
Play Games

本次博客詳細的介紹了rpm命令的使用方法,作為軟體包管理最基本的命令,需要熟練的使用。 ...


我們日常在使用Windows的時候,如果要安裝某個軟體,最簡單的方法就是在程式包的官網直接下載軟體包到本地,一般是以.exe或者.msi格式的文件,然後一直下一步下一步就能安裝成功了,但是在使用linux的操作系統的時候也許不是這麼的友好,即使現在有的linux發行版也可以通過簡單的搜索點擊安裝來實現軟體包的安裝,但這並不一種很好的安裝方法,因為你必須安裝桌面環境,消耗和占用一定的記憶體資源,除非只是你日常使用。本次博客就如何使用rpm命令來實現centos上的軟體包的安裝與管理,rpm也許不是最明智的選擇,但是在學習yum之前,我們還是先來看一下rpm吧!

 

rpm包的組成和獲取路徑

程式包,簡單的來說就是將源代碼通過編譯器編譯成二進位格式的程式,然後將二進位程式、庫文件、配置文件和幫助文件組成為一個或者有限幾個“包”文件。

在不同的linux發行版上,提供的程式包的管理器並不是都相同的,比如debian系的使用的包管理器是dpkg(包文件尾碼名.deb),在rehat和SUSE系使用都是rpm( rpm is package manager),centos作為redhat的分支,自然使用的是rpm了,而這些包文件的尾碼名就是.rpm。

來看一下這些文件吧!(這裡使用grep顯示了包文件名中只含有yum的包名)

rpm包命名的格式:

先來看一下源代碼的命令格式,一般程式的官網會提供程式的源代碼文件,你可以通過源代碼編譯安裝:

zabbix-3.4.1.tar.gz

格式: name - version.tar.gz

version:major.minor.release 

major:主版本號,源碼發生巨大的改變,則會改變;

minor:次版本號,源碼發生了較大的改變,則會改變;

release:發行號,當修複了很小的bug的時候,則會改變。

再來看一下包的命令格式:
yum-3.4.3-150.el7.centos.noarch.rpm

格式:name-VERSION-release.arch.rpm

VERSION為源碼的版本號;

releas為rpm包的發行號;

arch為包可以運行的平臺,如i386,x64(amd64),ppc,noarch(說明可以在不同的平臺上安裝)等。

如這裡的yum-3.4.3-150.el7.centos.noarch.rpm,yum為包名,3.4.3為源碼版本,el7.centos代表centos7,noarch說明你可以在不同的平臺上使用它。

從上面的圖上我們可以看到,除了一個以yum為名字的包以外還有很多其他包含yum的包,當我們安裝了這些包之後,可以為yum提供更多的額外的功能。

包文件的組成(每個包都是單獨實現的):

rpm包內的文件;

rpm的元數據,依賴關係,描述等;

安裝和卸載時候運行的腳本。

公共的資料庫(/var/lib/rpm):

程式包的名稱和版本;

依賴關係;

功能說明;

安裝生成的各文件的文件路徑及校驗碼信息。

依賴關係:

做為linux重要的哲學思想之一,單一程式的組合起來完成複雜的任務,rpm包之間也是這樣的,如果想要實現一個複製的功能,可能需要多個rpm包之間相互依賴才能實現,例如,你裝A軟體包,可能依賴於B包,那麼你就需要安裝B包,你安裝B包,可能又要依賴於C包,所以你在安裝A包的時候,就需要同時報B包和C包都裝上去。這樣一個一個安裝固然很浪費時間,所以linux也提供了一些前端工具來自動解決依賴關係:

yum:rhel系列系統上rpm包管理器的前段工具

apt-get:deb包管理器的前端工具

zypper:suse的rpm管理器前端工具

dnf:Fedora 22+系統上的rpm包管理器的前端工具。

獲取程式包的途徑

 (1)系統發行版的光碟或官方的文件伺服器:

         http://mirrors.aliyun.com,           http://mirrors.sohu.com,          http://mirrors.163.com  (2)項目的官方站點

 (3)第三方組織

         (a)EPEL          (b)搜索引擎              http://pkgs.org              http://rpmfind.net               http://rpm.pbone.net 

 (4) 毛爺爺說過:自己動手,豐衣足食!

 

rpm命令

 centos上使用rpm命令來實現程式包的安裝、升級、卸載、查詢、校驗和資料庫的維護。

 一、安裝

rpm {-i|--install} [install-options] PACKAGE_FILE ...
選項:
-i,--install:安裝包
-v:verbose,詳細信息
-vv:更詳細的輸出
[install-options]:
-h:hash marks輸出進度條,每個#表示2%的進度
--test:測試安裝,但是並沒有安裝,檢查並報告依賴關係及衝突消息等
--nodeps:忽略依賴關係安裝,不建議
--replacepkgs:重新安裝
--nosignature:不檢查包的簽名信息,不檢查來源合法性
--nodigest:不檢查包完整性信息
註意:rpm可以自帶腳本
總共有4類腳本:
preinstall:安裝過程開始之前運行的腳本,%pre
postinstall:安裝過程完成之後運行的腳本,%post
preuninstall:卸載過程真正開始執行之前運行的腳本,%preun
postuninstall:卸載過程完成之後運行的腳本,%postun
--noscripts:不執行這四種腳本
--noper:不執行preinstall腳本
--nopost:不執行postinstall腳本
--nopreun:不執行preuninstall腳本
--nopostun:不執行postuninstall腳本

下麵我們來舉一些例子吧!

1.安裝zsh,並顯示詳細信息和進度條:

[root@localhost Packages]# rpm -ivh  zsh-5.0.2-25.el7.x86_64.rpm  #最常用的組合 -ivh
Preparing...                          ################################# [100%]
Updating / installing...
   1:zsh-5.0.2-25.el7                 ################################# [100%]
[root@localhost Packages]# 

2.修改zsh的配置文件,再執行重新安裝:

 

[root@localhost Packages]# rpm -i  --replacepkgs zsh-5.0.2-25.el7.x86_64.rpm 

 說明重新安裝並不會覆蓋原有的配置文件。

 3.忽略依賴性安裝

[root@localhost Packages]# rpm -i xterm-295-3.el7.x86_64.rpm #提示需要以下的capability才能安裝成功
error: Failed dependencies:
    libICE.so.6()(64bit) is needed by xterm-295-3.el7.x86_64
    libXaw.so.7()(64bit) is needed by xterm-295-3.el7.x86_64
    libXmu.so.6()(64bit) is needed by xterm-295-3.el7.x86_64
    libXpm.so.4()(64bit) is needed by xterm-295-3.el7.x86_64
    libXt.so.6()(64bit) is needed by xterm-295-3.el7.x86_64
[root@localhost Packages]# rpm -i --nodeps xterm-295-3.el7.x86_64.rpm  #忽略依賴性關係安裝

 

 二、升級

rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
選項:
-U:升級或安裝
-F:升級
[install-options]:支持安裝不部分的install-options
--oldpackage:降級
--force:強制升級
註意:(1)不要對內核做升級操作,linux支持多內核版本並存,因此直接安裝新版本的內核
      (2)如果某原程式包的配置文件安裝後曾被修改,升級時,新版本的程式提供的同一個配置文件不會覆蓋原有的配置文件。

 

 三、卸載

rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...
選項:
-e:卸載
--allmatches:卸載所有pip指定名稱的程式包的各個版本
--nodeps:忽略依賴關係
--test:測試卸載,dry run模式

舉例:
卸載zsh,卸載後被修改的配置文件會被保存為.rpmsave的文件。

[root@localhost Packages]# rpm -e  zsh
warning: /etc/zshrc saved as /etc/zshrc.rpmsave
[root@localhost Packages]# 
[root@localhost Packages]# rpm -i zsh-5.0.2-25.el7.x86_64.rpm 
[root@localhost Packages]# 
[root@localhost Packages]# vim /etc/zshrc
zshrc          zshrc.rpmsave  

 

 四、查詢

rpm {-q|--query} [select-options] [query-options]
-q:查詢操作
[select-options]:
PACKGE_NAME:查詢指定的程式包是否已經按照及版本
-a,--all:查詢所有已經按照過得包
-f FILE:查詢指定的文件是由哪個程式包安裝生成的
-p,--packges PACKAGE_FILE:用戶實現對未安裝的程式包執行查詢操作
--whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個程式包提供
--whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴
[query-options]
--changelog:查詢rpm包的changelog
-l,--list:程式包安裝生成的所有文件列表
-i,--info:程式包相關的信息,版本、大小、所屬包組等
-c,--configfiles:查詢指定的程式包提供的配置文件
-d,--docfiles:查詢指定的程式包提供的文檔
--provides:查詢指定程式包提供的所有的CAPABILITY
-R,--requires:查詢指定的程式包的依賴關係
--scripts:查看程式包自帶的腳本片段

舉例:

[root@localhost Packages]# rpm -q zsh    #查詢zsh是否被安裝
zsh-5.0.2-25.el7.x86_64
[root@localhost Packages]# rpm -qf /etc/zshrc   #查詢/etc/zshrc是由哪個包安裝生成的
zsh-5.0.2-25.el7.x86_64
[root@localhost Packages]# rpm -q --changelog zsh   #查詢zsh的修改日誌
* Thu Jul 14 2016 Kamil Dudka <[email protected]> - 5.0.2-25
- improve use of new command substitution in completion (#1356388)

* Fri Jun 10 2016 Kamil Dudka <[email protected]> - 5.0.2-24
- fix off-by-one error in completion utility cache code (#1344599)

* Mon May 23 2016 Kamil Dudka <[email protected]> - 5.0.2-23
- fix parse error on a script with unescaped exclamation mark (#1338689)
......(略)
[root@localhost Packages]# rpm -ql zsh    #查詢安裝zsh會生成的文件列表
/bin/zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
/usr/lib64/zsh
/usr/lib64/zsh/5.0.2
......(略)
[root@localhost Packages]# rpm -qc zsh  #查詢安裝zsh所生成的配置文件
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
[root@localhost Packages]# rpm -qd zsh   #查詢安裝zsh所生成的文檔信息
/usr/share/doc/zsh-5.0.2/BUGS
/usr/share/doc/zsh-5.0.2/CONTRIBUTORS
/usr/share/doc/zsh-5.0.2/FAQ
/usr/share/doc/zsh-5.0.2/FEATURES
/usr/share/doc/zsh-5.0.2/LICENCE
/usr/share/doc/zsh-5.0.2/MACHINES
/usr/share/doc/zsh-5.0.2/NEWS
......(略)
[root@localhost Packages]# rpm -q --provides  zsh   #查詢zsh所提供的CAPABILITY
config(zsh) = 5.0.2-25.el7
zsh = 5.0.2-25.el7
zsh(x86-64) = 5.0.2-25.el7
[root@localhost Packages]# rpm -qR zsh  #查詢zsh所依賴的CAPABILITY
/bin/sh
/bin/sh
/bin/sh
/bin/sh
/bin/zsh
/sbin/install-info
/sbin/install-info
config(zsh) = 5.0.2-25.el7
coreutils
......(略)
[root@localhost Packages]# rpm -q --scripts  zsh  #查詢zsh的自定的腳本片段
postinstall scriptlet (using /bin/sh):  
if [ ! -f /etc/shells ] ; then
    echo "/bin/zsh" > /etc/shells
else
    grep -q "^/bin/zsh$" /etc/shells || echo "/bin/zsh" >> /etc/shells
fi

if [ -f /usr/share/info/zsh.info.gz ]; then
# This is needed so that --excludedocs works.
/sbin/install-info /usr/share/info/zsh.info.gz /usr/share/info/dir \
  --entry="* zsh: (zsh).            An enhanced bourne shell."
fi

:
preuninstall scriptlet (using /bin/sh):   
if [ "$1" = 0 ] ; then
    if [ -f /usr/share/info/zsh.info.gz ]; then
    # This is needed so that --excludedocs works.
    /sbin/install-info --delete /usr/share/info/zsh.info.gz /usr/share/info/dir \
      --entry="* zsh: (zsh).            An enhanced bourne shell."
    fi
fi
:
postuninstall scriptlet (using /bin/sh):
if [ "$1" = 0 ] ; then
    if [ -f /etc/shells ] ; then
        TmpFile=`/bin/mktemp /tmp/.zshrpmXXXXXX`
        grep -v '^/bin/zsh$' /etc/shells > $TmpFile
        cp -f $TmpFile /etc/shells
        rm -f $TmpFile
    fi
fi
[root@localhost Packages]# rpm -q --whatprovides 'config(zsh)'  #查詢conig(zsh)是由哪個包提供的
zsh-5.0.2-25.el7.x86_64
[root@localhost Packages]# 
[root@localhost Packages]# rpm -q --whatrequires  'config(zsh)' #查詢config(zsh)被哪個包所依賴
zsh-5.0.2-25.el7.x86_64
[root@localhost Packages]# rpm -qpl  zenity-3.8.0-5.el7.x86_64.rpm  #這裡的zenity是沒有安裝的,可以直接加-p選項,進行查詢操作,查詢zenity安裝後生成的文件列表
/usr/bin/zenity
/usr/share/doc/zenity-3.8.0
/usr/share/doc/zenity-3.8.0/AUTHORS
/usr/share/doc/zenity-3.8.0/COPYING
/usr/share/doc/zenity-3.8.0/NEWS
......(略)
[root@localhost Packages]# rpm -qp --provides  zenity-3.8.0-5.el7.x86_64.rpm #查詢zenity所提供的CAPABILITY
zenity = 3.8.0-5.el7
zenity(x86-64) = 3.8.0-5.el7

 

五、 校驗

rpm {-V|--verify} [select-options] [verify-options]    
選項:
--nodeps:不檢查文件的依賴性關係
--nofiles:不檢查文件的任何屬性
--nosize:不檢查文件大小
--nouser:不檢查文件的屬主
--nogroup:不檢查文件的屬組
--nomtime:不檢查文件的時間戳

舉例:

[root@localhost Packages]# rpm -V zsh
.......T.  c /etc/zshrc  #這裡表示時間戳有變,沒有任何輸出代表校驗成功
這裡的每個點代表一個校驗的類型:
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

我們在這個文件裡面添加一行試試:

 

 再來校驗:

[root@localhost Packages]# rpm -V zsh
S.5....T.  c /etc/zshrc  #文件大小發生改變,MD5值改變,時間戳改變
[root@localhost Packages]# rpm -V --nomtime zsh #不檢查時間戳
S.5......  c /etc/zshrc

包來源合法性驗證和完整性驗證:

那麼用戶如何獲取公鑰呢? 在centos發行版在:/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 導入包製作者的秘鑰:
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
驗證: 1.安裝程式的時候,會自動執行驗證 2.手動驗證:rpm -K PACKAGE_FILE
[root@localhost Packages]# rpm -K zsh-5.0.2-25.el7.x86_64.rpm 
zsh-5.0.2-25.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 OK

 

六、RPM的資料庫

rpm管理器的資料庫路徑位於:/var/lib/rpm/,比如查詢操作都是通過此處的資料庫進行的,當我們的資料庫損壞的時候,可有重建資料庫: 獲取幫助: centos 6: man rpm centos 7:man rpmdb
rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]
--initdb:初始化資料庫,當前無任何資料庫可實始化創建一個新的;當前有時不執行任何操作;
--rebuilddb:重新構建,通過讀取當前系統上所有已經安裝過的程式包進行重新創建;

一般情況下我們都不要去動RPM的資料庫。

 

總結:rpm命令的查詢功能是非常的重要的,但是安裝卻不顯的那麼重要,因為使用rpm安裝包,如果包存在一些依賴的包,你需要將依賴的包一個一個的安裝,這樣耗時又耗力,所以在安裝包的時候,我們一般會使用比較自動化的工具yum,它能幫我們解決依賴性的關係,yum將在下一篇博客中進行詳細的介紹。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 tempdb暴增,造成磁碟空間不足,甚至影響業務運行。 正文 如圖,tempdb log文件從7.40開始突然暴漲,因為 tempdb 0 M到 40G tempdb 所在磁碟是C 盤 C盤的可用空間正好也為40G 在下午16.22左右的時候tempdb 文件暴漲已經影響到業務使用.臨時解決是 ...
  • 1.環境: 上位機:ubuntu16.04 Linux jello 4.4.0-89-generic #112-Ubuntu SMP Mon Jul 31 19:38:41 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux 下位機: /home/jello # unam ...
  • 1.環境: ubuntu16.04 Linux jello 4.4.0-89-generic #112-Ubuntu SMP Mon Jul 31 19:38:41 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux 2.背景: 最近在linux下拷貝文件時由於文件比較大 ...
  • 1.環境: /home/jello # uname -aLinux 3.10.0 #2 SMP Mon Mar 6 17:52:09 CST 2017 armv7l GNU/Linux 2.使用tcpsvd啟動ftp服務 tcpsvd -vE 0.0.0.0 21 ftpd ftpdir & (&表 ...
  • 看操作系統精髓與設計原理(Operating Systems Internals and Design Principles),附錄提到一個教學用的系統Nachos。試著找源碼,編譯一下。使用ubuntu16LTS,總編譯不過。 swtch.s彙編不過去,因為pushl無法編譯啊(因為本機是64bi ...
  • sed系列文章: sed修煉系列(一):花拳繡腿之入門篇sed修煉系列(二):武功心法(info sed翻譯+註解)sed修煉系列(三):sed高級應用之實現視窗滑動技術sed修煉系列(四):sed中的疑難雜症 說明: 第一篇是入門篇,但卻是最重要的一篇。雖然內容不算多,但在裡面講了絕大多數sed的 ...
  • 本文目錄:1 sed中使用變數和變數替換的問題2 反向引用失效問題3 "-i"選項的文件保存問題4 貪婪匹配問題5 sed命令"a"和"N"的糾葛 1.sed中使用變數和變數替換的問題 在腳本中使用sed的時候,很可能需要在sed中引用shell變數,甚至想在sed命令行中使用變數替換。也許很多人都 ...
  • 加密技術是為了保護敏感數據在網路傳輸中的安全,就像日常生活中使用的淘寶、支付寶、微信等等軟體,如果涉及到金額的數據在網路中不加密傳輸,那是極易被別人竊取、篡改的,通信中的數據加密技術就顯得尤為重要。各類加密工具的原理都是大同小異,這裡對常見加密原理進行解讀。 一、對稱加密 加密數據與解密數據使用相同 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...