友情提醒:本文的實驗平臺vmware 10 + Centos 6.6 X86_64,所述內容中的命令請謹慎使用。
-------------------------------------楔子--------------------------------------------------
胖子法師上次在小酒館中,關於《grep與正則表達式使用》的闡述爲其贏得了幾個粉絲。今日在魔法塔中喜滋滋翻看着粉絲來信,一封信中提到在Gnu/Linux os平臺上安裝程序包的種種不順,這又勾起了胖子好爲人師的念頭,他決定再寫篇博文關於yum工具的使用,來解救他那爲數不多的粉絲。爲什麼胖子要寫yum而不是apt-get呢?因爲法師胖子的魔法屬於北美redhat流派,僅此而已。
------------------------------------------------------------------------------------------
1.yum是什麼?
yum全名:Yellowdog Updater Modified,是個程序包安裝管理工具,廣泛用在始於redhat系列
發行版的,基於Gnu/linux爲內核的os平臺上。相對於工具rpm而言yum可自動解決程序包的依賴性,
但yum只是rpm的前端工具,也就是說沒有yum,rpm工具依然可以工作,但是沒有rpm工具,yum便要歇菜。
2 爲什麼存在包安裝工具和程序包依賴性問題?
組成計算機的硬件所提供的功能,被安裝在其上的操作系統抽象爲系統調用,爲了使程序開發
更加便捷,週期縮短,又將系統調用抽象爲功能模塊,被稱爲庫。那麼再開發程序時,若想使用底層硬件的功能,只需在代碼中加入對相應的庫的調用即可。開發者編寫的代碼被稱爲僞碼,必須經過編譯的過程才能變爲可在操作系統上執行的二進制程序。
而這個編譯的過程依據開發語言的不同又分爲多個階段,以C語言開發的程序爲例,編譯過程爲:
源代碼-->預處理-->編譯-->彙編-->鏈接-->可執行程序。這個複雜的過程大大增加了程序的安裝的
難度。在沒有GNU/Linux爲內核的OS 發行版出現之前,對應普通的系統用戶來說,這是個難以逾越的“大山”。各個版本發行商出現後都在爲幫助用戶跨越這個障礙做着改進,通用的做法是:給其用戶提供可以在各自os上運行的兼容二進制程序包。因而有了例如windows平臺的exe程序,redhat系列平臺的rpm格式的包。爲了使這些程序包安裝後放置的竟然有序,便於管理:windows使用註冊表管理這些被安裝的exe程序,redhat系列使用rpm工具管理rpm包,debian系列使用dep工具來管理。
這些可被安裝的二進制程序一般包含:可執行程序,庫文件,配置文件,幫助和文檔。其中的庫文件不單指上文中提到的底層硬件的功能庫,還包含在這個程序體中被大多數程序共同用到功能模塊。
它即爲本程序提供功能,在程序安裝後又可被其它程序所使用。正式因爲這個庫可被其它程序所使用,才造成了程序間的互相依賴。比如要安裝程序A,A提出需要一個庫模塊D,經過查詢模塊D由程序B安裝後提供,
那麼只有先安裝B程序,才能得到庫模塊D,有了庫程序D才能安裝程序A,這就是程序的依賴。
這裏描述的很簡單,但是在實際應用中讓人很困惑,有時google都不一定能查到模塊D是有哪個程序提供。在redhat系列os上雖然rpm功能能管理rpm包,但是卻不具有解決這種依賴性的能力。yum的出世替rpm緩解了這個問題。
3 yum工作過程的描述,配置文件說明和yum倉庫的配置
3.1)yum工作過程的描述
yum工具的工作框架是C/S模式的,分爲服務器端和客戶端。
服務端又被稱爲yum倉庫,包含:rpm程序包和這些程序包的描述文件。
這些描述文件主要包含:軟件包的名稱,軟件包安裝後生成的文件列表,軟件包的額外信息,軟件包的修改日誌等。
放置在rpm程序包所在的目錄的下一級子目錄repodate中。使用createrepo命令生成。
客戶端包含:
(1)yum命令行工具yum。
(2)yum的配置文件/etc/yum.conf,該文件是對yum工具的使用特性的定義。(參見3.2)
(3)yum庫的配置文件/etc/yum.repos.d/xxx.repo,該文件中詳細定義yum倉庫編號,位置,客戶端與服務器端如何交互,該倉庫的啓用情況和是否對倉庫中的軟件包進行校驗。(參見3.2)
當客戶端第一次使用yum命令時,yum命令自動去服務器端yum倉庫中下載程序包的描述文件,並存至本地磁盤中。而後使用yum命令時會自動去服務端下載這些描述文件的校驗碼同本地文件的校驗碼進行比較,若一致,則表示服務器端rpm包沒有發生變化,可繼續使用本地這些描述文件進行程序包分析。若校驗碼不一致,則去服務器端下載最新的程序包描述文件。
當客戶端使用yum安裝程序時,會使用本地緩存的服務端yum庫程序包描述文件,藉助本地rpm安裝庫,分析出該程序是否已安裝,若沒安裝則分析程序是由哪個rpm包安裝後生成,所依賴的庫程序有哪些, 哪些庫程序在本地已安裝,還需安裝哪些rpm包才能提供其他的庫程序,去哪個yum倉庫中可尋找到需要的rpm包。然後根據/etc/yum.repos.d/xxx.repo中定義的庫位置和交互方式去服務器端相應的yum倉庫下載這些需要的rpm包,並執行安裝,然後刪除這些下載的rpm包(默認行爲,可修改)。
yum的其他操作如查詢,升級同上。
3.2)配置文件說明:
/etc/yum.conf:該文件是對yum工具特性的定義。
[root@Test01 ~]# cat /etc/yum.conf
[main]
cachedir=/var/cache/yum/$basearch/$releasever
#cachedir定義了一個目錄,用來存放yun客戶端從服務端yum倉庫中下載的程序包描述文件和下載的要安裝的程序包。
#$basearch是個宏,表示:適合客戶端的平臺類型。$releaserver同樣也是個宏,表示:os版本類型。
keepcache=1
#表示是否存儲下載的rpm包,當值爲0時表示不存儲,安裝後刪除下載的rpm包。當值爲1時,表示存儲下在的rpm包,存放在
#/var/cache/yum/$basearch/$releasever/$repoid/pachages/下
debuglevel=2
#使用yum時顯示的調試信息
logfile=/var/log/yum.log
#放置日誌文件的位置
exactarch=1
#下載安裝包時是否同自己平臺絕對一致。1絕對一致,即你平臺是i386的,不會安裝i686的包。
obsoletes=1
#要不要檢查包是不是被廢棄。
gpgcheck=1
#是否檢查包的來源合法性和完整性
plugins=1
#yum是否支持插件
installonly_limit=5
#限制一次同時安裝的程序包的個數
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=16&ref=http://bugs.centos.org/bug_report_page.php?category=yum
#指定bug追蹤的路徑
distroverpkg=centos-release
#選擇發行版程序包的樣例
#。。。。。。。。
# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d
------>最後這2行是個說明,指定了服務端yum倉庫的配置文件放置的位置和文件名樣例。
[root@Test01 ~]#
/etc/yum.repos.d/:這個目錄中存放了服務端yum倉庫的配置文件,這些文件必須是以".repo"結尾,而名字不重要。
這些服務端rpm倉庫可每個倉庫一個配置文件,也可多個倉庫寫在同一個配置文件中。
舉個例子說明文件的寫法:
[root@Test01 yum.repos.d]# cat centos6.6.repo
[base]
#這是yum倉庫ID要求客戶端本機唯一
name=CentOS $releasever $basearch on local server 172.16.0.1
#這是yum倉庫的簡單描述
baseurl=http://172.16.0.1/cobbler/ks_mirror/CentOS-6.6-$basearch/
#這定義了服務端yum倉庫的位置和yum客戶端使用那種協議同服務器端中該倉庫進行交互。
#可定義多個url路徑。baseurl=url://server1/path/to/repository/
# url://server2/path/to/repository/
#同服務器端倉庫的交互方式有http;ftp,若使用本地yum倉庫,使用file:///PATH/TO/REPO/
#baseurl 不可同mirrorlist同時定義。
#mirrorlist的寫法請參考系統/etc/yum.repos.d/中自帶yum倉庫配置文件中的寫法。
gpgcheck=0
#這定義了是否對從服務器端下載的rpm進行來源校驗和包完整性校驗。值爲0時不校驗。值爲1時校驗,還需定義新的一行
#gpgkey=file:///PATH/TO/key-file
#來指明key文件的位置。
enabled=1
#是否啓用這個庫,值1啓用,值0不啓用。
[root@Test01 yum.repos.d]#
yum 倉庫repodate目錄中文件的說明:
primary.xml.gz:定義了當前倉庫中所有的rpm包列表以及各包之間的依賴關係和每個軟件包安裝生成的文件列表
filelists.xml.gz:當前倉庫中所有RPM包的文件列表
other.xml.gz:額外信息,rpm包的修改日誌
repomd.xml:記錄的是上面三個文件的時間戳和校驗和
comps-*.xml:RPM包分組信息(需要手動定義)
3.3)yum倉庫的配置舉例:
*提醒:
下文中的綠色字體 #開頭行,-->後的內容 ,#-->後的內容都是說明,都不要寫在你的配置文件中。
藍色字體爲輸入shell中命令
3.3.1)使用光驅中的系統光盤配置一個本地yum倉庫:
1)將系統光盤放置在光驅中,並將光驅掛載至系統上
在centos 6上光驅一般被認爲是/dev/sr0
[lijun@Test02 ~]$ sudo mount |grep 'sr0' -->檢查本地是否已經掛載光驅文件
[lijun@Test02 ~]$ sudo ls /media -->檢查/media目錄下已存在的目錄文件
[lijun@Test02 ~]$ sudo mkdir /media/gp1 -->建立掛載目錄/media/gp1
[lijun@Test02 ~]$ sudo mount -o ro /dev/sr0 /media/gp1/
-->將光驅掛載至建立的掛在點上
[lijun@Test02 ~]$ sudo mount | grep 'sr0' -->檢查下掛載的情況
/dev/sr0 on /media/gp1 type iso9660 (ro) -->發現光驅已被掛載好
[lijun@Test02 ~]$ cd /media/gp1/
[lijun@Test02 gp1]$ ls
CentOS_BuildTag isolinux RPM-GPG-KEY-CentOS-Debug-6
EFI Packages RPM-GPG-KEY-CentOS-Security-6
EULA RELEASE-NOTES-en-US.html RPM-GPG-KEY-CentOS-Testing-6
GPL repodata TRANS.TBL
p_w_picpaths RPM-GPG-KEY-CentOS-6
[lijun@Test02 gp1]$
----->進入掛載點,觀察光盤文件中存在的文件,Packages目錄中是放置的rpm包。repodate中存放的是rpm包的描述文件,就不進入目錄詳細看了。
2)配置/etc/yum.repos.d/下的倉庫指導文件:
[lijun@Test02 gp1]$ cd /etc/yum.repos.d/
[lijun@Test02 yum.repos.d]$ sudo mkdir beifen
[sudo] password for lijun:
[lijun@Test02 yum.repos.d]$ sudo mv CentOS* beifen/
#--------->上面這2步操作,主要是爲了能驗證本地yum倉庫的有效性,而將系統自帶的repo文件移走。
[lijun@Test02 yum.repos.d]$ sudo touch localyum.repo
#建立local.repo文件承載本地yum倉庫的配置信息。
[lijun@Test02 yum.repos.d]$ sudo vim localyum.repo
[localyumrepo]
#指定本地yum倉庫的倉庫ID爲localyumrepo
name='this is local yum repo'
#給本地yum倉庫做個簡單描述
baseurl=file:///media/gp1/
#指定本地yum倉庫的交互方式和倉庫位置
#倉庫位置就是上面光盤掛載的目錄,注意file後面的///要有3個
enabled=1
#啓用這個yum倉庫
gpgcheck=0
#不對程序包的來源合法性和包完整性做校驗
:wq
#希望你懂得:wq這個符號的用途,不要寫在配置文件中
3)測試yum庫
3.3.2)配置yum服務器共局域網內用戶使用
環境設定:局域網2臺計算機:
yum服務器A:主機名:Test01 ip:172.16.34.1/16,使用http交互方式局域網共享xen程序包yum庫
測試客戶端B:主機名:Test02 ip:172.16.34.2/16
服務器A上操作:
1)IP檢查:
2)配置本地yum庫安裝httpd服務程序包和createrepo命令
配置本地yum庫略,參見3.3.1)種舉例
[lijun@Test01 ~]$ sudo yum -y install httpd createrepo
#使用本地yum庫安裝httpd程序和createrepo命令
[lijun@Test01 ~]$ yum list httpd createrepo #--->檢查是否安裝好
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
Installed Packages
createrepo.noarch 0.9.9-18.el6 @localyumbase
httpd.x86_64 2.2.15-29.el6.centos @localyumbase
[lijun@Test01 ~]$
3)建立xen程序包目錄並拷貝xen程序包生成數據描述文件和目錄repodate
[lijun@Test01 ~]$ cd /var/www/html
[lijun@Test01 html]$ sudo mkdir xen4
[lijun@Test01 html]$ cd xen4/
#拷貝xen程序包,這裏略過
[lijun@Test01 xen4]$ sudo createrepo .
#別忘了 createrepo命令後還有個點,表示當前目錄
#------>使用createrepo命令爲本目錄下xen程序包生成目錄repodate和xen程序包描述文件
[lijun@Test01 xen4]$ find . -type d -ls --->尋找當前是否有目錄文件
24984 4 drwxr-xr-x 3 root root 4096 Apr 9 17:44 .
25027 4 drwxr-xr-x 2 root root 4096 Apr 9 17:44 ./repodata
[lijun@Test01 xen4]$ cd repodata/ ---->查看repodate目錄下文件
[lijun@Test01 repodata]$ ls
0f8ae4790015fbfe94dfa9970338b45d4cb7d87e16e422659eae916053df99d4-other.xml.gz
5e09d94ecf0072f1a25d03799fb4d17a152ff092d425fef13cebb17119f2eab5-other.sqlite.bz2
6876ad11e89f7b4114efbfc97f4bc5055b7234e7d361e38a54dcf4c64c263ad4-primary.xml.gz
770a6f4d27e36b3160342cefae3adc950456148c863b4a031b41333cd20cea69-primary.sqlite.bz2
b427deb884b8357c03a921a7427b1389ebb4f69493a99990d54e0d0d7647b266-filelists.sqlite.bz2
d7a723ea54c18e1050ea6d1543b840c8137312ab9130d4731900c772de37023d-filelists.xml.gz
repomd.xml
[lijun@Test01 repodata]$
4)設定http服務並添加防火牆規則允許局域網對80端口的請求:
[lijun@Test01 ~]$ sudo service httpd start
[sudo] password for lijun:
Starting httpd: httpd: apr_sockaddr_info_get() failed for Test01.lijun.com
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
#這個提示是因爲沒有在httpd配置文件設定中servername的而採用127.0.0.1代替,算是個提示吧
[ OK ]
[lijun@Test01 ~]$ sudo service httpd status
httpd (pid 1753) is running...
[lijun@Test01 ~]$ sudo chkconfig --level 3 httpd on
#保證每次系統啓動後http服務都能自動啓動
[lijun@Test01 ~]$ sudo iptables -I INPUT -p tcp -s 172.16.0.0/16 --dport 80 -j ACCEPT
[lijun@Test01 ~]$ sudo iptables -I INPUT 2 -p tcp --dport 80 -j DROP
#添加了2條防火牆規則,只允許來自172.16.0.0/16網段的主機訪問80端口
[lijun@Test01 ~]$ sudo cp /etc/sysconfig/iptables /etc/sysconfig/iptables-$(date +%F-%H-%M)
#給原來的防火牆規則文件做個備份
[lijun@Test01 ~]$ # su - -c "iptables-save>/etc/sysconfig/iptables"
#將內存中現在運行的規則寫入防火牆規則文件中,保證每次重啓80端口能被內網訪問到
服務器B上配置和測試:
5)測試同服務器A的連通性:
[lijun@Test02 ~]$ sudo ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:70:8f:01 brd ff:ff:ff:ff:ff:ff
inet 172.16.34.2/16 scope global eth0
inet6 fe80::20c:29ff:fe70:8f01/64 scope link
valid_lft forever preferred_lft forever
[lijun@Test02 ~]$ ping -c 1 -w 1 172.16.34.1
PING 172.16.34.1 (172.16.34.1) 56(84) bytes of data.
64 bytes from 172.16.34.1: icmp_seq=1 ttl=64 time=2.16 ms
--- 172.16.34.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 2ms
rtt min/avg/max/mdev = 2.169/2.169/2.169/0.000 ms
[lijun@Test02 ~]$ curl -I http://172.16.34.1
HTTP/1.1 200 OK
Date: Sat, 11 Apr 2015 00:10:42 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Fri, 10 Apr 2015 23:57:43 GMT
ETag: "5f47-55-5136787c0023f"
Accept-Ranges: bytes
Content-Length: 85
Connection: close
Content-Type: text/html; charset=UTF-8
6)配置B服務器上的/etc/yum.repos.d/xen.repo 文件
[lijun@Test02 ~]$ cd /etc/yum.repos.d/
[lijun@Test02 yum.repos.d]$ ls
beifen localyum.repo
#因爲在上一個例子中用到了B服務器,因此beifen目錄和localyum.repo文件
[lijun@Test02 yum.repos.d]$ sudo mv localyum.repo beifen/
#將localyum.repo移走放置干擾
[lijun@Test02 yum.repos.d]$ sudo touch xen.repo
[lijun@Test02 yum.repos.d]$ sudo vim xen.repo
[xen]
name='this is ip=172.16.34.1 server xen yum repo'
baseurl=http://172.16.34.1/xen4/
enabled=1
gpgcheck=0
:wq
[lijun@Test02 yum.repos.d]$ sudo yum clean all
#清除系統現有yum repo的緩存文件
Loaded plugins: fastestmirror, security
Cleaning repos: xen
Cleaning up Everything
Cleaning up list of fastest mirrors
[lijun@Test02 yum.repos.d]$ sudo yum repolist
#使用yum repolist命令列出當前可使用的yum庫有哪些
Loaded plugins: fastestmirror, security
Determining fastest mirrors
xen | 2.9 kB 00:00
xen/primary_db | 33 kB 00:00
repo id repo name status
xen 'this is ip=172.16.34.1 server xen yum repo' 41
repolist: 41
[lijun@Test02 yum.repos.d]$ sudo yum search xen
#在配置的可使用yum庫中尋找xen關鍵字,通過這種方式測試yum庫的可使用性
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
=================================================== N/S Matched: xen ====================================================
xen.x86_64 : Xen is a virtual machine monitor
xen-debuginfo.x86_64 : Debug information for package xen
xen-devel.x86_64 : Development libraries for Xen tools
xen-doc.x86_64 : Xen documentation
xen-hypervisor.x86_64 : Libraries for Xen tools
xen-libs.x86_64 : Libraries for Xen tools
xen-licenses.x86_64 : License files from Xen source
xen-ocaml.x86_64 : Ocaml libraries for Xen tools
xen-ocaml-devel.x86_64 : Ocaml development libraries for Xen tools
xen-runtime.x86_64 : Core Xen runtime environment
kernel-xen.x86_64 : The Linux Kernel
kernel-xen-devel.x86_64 : Development package for building kernel modules to match the kernel
kernel-xen-firmware.x86_64 : Firmware files used by the Linux kernel
kernel-xen-headers.x86_64 : Header files for the Linux kernel for use by glibc
kernel-xen-release.noarch : Configuration files for package managers.
Name and summary matches only, use "search all" for everything.
[lijun@Test02 yum.repos.d]$
4 常用yum命令
(下面的截圖有點小,請用鼠標左鍵使勁戳)
通過$man yum 可以看到很詳細的yum工具使用手冊,這裏介紹的是經常用到的幾個
命令格式:
yum [options] [command] [package ...]
option:
-y :自動回答爲 yes
--disablerepo=repoidglob :臨時禁用某些啓用的倉庫
--enablerepo=repoidglob :臨時啓用某些配置文件中禁用的倉庫
--nogpgcheck :對包不進行校驗檢查
**這些選項有的在配置文件中設定,那麼遵循的原則是:作用範圍小的優先生效。命令行中作用範圍最小,因而重複的設定,命令行中的生效。
command:
管理repo倉庫:
repolist 列出/etc/yum.repos.d/xxx.repo 文件中定義的庫。
#yum repolist [all|enabled|disabled]
all:所有的
enabled:啓用的
disabled:不可用的
緩存管理:
clean: 清理緩存的
#yum clean [packages|metadate|expire-cache|rpmdb|plugins|all]
程序包查看:
list:列出程序包
#yum list [all|glob-exp]
all:所有的包
glob-exp:使用通配符標識一類包
#yum list {available|updates|installed|extras|obsoletes [glob-expl]}
extras:庫中沒有提供,但已經安裝在系統中的包
updates:可用於升級的包
obsoletes;已經安裝過的,但repo中有更好的,可被替代的包,
recent:剛剛加入倉庫的包
#yum grouplist {installed|available|}
*這是以包組爲單位顯示的
installed:已經安裝過的
available:可以使用沒有被安裝的包
程序包安裝:
install:安裝程序包
#yum install [-y] PACKAGE_NAME [PACKAGE_NAME2]......
-y:自動安裝,不在詢問用戶
* 倉庫中某包有多個版本,默認安裝最新的
想安裝指定的版本 install PACKAGE-VERISON
reinstall :覆蓋安裝。
#yum reinstall PACKAGE_NAME
localinstall :安裝本地rpm包非倉庫中的rpm包,使用倉庫解決依賴關係 #yum localinstall PACK-FILE
*在RHEL7中被廢除
程序包的升級:
# yum update [package1]
*當想升級指定版本時,需指明程序包version
#yum localupdate PACK-FILE
使用本地包升級,使用倉庫解決依賴關係。
*RHEL7中被廢除
程序包的降級:
#yum downgrade package1 [PACKAGE2]...
檢查有哪些升級可用;
#yum check-update
卸載:
#yum remove |erase package-name
*會一併卸載依賴當前包的程序包
查詢:
info:查詢包相關簡要信息
#yum info package-name
provides 或者whatprovides: 查詢文件由哪個包安裝後生成
#yum provides|whatprovides file
搜索:
search key-word 將會顯示 包名和簡要信息中包含key-word的行信息。
#yum search key-word
#yum grouplist
顯示包組信息:
# yum groupinfo "包名"
安裝包組:
#yum groupinstall “包名"
升級包組:
#yum groupupdate "包名"
卸載包組:
#yum groupremove "包名"
**** rhel7 上沒有專用包組命令。使用包命令 @”包組名“
eg:#yum install @"Server Platform Development"