1. 程式人生 > 實用技巧 >CentOS 基礎命令 III

CentOS 基礎命令 III


軟體包管理

為了滿足應用的需求,我們通常會在系統上安裝各種相應的軟體,並在維護中會對軟體進行升級和刪除,甚至是退回到舊的版本。 CentOS 中主要有三種類型的軟體管理方式,分別為原始碼編譯、RPM 包管理和 YUM 管理方式。其中 YUM 管理方式是對使用者最友好的方式,其次為 RPM 方式,最不友好的是原始碼編譯方式。原始碼編譯也可生成 RPM 包, RPM 包又可讓 YUM 解決資源依賴問題。

“RPM Package Manager” 是 RPM 的遞迴縮寫,也就是 RPM 軟體包管理器。RMP 包管理器可以生成 RMP 軟體包、安裝、查詢、升級、解除安裝、校驗軟體包和對 RPM 資料庫進行管理。 RPM 軟體包是以 .rpm 為副檔名,其命名規範為:

name-version-release.os.arch.rpm

其中 name 為程式名稱; version 為程式版本號; release 為發行號,用於標識 RPM 包本身的發行號,與源程式的 release 號無關; os 為 RPM 包支援的作業系統版本,如 el6、el7、el8 等; arch 為系統架構,如 i686、x86_64、amd64、ppc(power-pc)、noarch(即不依賴平臺)。

例如:

openssh-server-8.0p1-4.el8_1.x86_64
|-----1------| |-2-| 3 4      5

1-->name  2--> version  3-->release  4-->os  5-->arch

RPM 具有一組 rpm 命令集來實現包管理器的功能。雖然打包系統定義了一種依賴模型,可以查詢到所依賴的軟體和庫,但有時會陷入令人頭痛的包依賴地獄(package dependency hell)。 高階包管理系統 YUM 此時就可以大放光彩了,其可以自動下載軟體包並解決包依賴問題。在 CentOS 8 中開始採用 DNF 代替 YUM,這兩個命令的大部分選項是相容的,所以就不必太過擔心了。

高階包管理系統 YUM 的兩大基礎設施,分別為軟體包倉庫和與軟體包操作相關的命令集,以實現軟體包的安裝、查詢、升級、解除安裝、校驗軟體包和對 RPM 資料庫進行管理。

CentOS 軟體包倉庫庫配置檔案位於 /etc/yum.repo.d 內。

$ yum repolist all			/* 列表所有倉庫 */

repo id /* 倉庫 iD */        repo name  /* 倉庫名稱 */   status	/* 倉庫狀態 */
AppStream                    CentOS-8 - AppStream        enabled	/* enabled 表示倉庫開啟 */
AppStream-source             CentOS-8 - AppStream Source disabled	/* disabled 表示倉庫關閉 */
BaseOS                       CentOS-8 - Base             enabled
BaseOS-source                CentOS-8 - BaseOS Sources   disabled
Devel                        CentOS-8 - Devel WARNING! F disabled
HighAvailability             CentOS-8 - HA               disabled
PowerTools                   CentOS-8 - PowerTools       disabled
base-debuginfo               CentOS-8 - Debuginfo        disabled
c8-media-AppStream           CentOS-AppStream-8 - Media  disabled
c8-media-BaseOS              CentOS-BaseOS-8 - Media     disabled
centosplus                   CentOS-8 - Plus             disabled
centosplus-source            CentOS-8 - Plus Sources     disabled
cr                           CentOS-8 - cr               disabled
...

列表的內容與 /etc/yum.repo.d 內的倉庫配置檔案 .repo 相對應。倉庫配置檔案常用引數如下:

$ cat /etc/yum.repos.d/CentOS-Base.repo

# 井號起始的為註釋內容。
# 遠端倉庫系統會根據您的 IP 地址自動選擇相匹配的地理區域的倉庫映象。

[BaseOS]				/* 倉庫 ID。不能和其它倉庫 ID 重複。*/
name=CentOS-$releasever - Base		/* 倉庫名稱。*/
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=BaseOS&infra=$infra	/* 倉庫映象列表地址。*/
#baseurl=http://mirror.centos.org/$contentdir/$releasever/BaseOS/$basearch/os/				/* 倉庫地址。*/
gpgcheck=1				/* gpg 測試,以驗證包的完整。*/
enabled=1				/* 是否開啟此倉庫。*/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial	/* gpg 公鑰位置。*/

