systemctl
(服务管理),
wget
(文件下载),以及
rpm
和
yum
(软件包管理)
## 思维导图
一、 系统服务管理器 systemctl
systemctl
是systemd
初始化系统的主控制命令,用于管理系统服务。
常用命令与功能:
start <service>
: 启动服务
stop <service>
: 停止服务
restart <service>
: 重启服务
reload <service>
: 重新加载配置文件 (不中断服务)
status <service>
: 查看服务状态
enable <service>
: 设置服务开机自启
disable <service>
: 取消服务开机自启
is-enabled <service>
: 检查是否开机自启
代码示例 (以 httpd
服务为例):
systemctl start httpd
systemctl enable httpd
systemctl status httpd
systemctl stop httpd
systemctl disable httpd
二、文件下载工具 wget
wget
是一个强大的非交互式网络下载器,常用于从网络上获取软件包文件或配置文件。
常用选项:
-O <file>
: 将下载内容另存为指定文件名
-P <dir>
: 将文件下载到指定目录
-c
: 断点续传
代码示例:
wget https://www.python.org/ftp/python/3.12.4/Python-3.12.4.tgz
wget -O nginx.conf_example https://raw.githubusercontent.com/nginx/nginx/master/conf/nginx.conf
wget -P ./datasets https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data
三、RPM包管理器
rpm功能强大且直接,但它本身不解决软件包之间的依赖关系
a. 安装与升级 (-i
, -U
)
第一步:准备软件包源 (挂载光盘)
连接并挂载光盘
在虚拟机或物理机上连接系统安装光盘/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) 选项
更常用,因为它
既可以升级一个已安装的包,也
可以安装一个新包。
bash 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)。
代码示例:
bash # 查询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) 用于
卸载软件包。
代码示例:
bash # 卸载 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 包管理工具
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" -y
yum history list
yum provides htpasswd
yum clean all
五、YUM 仓库配置
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
.repo
文件来指向我们挂载的光盘。
在vim /etc/yum.repos.d/BaseOS.repo
local-iso.repo
文件中,添加以下内容 (二选一,建议初学者使用版本一):
版本一 (简单,不校验GPG签名):
[BaseOS]
name=BaseOS
baseurl=file:///mnt
enabled=1
gpgcheck=0
版本二 (安全,校验GPG签名):
[BaseOS]
name=BaseOS
baseurl=file:///mnt
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[BaseOS]
: 仓库ID,可自定义
baseurl=file:///mnt
: 核心配置。file:///
协议告诉YUM这是一个本地文件系统路径,/mnt
是我们挂载光盘的目录。
gpgcheck=0
: 禁用GPG签名检查,最简单。
gpgcheck=1
和gpgkey
: 启用GPG检查,并指定GPG公钥文件的位置 (通常系统自带了对应版本的公钥)。
- 应用配置并测试:
配置好.repo
文件后,必须清理旧缓存并生成新的缓存。
现在,检查仓库列表,应该只能看到我们刚刚配置的本地源。yum clean all yum makecache
最后,尝试安装一个光盘里肯定有的小工具来测试。yum repolist
如果安装成功,说明本地文件源配置成功!yum install -y tree
场景三:配置局域网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
则在此之上提供了自动化依赖处理和强大的仓库管理功能,特别是自定义仓库配置的能力,是高级系统运维和自动化部署的基石。
练习题
题目:
- 如何查看
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
)。
- 解析: