Linux系統管理之——軟件包管理

安裝、升級和卸載應用軟件是影響用戶對操作系統評價的決定性因素之一。

本文從基本的rpm/dpkg命令行出發,以CentOSUBUNTU爲例,介紹典型Linux系統中應用軟件的管理和使用;

 

軟件包管理工具的作用是提供在操作系統中安裝,升級,卸載需要的軟件的方法,並提供對系統中所有軟件狀態信息的查詢;

RPM全稱爲:Redhat PacesgeManager,最早由RedHat公司制定實施,隨後被GNU開源操作系統接收併成爲很多Linux系統(RHEL)的既定軟件標準;

DEB軟件包管理工具——DPKG,全稱爲DebianPackage

一、RPM

  1. 安裝

    rpm {-i|--install}[install-options] PACKAGE_FILE ...

             -vverbose,詳細過程;

               -vv:更詳細的信息;

               -h:以#顯示程序包管理執行進度,每個#表示2%的進度;

              

             rpm –ivh PACKAGE_FILE…

                        [install-optins ]:

                                 --test:測試安裝,但不真正執行安裝過程;

                                 --nodeps:忽略依賴關係;

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

     

                                 --ignoreos:忽略系統平臺差異;

                                 --nodigest:不檢查包完整性;

                                 --nosignature:不檢查來源合法性;

                                 --oldpackage:允許降級安裝;

     

                                 --noscripts:安裝不執行腳本:

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

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

                 %preun:卸載前腳本;--nopreun

                    %postun:卸載後腳本;--nopostun

[root@kalaguiyin Packages]# rpm -ivh--noscripts --nopost zsh-5.0.2-7.el7.x86_64.rpm 
準備中...                         ################################# [100%]
正在升級/安裝...
  1:zsh-5.0.2-7.el7                 ################################# [100%]

2.升級

rpm {-U|--upgrade}[install-options] PACKAGE_FILE ...

rpm {-F|--freshen} [install-options] PACKAGE_FILE ...

upgrade:安裝有舊版程序包,則“升級”:如果不存在舊版程序包,則"安裝"

freeshen:安裝有舊版程序包,則"升級":如果不存在舊版程序包,則不執行升級操作;

                   --oldpackage:降級;

                   --force:強行升級;

注意:

(1)、不要對內核做升級操作;Linux支持多內核版本並存;因此,可直接安裝新版本的內核;

(2)、如果原程序包的配置文件安裝後曾被修改,升級時,新版本的提供的同一個配置文件並不會覆蓋老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)後保留;

3、查詢:

rpm {-q|--query} [select-options] [query-options]

 