除了 CentOS 官方提供的倉庫外,還可以使用第三方倉庫。

CentOS 官方倉庫及其推薦的第三方倉庫介紹:
https://wiki.centos.org/action/show/AdditionalResources/Repositories?action=show&redirect=Repositories。

CentOS 軟體倉庫國內及其它地理區域的映象:
CentOS 6 http://isoredirect.centos.org/centos/6/isos/
CentOS 7 http://isoredirect.centos.org/centos/7/isos/
CentOS 8 http://isoredirect.centos.org/centos/8/isos/

直接取 CentOS 軟體倉庫映象的主域名,就可以看到各大網站提供的所有軟體倉庫。

清華大學映象: https://mirrors.tuna.tsinghua.edu.cn/
阿里雲映象:https://developer.aliyun.com/mirror/
華為映象:https://mirrors.huaweicloud.com/
網易三石映象:http://mirrors.163.com/

為了提高軟體包下載速度,我們還可以直接設定國內倉庫的地址。

示例:

/* 國內遠端倉庫*/

/* 新增網易 docker-ce 倉庫。*/
$sudo wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.163.com/docker-ce/linux/centos/docker-ce.repo
 
$cat /etc/yum.repos.d/docker-ce.repo

[docker-ce-stable]
name=Docker CE Stable - $basearch
#baseurl=https://download.docker.com/linux/centos/$releasever/$basearch/stable
baseurl=https://mirrors.163.com/docker-ce/linux/centos/$releasever/$basearch/stable

/* 注意 baseurl 兩行的對應關係與倉庫網址對應關係。可以很方便的設定為任何倉庫源。*/

enabled=1
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
...


/* 本地倉庫*/

/* 在系統更新後,同步一個遠端倉庫到本地,再設定本地倉庫。*/

/* centos 7 */
$sudo yum install yum-utils createrepo		/* 安裝 yum 外掛。*/
$sudo mkdir /tmp/data/repos			
$sudo reposync -r docker-ce-stable -p /tmp/data/repos
/* reposync 同步倉庫到本地, -r 指定同步的倉庫 id,-p 指定同步資料所到位置。*/
$sudo createrepo /tmp/data/repos/docker-ce-stable
/* 建立倉庫 xml 索引,也就是 metadata。*/

/* centos 8 */
$sudo dnf install createrepo_c
$sudo mkdir /tmp/data/repos
$sudo dnf reposync -r docker-ce-stable -p /tmp/data/repos
$sudo createrepo_c /tmp/data/repos/docker-ce-stable
$sudo cp  /etc/yum.repos.d/docker-ce.repo  /etc/yum.repos.d/local-docker-ce.repo
$sudo vim  /etc/yum.repos.d/local-docker-ce.repo


[docker-ce-stable]
name=Docker CE Stable - $basearch
#baseurl=https://download.docker.com/linux/centos/$releasever/$basearch/stable
baseurl=file:///data/repos/docker-ce-stable/linux/centos/$releasever/$basearch/stable
...

yum 命令

yum [options] command [package ...]

--security	/* 指定包含安全更新的軟體包,一般用於 check-upate 或 update  */

-v					/* 繁瑣模式。*/
[-y | --assumeyes]			/* 自動同意所有安裝時的問題。*/
-h					/* 幫助。*/


repolist [all | enabled | disabled]	/* 列表所有/開啟/關閉的倉庫。*/
repoinfo [all | enabled | disabled | <repo_id> ...]	/* 查詢指定倉庫的資訊。 */

clean [packages | metadata | dbcache | expire-cache | all]
/* 清理系統下載的軟體包、倉庫資訊元資料、倉庫資訊 sqlite 元資料、使快取資料過期或清理所有資料。快取目錄位於 /var/cache/yum。*/

makecache [fast]		/* 下載所有已啟用倉庫的元資料,如果使用 fast,則相當於執行 yum clean expire-cache。*/

