YUM:Yellow dog Updater Modified

1. 什麼是YUM

YUM(全稱爲 Yellow dog Updater Modified)
是一個在Fedora和RedHat以及CentOS中的Shell前端軟件包管理器。基於RPM包管理,可以從指定的服務器自動下載RPM包而且安裝,能夠自動處理依賴性關係,而且一次安裝全部依賴的軟件包,無須繁瑣地一次次下載、安裝。php

YUM是C/S架構,是RPM的前端工具,依賴於RPM存在的
服務器端:
首先要是一個文件服務器,有很大的存儲空間,裏面放着RPM包、元數據文件、conf文件、binary信息。並經過文件共享服務讓外部客戶端能夠訪問到存放RPM包的目錄。前端

YUM支持的文件服務器有如下幾種:nginx

  • ftp://
  • http://
  • nfs://
  • file:/// ##爲何有三個斜槓,這是由於第三個斜槓是Linux目錄中的斜杆

客戶端:sql

  • 支持RPM包管理基本功能,本地也要有YUM程序;
  • 本地要有配置文件(配置遠程服務器YUM倉庫或本地服務器YUM倉庫);

2. YUM的工做流程

在客戶端,當YUM接收到用戶命令(例如:安裝程序包的命令)以後,會向着本地配置文件中配置的服務器地址(URL)發起鏈接。YUM不會直接向服務器請求程序包,而是請求YUM服務器上存放RPM包名、版本、包和包之間依賴關係的元數據文件。這個文件下載到本地以後,會先存放到cache中,而後YUM會在本地上分析這個文件中是否存有要安裝程序包的包名,若是有就根據這個元數據文件嘗試分析該包的依賴關係,得出要依賴哪些程序包以後,就在本地已安裝的程序包中查詢被依賴的包中哪些已安裝,哪些沒有安裝;shell

分析完以後,YUM會啓動文件服務器的客戶端向着YUM服務器下載那些沒有安裝的程序包。下載完成後先緩存在本地,在本地開始執行相似於RPM安裝的操做;而安裝時會先安裝被依賴的程序包,全部程序包安裝完成後會通知客戶端,並自動刪除緩存區中的程序包以節省空間;可是元數據不會被刪除,由於下次再安裝新的程序包時,直接分析本地的元數據就能夠獲取依賴關係,經過這種方式能夠節省時間與網絡帶寬。centos

可是上述這種機制,也存在着一些問題,萬一服務器上的程序包或者依賴關係發生了變化,就會致使服務器和客戶端本地的元數據不一致。想解決這個問題,能夠在每次使用YUM的時候,都向服務器請求元數據。可是這種方式浪費帶寬和時間,有的時候明明沒有變化,但仍是須要下載。緩存

YUM服務器上有一個特殊文件,文件中記錄了每個元數據文件的校驗碼,實際上每次運行YUM的時候,都會向服務器請求這個文件(剛剛配置好YUM源的時候,本地沒有這個文件,這時候確定是要下載元數據的),並和本地元數據中的校驗碼文件進行對比,若是一致則表明元數據沒有變化,本地元數據有效,不然就從新請求元數據。服務器

3. YUM命令

3.1 經常使用命令行選項

若是一個功能在配置文件中使能了,卻在命令行運行命令的時候去使能了,命令行優先。網絡

