軟體管理

2020-08-11 21:39:07

1.軟體執行和編譯

1.1軟體相關概念

1.1.1 ABI

ABI:Application Binary Interface
Windows與Linux不相容

  • ELF(Executable and Linkable Format)
  • PE(Portable Executable)
    庫級別的虛擬化:
  • Linux:WINE
  • Windows:Cygwin

1.1.2 API

API即Application Programming Interface,API可以在各種不同的操作系統上實現給應用程式提供完 全相同的介面,而它們本身在這些系統上的實現卻可能迥異,主流的操作系統有兩種,一種是Windows 系統,另一種是Linux系統。由於操作系統的不同,API又分爲Windows API和Linux API。在Windows 平臺開發出來的軟體在Linux上無法執行,在Linux上開發的軟體在Windows上又無法執行,這就導致 了軟體移植困難,POSIX 標準的出現就是爲了解決這個問題
POSIX:Portable Operating System Interface 可移植操作系統介面,定義了操作系統應該爲應用程式 提供的介面標準,是IEEE爲要在各種UNIX操作系統上執行的軟體而定義的一系列API標準的總稱。 Linux和windows都要實現基本的posix標準,程式就在原始碼
級別可移植了

1.2 c語言程式的實現過程

c程式原始碼 --> 預處理 --> 編譯 --> 彙編 --> 鏈接
C語言的程式編譯主要經過四個過程:

  • 預處理(Pre-Processing)
    1)將所有的#define刪除,並且展開所有的宏定義
    2)處理所有的條件預編譯指令,比如#if #ifdef #elif #else #endif等
    3)處理#include 預編譯指令,將被包含的檔案插入到該預編譯指令的位置。
    4)刪除所有註釋 「//」和」/* */」.
    5)新增行號和檔案標識,以便編譯時產生偵錯用的行號及編譯錯誤警告行號。
    6)保留所有的#pragma編譯器指令,因爲編譯器需要使用它們
  • 編譯 (Compiling) 編譯過程就是把預處理完的檔案進行一系列的詞法分析,語法分析,語意分析及優化後,後生成 相應的彙編程式碼
  • 彙編 (Assembling) 彙編器是將彙編程式碼轉變成機器可以執行的命令,每一個彙編語句幾乎都對應一條機器指令。彙編 相對於編譯過程比較簡單,根據彙編指令和機器指令的對照表一一翻譯即可
  • 鏈接 (Linking) 通過呼叫鏈接器ld來鏈接程式執行需要的一大堆目標檔案,以及所依賴的其它庫檔案,後生成可 執行檔案
    範例:
#分步驟編譯執行
gcc -E hello.c -o hello.i   對hello.c檔案進行預處理,生成了hello.i 檔案 
gcc -S hello.i -o hello.s   對預處理檔案進行編譯,生成了彙編檔案 
gcc -c hello.s -o hello.o   對彙編檔案進行編譯,生成了目標檔案 
gcc hello.o -o hello        對目標檔案進行鏈接,生成可執行檔案

#一步實現編譯過程
gcc hello.c -o hello        直接編譯鏈接成可執行目標檔案

1.3 軟體模組的靜態和動態鏈接

鏈接主要作用是把各個模組之間相互參照的部分處理好,使得各個模組之間能夠正確地銜接,分爲靜態 和動態鏈接

1.3.1 靜態編譯

  • 把程式對應的依賴庫複製一份到包
  • 生成模組檔案libxxx.a
  • 嵌入程式包
  • 升級難,需重新編譯
  • 佔用較多空間,遷移容易

1.3.2 動態編譯

  • 只把依賴加做一個動態鏈接
  • 生成模組檔案libxxx.so
  • 連線指向
  • 佔用較少空間,升級方便

1.3.3 模組(庫)檔案

檢視二進制程式所依賴的庫檔案

ldd /PATH/TO/BINARY_FILE

管理及檢視本機裝載的庫檔案

