1. 程式人生 > >linux下包管理器

linux下包管理器

time sql 命令行選項 清單 ger modified remove 興趣 弊端

一、操作linux發型版本的包管理器

此小結摘抄:
https://www.cnblogs.com/linuxprobe/p/5883783.html

  在 linux 中,包管理器非常重要,了解如何使用多種包管理器可以讓你像一個高手一樣活得很舒適,從在倉庫下載軟件、安裝軟件,到更新軟件、處理依賴和刪除軟件是非常重要的,這也是Linux 系統管理的一個重要部分。

  • debian派系

  dpkg 是 Debian Linux 家族的基礎包管理系統,它用於安裝、刪除、存儲和提供deb包的信息。
這是一個低層面的工具,並且有多個前端工具可以幫助用戶從遠程的倉庫獲取包,或處理復雜的包關系的工具,包括如下:

(1) apt(高級打包工具)
  這個是一個 dpkg 包管理系統的前端工具,它是一個非常受歡迎的、自由而強大的,有用的命令行包管理器系統。debian 及其衍生版,例如 Ubuntu 和 Linux Mint 的用戶應該非常熟悉這個包管理工具。
(2) aptitude 包管理器
  這個也是 Debian Linux 家族一個非常出名的命令行前端包管理工具,它工作方式類似 APT ,它們之間有很多可以比較的地方,不過,你應該兩個都試試才知道哪個工作的更好。它最初為 Debian 及其衍生版設計的,但是現在它的功能延伸到 RHEL 家族。
(3) synaptic 包管理器

  synaptic是一個基於GTK+的APT的可視化包管理器,對於一些不想使用命令行的用戶,它非常好用。

  • 紅帽派系

rpm 包管理器
  這個是紅帽創建的 Linux 基本標準(LSB)打包格式和基礎包管理系統。基於這個底層系統,有多個前端包管理工具可供你使用,但我們應該只看那些最好的,那就是:

(1) yum
  這個是一個開源、流行的命令行包管理器,它是用戶使用 RPM 的界面(之一)。你可以把它和 Debian Linux 系統中的 APT 進行對比,它和 APT 擁有相同的功能。

(2) dnf
  這個也是一個用於基於 RPM 的發行版的包管理器,Fedora 18 引入了它,它是下一代 YUM。如果你用 Fedora 22 及更新版本,你肯定知道它是默認的包管理器。這裏有一些鏈接,將為你提供更多關於 DNF 的信息和如何使用它。

  • 其他派系

(1) Pacman包管理器(Arch Linux)
  這個是一個流行的、強大而易用的包管理器,它用於 Arch Linux 和其他的一些小眾發行版。它提供了一些其他包管理器提供的基本功能,包括安裝、自動解決依賴關系、升級、卸載和降級軟件。但是最大的用處是,它為 Arch 用戶創建了一個簡單易用的包管理方式。

(2) Zypper 包管理器(openSUSE)
  這個是一個使用 libzypp 庫制作的用於 OpenSUSE 系統上的命令行包管理器,它的常用功能包括訪問倉庫、安裝包、解決依賴問題和其他功能。更重要的是,它也可以支持存儲庫擴展功能,如模式、補丁和產品。

(3) Portage 包管理器(Gentoo)
  這個是 Gentoo 的包管理器,當下不怎麽流行的一個發行版,但是這並不阻止它成為 Linux 下最好的軟件包管理器之一。Portage 項目的主要目標是創建一個簡單、無故障的包管理系統,包含向後兼容、自動化等功能。

二、rpm包管理器

2.1、程序概述以及rpm概述

API:Application Program Interface,應用程序接口;
ABI:Application Binary Interface,應用二進制接口;

至於二者的區別,之前也有講過,這裏拿一張別人畫好的圖:

https://blog.csdn.net/FatalError1/article/details/78362829
技術分享圖片

  • C/C++程序格式
    源代碼:文本格式的程序代碼;
    編譯開發環境:編譯器、頭文件、開發庫
    二進制格式:文本格式的程序代碼 - -> 編譯器 - -> 二進制格式(二進制程序、庫文件、配置文件、幫助文件)
  • java/python程序格式
    源代碼:編譯成能夠在其虛擬機(jvm/pvm)運行的格式;
    開發環境:編譯器、開發庫
    二進制
  • 項目構建工具

    c/c++: make
    java: maven
  • 源代碼格式和二進制rpm包格式
源代碼命名:name-VERSION-release.tar.gz 
.tar.gz只是一種,通常是使用tar打包歸檔,並使用gzip壓縮;
VERSION:major.minor.release(主版本號.次版本號.發型號);
name:源代碼所代表的應用程序的名字;
例如:redis-5.0.0.tar.gz

rpm包命名:
name-VERSION-release.arch.rpm
VERSION:major.minor.release(軟件包主版本號.次版本號.發型號);
release.arch:rpm包的發型號;
其中的release由release.os組成,(release表示發型號的版本,os表示系統說明)
arch可選值有:i386, x64(amd64), ppc, noarch等等

例如:redis-5.0.0-1.centos7.x64.rpm
  • rpm概述
rpm是一款能夠用於編譯,安裝,查詢,驗證,更新以及移除軟件包的包管理器。包由文件和元數據構成。
元數據構成:
二進制程序文件,庫文件,配置文件,幫助文件等;

包的兩種形式,上面有提到過,一種是二進制包格式,另外一種是源碼包格式。
二進制包已經封裝好了要安裝的程序,源碼包就是由程序源代碼以及要生成二進制格式的一些附加配置構成;

rpm包就是由二進制格式組成的,不過為了最小化功能模塊設計,一個應用程序被打包成rpm包的時候,可能
組成了不止一個rpm包,比如像mysql這種的應用程序,可能由devel,utils,libs等組成各個小包,我們稱這些
為分包或支包,如果要想完整的使用應用程序,我們應該先安裝對應程序的主包,然後把這些輔助的支包也安裝
上。主包和支包(這種機制叫拆包)命名:
主包:name-VERSION-release.arch.rpm 
支包:name-function-VERSION-release.arch.rpm
其中function表示一類輔助功能,常見的有:
devel,utils,libs等