-q, --quiet:靜默模式
-v, --verbose:詳細模式
-y, --assumeyes:自動回答爲yes;
--assumeno:自動回答爲no
--nogpgcheck:禁止進行GPG Check;
-R [minutes], --randomwait=[minutes]:最多等待時間
--disablerepo=repoidglob:禁用此處指定的repo倉庫ID,可配置通配符進行匹配;
--enablerepo=repoidglog:啓用指定的repo倉庫ID,可配置通配符進行匹配;
-x [package], --exclude=[package]:通配要排除的包
--noplugins:禁用全部插件;
--color=COLOR:帶顏色
--downloadonly:僅下載包,不安裝或升級。默認下載在yum的緩存目錄中,默認爲/var/cache/yum/$basearch/$releasever
--downloaddir=DLDIR:指定下載目錄
--installroot=:指定另外一個installroot,至關於運行了chroot。注意:當建立其餘instalroot的時候,能夠指定--releasever=/,不然$releasever將重新制定的目錄的rpmdb中獲取。例如:yum --installroot=/tmp --releasever=/ install nginx
--releasever=:假設當前的release version是指定的字符串。這個選項在使用--installroot的時候很是有用。你可使用--releasever=/指定$releasever從--installroot以外的目錄獲取。例如:yum --installroot=/tmp --releasever=7 install nginx

3.2 查詢功能

顯示倉庫列表
yum repolist [all|enabled|disabled]
按照選項列出程序包信息架構

Note:根據命令格式可搭配glob風格的通配符;

列出全部可提供的或已安裝的程序包;
yum list [all | glob_exp1] [glob_exp2] [...]

列出軟件倉庫中全部能夠提供安裝的程序包
yum list available [glob_exp1] [...]

列出軟件倉庫中全部可用來更新的程序包(可讓本地系統用來更新的包)
yum list updates [glob_exp1] [...]

列出args指定的包。若是參數與可用包的名稱不匹配,則假定它是shell樣式的glob,而且打印任何匹配項。
yum list installed [glob_exp1] [...]

列出系統上已經安裝,但在被配置文件裏列出的YUM倉庫裏不存在的程序包
yum list extras [glob_exp1] [...]
        
列出系統上已經安裝,但在配置文件裏列出的YUM倉庫中被廢棄的程序包
yum list obsoletes [glob_exp1] [...]

列出最近添加到YUM倉庫的RPM包
yum list recent

顯示程序包信息,至關於rpm -qi PACKAGE
yum info [...]

查看指定特性(也能夠是文件)是哪一個程序包提供的
yum provides | whatprovides feature1 [feature2] [...]

搜索包含包名和摘要字符串

模糊搜索,搜索包名和摘要信息
yum search string1 [string2] [...]

查看指定包所依賴的capabilities
yum deplist package1 [package2] [...]

查看rmp包db版本信息
yum version [ all | installed | available | group-* | nogroups* | grouplist | groupinfo ]

查看yum事務歷史

yum history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
事務就是執行yum命令,查詢不算事務,通常包括安裝、升級、卸載等,修改類的操做纔算事務;
例如:
]# yum history                      ##查看yum的歷史事務信息;            
]# yum history summary              ##查看yum歷史事務的摘要信息;
]# yum history list                 ##查看yum歷史事務列表,默認操做;
]# yum history liststats            ##查看的是統計數據;

3.3 安裝/升級/移除功能

安裝程序包

默認會安裝最新的,安裝的時候指定部分包名就行,不須要指定完成的RPM程序包名稱
yum install package1 [package2] [...]

從新安裝程序包

從新安裝(基於覆蓋方式安裝),相似於rpm  -ivh --replacepgks
yum reinstall package1 [package2] [...]

升級程序包

yum update [package1] [package2] [...]
升級軟件包的同時也升級軟件和系統內核
yum upgrade [package1] [package2] [...]
只升級軟件包,不升級軟件和系統內核

降級程序包

相似於rmp -Uvh --oldpackages
yum downgrade package1 [package2] [...]

檢查可升級的程序包
yum check-update

卸載程序包

卸載某個程序包,會把依賴它的程序包也一塊兒卸載
remove | erase package1 [package2] [...]

3.4 清除/構建緩存

當更換新的YUM倉庫以後,執行一次清理和構建是頗有必要,這可使得本地和YUM倉庫中的元數據等信息同步。
清理本地緩存目錄
用於清理在yum緩存目錄中積累的各類各樣的東西
yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]

構建元數據
下載並使用全部當前可用的YUM倉庫的元數據
yum makecache [fast]

3.5 安裝/升級本地程序包