ldconfig		#載入組態檔中指定的庫檔案
/sbin/ldconfig -p		#顯示本機已經快取的所有可用庫檔名及檔案路徑對映關係

組態檔:

/etc/ld.so.conf
/etc/ld.so.conf.d/*.conf

快取檔案:

/etc/ld.so.cache

注意:庫檔案誤刪後,將導致依賴的程式無法正常執行,恢復方法爲:
利用光碟映象進入緊急救援模式:

  • 1)在重新啓動系統之前,立即按ESC鍵,進入Boot Menu模式
  • 2)選擇CD-ROM Drive – > 選擇Troubleshooting --> Rescue a CentOS system救援模式 --> 進入main,選擇3)Skip to shell
  • 3)lsblk --> mkdir /mnt/rootfs --> mount /dev/sda2 /mnt/rootfs --> cp -a lib64/ld-linux-x86-64.so.2 /mnt/rootfs/lib64/ --> sync --> exit
  • 4)重新啓動即可

2.軟體包和包管理器

2.1 軟體包介紹

開源軟體初只提供了.tar.gz的打包的原始碼檔案,使用者必須自已編譯每個想在GNU/Linux上執行的軟 件。使用者急需系統能提供一種更加便利的方法來管理這些軟體,當Debian誕生時,這樣一個管理工具 dpkg也就應運而生,可用來管理deb後綴的"包"檔案。從而著名的「package」概念第一次出現在 GNU/Linux系統中,稍後Red Hat纔開發自己的rpm包管理系統

2.1.1 軟體包中的檔案分類

  • 二進制檔案
  • 庫檔案
  • 組態檔
  • 幫助檔案
    範例:利用cpio工具檢視包檔案列表
rpm2cpio 包檔案|cpio –itv  預覽包內檔案 
rpm2cpio 包檔案|cpio –id  「*.conf」 釋放包內檔案

2.1.2程式包管理器

軟體包管理器功能:
將編譯好的應用程式的各組成檔案打包一個或幾個程式包檔案,利用包管理器可以方便快捷地實現程式 包的安裝、解除安裝、查詢、升級和校驗等管理操作
主流的程式包管理器

  • redhat:rpm檔案, rpm 包管理器,rpm:Redhat Package Manager,RPM Package Manager
  • debian:deb檔案, dpkg 包管理器

2.1.3包命令

原始碼打包檔案命名:

name-VERSION.tar.gz|bz2|xz VERSION: major.minor.release

rpm包命名方式:

name-VERSION-release.arch.rpm 
VERSION: major.minor.release 
release:release.OS

常見的arch:
* x86: i386, i486, i586, i686
* x86_64: x64, x86_64, amd64
* powerpc: ppc
* 跟平臺無關:noarch
範例:

bash-3.2-32.el5_9.1.i386.rpm 
bash-4.2.46-19.el7.x86_64.rpm 

範例:統計rpm的架構型別及相應的包的數量

sed -nr 's#.*\.(.*)\.rpm$#\1#p' /misc/cd/BaseOS/Packages/*|sort|uniq -c
ls *.rpm | grep -Eo '[^.]+\.rpm$'|cut -d. -f1|sort |uniq -c
#### 2.1.4分類和拆包
軟體包爲了管理和使用的便利,會將一個大的軟體分類,放在不同的子包中。
包的分類:
* Application-VERSION-ARCH.rpm: 主包 
* Application-devel-VERSION-ARCH.rpm 開發子包 
* Application-utils-VERSION-ARHC.rpm 其它子包 
* Application-libs-VERSION-ARHC.rpm 其它子包
#### 2.1.5包的依賴
軟體包之間可能存在依賴關係,甚至回圈依賴,即:A包依賴B包,B包依賴C包,C包依賴A包
安裝軟體包時,會因爲缺少依賴的包,而導致安裝包失敗。
解決依賴包管理工具:
* yum: rpm包管理器的前端工具
* dnf:Fedora 18+ rpm包管理器前端管理工具,CentOS 8 版代替 yum 
* apt:deb包管理器前端工具 
* zypper:suse上的rpm前端管理工具
#### 2.1.6 程式包管理器相關檔案
1. 包檔案組成
* 包內的檔案
* 元數據,如:包的名稱,版本,依賴性,描述等
* 可能會有包安裝或解除安裝時執行的指令碼
2. 數據庫(公共):/var/lib/rpm
* 程式包名稱及版本 
* 依賴關係 功能說明 
* 包安裝後生成的各檔案路徑及校驗碼資訊
#### 2.1.7獲取程式包的途徑
##### 2.1.7.1系統發版的光碟或官方網站
CentOS映象:
https://www.centos.org/download/ http://mirrors.aliyun.com https://mirrors.huaweicloud.com/ https://mirror.tuna.tsinghua.edu.cn/ http://mirrors.sohu.com http://mirrors.163.com 
Ubuntu 映象: 
http://cdimage.ubuntu.com/releases/ 
http://releases.ubuntu.com
##### 2.1.7.2第三方組織提供
* Fedora-EPEL:Extra Packages for Enterprise Linux 
   https://fedoraproject.org/wiki/EPEL 
   https://mirrors.aliyun.com/epel/?spm=a2c6h.13651104.0.0.3bc47dfaZpesAr
*  Rpmforge:官網:http://repoforge.org/,   RHEL推薦,包很全,即將關閉
* Community Enterprise Linux Repository:http://www.elrepo.org,支援新的內核和硬體相關包
##### 2.1.7.3軟體專案官方站點
http://yum.mariadb.org/10.4/centos8-amd64/rpms/ 
http://repo.mysql.com/yum/mysql-8.0-community/el/8/x86_64/
##### 2.1.7.4搜尋引擎
http://pkgs.org 
http://rpmfind.net 
http://rpm.pbone.net 
https://sourceforge.net/
注意:第三方包建議要檢查其合法性,來源合法性,程式包的完整性
##### 2.1.7.5自己製作
將原始碼檔案,利用工具,如:rpmbuild,fpm等工具製作成rpm包檔案
## 3.包管理器
CentOS系統上使用rpm命令管理程式包
功能:
安裝、解除安裝、升級、查詢、校驗、數據庫維護 
### 3.1安裝
格式:

rpm {-i|–install} [install-options] PACKAGE_FILE…

選項:

-v: verbose
-vv:
-h: 以#顯示程式包管理執行進度
常用組合:

rpm -ivh PACKAGE_FILE ...

rpm包安裝選項[install-options]:

--test: 測試安裝,但不真正執行安裝,即dry run模式 
--nodeps:忽略依賴關係 
--replacepkgs | replacefiles 
--nosignature: 不檢查來源合法性 
--nodigest:不檢查包完整性 
--noscripts:不執行程式包指令碼        
			%pre: 安裝前指令碼     --nopre        
			%post: 安裝後腳本        --nopost        
			%preun: 解除安裝前指令碼   --nopreun        
			%postun: 解除安裝後腳本  --nopostun
### 3.2升級和降級
rpm包升級

rpm {-U|–upgrade} [install-options] PACKAGE_FILE…
rpm {-F|–freshen} [install-options] PACKAGE_FILE…

對應選項:

upgrade:安裝有舊版程式包,則「升級」,如果不存在舊版程式包,則「安裝」
freshen:安裝有舊版程式包,則「升級」, 如果不存在舊版程式包,則不執行升級操作
–oldpackage:降級
–force: 強制安裝
常用組合

rpm -Uvh PACKAGE_FILE ... 
rpm -Fvh PACKAGE_FILE ...

升級注意項:
(1) 不要對內核做升級操作;Linux支援多內核版本並存,因此直接安裝新版本內核
(2) 如果原程式包的組態檔安裝後曾被修改,升級時,新版本提供的同一個組態檔不會直接覆蓋老版本的組態檔,而把新版本檔案重新命名(FILENAME.rpmnew)後保留

3.3包查詢

rpm {-q|--query} [select-options] [query-options]
[select-options] 
-a:所有包 
-f:檢視指定的檔案由哪個程式包安裝生成 
-p rpmfile:針對尚未安裝的程式包檔案做查詢操作

[query-options] 
--changelog:查詢rpm包的changelog 
-c:查詢程式的組態檔 
-d:查詢程式的文件 
-i:information -l:檢視指定的程式包安裝後生成的所有檔案 
--scripts:程式包自帶的指令碼

#和CAPABILITY相關 
--whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個包所提供 
--whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴 
--provides:列出指定程式包所提供的CAPABILITY 
-R:查詢指定的程式包所依賴的CAPABILITY

常用查詢用法:

-qa
-q PACKAGE
-qi PACKAGE
-qc PACKAGE
-ql PACKAGE 
-qd PACKAGE 
-q --scripts PACKAGE 
-qf FILE -qpi PACKAGE_FILE 
-qpl PACKAGE_FILE, ...

3.4包解除安裝

格式:

rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...

注意:當包解除安裝時,對應的組態檔不會被刪除,以FILENAME.rpmsave形式保留
範例:強行刪除rpm包,並恢復

rpm -e rpm --nodeps
#重新啓動進入rescue模式
#mkdir /mnt/cdrom
#mount /dev/sr0 /mnt/cdrom
#rpm -ivh /mnt/cdrom/Packages/rpm-4.11.3-40.el7.x86_64.rpm --root=/mnt/sysimage
#reboot

3.5包校驗

在安裝包時,系統也會檢查包的來源是否是合法的
檢查包的完整性和簽名

rpm  -K|--checksig  rpmfile 

在檢查包的來源和完整性前,必須匯入所需要的公鑰
範例:

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 
rpm -qa 「gpg-pubkey*」

軟體在安裝時,會將包裡的每個檔案的元數據,如:大小,許可權,所有者,時間等記錄至rpm相關的數據庫中,可以用來檢查包中的檔案是否和當初安裝時有所變化

rpm {-V|--verify} [select-options] [verify-options]
#範例:
#rpm -V centos-release
S.5....T.  c /etc/issue

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 . (點)   表示當前位置代表的字元含義一致

c   所在的位置表示檔案型別

c   組態檔 
d   檔案數據檔案 
g   該檔案不屬於某個檔案(少數情況) 
l   許可證檔案(license file) 
r   讀我檔案(READ ME)

3.6數據庫

rpm包安裝時生成的資訊,都放在rpm數據庫中

/var/lib/rpm

可以重建數據庫

rpm {--initdb|--rebuilddb} 
initdb: 初始化,如果事先不存在數據庫,則新建之,否則,不執行任何操作
rebuilddb:重建已安裝的包頭的數據庫索引目錄

4.yum和dnf

CentOS 使用 yum, dnf 解決rpm的包依賴關係
YUM: Yellowdog Update Modifier,rpm的前端程式,可解決軟體包相關依賴性,可在多個庫之間定位軟體包,up2date的替代工具,CentOS 8 用dnf 代替了yum ,不過保留了和yum的相容性,設定也是 通用的

4.1yum/dnf工作原理

yum/dnf 是基於C/S 模式

  • yum 伺服器存放rpm包和相關包的元數據庫
  • yum 用戶端存取yum伺服器進行安裝或查詢等
yum 實現過程

先在yum伺服器上建立 yum repository(倉庫),在倉庫中事先儲存了衆多rpm包,以及包的相關的元數據檔案(放置於特定目錄repodata下),當yum用戶端利用yum/dnf工具進行安裝時包時,會自動 下載repodata中的元數據,查詢元數據是否存在相關的包及依賴關係,自動從倉庫中找到相關包下載並安裝。

4.2yum用戶端設定

yum用戶端組態檔
/etc/yum.conf               #爲所有倉庫提供公共設定 
/etc/yum.repos.d/*.repo:    #爲每個倉庫提供組態檔

** repo倉庫組態檔指向的定義:**

[repositoryID] 
name=Some name for this repository 
baseurl=url://path/to/repository/ 
enabled={1|0} gpgcheck={1|0} 
gpgkey=URL enablegroups={1|0} 
failovermethod={roundrobin|priority}    
			roundrobin:意爲隨機挑選,預設值    
			priority:按順序存取 
cost=   預設爲1000

yum伺服器的baseurl形式

file://  本地路徑 
http:// 
https:// 
ftp://

注意:yum倉庫指向的路徑一定必須是repodata目錄所在目錄
相關變數

yum的repo組態檔中可用的變數: 
$releasever: 當前OS的發行版的主版本號,如:8,7,6 
$arch: CPU架構,如:aarch64, i586, i686,x86_64等 
$basearch:系統基礎平臺;i386, x86_64 
$contentdir:表示目錄,比如:centos-8,centos-7 $YUM0-
$YUM9:自定義變數

範例:

http://server/centos/$releasever/$basearch/ 
http://server/centos/7/x86_64 
http://server/centos/6/i386

範例:CentOS 8 組態檔

[root@centos8 ~]# ll /etc/yum.conf 
lrwxrwxrwx. 1 root root 12 May 14  2019 /etc/yum.conf -> dnf/dnf.conf
[root@centos8 ~]#cat /etc/yum.conf 
[main] gpgcheck=1                  #安裝包前要做包的合法和完整性校驗    
installonly_limit=3         #同時可以安裝3個包,最小值爲2,如設爲0或1,爲不限制 
clean_requirements_on_remove=True   #刪除包時,是否將不再使用的包刪除 
best=True                   #升級時,自動選擇安裝最新版,即使缺少包的依賴

範例:CentOS 7的組態檔

[root@centos7 ~]# ll /etc/yum.conf 
-rw-r--r--. 1 root root 970 Aug  8 19:57 /etc/yum.conf
[root@centos7 ~]# cat /etc/yum.conf 
[main] 
cachedir=/var/cache/yum/$basearch/$releasever 
keepcache=0 
debuglevel=2 
logfile=/var/log/yum.log 
exactarch=1 
obsoletes=1 
gpgcheck=1 plugins=1 
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 
distroverpkg=centos-release

baseurl指向的路徑
阿裡雲提供了寫好的CentOS和ubuntu的倉庫檔案下載鏈接

http://mirrors.aliyun.com/repo/

CentOS系統的yum源

#阿裡雲 
https://mirrors.aliyun.com/centos/$releasever/os/x86_64/
#華爲雲 
https://mirrors.huaweicloud.com/
#清華大學 
https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/x86_64/

EPEL的yum源

#阿裡雲 
https://mirrors.aliyun.com/epel/$releasever/x86_64

阿裡巴巴開源軟體

https://opsx.alibaba.com/

範例:爲CentOS7用系統安裝光碟作的本地yum倉庫

#掛載光碟至某目錄,如/mnt/cdrom 
mount /dev/cdrom /mnt/cdrom
#建立組態檔 
[root@centos7 ~]#vim /etc/yum.repos.d/centos7.repo 
[CentOS7] name=CentOS 7 
baseurl=file:///mnt/cdrom 
gpgcheck=0 
enabled=1

範例:爲CentOS 8 設定 yum 的系統和EPEL源倉庫

[root@centos8 ~]#cat /etc/yum.repos.d/base.repo 
[BaseOS] 
name=BaseOS 
baseurl=file:///misc/cd/BaseOS 
gpgcheck=1
gpgkey=/etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
                                                            
[AppStream] 
name=AppStream 
baseurl=file:///misc/cd/AppStream 
gpgcheck=0

[epel] 
name=EPEL 	
baseurl=http://mirrors.aliyun.com/epel/$releasever/Everything/$basearch 
gpgcheck=0 
enabled=1

[extras] 
name=extras 
baseurl=https://mirrors.aliyun.com/centos/$releasever/extras/$basearch/os 
gpgcheck=0

注意:與之前的版本不同,CentOS 8系統有兩個yum源:BaseOS和AppStream,需要分別設定兩個倉庫
範例:用指令碼實現建立yum倉庫組態檔

[root@centos7 ~]# cat yum.sh 
#!/bin/bash mkdir  
/etc/yum.repos.d/backup 
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup 
cat >  /etc/yum.repos.d/base.repo <<EOF 
[base] name=base 
baseurl=https://mirrors.aliyun.com/centos/\$releasever/os/\$basearch 
gpgcheck=0 
EOF

** yum-config-manager命令 **
可以生成yum倉庫的組態檔及啓用或禁用倉庫,來自於yum-utils包
格式:

#增加倉庫 
yum-config-manager --add-repo URL或file 
#禁用倉庫 
yum-config-manager --disable 「倉庫名" 
#啓用倉庫 
yum-config-manager --enable  「倉庫名」 

範例:建立倉庫設定

[root@centos8 ~]#rpm -qf `which yum-config-manager ` 
dnf-utils-4.0.2.2-3.el8.noarch
[root@centos8 ~]#yum-config-manager --add-repo 
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
Adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/dockerce.repo 
[root@centos8 ~]#ls /etc/yum.repos.d/ 
backup  base.repo  docker-ce.repo

#生成172.16.0.1_cobbler_ks_mirror_8_.repo 
[root@centos8 ~]#yum-config-manager --
addrepo=http://172.16.0.1/cobbler/ks_mirror/8/ 
Adding repo from: http://172.16.0.1/cobbler/ks_mirror/8/

[root@centos8 ~]#cat /etc/yum.repos.d/172.16.0.1_cobbler_ks_mirror_8_.repo 
[172.16.0.1_cobbler_ks_mirror_8_] 
name=created by dnf config-manager from http://172.16.0.1/cobbler/ks_mirror/8/ 
baseurl=http://172.16.0.1/cobbler/ks_mirror/8/ 
enabled=1

[root@centos8 ~]#ls /etc/yum.repos.d/ 
backup  base.repo 
[root@centos8 ~]#yum-config-manager --add-repo /data/docker-ce.repo 
Adding repo from: file:///data/docker-ce.repo 
[root@centos8 ~]#ls /etc/yum.repos.d/ 
backup  base.repo  docker-ce.repo

範例:啓用和禁用倉庫

[root@centos8 ~]#yum repolist 
[root@centos8 ~]#yum-config-manager --disable epel 
[root@centos8 ~]#cat /etc/yum.repos.d/base.repo 
[root@centos8 ~]#yum repolist 
[root@centos8 ~]#yum-config-manager --disable extras 
[root@centos8 ~]#yum repolist 
[root@centos8 ~]#yum-config-manager --enable extras 
[root@centos8 ~]#yum repolist 

4.3yum命令

用法:

yum [options] [command] [package ...]

yum的命令列選項:

-y                          #自動回答爲「yes」 
-q                          #靜默模式 
--nogpgcheck                #禁止進行gpg check 
--enablerepo=repoidglob     #臨時啓用此處指定的repo,支援萬用字元,如:」*「 --
disablerepo=repoidglob    #臨時禁用此處指定的repo,和上面語句同時使用,放在後面的生效

4.3.1顯示倉庫列表

yum repolist [all|enabled|disabled]

範例:

[root@centos8 ~]#yum repolist 
[root@centos8 ~]#yum repolist all 
[root@centos8 ~]#yum --enablerepo=ep* --disablerepo=A* repolist 

範例: 顯示倉庫的詳細資訊

[root@centos8 ~]#yum repolist -v 

4.3.2顯示程式包

yum list 
yum list [all | glob_exp1] [glob_exp2] [...] 
yum list {available|installed|updates} [glob_exp1] [...]

範例:

[root@centos8 data]#dnf list mariadb-server 
[root@centos8 data]#dnf list mariadb-server --showduplicates 
[root@centos8 data]#dnf list mariadb-server   --disablerepo=AppStream 
[root@centos8 data]#dnf list mariadb-server --showduplicates  -
disablerepo=AppStream 

範例: 只檢視已經安裝的包

[root@centos8 ~]#yum list installed|head 

範例: 檢視可安裝的包

[root@centos8 ~]#yum list available |head 

範例: 檢視可以升級的包

[root@centos8 ~]#yum list updates 

範例: 檢視指定的包

[root@centos8 ~]#yum list exim

#支援萬用字元 
[root@centos8 ~]#yum list exim*  

4.3.3安裝程式包

yum install package1 [package2] [...] 
yum reinstall package1 [package2] [...]  #重新安裝
--downloadonly  #只下載相關包預設至/var/cache/yum/x86_64/7/目錄下,而不執行   
install/upgrade/erase 
--downloaddir=<path>, --destdir=<path>  #--downloaddir選項來指定下載的目錄,如果不存在自動建立
4.3.3.1安裝epel源包

範例:安裝epel源

[root@centos7 ~]#yum  -y install  epel-release 
[root@centos7 ~]#yum  -y install sl 
[root@centos7 ~]#rpm -ql sl 
#執行安裝sl程式,可以看到下面 下麪火車,這標誌着我們可以當老司機了
[root@centos7 ~]#sl -a

[root@centos8 ~]#dnf -y install cowsay
[root@centos8 ~]#cowsay hello
4.3.3.2升級最新內核

範例:利用elrepo源在CentOS 7 安裝新版內核

[root@centos7 ~]#yum install https://www.elrepo.org/elrepo-release-  
7.04.el7.elrepo.noarch.rpm 
[root@centos7 ~]#rpm -ql elrepo-release-7.0-4.el7.elrepo
[root@centos7 ~]#yum repolist 
[root@centos7 ~]#cat /etc/yum.repos.d/elrepo.repo 
[root@centos7 ~]#yum --disablerepo="*" --enablerepo="elrepo-kernel" list available 
[root@magedu ~]#yum -y --enablerepo="elrepo-kernel" install kernel-ml 
[root@centos7 ~]#ls /boot 
[root@centos7 ~]#ls /lib/modules 
[root@centos7 ~]#reboot 
[root@centos7 ~]#uname -r 
4.3.3.3 只下載相關的依賴包,而不安裝
#/data/目錄如果不存在,會自動建立 
[root@centos8 ~]#yum -y install --downloadonly --downloaddir=/data/httpd httpd 
[root@centos8 ~]#ls /data/httpd/ 

4.3.4解除安裝程式包

yum remove | erase package1 [package2] [...]

4.3.5升級和降級

檢查可用升級:

yum check-update

升級和降級

yum upgrade|update  [package1] [package2] [...] 
upgrade-minimal   #最小化升級 
yum downgrade package1 [package2] [...] (降級)

範例:

[root@centos7 ~]# cat /etc/yum.repos.d/base.repo 
[root@centos7 ~]#yum  --disablerepo=* --enablerepo=updates list available 
[root@centos7 ~]#yum info samba 
[root@centos7 ~]#yum info samba --showduplicates 
[root@centos7 ~]#yum  install samba --disablerepo=updates 
[root@centos7 ~]#yum  update samba 
[root@centos7 ~]#yum update

4.3.6查詢

檢視程式包information

yum info [...]

檢視指定的特性(可以是某檔案)是由哪個程式包所提供:
yum provides | whatprovides feature1 [feature2] [...]
注意:檔案要寫全路徑,而不只是檔名,否則可能無法查詢到