rpm管理器有個弊端就是不能自動解決程序包依賴關系的問題,何為依賴關系:
比如我要安裝X,Y,Z程序包,安裝X程序包要依賴於Y和Z程序包,而安裝Y程序包要依賴於A,B,C程序包,
然後安裝A程序要依賴於Y程序包,依賴我的Y程序包還沒安裝,而後Y程序包要裝的軟件包又依賴
於Y程序包本身,這種是很常見的,在rpm管理器中沒能得到解決,我們只能找出依賴,先把依賴包安裝好,
然後運氣好的話,沒有這種互相關聯,我們可以解決,如果是互相關聯的,就沒有辦法了。而rpm包的前端
工具,例如yum,就很好的解決了軟件包依賴的關系。

程序包管理器的功能(例如rpm):
將編譯好的應用程序的各組成文件打包成一個或幾個程序包文件,從而更方便地實現程序包的安裝、升級、
卸載和查詢等管理操作;
1、程序包的組成清單(每個程序包都單獨實現);
    文件清單
    安裝或卸載時運行的腳本
2、數據庫(公共)
    程序包的名稱和版本;
    依賴關系;
    功能說明;
    安裝生成的各文件的文件路徑及校驗碼信息;
    等等等

獲取程序包的途徑:
1、系統發行版的光盤或官方的文件服務器(或鏡像站點):
http://mirrors.aliyun.com 這是是國內阿裏雲提供的公共鏡像站點;
http://mirrors.sohu.com   這是國內搜狐提供的公共鏡像站點;
http://mirrors.163.com     這是163組織提供的公共鏡像站點;  
2、項目的官方站點
3、第三方組織:
    (1) EPEL
    (2) 搜索引擎
        http://pkgs.org
        http://rpmfind.net 
        http://rpm.pbone.net 
4、自己部署搭建鏡像站點或者主機打包rpm包

建議:檢查其合法性
    來源合法性;
    程序包的完整性;

2.2、rpm常見選項

rpm簡單組織語法格式:

rpm [OPTION] [PACKAGE_FILE]
其中OPTION根據rpm實現的每種功能,有分別的主選項,例如:
查詢:-q或-query
校驗:-V或--verify
安裝:-i或--install
升級:U或--upgrade,-F或--freshen
卸載:-e或--erase

2.2.1、rpm的通用選項

-?, --help:查看幫助信息;
--version:查看版本;
--quiet:安靜模式;
-v:詳細信息;
-vv:更詳細的輸出;

2.2.2、rpm與安裝相關的選項

語法格式:
rpm {-i|--install} [install-options] PACKAGE_FILE ...
其中-i或--install表示安裝功能主選項;
install-options表示安裝的子選項;

-h, --hash:hash marks輸出進度條;每個#表示2%的進度;
--test:測試安裝,檢查並報告依賴關系及沖突消息等;
--nodeps:忽略軟件包的依賴關系(正常情況不應該忽略);
--replacepkgs:重新安裝;
--replacefiles:如果其他程序安裝過相應文件,會覆蓋安裝;
--oldpackage:允許降級安裝軟件包;
--force:--replacepkgs, --replacefiles, and --oldpackage的組合;

PS:rpm包安裝,可以附帶四類安裝腳本,分別為:
preinstall:安裝過程開始之前運行的腳本,%pre
postinstall:安裝過程完成之後運行的腳本,%post
preuninstall:卸載過程真正開始執行之前運行的腳本,%preun
postuninstall:卸載過程完成之後運行的腳本,%postun

--nopre:不執行"安裝過程開始之前要運行的腳本片段";
--nopost:不執行"安裝過程完成之後運行的腳本片段";
--nopreun:不執行"卸載過程開始執行之前運行的腳本片段";
--nopostun:不執行"卸載過程完成之後運行的腳本片段";
--noscripts:相當於--nopre --nopost --nopreun --nopostun
--nodigest:不檢查包完整性信息;
--nosignature:不檢查包簽名信息,不檢查來源合法性;
--justdb:只安裝數據庫,不包安裝安裝文件系統的文件;(通過查詢選項還是可以列出安裝的文件,不過
實際並不存在,卸載的時候也要加上該選項);

PS:安裝的時候,rpm的數據庫沒有記錄軟件包的相關記錄,應該指明完整的rpm包名;

2.2.3、rpm與升級相關的選項

語法格式:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
這個-U是升級或安裝,如果已經安裝了且存在新版本,會移除舊版本並升級成新版本,簡稱升級或安裝軟件包;

rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
這個-F只升級軟件包,如果指定軟件包沒有安裝,不會安裝;

至於升級的選項,很多與安裝的選項相同
--justdb:只安裝數據庫,不包安裝安裝文件系統的文件;(通過查詢選項還是可以列出安裝的文件,不過
實際並不存在,卸載的時候也要加上該選項);
--force:強制,相當於--replacepkgs, --replacefiles, and --oldpackage;
--oldpackage:降級;
等等,其他選項,請看上一小結。

註意事項:
(1) 不要對內核做升級操作;Linux支持多內核版本並存,因此,直接安裝新版本內核;
(2) 如果某原程序包的配置文件安裝後曾被修改過,升級時,新版本的程序提供的同一個配置文件不會覆蓋原有
版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)後提供;

2.2.4、rpm與卸載相關的選項

語法結構:
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...
--allmatches:指定軟件包如果有多個版本,會卸載掉多有的版本(正常情況如果有多個版本存在,卸載檢測
出來,會報錯);
--nodeps:卸載軟件包前不檢查依賴關系;
--test :測試卸載,不真正執行;
--nopreun:不執行"卸載過程開始執行之前運行的腳本片段";
--nopostun:不執行"卸載過程完成之後運行的腳本片段";
--noscripts:等價於 --nopreun --nopostun;

PS:卸載的時候,不能指明完整的包名,只需要指定要卸載的軟件包的名字即可。

2.2.5、rpm與查詢相關的選項(最核心之一)

語法格式:
rpm {-q|--query} [select-options] [query-options]