安裝本地RPM包

不用管這個RPM包的依賴問題,依賴問題會被yum解決
yum localinstall rpmfile1 [rpmfile2] [...]
maintained for legacy reasons only - use install

升級本地程序包

不用管這個RPM包的依賴問題,依賴問題會被yum解決
yum localupdate rpmfile1 [rpmfile2] [...]
maintained for legacy reasons only - use update

3.6 包組管理相關命令

Note:若是包組名稱中包含空格,則要使用雙引號包圍;

yum groupinstall group1 [group2] [...]:安裝包組;
yum groupupdate group1 [group2] [...]:升級包組;
yum grouplist [hidden] [groupwildcard] [...]:查看包組;
yum groupremove group1 [group2] [...]:移除包組;
yum groupinfo group1 [...]:查看包組相關信息,就是包組內有多少程序包等信息;
        ##Mandatory Packages:必須安裝的包;
        ##Default Packages:默認安裝的包;
        ##Optional Packages:可選安裝的包(若是被依賴也會安裝);

安裝一個包組的時候,默認狀況只會安裝Mandatory或Default ,其中Optional Packages不會被安裝,想改變這種狀況須要/etc/yum.repos.d/xxxx.repo中加入此選項
group_package_types=default, mandatory, optional

4. YUM客戶端的配置文件

4.1 主配置文件/etc/yum.conf

一個YUM客戶端能夠指向一個或多個倉庫(如:一個倉庫存儲的是基本程序包,一個倉庫存儲的是擴展程序包,一個倉庫存儲是第三方程序包);
當安裝程序包時,若是存在多個同一類倉庫(經過鏡像來管理);yum會同時分析多個倉庫,從中找出版本最新的程序包安裝,而且能夠經過自定義COST,實現優先使用自定義的倉庫。

[root@Centos7 ~]# cat /etc/yum.conf         ##Centos7.4,沒有更改過徹底默認。
1表示使能,0表示不使能;等號左右不要有空格,不然可能出現語法錯誤;
[main]                                              ##倉庫ID
cachedir=/var/cache/yum/$basearch/$releasever       ##緩存文件存放目錄
keepcache=0                                         ##緩存文件是否保存下來
debuglevel=2                                        ##debug調試級別,默認爲2
logfile=/var/log/yum.log                            ##日誌文件路徑
exactarch=1                                         ##安裝程序包的時候,作精確地平臺匹配(例如:配置爲0則容許在i386上更新i686的RPM包)
obsoletes=1                                         ##僅在更新的時候生效,容許更新陳舊的RPM包
gpgcheck=1                                          ##安裝程序包的時候,檢查GPG(GNU Private Guard)
plugins=1                                           ##是否容許使用插件(咱們通常會用yum-fastestmirror這個插件)
installonly_limit=5                                 ##同時安裝幾個程序包
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum     ##追蹤BUG的URL
distroverpkg=centos-release                         ##指定基準包,yum會根據這個包判斷髮行版本

4.2 倉庫文件/etc/yum.repos.d/xx.repo

repo文件是Fedora、Redhat和Centos中yum源(軟件倉庫)的配置文件,一般一個repo文件定義了一個或者多個軟件倉庫的細節內容,例如咱們將從哪裏下載須要安裝或者升級的軟件包,repo文件中的設置內容將被yum讀取和應用!
Note:文件必須以.repo結尾,不然不會被YUM使用
一個repo文件能夠指向一個倉庫,爲倉庫的指向提供配置信息;
一個repo文件也能夠指向多個倉庫,只不過爲了便於管理切割成了多個repo文件;

自定義repo文件的部分參數

1表示使能,0表示不使能;等號左右不要有空格,不然可能出現語法錯誤;
[repositoryID]:                                         ##設定倉庫ID(main不能做爲ID,由於它是公共的);
name=Some name for this repository                      ##設定YUM倉庫名;
baseurl=url://server1/path/to/repository/               ##設定YUM倉庫訪問路徑(指向repodata這個目錄的上級目錄);
            url://server2/path/to/repository/           ##第二行及其以後的URL不能頂格寫
            url://server3/path/to/repository/