[select-options]

         -a:所有包;

         -f:查詢指定的文件由那個程序包安裝生成;

         -g[-g,--group GROUP]{-p,--package PACKAGE_FILE]

         -p/PATH/TO/PACKAGE_FILE:針對尚未安裝的程序包文件做查詢操作;

         --whatprovides CAPABILITY:查詢指定CAPABILITY([kep'blt]能力、性能)由那個包所提供;

--whatrequires CAPABILITY:查詢指定的CAPABILITY被那個包所依賴;

         [query-options]

         --changelog:查詢rpm包的changelog

         -c:查詢程序的配置文件;

         -i--infoinformation

         -l:查看指定程序包安裝生成的所有文件;

         --scripts:程序包自帶的腳本片段;

         -R--requres:查詢指定的程序包所依賴的CAPABILITY

         --provides:列出指定程序包所提供的CAPABILITY

[root@localhost ~]# rpm -qf /bin/ls
coreutils-8.4-37.el6.x86_64
[root@localhost ~]#rpm -ql bash | head -10
/bin/bash
/bin/sh
/etc/skel/.bash_logout
/etc/skel/.bash_profile
/etc/skel/.bashrc
/usr/bin/bashbug-64
/usr/share/doc/bash-4.1.2/COPYING
/usr/share/info/bash.info.gz
/usr/share/locale/af/LC_MESSAGES/bash.mo
/usr/share/locale/bg/LC_MESSAGES/bash.mo
 [root@localhost~]# rpm -q --scripts httpd
preinstall scriptlet (using /bin/sh):
# Add the "apache" user
getent group apache >/dev/null ||groupadd -g 48 -r apache
getent passwd apache >/dev/null || \
 useradd -r -u 48 -g apache -s /sbin/nologin \
   -d /var/www -c "Apache" apache
exit 0
postinstall scriptlet (using /bin/sh):
# Register the httpd service
/sbin/chkconfig --add httpd
/sbin/chkconfig --add htcacheclean
preuninstall scriptlet (using /bin/sh):
if [ $1 = 0 ]; then
         /sbin/servicehttpd stop > /dev/null 2>&1
         /sbin/chkconfig--del httpd
         /sbin/service htcacheclean stop >

4、卸載

rpm {-e|--erase}[--allmatches] [--nodeps] [--noscripts]

 [--notriggers] [--test]PACKAGE_NAME ...

# rpm –e zsh

--allmatches
    刪除所有那些包匹配PACKAGE_NAME的版本。如果PACKAGE_NAME有多個匹配,正常情況下將有一個錯誤說明。
--nodeps
     在沒有安裝包之前,不檢測依賴關係。
--noscripts
--nopreun
--nopostun
     不執行同名角本。--noscripts、--nopreun –nopostun含義相同。關閉%preun、%postun腳本的響應。
--notriggers
--notriggerun
--notriggerpostun
     不執行任何指定類型的觸發器腳本。--notriggers、--notriggerun、 --notriggerpostun含義相同。同時關閉%triggerun、%triggerpostun腳本響應。
--repackage
     在刪除之前重新打包文件。先前安裝的包將由宏%_repackage_name_fmt指定,且其創建目錄也由宏%_repackage_dir指定(默認值是/var/tmp)。
--test  不真的卸載任何東西, 僅僅是經歷一下這個動作。與-vv選項聯合使用。

5、校驗

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

    公鑰加密:

       對稱加密:加密、解密使用同一密鑰;

       非對稱加密:密鑰是成對的;

           public key:公鑰;公開所有人;

           secret key:私鑰;不能公開;

    導入所需要公鑰:

       rpm --import /PATH/FROM/GPG-PUBKEY-FILE

       rpm -k 直接檢驗程序包完整性;

       CentOS 7 發行光盤提供的密鑰文件:RPM-GPG-KEY-CentOS-7

 

   cd /var/lib/rpm

rpm的信息數據庫;

[root@localhost ~]# cd /var/lib/rpm/
[root@localhost rpm]# ls
Basenames     __db.002 Dirnames     Installtid    Packages        Pubkeys         Sha1header
Conflictname  __db.003 Filedigests  Name          Providename     Requirename     Sigmd5
__db.001      __db.004 Group        Obsoletename  Provideversion  Requireversion  Triggername

6、數據庫重建

rpm{--initdb|--rebuilddb}

 --initdb:初始化

    如果實現不存在數據庫,則新建之;否則,不執行任何操作;

--rebuilddb:重建;

       無論當前存在與否,直接重新創建數據庫;

二、YUM

  1. 軟件包間的依賴關係:

    由於開源的多態性,Linux 操作系統中的軟件之間的依賴性關係處理一直令用戶感到頭疼。

    如果 package_a 依賴於 package_b,那麼在一個沒有安裝 package_b 的系統中,package_a 是不被系統推薦安裝的,強制安裝很可能會導致軟件無法正常工作。

    基於以上 package_a package_b 的關係,在一個乾淨的系統中 ( 未安裝package_a package_b),欲安裝 package_a,錯誤通常會表現爲:

[root@kalaguiyin Packages]# rpm -ivhmysql-connector-odbc-5.2.5-6.el7.x86_64.rpm 
錯誤:依賴檢測失敗:
         libodbc.so.2()(64bit)被 mysql-connector-odbc-5.2.5-6.el7.x86_64 需要
         libodbcinst.so.2()(64bit)被 mysql-connector-odbc-5.2.5-6.el7.x86_64 需要

查詢軟件包依賴關係:使用rpm –qRp

[root@kalaguiyin Packages]# rpm -qRp
mysql-connector-odbc-5.2.5-6.el7.x86_64.rpm 
/sbin/ldconfig
/sbin/ldconfig
libc.so.6()(64bit)
libc.so.6(GLIBC_2.14)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
libc.so.6(GLIBC_2.3.4)(64bit)

需要先安裝被目標軟件包所依賴的軟件包,但在此過程中又可能會遇到其他的依賴關係問題或嵌套的依賴關係,故而是的手工使用rpm命令解決依賴關係變得相當繁瑣;故而出現了YUM,自動解決軟件包依賴關係;

YUMyellow dogYellowdogUpdate Modifier

YUM 基於 RPM 包管理工具,能夠從指定的源空間(服務器,本地目錄等)自動下載目標 RPM 包並且安裝,可以自動處理依賴性關係並進行下載、安裝,無須繁瑣地手動下載、安裝每一個需要的依賴包。此外,YUM 的另一個功能是進行系統中所有軟件的升級。如上所述,YUM RPM 包來源於源空間,在 RHEL系列中由 /etc/yum.repos.d/ 目錄中的*.repo 文件配置指定,如CentOS-Debuginfo.repo 的內容:

[base-debuginfo]
name=CentOS-6 - Debuginfo
baseurl=http://debuginfo.centos.org/6/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-6
enabled=0

YUM的系統配置文件位於/etc/yum.conf,內容如下:

[main]
cachedir=/var/cache/yum         #yum下載的RPM包的緩存目錄
keepcache=0             #緩存是否保存,1保存,0不保存。
debuglevel=2             #調試級別(0-10),默認爲2(具體調試級別的應用,我也不瞭解)。
logfile=/var/log/yum.log         #yum的日誌文件所在的位置
exactarch=1             #在更新的時候,是否允許更新不同版本的RPM包,比如是否在i386上更新i686的RPM包。
obsoletes=1              #這是一個update的參數,簡單的說就是相當於upgrade,允許更新陳舊的RPM包。
gpgcheck=1             #是否檢查GPG(GNU Private Guard),一種密鑰方式簽名。
plugins=1             #是否允許使用插件,默認是0不允許,但是我們一般會用yum-fastestmirror這個插件。
installonly_limit=3         #允許保留多少個內核包。
exclude=selinux*         #屏蔽不想更新的RPM包,可用通配符,多個RPM包之間使用空格分離。

yum repositoryyum repo

    存儲了衆多rpm包,以及包的相關的元數據文件(放置與特定目錄下:repodate)yum應該指向的路徑;

yum中文件服務器可以使用:

         ftp://   http://  nfs://   file:///

yum客戶端:

         rpm–q yum    查詢本地系統是否安裝了yum軟件包;

         rpm–qc yum   查詢yum的配置文件;

         配置文件:

                   /etc/yum.conf   : 爲所有倉庫提供公共配置;

                   /etc/yum.repos.d/*.repo :爲倉庫的指向提供配置;

         關於yum.conf配置文件中的參數解釋可以查看man yum.conf


yum倉庫指向的定義:

[fedora]      #方括號裏面的是軟件源的名稱,將被yum取得並識別

name=Fedora $releasever - $basearch   # 這裏也定義了軟件 倉庫的名稱,通常是爲了方便閱讀配置文件,一般沒什麼作用,$releasever變量定義了發行版本,通常是8910等數字,$basearch 量定義了系統的架構,可以是i386x86_64ppc等值,這兩個變量根據當前系統的版本架構不同而有不同的取值,這可以方便yum升級的時候選擇 適合當前系統的軟件包,以下同……
failovermethod=priority   #failovermethod
有兩個值可以選擇,priority是默認值,表示從列出的baseurl中順序選擇鏡像服務器地址,roundrobin表示在列出的服務器中隨機選擇
exclude=compiz* *compiz* fusion-icon*#exclude
這個選項是後來我自己加上去的,用來禁止這個軟件倉庫中的某些軟件包的安裝和更新,可以使用通配符,並以空格分隔,可以視情況需要自行添加
#baseurl=http://download.fedoraproject.org/pub/fedora/linux/releases/$releasever/Everything/$basearch/os/
#
上面的一行baseurl第一個字符是'#'表示該行已經被註釋,將不會被讀取,這一行的意思是指定一個baseurl(源的鏡像服務器地址)
#mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=fedora-$releasever&arch=$basearch
#
上面的這一行是指定一個鏡像服務器的地址列表,通常是開啓的,本例中加了註釋符號禁用了,我們可以試試,將$releasever$basearch替換成自己對應的版本和架構,例如10i386,在瀏覽器中打開,我們就能看到一長串鏡可用的鏡像服務器地址列表。
選擇自己訪問速度較快的鏡像服務器地址複製並粘貼到repo文件中,我們就能獲得較快的更新速度了,格式如下baseurl所示:
baseurl=
ftp://ftp.sfc.wide.ad.jp/pub/Linux/Fedora/releases/10/Everything/i386/os
http://ftp.chg.ru/pub/Linux/fedora/linux/releases/10/Everything/i386/os
http://ftp.yz.yamagata-u.ac.jp/pub/linux/fedora/linux/releases/10/Everything/i386/os

enabled=1 #這個選項表示這個repo中定義的源是啓用的,0爲禁用
gpgcheck=1 #
這個選項表示這個repo中下載的rpm將進行gpg的校驗,已確定rpm包的來源是有效和安全的
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch#
定義用於校驗的gpg密鑰

yum命令的語法:

 command is one of:
       * install package1 [package2] [...]
       * update [package1] [package2] [...]
       * update-to [package1] [package2] [...]
       * update-minimal [package1] [package2] [...]
       * check-update
       * upgrade [package1] [package2] [...]
       * upgrade-to [package1] [package2] [...]
       * distribution-synchronization [package1] [package2] [...]
       * remove | erase package1 [package2] [...]
       * autoremove [package1] [...]
       * list [...]
       * info [...]
       * provides | whatprovides feature1 [feature2] [...]
       * clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
       * makecache [fast]
       * groups [...]
       * search string1 [string2] [...]
       * shell [filename]
       * resolvedep dep1 [dep2] [...]
          (maintained for legacy reasons only - use repoquery or yum provides)
       * localinstall rpmfile1 [rpmfile2] [...]
          (maintained for legacy reasons only - use install)
       * localupdate rpmfile1 [rpmfile2] [...]
          (maintained for legacy reasons only - use update)
       * reinstall package1 [package2] [...]
       * downgrade package1 [package2] [...]
       * deplist package1 [package2] [...]
       * repolist [all|enabled|disabled]
       * repoinfo [all|enabled|disabled]
       * repository-packages <enabled-repoid> <install|remove|remove-or-reinstall|remove-or-
      distribution-synchronization> [package2] [...]
        * version [ all | installed | available | group-* | nogroups* |grouplist | groupinfo
       ]
        *  history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|roll‐
      back|new|sync|stats]
       * load-transaction [txfile]
       * updateinfo [summary | list | info | remove-pkgs-ts | exclude-updates |exclude-all |
      check-running-kernel]
       * fssnapshot [summary | list | have-space | create | delete]
       * fs [filters | refilter | refilter-cleanup | du]
       * check
       * help [command]

顯示倉庫列表:

repolist[all|enabled|disabled]       

顯示程序包:

list  ==    #yum list

yum remove | erase package1[package2,....]    ==》卸載軟件包;

yum info gcc  類似於rpm –qi   ==查詢指定軟件包的信息;

yum makecache                                                    ==》構建緩存,建立本地原數據;

yum search string1 [string2] [...]                       ==》以指定的關鍵字搜索程序包名,

 

YUM命令子命令釋義:

check-update       檢查可提供的包升級
clean              刪除緩存數據
deplist            列出包依賴相關
erase              移除一個或多個包從你的系統
groupinfo          顯示關於包組的細節
groupinstall       從組裏安裝軟件包到你的系統
grouplist          列出當前的組
groupremove        在一個組中移除包從您的系統
help               顯示幫助用法信息
info               顯示關於包或一組包的細節信息
install            安裝一個或多個軟件包在你的系統
list               列出一個包或某組的包
localinstall       安裝本地 RPM
makecache          生成原數據緩存
provides           Find what package provides the given value
reinstall          重新安裝一個包
repolist           顯示軟件倉庫的配置
resolvedep         決定哪個包提供了給定的依賴
search             查找包細節居給定的字符串
shell              運行交互式的yum shell
update             更新一個或多個包在你的系統
upgrade            Update packages taking obsoletes into account
YUM命令選項釋義:
Options:
-h, --help                show this help message and exit
-t, --tolerant            be tolerant of errors
-C                        從緩衝中運行,而不是升級緩存
-c  [config file]         config file location
-R  [minutes]             最大化的命令等待時間
-d  [debug level]         調試輸出級別
--showduplicates          顯示覆制, 在repo,list/search命令下
-e  [error level]         錯誤輸出級別
-q, --quiet               安靜的操作
-v, --verbose             verbose operation
-y                        回答所有的問題爲是
--version                 顯示 YUM版本信息並退出
--installroot=[path]  設置爲root安裝
--enablerepo=[repo]       激活一個或多個倉庫(支持通配符)
--disablerepo=[repo]  禁掉一個或多個倉庫(支持通配符)
-x [package], --exclude=[package] 在名稱或glob不包含包。
--disableexcludes=[repo]       disable exclude from main, for a repo or for everything
--obsoletes               enable obsoletes processing during updates
--noplugins               禁掉yum插件
--nogpgcheck              禁掉GPG驗證檢查
--disableplugin=[plugin]       用名稱禁掉插件
--enableplugin=[plugin]   enable plugins by name
--skip-broken             忽略包的依賴問題
--color=COLOR             control whether color is used

三、DNF

DNF是新一代的RPM軟件包管理器。首先出現在Fedora 18中,在Fedora22中正式取代了YUM

DNF包管理器克服了YUM包管理器的一些瓶頸,提升了包括用戶體驗,內存佔用,依賴分析、運行速度等多方面的內容;

CentOS 7 RHEL7中默認預裝DNF,但可以自行安裝,和YUM同時使用;

 

DNF大部分採用Python編寫,發行許可爲GPL v2

  1. 安裝DNF

    1. 爲了安裝DNF,必須先安裝並啓用epel-release 庫依賴;

      yum install epel-release

    2. 使用 epel-release 依賴中的 YUM 命令來安裝 DNF 包。

      yum install dnf

      2DNF常用子命令:   ==》和yum大致相同;

         # dnf –version    查看安裝在系統中DNF包管理器的版本;

         # dnf repolist           用於顯示系統中可用的DNF軟件庫;

         # dnf repolist all     顯示系統中可用和不可用的DNF軟件庫;

         # dnf list                     列出用戶系統上的所有來自軟件庫的可用軟件包和所有已安裝在本地系統的軟件包;

         # dnf list installed  列出所有安裝了的RPM包;

         # dnf list available  列出來自所有可用軟件庫的可供安裝的軟件包;

         # dnf search STRING       搜索指定的軟件名稱;可用使用通配符;

         # dnf provides /bin/bash     查找某一文件的提供者;

         # dnf info PACKAGE_NAME 查看軟件包詳情;

        

         # dnf install nano 安裝軟件包;

         # dnf update system 升級軟件包;

         # dnf check-update 檢查系統中所有軟件包的更新;

         # dnf update # dnf upgrade  升級系統中所有由可用升級的軟件包;

         # dnf remove PACKAGE_NAME # dnf erase PACKAGE_NAME  刪除指定軟件包;

        

         # dnf autoremove 刪除無用孤立的軟件包;

         # dnf clean all 刪除緩存的無用軟件包;

 

         # dnf help SUB_COMMAND  獲取dnf命令的某個子命令的使用幫助;如:dnf help clean

         # dnf help   列出所有的DNF命令及其用途;

         # dnf history 查看系統上DNF命令的執行歷史,以此可以知道自你使用DNF開始有說明軟件被安裝和卸載;

         # dnfgrouplist          列出所有的軟件包組;

         #dnf groupinstall ‘Educational Software’  安裝一個軟件包組;

         #dnf groupupdate ‘Educational Software’      升級一個軟件包組中的軟件包;

         #dnf groupremove ‘Educational Software’  刪除一個軟件包組;

 

         #dnf –enablerepo=epel install phpmyadmin 從特定的軟件包庫安裝特定的軟件;

         #dnf distro-sync  通過所有可用的軟件源將已經安裝的所有軟件包更新到最新的穩定發行版。

         #dnf reinstall PACKAGE_NAME        重新安裝特定軟件包;

         #dnf downgrade PACKAGE_NAME          降低特定軟件包的版本,相當於rpm—oldpackage

 

DNF的不足:

  1. DNF 中沒有 –skip-broken 命令,並且沒有替代命令供選擇。

  2. DNF 中沒有判斷哪個包提供了指定依賴的 resolvedep 命令。

  3. DNF 中沒有用來列出某個軟件依賴包的 deplist 命令。

  4. 當你在 DNF 中排除了某個軟件庫,那麼該操作將會影響到你之後所有的操作,不像在 YUM 下那樣,你的排除操作只會在升級和安裝軟件時才起作用。


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