select-options:
-a, --all:查詢所有已經安裝過的軟件包;
-f, --file FILE:查詢指定文件由哪一個軟件包提供;
-g, --group GROUP:查詢指定開發包組中對應程序包,系統已經安裝的有哪些;
-p, --package PACKAGE_FILE:用於實現對未安裝的程序包進行查詢操作;
--whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個程序包提供
--whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴;

query-options:
--changelog:查詢軟件包的改變信息;
-l, --list:查詢軟件包安裝生成的所有文件列表;
-i, --info:查詢程序包的相關信息,包括名字,版本號,大小,所屬包組,描述信息等;
-c, --configfiles:查詢軟件包提供的配置文件列表;(已經隱式含有-l,不用顯式再指明-l選項)
-d, --docfiles:查詢軟件包提供的文本文件列表;(已經隱式含有-l,不用顯式再指明-l選項)
--dump:導出(打印)軟件包的以下部分的詳細信息(隱式含有-l選項)
path size mtime digest mode owner group isconfig isdoc rdev symlink
路徑 大小 修改事件 摘要碼 權限 文件屬主 文件屬組 是否為配置文件 是否為文件文件, 設備相關,鏈接相關
--filesbypkg:查詢所有指定軟件包的安裝的文件列表(每個文件前邊會有軟件包名,再查找多個軟件包的文件列表
的時候可便於區分);
-i, --info:查詢程序包的相關信息,包括名字,版本號,大小,所屬包組,描述信息等;
-L, --licensefiles:查詢軟件包的許可證信息;
--provides:查詢軟件包的CAPABILITY(能力);
-R, --requires:查詢指定軟件包的依賴能力關系(這裏的依賴關系不一定到一個軟件包,因為能力是一種體現,
一個軟件包可以有多個能力);
--scripts:查詢軟件包自帶的腳本片段;

2.2.6、rpm與校驗相關的選項

語法結構:
rpm {-V|--verify} [select-options] [verify-options]
select-options和查詢的select-options相同;

verify-options:
--nodeps:校驗的時候不檢查軟件包的依賴關系;
--nodigest:校驗的時候不檢查包完整性;
--nosignature:校驗的時候不檢查包簽名信息和來源合法性;

輸出格式由9個字符組成的字符串,可能用來標識的屬性有:
c %config configuration file. 配置文件
d %doc documentation file. 文檔文件;
g %ghost file (i.e. the file contents are not included in the package payload).
l %license license file.: 許可證文件
r %readme readme file. 說明文件

字符構成:
如果對應字符位置標記為符號"."表示校驗通過,沒有異常,如果為符號"?",表示檢測異常,可能因為沒有權限等
原因造成,如果標記為以下字符表示對應屬性檢測失敗(軟件包本身屬性不變,如果有修改,對應字段會作出
相應的標記,不是所檢測不同就表示有問題,只能說與元件包原始提供的檢測不一樣):
S file Size differs    標記為S表示文件大小不同;
M Mode differs (includes permissions and file type) 標記為M表示權限不同(包括權限和文件類型)
5 digest (formerly MD5 sum) differs 標記為5 表示消息摘要碼不一樣;
D Device major/minor number mismatch 標記為D表示主設備號或次設備號不匹配;
L readLink(2) path mismatch 標記為L表示路徑不匹配;
U User ownership differs 標記為U表示文件的屬主不同;
G Group ownership differs 標記為G表示文件的屬組不同;
T mTime differs 標記為T表示文件的修改時間不同;
P caPabilities differ 標記為P表示軟件包提供的能力檢測不同;

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

獲取並導入信任的包制作者的密鑰:
    對於CentOS發行版來說:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

驗證:
    (1) 安裝此組織簽名的程序時,會自動執行驗正;
    (2) 手動驗證:rpm -K PACKAGE_FILE

PS:校驗rpm軟件包也不能帶上rpm的全路徑,只需要指明rpm包的名字即可;

2.2.7、rpm與數據庫維護相關

數據庫重建:
    rpm管理器數據庫路徑:/var/lib/rpm/
    查詢操作:通過的rpm的數據庫進行;

獲取幫助:
    CentOS 6:man rpm
    CentOS 7:man rpmdb

rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]
    --initdb:初始化數據庫,當前無任何數據庫可實始化創建一個新的;當前有時不執行任何操作;
    --rebuilddb:重新構建,通過讀取當前系統上所有已經安裝過的程序包進行重新創建;

2.3、實際案例

本小結主要以光盤中的一個名叫zsh的軟件包進行演示操作說明。
1、查詢
技術分享圖片

技術分享圖片

技術分享圖片

2、安裝和升級安裝,卸載

技術分享圖片

3、校驗和數據庫維護

技術分享圖片

技術分享圖片

學完rpm,記得把這個鏈接的10多個常見問題看一下,非常有用:
http://fedoranews.org/alex/tutorial/rpm/

Problem 1: Install or Upgrade a package? Can I install an old one?
Problem 2: Remove a package? Is it going to remove any dependencies?
Problem 3: Query installed packages? What about a RPM file?
Problem 4: List what packages are required by some RPM package?
Problem 5: Find from which package the file /usr/bin/smbmount belongs?
Problem 6: List what files will be installed by a RPM package?
Problem 7: Install a package directly from Internet? Can I use a proxy?
Problem 8: Simulate what will be done when executing "rpm -ivh new-kernel.rpm"?
Problem 9: Upgrade all my installed packages with one Freshen command?
Problem 10: Figure out the Kernel version(smp, bigmem) and base arch(i386, athlon)?
Problem 11: Install a new Kernel version but keeping my old one installed?
Problem 12: Make backups of my old packages when updating or removing them?
Problem 13: Build a RPM package from a SRPM with rpmbuild?
Problem 14: Check digests and signatures against a package?
Problem 15: See what RPM macros are defined on my system?
Problem 16: Get rpm back? The command "rpm -qa" returns nothing!
Problem 17: Figure out the installation time of my packages? [User Contribution]
Problem 18: Figure out the size of a installed package? [User Contribution]