check-update			/* 檢查是否有更新。*/

install [package ...]		/* 安裝一個或多個軟體包,用空格分隔軟體包名稱 */
reinstall [package ...]		/* 重新安裝一個或多個軟體包。*/
update [package ...]		/* 更新指定的一個、多個軟體包或所有可以更新的軟體包。*/
update-to [package ...]		/* 更新一個或多個指定的軟體到指定版本的軟體包。*/
remove | erase [package ...]	/* 刪除一個或多個軟體包。*/

list [list_option]		/* 列表指定軟體包*/
	[all | glob_exp] [...]	/* 列表所有的軟體包或與指定的 glob 表示式匹配的軟體包。*/
	available [glob_exp] [...]	/* 列表可供安裝的軟體包。*/
	updates [glob_exp] [...]	/* 列表可供更新的軟體包。*/
	installed [glob_exp] [...]	/* 列表已安裝的軟體包。*/
	obsoletes [glob_exp] [...]	/* 列表已標識為廢棄的軟體包。*/
	recent [glob_exp] [...]		/* 列表最近新增到倉庫的軟體包。*/

info [list_option]			/* 查詢指定軟體包的資訊*/
	/*info 可以使用與 list_option 同樣的選項,但一般直接查詢指定軟體包的資訊。*/

search [string]			/* 查詢軟體包,可以指定部分字串來查詢。*/

group [groups_option]		/* 軟體包組的管理,類似軟體包管理。 */
	list [installed|available|environment|language|package|hidden|ids]
				/* 列表軟體包組,或選擇以下型別,只有指定了 hidden,才會列出隱藏包組。*/
	install			/* 安裝軟體包組。 */
	remove			/* 刪除軟體包組,其會刪除軟體包組包含的所有軟體包,無論其它軟體包是否依賴所刪除的。 */	
	info			/* 檢視軟體包組資訊。*/

deplist	[package] [...]		/* 列表指定軟體包依賴 */

provides | whatprovides	[command | package]	/* 查詢指定的命令或軟體包由誰提供 */

history 			/* 軟體包管理事務歷史 */
	list [<trans-id> ...]	/* 列表管理事務歷史,含事務 ID、命令列、日期、動作和所作的改動。 */
	info <trans-id> ...	/* 查詢指定事務詳細資訊。*/
	redo <trans-id>		/* 重做指定事務。*/
	rollback <trans-id>	/* 回滾到指定事務。*/
	undo <trans-id>		/* 撤銷指定事務。/

示例:

$sudo yum --security check-update		/* 檢查是否有關於安全的更新。*/

$sudo yum update				/* 安裝所有更新。*/

$yum search epel		/* 查詢 epel 倉庫安裝包。*/

Last metadata expiration check: 0:00:59 ago on Wed 09 Dec 2020 08:43:00 PM CST.
============================== Name Matched: epel ==============================
epel-release.noarch : Extra Packages for Enterprise Linux repository configuration
epel-rpm-macros.noarch : Extra Packages for Enterprise Linux RPM macros

$yum info epel-release		/* 查詢 epel-release 倉庫安裝包資訊。*/

Last metadata expiration check: 0:03:45 ago on Wed 09 Dec 2020 08:43:00 PM CST.
Installed Packages
Name         : epel-release
Version      : 8
Release      : 9.el8
Architecture : noarch
Size         : 32 k
Source       : epel-release-8-9.el8.src.rpm
Repository   : @System
From repo    : @commandline
Summary      : Extra Packages for Enterprise Linux repository configuration
URL          : http://download.fedoraproject.org/pub/epel
License      : GPLv2
Description  : This package contains the Extra Packages for Enterprise Linux (EPEL) repository
             : GPG key as well as configuration for yum.

$sudo yum install epel-release rmpfusion-free-release \
rpmfusion-nonfree-release -y			/* 安裝 epel、rpmfusion 倉庫。*/

$sudo yum history list				/* 查詢安裝歷史。*/	

ID     | Command line              | Date and time    | Action(s)      | Altered
--------------------------------------------------------------------------------
    44 | install vsftpd            | 2020-12-15 21:54 | Install        |    1   
    43 |                           | 2020-12-15 17:30 | Upgrade        |    2   
    42 | update                    | 2020-12-12 16:19 | Upgrade        |    1   
...

$sudo yum history info 44			/* 查詢事務 ID 44 詳細資訊。*/

Transaction ID : 44
Begin time     : Tue 15 Dec 2020 09:54:33 PM CST
Begin rpmdb    : 2115:61986a56c82aec41b92fb2b3bc09ce57dd092e60
End time       : Tue 15 Dec 2020 09:54:34 PM CST (1 seconds)
End rpmdb      : 2116:146141955c021eb24181666635dc6b4293874964
User           :  <haojiang>
Return-Code    : Success
Releasever     : 8
Command Line   : install vsftpd
Comment        : 
Packages Altered:
    Install vsftpd-3.0.3-32.el8.x86_64 @appstream

$sudo yum remove vsftpd				/* 刪除 vsftpd。*/

Dependencies resolved.
================================================================================
 Package        Architecture   Version                 Repository          Size
================================================================================
Removing:
 vsftpd         x86_64         3.0.3-32.el8            @appstream         343 k

Transaction Summary
================================================================================
Remove  1 Package

Freed space: 343 k
Is this ok [y/N]: y
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1 
  Running scriptlet: vsftpd-3.0.3-32.el8.x86_64                             1/1 
  Erasing          : vsftpd-3.0.3-32.el8.x86_64                             1/1 
  Running scriptlet: vsftpd-3.0.3-32.el8.x86_64                             1/1 
  Verifying        : vsftpd-3.0.3-32.el8.x86_64                             1/1 
Installed products updated.

Removed:
  vsftpd-3.0.3-32.el8.x86_64                                                    

Complete!

$sudo yum history redo 44				/* 重做事務 ID 44。*/

Last metadata expiration check: 0:23:16 ago on Tue 15 Dec 2020 09:43:53 PM CST.
Repeating transaction 44, from Tue 15 Dec 2020 09:54:33 PM CST
    Install vsftpd-3.0.3-32.el8.x86_64 @appstream
================================================================================
 Package         Architecture    Version               Repository          Size
================================================================================
Installing:
 vsftpd          x86_64          3.0.3-32.el8          appstream          180 k

Transaction Summary
================================================================================
Install  1 Package

Total download size: 180 k
Installed size: 343 k
Is this ok [y/N]: y
Downloading Packages:
vsftpd-3.0.3-32.el8.x86_64.rpm                  308 kB/s | 180 kB     00:00    
--------------------------------------------------------------------------------
Total                                           112 kB/s | 180 kB     00:01     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1 
  Installing       : vsftpd-3.0.3-32.el8.x86_64                             1/1 
  Running scriptlet: vsftpd-3.0.3-32.el8.x86_64                             1/1 
  Verifying        : vsftpd-3.0.3-32.el8.x86_64                             1/1 
Installed products updated.

Installed:
  vsftpd-3.0.3-32.el8.x86_64     

$whereis vsftpd		/* 查詢 vsftpd 位置。*/

vsftpd: /usr/sbin/vsftpd /etc/vsftpd /usr/share/man/man8/vsftpd.8.gz

$sudo yum provides /usr/sbin/vsftpd	/* 查詢指定命令由那個軟體包提供。*/

Last metadata expiration check: 6 days, 1:41:12 ago on Wed 09 Dec 2020 08:43:00 PM CST.
vsftpd-3.0.3-32.el8.x86_64 : Very Secure Ftp Daemon
Repo        : @System
Matched from:
Filename    : /usr/sbin/vsftpd

vsftpd-3.0.3-32.el8.x86_64 : Very Secure Ftp Daemon
Repo        : appstream
Matched from:
Filename    : /usr/sbin/vsftpd

$sudo yum deplist vsftpd			/* 查詢指定軟體的依賴。*/