mirrorlist=                                                 ##不能與baseurl同時使用,設定鏡像服務器地址URL(指向的是個文本文件,裏面存放多個指向倉庫的URL,YUM會將這個文件下載到本地而後鏈接倉庫);
enabled={1|0}                                               ##設定是否啓用倉庫,默認啓用;
gpgcheck={1|0}                                              ##設定是否在安裝此倉庫中的程序包時,進行GPG校驗,來RPM包的完整性和來源合法性;
repo_gpgcheck={1|0}                                         ##設置是否檢查倉庫元數據簽名信息;
gpgkey=URL                                                  ##指向GPG密鑰文件的訪問路徑(多是倉庫或權威機構提供);
enablegroups={1|0}                                          ##設置是否在倉庫上使用組批量管理程序包;
failovermethod={roundrobin|priority}                        ##故障轉移方法(輪詢|優先級),默認爲roundrobin隨機挑選,priority是按順序選擇;
exclude=compiz* *compiz* fusion-icon*                       ##用來禁止這個軟件倉庫中的某些軟件包的安裝和更新,可使用通配符,並以空格分隔,能夠視狀況須要自行添加;
keepalive={1|0}                                             ##是否當遠程服務器是HTTP/1.1時,保持鏈接功能;
username                                                    ##有些服務器不支持匿名訪問,須要指明要訪問服務器的用戶名;
password                                                    ##有些服務器不支持匿名訪問,須要指明要訪問服務器的密碼;
cost=                                                       ##訪問倉庫的開銷(默認爲1000),用數字表示;
group_package_types=default, mandatory, optional            ##安裝包組中指定類型的包;

4.3 YUM的repo配置文件中可用的變量

示例:

[centosplus]
baseurl=http://mirrors.aliyun.com/centos/$releasever/centosplus/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/centosplus/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

$releasever:程序的版本,對YUM而言指的是redhat-relrase版本。只替換爲主版本號,如Redhat6.5 則替換爲6
$arch:系統架構
$basearch:系統基本架構,如i686,i586等的基本架構爲i386
$YUM0-$YUM9:在系統定義的環境變量,能夠在yum中使用

5. repodata目錄

YUM倉庫存儲了衆多的RPM包,以及包的相關的元數據文件,其中包含元數據在內的一些文件就是放置於repodata目錄下的;
通常出現的找不到repodata目錄或文件的錯誤的緣由一般有三個:

  • 路徑問題;
  • 沒有生成repodate目錄;
  • *.repo配置文件衝突。

repodata做爲軟件的倉庫,其目錄下有四個必要文件,其中最主要的是repomd.xml文件。

  • filelists.xml.[gz]
  • other.xml.[gz]
  • primary.xml.[gz]
  • repomd.xml(md意思是metadata)
[Allen@Centos7 ~]$ ls -lh  /mnt/sdf/repodata/
total 13M
-rw-r--r--. 1 root root 1.3M Sep 10 14:07 4153601518ea9bea00dea4b73816fccd29a5167fca6902ee31f536e023763371-other.sqlite.bz2
-rw-r--r--. 1 root root 953K Sep 10 14:07 a7877ff695cd6b491a74016534c4201fcf0aa92f2bf7301c7cf72488e72f9807-other.xml.gz
-rw-r--r--. 1 root root 3.2M Sep 10 14:07 bcb5a2092e7ad381b6e5b6f7982ca60efde0fd570bec36afb318829b0892152c-filelists.xml.gz
-rw-r--r--. 1 root root 1.5M Sep 10 14:07 c2839d685c7b3885e9d9d883e3d2eff9f857a0ab8a6dbb4c8ada69fc041283a5-primary.xml.gz
-rw-r--r--. 1 root root 3.1M Sep 10 14:07 d6ce21daefa0b83ba93871586fcf46030b8cea7675b31b42734353c112c165b7-primary.sqlite.bz2
-rw-r--r--. 1 root root 3.1M Sep 10 14:07 ee7a27844625d211f084876e6f94e1768f2a747d612c7252d77bee234405934d-filelists.sqlite.bz2
-rw-r--r--. 1 root root 3.1K Sep 10 14:07 repomd.xml