1、安裝和升級軟件包,我可以使用舊軟件包嗎?
2、如何卸載軟件包,會卸載掉依賴文件嗎?
3、查詢已經安裝的軟件包,以及rpm的安裝文件信息?
4、列出依賴於rpm包的包以及文件?
5、查找某個程序文件屬於哪一個軟件包?(比如查詢/usr/bin/smbmount輸出哪個軟件包)
6、列出rpm軟件包將要安裝的文件?
7、如何直接從互聯網安裝一個軟件包?我可以使用代理嗎?(例如使用ftp協議或者http協議)
8、如何模擬安裝一個軟件包?
9、如何一次升級所有已經安裝過的軟件包?
10、如何查詢自己的內核版本以及系統體系架構?
11、安裝一個新的內容版本並且保留之前已經安裝過的舊版本?
12、在升級或卸載軟件包的時候,如果備份軟件包?
13、使用rpmbuild工具從SRPM格式構建出對應的RPM包?(這個涉及到rpm包的制作知識點,有興趣可以查閱)
14、如何檢驗包的完整性和來源合法性?
15、查看我的系統定義的和RPM包相關的宏有哪些?(這個涉及到rpm包的制作知識點,有興趣可以查閱)
16、有時候"rpm -qa"查詢不出東西,怎麽處理?
17、如何計算包的安裝時間?(這個是用戶提交的,非官方)
18、如何計算出已經安裝包的大小?(這個是用戶提交的,非官方)

三、rpm包管理器的前端工具yum

3.1、yum概述

yum是一個交互式的基於rpm實現的包管理器。它可以自動執行系統的更新,包括依賴性分析以及基於"倉庫(repository)"的元數據庫過時的處理。它也能夠實現安裝(新)軟件包,卸載(舊)軟件包以及對已經安裝的軟件包的查詢,或者向其他命令或程序提供可用的軟件包。yum和其他高級的軟件包管理工具是相似的,例如像apt-get或smart。

yum可以解決rpm安裝軟件包依賴的問題,不過yum是基於rpm來實現的,所以如果rpm使用有異常或者環境有問題,yum可能會使用異常。
yum - Yellowdog Updater Modified,通常都叫小黃狗。yum是rpm的前端工具實現,可以從指定服務器上自動下載程序包,並自動分析程序包的元數據、自動處理程序包之間的依賴關系,能一次性安裝完所有依賴的包,而無須繁瑣地一次次安裝所有依賴包。yum訪問訪問文件服務器(俗稱yum倉庫,yum repository)的模式是基於C/S架構的,而文件服務器(repository)則需要以某種共享服務方式將其提供的程序包及包相關的元數據提供給其他主機使用,通常使用到的協議有http、https、ftp、nfs等。此外,還可以使用光盤作為本地倉庫或者自己制作本地倉庫,通常使用到的協議是file。

上面有提到repository,yum的repository俗稱yum倉庫(yum repo),這個倉庫裏面存儲了很多rpm包以及存放於特定
repodata目錄下的包的相關元數據文件。既然yum訪問yum倉庫的模式是C/S架構,所以就必然有個yum客戶端和
yum服務端的概念。

  • yum客戶端
配置文件:
    /etc/yum.conf:為所有倉庫提供公共配置
    /etc/yum.repos.d/*.repo:為倉庫的指向提供配置

yum倉庫指向的配置文件:
[repositoryID]    這個表示倉庫的id表示,不同的yum倉庫配置不能相同;
name=Some name for this repository    這個是倉庫的名字;
baseurl=url://path/to/repository/   這個是訪問真正的yum服務端的url指向;
enabled={1|0}   倉庫是否啟用,1表示啟用(默認值),0表示未啟用;
gpgcheck={1|0}   是否要對程序包數據的來源合法性和數據完整性做校驗;,1表示檢查,0表示不檢查;
gpgkey=URL     指定GPG密鑰文件的訪問路徑,可由倉庫提供;;(如果gpgcheck啟用,這裏就要指向)
enablegroups={1|0}  是否允許以組的方式管理倉庫;
failovermethod={roundrobin|priority}
    默認為:roundrobin,意為隨機挑選;
    當baseurl同時指向多個倉庫路徑時,可指定以什麽方式選擇url去訪問倉庫,以及當某一路徑訪問
失敗時,可指定如何再選擇路徑;roundrobin是隨機挑選路徑訪問,priority是自上而下選擇路徑訪
問;
cost=
    開銷;開銷越小,該倉庫url更優;默認值為1000.
  • yum服務端(yum倉庫)
    至於服務端,沒什麽好說的,我們上面有講過客戶端了,我們來通過幾張圖來簡要說明。
    摘抄:

技術分享圖片

技術分享圖片

  用戶使用yum去請求安裝某一個程序包時,yum工具會先去yum配置文件中查找yum倉庫指向的路徑,根據該路徑去訪問遠程或本地的文件服務器,這個服務器作為yum倉庫並且存儲了眾多的rpm包以及包相關的元數據文件。當yum根據倉庫路徑訪問到倉庫後,會首先嘗試請求獲取rpm包的元數據文件並緩存至本地(/var/cache/yum目錄),而這個元數據文件包括了該倉庫所有rpm包的程序包名、版本號、依賴性以及每個程序包所提供的capabilities等。而後,yum根據用戶要安裝的程序包名去元數據文件裏查找,看看倉庫裏是否有用戶請求下載的程序包文件,如果找到了則根據元數據文件分析該程序包的依賴關系並分析本地系統上有哪些包已安裝、哪些包還沒安裝,再將所有用戶需要安裝且本地尚未安裝的程序包名列出來,並以客戶端的角色發送至文件服務器(倉庫)請求下載之。如果請求成功,則yum將要安裝的程序包文件也緩存至本地並執行安裝操作。安裝完成之後將緩存的程序包文件刪除以節約空間,而緩存中只留下元數據文件。

  為什麽只緩存元數據而不緩存程序包呢?因為程序包一般只安裝一次即可,很少會再安裝第二次,而且基於節約空間的考慮,因此yum在安裝完程序包後會將緩存中的程序包刪除。而緩存元數據好處則是當下一次用戶使用yum請求安裝程序包時可以節約帶寬,無需再次重新請求獲取全部的元數據文件,並且可以提高本地分析程序包的速度。

  當用戶第二次使用yum請求安裝程序包時,基於實時同步更新緩存以及節約帶寬的考慮,yum會先請求下載yum倉庫下rpm包元數據的校驗碼文件至本地,將其與本地緩存上的元數據校驗碼相比較,如果相同,說明無須更新;如果不同,則說明倉庫中rpm包已經更新,因此yum會重新請求下載倉庫上的元數據文件以更新元數據緩存。接著同樣是分析程序包依賴性、請求要安裝的全部程序包等。

3.2、yum常見選項

語法結構:
yum [options] [command] [package ...]

options表示選項,command表示使用的命令,package表示軟件包的名字;

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|rollback|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]

options:
1、repolist:顯示倉庫列表;
repolist [all|enabled|disabled]
如果指定enabled:表示只顯示啟用的倉庫列表;
如果指定disabled:表示只顯示關閉的倉庫列表;
如果指定all:表示顯示啟用和關閉的倉庫列表;
默認的repolist的參數是enabled。
repolist [all|enabled|disabled] 後邊還可以通過倉庫的id或者名字來查找,並且支持bash通配符機制;
repolist [all|enabled|disabled] "Repo-id"
repolist [all|enabled|disabled] "Repo-name"

有時候需要配置-v選項一起,查看詳細信息;

2、repoinfo:查看倉庫詳細信息
repoinfo [all|enabled|disabled]
repoinfo命令和repolist [all|enabled|disabled] -v等價;

3、list:顯示程序包
yum list [all | glob_exp1] [glob_exp2] [...]
列出所有可用和已經安裝的軟件包;
yum list available [glob_exp1] [...]
列出yum倉庫所有可用的的安裝包;
yum list updates [glob_exp1] [...]
列出yum倉庫所有可用的更新包;
yum list installed [glob_exp1] [...]
列出所有已經安裝的軟件包;
yum list extras [glob_exp1] [...]
列出所有系統已經安裝的軟件包卻不能被yum倉庫的配置文件所列出(通過rpm安裝的或者之前yum倉庫安裝
後來yum倉庫被移除了等)軟件包列表;
yum list distro-extras [glob_exp1] [...]
列出所有已經安裝的軟件包卻不能根據yum配置文件列出的yum倉庫的名字所匹配(yum倉庫已經被移除了)軟件包
列表;
yum list obsoletes [glob_exp1] [...]
列出系統已經安裝卻被rpm倉庫的配置文件列表指向yum倉庫人為軟件包已經過時了的軟件包列表;
yum list recent
   List  packages recently added into the repositories. This is often not helpful, but what you may really want
   to use is "yum list-updateinfo new" from the security yum plugin.
列出最近加入yum倉庫的軟件包列表。

4、install:安裝
install package1 [package2] [...]

5、reinstall:重新安裝
reinstall package1 [package2] [...]

6、update:升級更新
update [package1] [package2] [...]
不指定軟件包名或者指定參考沒有匹配(可以使用bash通配機制)軟件包,會更新所有軟件包;

7、downgrade:降級
downgrade package1 [package2] [...]

8、check-update:檢查是否有可用的升級
返回狀態值為100表示有可用的軟件包升級(正常會返回可用的軟件包更新列表);
返回狀態值為0表示無可用的軟件包升級;
返回狀態值為1表示運行報錯;

9、remove or erase:卸載軟件包
remove | erase package1 [package2] [...]
yum默認有保護yum自身的機制,不能對yum本身進行卸載;

10、info:查看程序包信息
列出描述和摘要信息,可選的指定選項和list一樣,下面只理出,不再次說明含義。
yum info [all | glob_exp1] [glob_exp2] [...]
yum info available [glob_exp1] [...]
yum info updates [glob_exp1] [...]
yum info installed [glob_exp1] [...]
yum info extras [glob_exp1] [...]
yum info distro-extras [glob_exp1] [...]
yum info obsoletes [glob_exp1] [...]
yum info recent
用的最多的就是:
yum info package_name類似於rpm -qi package_name或者rpm -qpi package_name.xxx.rpm

11、search:搜索程序包
search [all] string1 [string2] [...]
以指定的關鍵字搜索程序包名及summary信息;
默認是根據報名和摘要信息進行搜索,如果檢索失敗,會去詳細描述信息和url中去檢索;
可以顯式指明all來增大檢索的範圍,搜索的結果會有一定的排序;

12、provides 或 whatprovides:查看指定的特性是由哪個程序包提供
provides | whatprovides feature1 [feature2] [...]

13、clean:清理本地緩存
yum clean expire-cache  清理過期緩存;
yum clean packages   清理包;
yum clean headers  清理頭文件;
yum clean metadata 清理元數據;
yum clean dbcache 清理sqlite數據庫緩存;
yum clean rpmdb 清理本地的rpmdb緩存;
yum clean plugins 清理插件;
yum clean all 清理所有的

14、makecache:構建本地緩存
makecache [fast]
不加fast,會對所有啟用的倉庫構建本地緩存數據;
加fast,速度更快,不過只會對過期的緩存進行重新緩存,已經緩存且沒過期的不會;

15、deplist:查看指定的軟件包所依賴的能力(capabilities)
deplist package1 [package2] [...]

16、history:查看yum事務歷史
history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
不常用,這裏不進行講解每個選項的含義。

17、安裝及升級本地程序包:
* localinstall rpmfile1 [rpmfile2] [...]
   (maintained for legacy reasons only - use install)
* localupdate rpmfile1 [rpmfile2] [...]
   (maintained for legacy reasons only - use update)
這是一個早期的版本的選項,就是如果你本地有一個rpm文件,你可以直接通過yum 指定這個rpm文件(接的全名)
來安裝(會解決依賴管理,去啟用的倉庫中尋找依賴的軟件包)。
CentOS 6.x和CentOS 7.x直接使用:
yum install package_name.xxx.rpm
yum update package_name.xxx.rpm

18、包組管理相關:
* groupinstall group1 [group2] [...]   #安裝開發包組
* groupupdate group1 [group2] [...]  #更新開發包組
* grouplist [hidden] [groupwildcard] [...] #列出開發包組的信息
* groupremove group1 [group2] [...] #卸載開發包組
* groupinfo group1 [...]  #查看開發包組的摘要信息(包含軟件包列表)

yum的命令行選項:
--nogpgcheck:禁止進行gpg check;
-y: 自動回答為“yes”;
-q:靜默模式;
--disablerepo=repoidglob:臨時禁用此處指定的repo;
--enablerepo=repoidglob:臨時啟用此處指定的repo;
--noplugins:禁用所有插件;

3.3、自己配置yum倉庫

3.3.1、配置本地yum倉庫

我們本地有個iso的光盤,裏面有很多軟件包,簡單來看看如何配置yum的客戶端,然後通過掛載光盤
到文件系統上,通過本地文件系統安裝管理軟件包。

(1) 掛載光盤至某目錄,例如/media/cdrom
mkdir -p /media/cdrom  #創建光盤掛載點
mount -r -t iso9660 /dev/cdrom /media/cdrom #只讀掛載光盤文件到/dev/cdrom下(iso9660表示光盤的類型)

(2) 創建配置文件
最少可選模板,
[repository-id]
name=
baseurl=
gpgcheck=
enabled=

[root@node2 ~]# cd /etc/yum.repos.d/
[root@node2 yum.repos.d]# mkdir -p /media/cdrom
[root@node2 yum.repos.d]# mount -r -t iso9660 /dev/cdrom /media/cdrom/
[root@node2 yum.repos.d]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        98G  1.5G   97G   2% /
devtmpfs        229M     0  229M   0% /dev
tmpfs           238M     0  238M   0% /dev/shm
tmpfs           238M  8.8M  230M   4% /run
tmpfs           238M     0  238M   0% /sys/fs/cgroup
/dev/sda1       397M   94M  303M  24% /boot
tmpfs            48M     0   48M   0% /run/user/0
tmpfs            48M     0   48M   0% /run/user/1000
tmpfs            48M     0   48M   0% /run/user/1007
/dev/sr0        4.1G  4.1G     0 100% /mnt
[root@node2 yum.repos.d]# ls -l /media/cdrom/
total 614
-rw-r--r-- 1 root root     16 Apr  1  2015 CentOS_BuildTag
drwxr-xr-x 3 root root   2048 Mar 28  2015 EFI
-rw-r--r-- 1 root root    215 Mar 28  2015 EULA
-rw-r--r-- 1 root root  18009 Mar 28  2015 GPL
drwxr-xr-x 3 root root   2048 Mar 28  2015 images
drwxr-xr-x 2 root root   2048 Mar 28  2015 isolinux
drwxr-xr-x 2 root root   2048 Mar 28  2015 LiveOS
drwxr-xr-x 2 root root 589824 Apr  1  2015 Packages
drwxr-xr-x 2 root root   4096 Apr  1  2015 repodata
-rw-r--r-- 1 root root   1690 Mar 28  2015 RPM-GPG-KEY-CentOS-7
-rw-r--r-- 1 root root   1690 Mar 28  2015 RPM-GPG-KEY-CentOS-Testing-7
-r--r--r-- 1 root root   2883 Apr  1  2015 TRANS.TBL

這是我配置的yum倉庫客戶端的配置文件
[root@node2 yum.repos.d]# cat local-base.repo
[CentOS7-localbase]
name=CentOS 7 local iso base
baseurl=file:///media/cdrom
gpgcheck=0
enabled=1

[root@node2 yum.repos.d]# yum repolist
Loaded plugins: fastestmirror
CentOS7-localbase                                                                                      | 3.6 kB  00:00:00     
(1/2): CentOS7-localbase/group_gz                                                                      | 154 kB  00:00:00     
(2/2): CentOS7-localbase/primary_db                                                                    | 2.7 MB  00:00:00     
Loading mirror speeds from cached hostfile
 * base: mirrors.163.com
 * extras: mirrors.shu.edu.cn
 * updates: mirrors.163.com
repo id                                                  repo name                                                      status
CentOS7-localbase                                        CentOS 7 local iso base                                        3,576
base/7/x86_64                                            CentOS-7 - Base                                                9,911
extras/7/x86_64                                          CentOS-7 - Extras                                                432
updates/7/x86_64                                         CentOS-7 - Updates                                             1,602
repolist: 15,521
上面可以看出,我們的配置的已經可以被查詢出來了。

yum的repo配置文件中可用的變量:
    $releasever: 當前OS的發行版的主版本號;
    $arch: 平臺;
    $basearch:基礎平臺;
    $YUM0-$YUM9

3.3.2、配置網絡yum倉庫

自己準備一些軟件包,然後構建一個yum的服務端倉庫,然後通過http協議給本地機器走http協議訪問。

yum server:

1、創建一個文件系統目錄,上傳一些軟件包(模擬測試用的)
[root@node2 ~]# mkdir -p /data/yum_server
[root@node2 ~]# cd /data/yum_server
[root@node2 yum_server]# ls /data/yum_server
DenyHosts-2.6.tar.gz           nginx-1.10.3.tar.gz   redis-3.2.11.tar.gz  redis-4.0.3.tar.gz  redis-4.0.9.tar.gz
extundelete-0.2.4.tar.bz2      nginx-1.12.2.tar.gz   redis-3.2.3.tar.gz   redis-4.0.4.tar.gz  ss5-3.8.9-8.tar.gz
fping-2.4b2-10.el6.x86_64.rpm  nginx-1.14.0.tar.gz   redis-3.2.8.tar.gz   redis-4.0.5.tar.gz  tcl8.6.6-src.tar.gz
keepalived-1.2.20.tar.gz       nginx-1.6.3.tar.gz    redis-4.0.0.tar.gz   redis-4.0.6.tar.gz
kubernetes-1.11.2.zip          Python-2.7.13.tar.xz  redis-4.0.1.tar.gz   redis-4.0.7.tar.gz
lynis-2.5.7.tar.gz             redis-3.2.10.tar.gz   redis-4.0.2.tar.gz   redis-4.0.8.tar.gz

2、安裝createrepo
[root@node2 yum_server]# rpm -q createrepo
package createrepo is not installed
[root@node2 yum_server]# yum install createrepo
......

3、 初始化repodata索引文件
-d --database
       Generate sqlite databases for use with yum. This is now the default.
-p --pretty
       Output xml files in pretty format.
-o --outputdir <url>
       Optional output directory (useful for read only media).

[root@node2 yum_server]# createrepo -pdo /data/yum_server/ /data/yum_server/
Spawning worker 0 with 1 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
[root@node2 yum_server]# ls /data/yum_server/
DenyHosts-2.6.tar.gz           nginx-1.10.3.tar.gz   redis-3.2.11.tar.gz  redis-4.0.3.tar.gz  redis-4.0.9.tar.gz
extundelete-0.2.4.tar.bz2      nginx-1.12.2.tar.gz   redis-3.2.3.tar.gz   redis-4.0.4.tar.gz  repodata
fping-2.4b2-10.el6.x86_64.rpm  nginx-1.14.0.tar.gz   redis-3.2.8.tar.gz   redis-4.0.5.tar.gz  ss5-3.8.9-8.tar.gz
keepalived-1.2.20.tar.gz       nginx-1.6.3.tar.gz    redis-4.0.0.tar.gz   redis-4.0.6.tar.gz  tcl8.6.6-src.tar.gz
kubernetes-1.11.2.zip          Python-2.7.13.tar.xz  redis-4.0.1.tar.gz   redis-4.0.7.tar.gz
lynis-2.5.7.tar.gz             redis-3.2.10.tar.gz   redis-4.0.2.tar.gz   redis-4.0.8.tar.gz
[root@node2 yum_server]# ls /data/yum_server/repodata
0dd81bd3480e1b700ef4d8501952ada4c17f0f7aa6e33b2ecdc1986327bcef70-primary.sqlite.bz2
54b9a1903b8bd39bcfd5c1e35840a19891a1187d078a009b4882aedf24e21154-filelists.sqlite.bz2
59026382882aae681f9af6f060b7d151f36be0e82583dcd07652cc7bb74d9f8c-other.sqlite.bz2
71b15f14ece520f2722a1648481a433c30e4bff9e407b89ad4d22f0ec40b90bd-other.xml.gz
cb1c34973cff8ddb6b6f40fc48ddaec468c057f9ff62c20fad26119d278b6c85-primary.xml.gz
dc8a69e32b8fbfd2a3d54f6f92ed53561754e3bf68b4263be3e74323a1bb2549-filelists.xml.gz
repomd.xml
[root@node2 yum_server]# cat /data/yum_server/repodata/repomd.xml |wc -l
55

4、通過http協議實現yum的文件傳輸
(1) 安裝nginx
yum install nginx
此步驟要包裝本地配置的yum客戶端配置指向的啟用的yum源,要有nginx安裝包,常見的EPEL源和nginx官方自己的
yum倉庫就提供nginx的軟件包;

(2) 修改nginx主頁指向

vim /etc/nginx/conf.d/default.conf
默認 root   /usr/share/nginx/html
改為
root /data/yum_server
(3) 設置nginx主頁權限和防火墻放行http服務(我沒有啟用Selinux機制)
[root@node2 ~]# id nginx
uid=998(nginx) gid=996(nginx) groups=996(nginx)
[root@node2 ~]# setfacl -R -m u:nginx:r-- /data/yum_server
[root@node2 ~]# getfacl /data/yum_server
getfacl: Removing leading ‘/‘ from absolute path names
# file: data/yum_server
# owner: root
# group: root
user::rwx
user:nginx:r--
group::r-x
mask::r-x
other::r-x
[root@node2 ~]# getfacl /data/yum_server/redis-4.0.1.tar.gz 
getfacl: Removing leading ‘/‘ from absolute path names
# file: data/yum_server/redis-4.0.1.tar.gz
# owner: root
# group: root
user::rw-
user:nginx:r--
group::r--
mask::r--
other::r--
[root@node2 yum.repos.d]#  getfacl -p /data/yum_server/redis-4.0.1.tar.gz 
# file: /data/yum_server/redis-4.0.1.tar.gz
# owner: root
# group: root
user::rw-
user:nginx:r--
group::r--
mask::r--
other::r--

[root@node2 yum.repos.d]#  getfacl -p /data/yum_server/nginx-1.14.0.tar.gz 
# file: /data/yum_server/nginx-1.14.0.tar.gz
# owner: root
# group: root
user::rw-
user:nginx:r--
group::r--
mask::r--
other::r--

Firewalld防火墻放行http:
[root@node2 yum.repos.d]# firewall-cmd --help|grep add-service
  --add-service=<service>
[root@node2 yum.repos.d]# firewall-cmd --add-service=http --permanent
success
[root@node2 yum.repos.d]# firewall-cmd --reload
success
[root@node2 yum.repos.d]# firewall-cmd --list-services
dhcpv6-client http ssh

(5) 啟動nginx,嘗試機房訪問測試
[root@node2 ~]# nginx -t 
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

[root@node2 ~]# systemctl enable nginx.service
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[root@node2 ~]# systemctl start nginx.service
[root@node2 ~]# ss -nlt|grep :80
LISTEN     0      128                       *:80                       *:* 

如果是單純的文件訪問沒問題,不過要想列出nginx的文件列表,首先nginx的工作進程用戶要
對主頁的那個目錄有執行權限,其次,對應的站點的配置要添加以下內容:
autoindex on;  # 開啟目錄文件列表
autoindex_exact_size on;  # 顯示出文件的確切大小,單位是bytes
autoindex_localtime on;  # 顯示的文件時間為文件的服務器時間
charset utf-8,gbk;  # 避免中文亂碼

給執行權限:
[root@node2 ~]# setfacl -R -m u:nginx:r-x /data/yum_server
[root@node2 ~]# getfacl -p /data/yum_server
# file: /data/yum_server
# owner: root
# group: root
user::rwx
user:nginx:r-x
group::r-x
mask::r-x
other::r-x
nginx -t檢測語法,成功後,
systemctl reload nginx.service 重新加載

站點瀏覽器訪問測試![](http://i2.51cto.com/images/blog/201810/28/584f59f82b3f4df557b5f0fae32705a0.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

(6)、準備另外一臺主機,配置客戶端yum源的baseurl指向上面配置的http站點

客戶端配置:
[local-http]
name=centos7 local http
baseurl=http://172.168.110.21/
enable=1
gpgcheck=0

這裏有些淩亂了,我把源碼包傳到我的yum服務器的軟件包目錄了,我應該準備rpm包。
拷貝一些光盤的軟件包到我的yum服務端的對應目錄。
[root@node2 yum_server]# cp /media/cdrom/Packages/*.rpm .
[root@node2 yum_server]# du -sh /data/yum_server/
3.6G    /data/yum_server/
重新授權:
[root@node2 yum_server]# setfacl -R -m u:nginx:r-x /data/yum_server
軟件包加入或變更,要手動更新一下:(更新是非常吃cpu資源的,請不要在有業務的生成環境上測試)
[root@node2 yum_server]# createrepo --update /data/yum_server
Spawning worker 0 with 3576 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
客戶端重啟構建一下緩存數據:
[root@node1 yum.repos.d]# yum makecache
Loaded plugins: fastestmirror
local-http                                                                                             | 2.9 kB  00:00:00     
(1/3): local-http/primary_db                                                                           | 2.7 MB  00:00:00     
(2/3): local-http/filelists_db                                                                         | 2.7 MB  00:00:00     
(3/3): local-http/other_db                                                                             | 1.1 MB  00:00:00     
Loading mirror speeds from cached hostfile
Metadata Cache Created

我之前把系統默認自帶的repo都備份了,現在哪臺客戶端主機只剩下這個配置的http的yum倉庫。
[root@node1 yum.repos.d]# yum repolist
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
repo id                                                 repo name                                                       status
local-http                                              centos7 local http                                              3,577
repolist: 3,577
[root@node1 yum.repos.d]# yum info zsh
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Available Packages
Name        : zsh
Arch        : x86_64
Version     : 5.0.2
Release     : 7.el7
Size        : 2.4 M
Repo        : local-http
Summary     : Powerful interactive shell
URL         : http://zsh.sourceforge.net/
License     : MIT
Description : The zsh shell is a command interpreter usable as an interactive login
            : shell and as a shell script command processor.  Zsh resembles the ksh
            : shell (the Korn shell), but includes many enhancements.  Zsh supports
            : command line editing, built-in spelling correction, programmable
            : command completion, shell functions (with autoloading), a history
            : mechanism, and more.
[root@node1 yum.repos.d]# yum install zsh
......
[root@node1 yum.repos.d]# rpm -q zsh
zsh-5.0.2-7.el7.x86_64
經過簡單測試後,發現沒有問題。

PS:一般構建自己的yum服務器,會去外網同步更新yum倉庫的軟件包(這臺服務器必須要保證出口帶寬)。如果
走外網提供yum文件傳輸的話,可以這樣做,同步外網的軟件包,然後對內走內網使用yum倉庫。
比較有名的,CentOS的自己的源,163的源,EPEL的源,阿裏雲的源等等。

四、rpm包管理器的前端工具dnf(精簡說明)

默認base倉庫沒有dnf軟件包,需要特殊配置,就連EPEL源也沒有,所以我這裏只是簡單的介紹一下。

網上google的做法:

yum -y install wget
wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/dnf-conf-0.6.4-2.sdl7.noarch.rpm
wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64//dnf-0.6.4-2.sdl7.noarch.rpm
wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/python-dnf-0.6.4-2.sdl7.noarch.rpm  
yum -y install python-dnf-0.6.4-2.sdl7.noarch.rpm  dnf-0.6.4-2.sdl7.noarch.rpm dnf-conf-0.6.4-2.sdl7.noarch.rpm 

[root@node2 ~]# yum info dnf
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.163.com
 * epel: mirrors.yun-idc.com
 * extras: mirrors.shu.edu.cn
 * updates: mirrors.163.com
Installed Packages
Name        : dnf
Arch        : noarch
Version     : 0.6.4
Release     : 2.sdl7
Size        : 652 k
Repo        : installed
From repo   : /dnf-0.6.4-2.sdl7.noarch
Summary     : Package manager forked from Yum, using libsolv as a dependency resolver
URL         : https://github.com/rpm-software-management/dnf
License     : GPLv2+ and GPLv2 and GPL
Description : Package manager forked from Yum, using libsolv as a dependency resolver.

dnf是是下一個即將到來的主要版本的yum,它是基於rpm包管理器的linux發型版本的包管理器。(很謙虛)
它大體上維護了與YUM兼容的CLI,並定義了擴展和插件的嚴格API。yum相較yum是有有點的,不過目前
的CentOS 7.x沒有采納進來, Fedora 22 已經默認使用 DNF作為包前端管理器。

dnf語法結構:
dnf [options] <command> [<args>...]
Available commands are:

· autoremove
· check-update
· clean
· distro-sync
· downgrade
· group
· help
· history
· info
· install
· list
· makecache
· provides
· reinstall
· remove
· repolist
· repository-packages
· search
· updateinfo
· upgrade
· upgrade-to

1、安裝和重新安裝
dnf [options] install <spec>...
dnf [options] reinstall <package-specs>...

2、檢測更新和更新
dnf [options] check-update [<package-specs>...]
dnf [options] upgrade

3、卸載
dnf [options] erase <spec>...
dnf [options] remove <package-specs>...

4、查看repo和軟件包以及列表
dnf [options] repolist [enabled|disabled|all]
dnf [options] info [<package-spec>...]
dnf [options] list [all] [<package-name-specs>...]
dnf [options] list installed [<package-name-specs>...]
dnf [options] list available [<package-name-specs>...]
dnf [options] list extras [<package-name-specs>...]
dnf [options] list obsoletes [<package-name-specs>...]
dnf [options] list recent [<package-name-specs>...]
dnf [options] list upgrades [<package-name-specs>...]

5、檢索軟件包
dnf [options] search [all] <keywords>...

6、清理緩存和構建緩存
dnf clean dbcache
dnf clean expire-cache
dnf clean metadata
dnf clean packages
dnf clean plugins
dnf clean all
dnf [options] makecache

等(其他查看軟件包的能力,以及包組管理相關,我就不列出來了,也是支持的,和yum幾乎差別不大)

linux下包管理器