CentOS Linux 8 - AppStream                      3.8 kB/s | 4.3 kB     00:01    
CentOS Linux 8 - BaseOS                         4.7 kB/s | 3.9 kB     00:00    
CentOS Linux 8 - Extras                         1.5 kB/s | 1.5 kB     00:01    
CentOS Linux 8 - Extras                         7.6 kB/s | 8.6 kB     00:01    
...
package: vsftpd-3.0.3-32.el8.x86_64
  dependency: /bin/bash
   provider: bash-4.4.19-12.el8.x86_64
  dependency: /bin/sh
   provider: bash-4.4.19-12.el8.x86_64
  dependency: libc.so.6(GLIBC_2.28)(64bit)
   provider: glibc-2.28-127.el8.x86_64
  dependency: libcap.so.2()(64bit)
   provider: libcap-2.26-4.el8.x86_64
  dependency: libcrypto.so.1.1()(64bit)
   provider: openssl-libs-1:1.1.1g-11.el8.x86_64
...

注:如未特別指出,以上 yum 命令引數與 dnf 命令引數通用。

/* Centos 7 用 yum 下載軟體包。如果加 --resolve,還將下載依賴。*/
$yum install --downloadonly --downloaddir=./epel.release.noarch

/* Centos 8 用 yum/dnf 下載軟體包。*如果加 --resolve,還將下載依賴。*/
$[yum | dnf] download epel.release.noarch

rpm 命令

GENERAL OPTIONS

-v			/* 繁瑣模式。*/
-vv			/* 輸出大量的除錯資訊。*/

INSTALL AND UPGRADE OPTIONS

{-i | --install}	/* 安裝指定軟體包。*/
{-U | --upgrade}	/* 更新或安裝指定軟體包。其更新過程其實是先刪除再安裝。*/
{-F | --freshen}	/* 僅升級已安裝的軟體包。*/
	-h		/* 使用 # 字元顯示安裝或更新進度。*/
	--percent	/* 解包文件時,輸出百分比進度。*/
	--oldpackage	/* 使用指定舊版本軟體包更新。*/
	--test		/* 僅作測試和報告潛在衝突。*/

ERASE OPTIONS

{-e | --erase}		/* 刪除指定軟體包。*/
	--test		/* 僅作測試,與 -vv 結合使用對除錯很有用。*/

QUERY OPTIONS

{-q | --query}		/* 查詢指定軟體包資訊。*/
	[package-select-option]
	{-a | --all}	/* 查詢所有已安裝的軟體包。*/
	{-p | --package} package_file	/* 查詢指定軟體包。*/
	{-f | --file} file		/* 查詢指定檔案屬於哪個軟體包。*/

	--fileprovide	/* 列表指定檔案由哪些檔案提供。*/
	--filerequire	/* 列表指定檔案依賴哪些檔案。*/

	[package-query-option]
	{-i | --info}	/* 查詢指定軟體包的資訊。*/

	{-l | --list}	/* 列表指定軟體包內的檔案。*/

	--provides	/* 列表指定軟體包提供哪些功能。*/
	--whatrequires capability	/* 查詢哪些軟體包依賴指定的功能(軟體包名稱)。*/
	{-R | --requires}	/* 查詢指定軟體包的依賴功能。*/
	{-c | --configfiles}	/* 列表指定軟體包的配置檔案。*/

	--scripts	/* 查詢指定軟體包中用來安裝和刪除的指令碼。*/

--querytags	/* 列表 rpm 可以查詢的標記。*/

VERIFY OPTIONS

{-V | --verify}		/* 使用 rpm 資料庫內的元資料來驗證軟體包。*/

/* 驗證輸出為 9 個字元的字串,每個字串含義如下:

c %config	配置檔案。
d %doc		文件檔案。
g %ghost	檔案內容不是軟體包包含的。
l %license	版權檔案。
r %readme	說明文件。
l %license	版權檔案。
r %readme	說明文件。

. 		測試通過。 
S		檔案大小不同。
M		檔案許可權和型別不同。
5		MD5 不匹配。
D		主次裝置編號不匹配。
L		readlink(2) 路徑不匹配。
U		使用者屬主不同。
G		組不同。
T		修改時間不同。
P		功能不匹配。*/

-K		/* 公鑰驗證。*/

示例:

$rpm -qa | grep openssh		/* 查詢所有已安裝的軟體包,grep 匹配 openssh。*/