...primary:存儲主matadata數據,包括全部包名,版本號,依賴關係等等;
...filelists:保存了每一個程序包安裝後會生成的文件;
repomd:存儲了以上6個文件的指紋信息(校驗碼);即當yum從遠程倉庫下載程序包時,就先下載這個文件,比較與本地是否一致,若是一致,本地緩存繼續有效,不然從新下載;

6. createrepo_c命令

每一個rpm包都包含一個內部文件清單,每個文件就是capability,若是這個程序包還能額外提供其它的capability,須要在製做rpm包的sbark文件中顯示說明;
YUM倉庫經過createrepo_c命令,經過分析每個rpm包自帶的元數據,而後抽取出來,並羅列保存在元數據文件裏,好比:在製做rpm包時,每一個包叫什麼名字、依賴哪些包、提供哪些capability等,這些信息在製做rpm包時都已經提供了。
createrepo命令建立高級倉庫時比較困難,高級倉庫中要對程序包分組,建立分組,組文件是xml格式的,所以要建立時要精通xml語法才能建立;
createrepo_c就能夠建立repodata目錄
NAME
createrepo_c - Create rpm-md format (xml-rpm-metadata) repository

SYNOPSIS
createrepo_c [options] <directory>

OPTIONS

-u,--baseurl <url>:可選指明base URL本地的路徑;
-o,--outputdir <url>:可選輸出目錄的路徑;
-x,--excludes <package>:排除指定的程序包;
-i,--pkglist <filename>:包含對哪些包建立;
-g,--groupfile <groupfile>:指明包組文件;
--basedir:指明獲取repodata的basedir路徑,默認當前工做目錄;
--update:只更新那些在上次產生元數據以後被改變(基於文件大小和mtime),添加或者刪除了的項目,這能夠大大減小I/O和處理時間;
--update-md-path:使用已經存在的repodata。
-o --outputdir <URL>:可選的輸出目錄

7. 配置YUM實驗

7.1 使用系統光盤做爲YUM源

[Allen@Centos7 ~]$ cat /etc/yum.repos.d/cd.repo
[mycdrom]
name=Centos7.4
baseurl=file:///mnt/iso/
enabled=1
gpgcheck=1
gpgkey=file:///mnt/iso/RPM-GPG-KEY-CentOS-7

[root@study ~]# yum --enablerepo=mycdrom install software_name

7.2 在本地構建YUM倉庫

一、建立目錄
mkdir /mnt/sdf

二、拷貝rpm包到本地YUM倉庫的目錄
cp /mnt/iso/Packages /mnt/sdf   

三、在倉庫所在目錄下更新建立源(repodata)
##最終會在/mnt/sdf下建立一個叫作repodata的目錄
createrepo /mnt/sdf                   # 從新生成metadata,若是以前存在repodata可使用--update進行更新;

四、建立配置文件
cat >/etc/yum.repos.d/custom.repo<<EOF
[Centos7.4]
name=Custom YUM
baseurl=file:///mnt/sdf/        ##指向repodata這個目錄的上級目錄(repodata目錄所在的目錄)
enabled=1
gpgcheck=1
gpgkey=file:///mnt/iso/RPM-GPG-KEY-CentOS-7
EOF

7.3 全系統自動升級

包含kernel在內的全部程序都進行升級,kernel重啓後生效

手動執行
yum -y update

建立系統定時任務,這個任務會被crond服務按期執行
echo '10 1 * * * root /usr/bin/yum -y --enablerepo=epel update' > /etc/cron.d/yumupdate
相關文章
相關標籤/搜索