作者:IvanCodes
日期:2025年8月3日
專欄:Linux教程
要保證一個Linux系統穩定、安全、功能完備,有效管理其后臺服務和軟件包是至關重要的。本文將深入介紹現代Linux系統中四個核心的管理工具:systemctl
(服務管理),wget
(文件下載),以及 rpm
和 yum
/dnf
(軟件包管理)
思維導圖 (占位)
(此處可以放置您為本主題制作的思維導圖)
一、 系統服務管理器 systemctl
systemctl
是systemd
初始化系統的主控制命令,用于管理系統服務。
常用命令與功能:
start <service>
: 啟動服務
stop <service>
: 停止服務
restart <service>
: 重啟服務
reload <service>
: 重新加載配置文件 (不中斷服務)
status <service>
: 查看服務狀態
enable <service>
: 設置服務開機自啟
disable <service>
: 取消服務開機自啟
is-enabled <service>
: 檢查是否開機自啟
代碼示例 (以 httpd
服務為例):
systemctl start httpdsystemctl enable httpdsystemctl status httpdsystemctl stop httpdsystemctl disable httpd
二、文件下載工具 wget
wget
是一個強大的非交互式網絡下載器,常用于從網絡上獲取軟件包文件或配置文件。
常用選項:
-O <file>
: 將下載內容另存為指定文件名
-P <dir>
: 將文件下載到指定目錄
-c
: 斷點續傳
代碼示例:
wget https://www.python.org/ftp/python/3.12.4/Python-3.12.4.tgzwget -O nginx.conf_example https://raw.githubusercontent.com/nginx/nginx/master/conf/nginx.confwget -P ./datasets https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data
三、RPM包管理器
rpm功能強大且直接,但它本身不解決軟件包之間的依賴關系
a. 安裝與升級 (-i
, -U
)
在沒有網絡的情況下,使用系統安裝光盤是獲取RPM包的常用方法。
第一步:準備軟件包源 (掛載光盤)
- 連接并掛載光盤
在虛擬機或物理機上連接系統安裝光盤/ISO,設備名通常是/dev/sr0
。
mount /dev/sr0 /mnt
mount
命令可能會提示 /dev/sr0 is write-protected, mounting read-only
,這是正常現象。
- 驗證掛載并進入Packages目錄
df -h
# 確認 /dev/sr0 已掛載到 /mnt
cd /mnt/Packages
# ls | wc -l # (可選) 查看包的數量
第二步:執行安裝
-i
: 安裝 (install)。
-v
: 顯示詳細信息 (verbose)。
-h
: 顯示帶#
號的進度條 (hash)。
案例1:安裝一個無依賴或依賴已滿足的包 (vsftpd
)
# 檢查 vsftpd 是否已安裝
rpm -q vsftpd
# 提示 "package vsftpd is not installed"# 安裝時必須使用軟件包的完整文件名
rpm -ivh vsftpd-3.0.2-28.el7.x86_64.rpm# 再次檢查,確認安裝成功
rpm -q vsftpd
# 顯示 vsftpd-3.0.2-28.el7.x86_64
注意:rpm
命令需要指定RPM文件的完整路徑或在當前目錄下。如果包名不完整或文件不存在,會報錯。
案例2:安裝一個有依賴關系的包 (httpd
)
rpm -ivh httpd-2.4.6-97.el7.centos.x86_64.rpm
此時,你會看到典型的依賴錯誤:
處理依賴問題的危險選項 (應極力避免)
在某些特殊、明確知道后果的情況下,可以使用以下參數強制安裝:
--nodeps
: 忽略依賴關系。
--force
: 強制安裝 (覆蓋文件、替換已安裝包)。
rpm -ivh httpd-2.4.6-97.el7.centos.x86_64.rpm --nodeps --force
# 這種安裝方式極有可能導致httpd服務無法正常啟動!
正確做法:應先手動安裝所有被依賴的包,或者直接使用 yum
/dnf
。
升級 (-Uvh
)
-U
(upgrade) 選項更常用,因為它既可以升級一個已安裝的包,也可以安裝一個新包。
rpm -Uvh new-version-httpd.rpm
b. 查詢 (-q
)
rpm -q
是最安全、最常用的子命令。
rpm -q <package_name>
: 查詢包是否安裝。
rpm -qa
: 查詢所有 (all) 已安裝的包。
rpm -qi <package_name>
: 查詢包的詳細信息 (information)。
rpm -ql <package_name>
: 列出包安裝的所有文件 (list)。
rpm -qc <package_name>
: 只列出包的配置文件 (config)。
rpm -qf <file_path>
: 根據文件反查所屬的包 (file)。
代碼示例:
# 查詢httpd包的詳細信息
rpm -qi httpd# 列出vsftpd包安裝的所有文件
rpm -ql vsftpd# 列出httpd包安裝的配置文件
rpm -qc httpd# 查看/etc/vsftpd/vsftpd.conf這個文件屬于哪個包
rpm -qf /etc/vsftpd/vsftpd.conf
c. 卸載 (-e
)
-e
(erase) 用于卸載軟件包。
代碼示例:
# 卸載 httpd 和 vsftpd
rpm -e httpd
rpm -e vsftpd# 驗證卸載結果
rpm -q httpd
rpm -q vsftpd
注意:卸載時同樣會檢查依賴關系。如果有其他包依賴于你要卸載的包,卸載會失敗。
d. 其他實用查詢與校驗
- 查詢未安裝的包文件 (
-p
)
# 查看一個RPM文件將要安裝哪些文件,而不實際安裝它
rpm -qpl vsftpd-3.0.2-28.el7.x86_64.rpm
- 校驗已安裝的包 (
-V
)
rpm -V
(Verify) 檢查軟件包的文件是否被修改過。沒有任何輸出表示文件完好。
rpm -V vsftpd
# 如果修改了 /etc/vsftpd/vsftpd.conf,此命令會有輸出
命令總結表
操作類型 | 常用命令格式 | 描述 |
---|---|---|
安裝/升級 | rpm -ivh <file.rpm> | 安裝一個新包,顯示詳細過程和進度。 |
rpm -Uvh <file.rpm> | 升級或安裝一個包 (推薦使用)。 | |
查詢已安裝 | rpm -qa | 列出所有已安裝的軟件包。 |
rpm -q <pkg_name> | 檢查指定軟件包是否已安裝。 | |
rpm -qi <pkg_name> | 顯示指定軟件包的詳細信息。 | |
rpm -ql <pkg_name> | 列出指定軟件包包含的所有文件。 | |
rpm -qc <pkg_name> | 只列出指定軟件包的配置文件。 | |
rpm -qf <file_path> | 查詢一個文件是由哪個軟件包安裝的。 | |
查詢未安裝 | rpm -qpl <file.rpm> | 預覽一個RPM包文件將會安裝哪些文件。 |
rpm -qpR <file.rpm> | 查看一個RPM包文件需要哪些依賴。 | |
卸載 | rpm -e <pkg_name> | 卸載一個已安裝的軟件包。 |
校驗 | rpm -V <pkg_name> | 驗證已安裝軟件包的文件是否被修改。 |
四、YUM/DNF包管理工具 (yum/dnf)
yum
/dnf
是高級包管理器,自動處理依賴關系,從遠程倉庫獲取軟件。
常用命令:
install
: 安裝
remove
: 卸載
update
: 更新
search
: 搜索
info
: 查看信息
list
: 列出包 (yum list installed
)
groupinstall
: 安裝包組 (如 “Development Tools”)
history
: 查看、撤銷、重做事務歷史
provides
(或whatprovides
): 查找哪個包提供某個文件或功能
clean
: 清理緩存 (yum clean all
)
repolist
: 列出已啟用的倉庫
代碼示例:
yum groupinstall "Development Tools"yum history listyum history undo 25yum provides htpasswdyum clean all
五、YUM/DNF 倉庫配置
YUM/DNF 從哪里下載軟件包,完全取決于 /etc/yum.repos.d/
目錄下的 .repo
配置文件。
.repo 文件核心字段:
[repository_id]
: 倉庫的唯一ID,用中括號括起來。
name
: 倉庫的描述性名稱。
baseurl
: 倉庫的URL地址。可以是http://
,https://
,ftp://
或file:///
。
mirrorlist
: (與baseurl
二選一) 指向一個包含多個鏡像URL的元文件地址。
enabled
:1
(啟用) 或0
(禁用)。
gpgcheck
:1
(檢查RPM包的GPG簽名以保證安全) 或0
(不檢查)。
gpgkey
: 指向GPG公鑰文件的URL或本地路徑,用于驗證簽名。
場景一:配置網絡鏡像源 (例如,使用阿里云鏡像)
在生產環境中,為了提高下載速度,通常會替換官方源為國內的鏡像源。
操作步驟:
- 備份現有repo文件 (非常重要!):
mkdir /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup
- 使用
wget
下載新的repo文件: (以CentOS 7為例)
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
- 清理舊緩存并生成新緩存:
yum clean all
yum makecache
場景二:配置本地文件鏡像源 (使用系統安裝光盤/ISO)
在無法訪問互聯網的環境下,或者為了快速安裝系統自帶的基礎軟件包,直接使用系統安裝光盤或ISO文件作為本地YUM源是一種非常便捷的方法。
操作步驟:
- 連接并掛載光盤/ISO:
將您的系統安裝光盤 (通常設備名為/dev/cdrom
或/dev/sr0
) 掛載到一個臨時目錄,例如/mnt
。
mount /dev/sr0 /mnt
驗證掛載:
df -h
# 你應該能看到 /dev/sr0 掛載在了 /mnt 上
- 配置倉庫文件:
為了避免與網絡源沖突,最佳實踐是先將所有現有的.repo
文件移動到一個備份目錄 (如果場景一中尚未操作)。
# 如果還未備份,請執行
mkdir -p /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup
然后,<font color="blue">創建一個新</font>的 `.repo` 文件來<font color="red">指向我們</font>掛載的<font color="green">光盤</font>。
vi /etc/yum.repos.d/local-iso.repo
在 `local-iso.repo` 文件中,<font color="orange">添加以下內容</font> (二選一,建議初學者使用版本一):**版本一 (簡單,不校驗GPG簽名):**
```ini
[local-iso]
name=Local CentOS ISO Repo
baseurl=file:///mnt
enabled=1
gpgcheck=0
```
**版本二 (安全,校驗GPG簽名):**
```ini
[local-iso]
name=Local CentOS ISO Repo
baseurl=file:///mnt
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
```
* `[local-iso]`: <font color="purple">倉庫ID</font>,可自定義。
* `baseurl=file:///mnt`: <font color="teal">核心配置</font>。`file:///` 協議<font color="brown">告訴YUM</font>這是一個<font color="darkgreen">本地文件系統路徑</font>,`/mnt` 是我們<font color="darkred">掛載光盤</font>的目錄。
* `gpgcheck=0`: <font color="navy">禁用</font>GPG簽名檢查,<font color="olive">最簡單</font>。
* `gpgcheck=1` 和 `gpgkey`: <font color="darkcyan">啟用</font>GPG檢查,并<font color="saddlebrown">指定</font>GPG公鑰文件的<font color="darkmagenta">位置</font> (通常系統<font color="firebrick">自帶</font>了對應版本的<font color="darkslategray">公鑰</font>)。
- 應用配置并測試:
配置好.repo
文件后,必須清理舊緩存并生成新的緩存。
yum clean all
yum makecache
現在,<font color="red">檢查倉庫列表</font>,應該<font color="green">只能看到</font>我們剛剛<font color="orange">配置的本地源</font>。
yum repolist
最后,<font color="purple">嘗試安裝</font>一個<font color="teal">光盤里</font>肯定有的<font color="brown">小工具</font>來<font color="darkgreen">測試</font>。
yum install -y tree
如果<font color="darkred">安裝成功</font>,說明<font color="navy">本地文件源</font>配置<font color="olive">成功</font>!
場景三:配置局域網YUM源 (網絡鏡像)
在企業環境中,搭建統一的局域網YUM源可以節省帶寬、加快速度并控制版本。
1. 在源服務器 (假設 IP: 192.168.1.100) 上操作:
a. 安裝必要工具:
yum install -y httpd createrepo
b. 準備軟件包目錄并同步:
(假設系統安裝光盤已掛載到 /mnt/cdrom
)
mkdir -p /var/www/html/centos/7
cp -r /mnt/cdrom/* /var/www/html/centos/7/
c. 創建倉庫元數據:
createrepo /var/www/html/centos/7/
d. 啟動并設置Web服務開機自啟:
systemctl start httpd
systemctl enable httpd
# 確保防火墻允許80端口
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
2. 在客戶端服務器上操作:
a. 備份并清空現有repo配置 (同上一步)。
b. 創建新的本地源配置文件:
vi /etc/yum.repos.d/lan.repo
c. 在 lan.repo
文件中添加以下內容:
[lan-base]
name=LAN CentOS-$releasever - Base
baseurl=http://192.168.1.100/centos/7/
enabled=1
gpgcheck=0
d. 清理并生成緩存:
yum clean all
yum makecache
現在,客戶端的 yum
命令將完全從你的局域網服務器獲取軟件包。
總結
本次我們掌握了Linux系統管理中至關重要的一系列工具。
systemctl
負責服務的生命周期管理。wget
是獲取網絡資源的得力助手。rpm
作為底層工具,讓我們能深入檢查和操作軟件包。而yum
/dnf
則在此之上提供了自動化依賴處理和強大的倉庫管理功能,特別是自定義倉庫配置的能力,是高級系統運維和自動化部署的基石。
練習題
題目:
- 如何查看
crond
服務的狀態,并判斷它是否設置為開機自啟? - 使用
wget
從http://ftp.gnu.org/gnu/wget/wget-1.21.4.tar.gz
下載文件,并將其保存在/opt/src
目錄下。 - 你有一個名為
myapp.rpm
的本地軟件包文件,如何查詢它將要安裝到系統中的所有文件列表,而不是真正安裝它? - 如何使用
rpm
查找/etc/my.cnf
這個配置文件是由哪個軟件包安裝的? - 如何使用
rpm
校驗openssh-server
軟件包的所有文件是否被修改過? - 使用
yum
安裝vim
編輯器,并且在安裝過程中自動回答“是”(yes)。 - 如何使用
yum
查看名為epel-release
的軟件包的詳細信息,包括它的描述、大小、來源倉庫等? - 寫出一條命令,列出系統中所有已安裝的、并且其包名中含有 “kernel” 關鍵詞的軟件包。
yum history
顯示最近一次remove
操作的事務ID是 30。如何撤銷這次刪除操作?/etc/yum.repos.d/
目錄的作用是什么?- 在一個
.repo
配置文件中,baseurl
和mirrorlist
這兩個參數通常是什么關系? - 為什么在配置指向國內鏡像源 (如阿里云、清華大學) 的
.repo
文件后,通常需要執行yum clean all
和yum makecache
? - 你正在搭建一個本地YUM源服務器。在將所有RPM包復制到Web服務器的目錄后,你需要運行哪個關鍵命令來生成倉庫所需的元數據?
答案與解析:
- 查看
crond
狀態與自啟設置:
systemctl status crond
systemctl is-enabled crond
解析: status
命令提供全面的實時狀態。is-enabled
專門用于檢查開機自啟的配置狀態。
wget
下載到指定目錄:
wget -P /opt/src http://ftp.gnu.org/gnu/wget/wget-1.21.4.tar.gz
解析: -P
(大寫P) 選項用于指定下載文件存放的目錄 (prefix directory)。
- 查詢未安裝RPM包的文件列表:
rpm -qpl myapp.rpm
解析: rpm -q
是查詢,-p
(package) 選項使其作用于一個包文件而不是已安裝的包名,-l
(list) 則是列出文件。
- 查找文件歸屬:
rpm -qf /etc/my.cnf
解析: rpm -qf
(query file) 是查詢指定文件屬于哪個已安裝軟件包的標準方法。
- 校驗軟件包文件:
rpm -V openssh-server
解析: rpm -V
(Verify) 會將軟件包當前的文件狀態與RPM數據庫中的原始元數據進行比對,報告任何不一致。
yum
自動同意安裝:
yum install -y vim
解析: -y
選項會自動對所有交互式提問回答“是”,這在編寫自動化腳本時非常有用。
yum
查看包信息:
yum info epel-release
解析: yum info <package_name>
提供了比 rpm -qi
更豐富的信息,因為它直接從倉庫獲取,可以查看未安裝的包,并包含來源倉庫信息。
- 列出含 “kernel” 的已安裝包:
yum list installed | grep kernel
解析: yum list installed
列出所有已安裝的包,然后通過管道 |
將結果傳遞給 grep
進行關鍵詞過濾。
yum history
撤銷操作:
yum history undo 30
解析: yum history undo <id>
會執行與指定事務ID相反的操作。如果ID 30是 remove
,undo
就會重新安裝被刪除的包。
-
/etc/yum.repos.d/
的作用:- 解析: 該目錄是存放YUM/DNF倉庫配置文件 (
.repo
文件) 的標準位置。YUM/DNF啟動時會掃描此目錄下所有.repo
文件,以確定可以從哪些軟件源獲取軟件包。
- 解析: 該目錄是存放YUM/DNF倉庫配置文件 (
-
baseurl
和mirrorlist
的關系:- 解析: 這兩個參數是互斥的,在一個倉庫配置中通常只使用一個。
baseurl
直接指定一個固定的倉庫URL。而mirrorlist
指定一個URL,該URL會返回一個包含多個可用baseurl
的列表,YUM會自動選擇一個最快或最近的鏡像進行下載。
- 解析: 這兩個參數是互斥的,在一個倉庫配置中通常只使用一個。
-
為何要
clean all
和makecache
:- 解析: 當你更改了
.repo
文件 (即更換了軟件源) 后,YUM本地的緩存 (包括包列表、元數據等) 仍然是基于舊倉庫的。yum clean all
強制清除所有舊緩存。yum makecache
則主動從新的倉庫地址下載元數據并建立新的緩存,這會顯著加快后續的search
和install
操作。
- 解析: 當你更改了
-
本地源生成元數據的命令:
createrepo /path/to/your/rpms
- 解析:
createrepo
命令會掃描指定目錄下的所有RPM包,并生成一個名為repodata
的子目錄,其中包含YUM/DNF識別倉庫所需的元數據文件 (如repomd.xml
)。