openssh-server-8.0p1-5.el8.x86_64
openssh-clients-8.0p1-5.el8.x86_64
openssh-8.0p1-5.el8.x86_64
openssh-askpass-8.0p1-5.el8.x86_64

$rpm -q vsftpd			/* 查詢是否安裝了 vsftpd 軟體包。*/

/* 驗證軟體包簽名。*/
$rpm -K  http://mirrors.aliyun.com/centos/8.3.2011/AppStream/x86_64/os/Packages/vsftpd-3.0.3-32.el8.x86_64.rpm

http://mirrors.aliyun.com/centos/8.3.2011/AppStream/x86_64/os/Packages/vsftpd-3.0.3-32.el8.x86_64.rpm: digests signatures OK

/* 安裝相應遠端倉庫的 vsftpd 軟體包。*/
$sudo rpm http://mirrors.aliyun.com/centos/8.3.2011/AppStream/x86_64/os/Packages/vsftpd-3.0.3-32.el8.x86_64.rpm 

$sudo rpm -qi vsftpd		/* 查詢相關資訊。*/

Name        : vsftpd
Version     : 3.0.3
Release     : 32.el8
Architecture: x86_64
Install Date: Tue 15 Dec 2020 09:21:09 PM CST
Group       : System Environment/Daemons
Size        : 351530
License     : GPLv2 with exceptions
Signature   : RSA/SHA256, Wed 29 Apr 2020 12:08:42 AM CST, Key ID 05b555b38483c65d
Source RPM  : vsftpd-3.0.3-32.el8.src.rpm
Build Date  : Mon 27 Apr 2020 10:04:03 AM CST
Build Host  : x86-01.mbox.centos.org
Relocations : (not relocatable)
Packager    : CentOS Buildsys <[email protected]>
Vendor      : CentOS
URL         : https://security.appspot.com/vsftpd.html
Summary     : Very Secure Ftp Daemon
Description :
vsftpd is a Very Secure FTP daemon. It was written completely from
scratch.

$sudo rpm -e vsftpd		/* 刪除指定軟體。*/

$sudo rpm -ql vsftpd		/* 查詢指定的軟體包含的檔案。*/ 

/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf
/etc/vsftpd/vsftpd_conf_migrate.sh
/usr/lib/.build-id
...

編譯安裝

一般來說,當我們下載了程式原始碼後,其內會提供編譯安裝所需的相應檔案,如 README、INSTALL、configure、Makefile 等檔案。README 自述檔案介紹軟體及其安裝方式;INSTALL 一般是安裝方式介紹;configure 是用於生成 Makefile 的指令碼。Makefile 是編譯和安裝的特定格式檔案。原始碼編譯所需的依賴檔案,如標頭檔案、庫檔案、所依賴的程式和編譯套件就必須自行安裝了。另外編譯安裝的軟體並非比軟體包安裝的好,但有時軟體安裝包發行的比較慢,就可以自行編譯安裝了。

configure 指令碼

--help		/* 幫助。 */
--prefix	/* 指定安裝目錄。*/
--with-***	/* 指定可選模組。*/

示例:

/* 下在 git 原始碼。*/
$wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.9.5.tar.xz
/* 解原始碼壓縮包。*/
$tar -xvf git-2.9.5.tar.xz

$cd git-2.9.5.tar.xz

$less README		/* 檢視自述檔案。*/
$less INSTALL		/* 檢視安裝檔案。*/

$sudo yum install make gcc -y		/* 安裝編譯套件。*/
/* 安裝編譯依賴。*/
$sudo yum install sudo dnf install dh-autoreconf curl-devel expat-devel gettext-devel openssl-devel perl-devel zlib-devel asciidoc xmlto

/* 指定安裝目錄為 /usr/local/git,方便以後刪除或升級。*/
$make prefix=/usr/local/git all doc
$sudo make prefix=/usr/local/git install install-doc install-html

/* 把編譯安裝的 git 路徑放到環境變數裡,修改 .bashrc 檔案。*/
$vim ~.bashrc
export PATH=/usr/local/git/bin:$PATH	/* 修改最後一行。*/

$source ~.bashrc			/* 使修改立刻生效。*/