Linux软件管理源
一、引言:为什么要重视软件管理源
在 CentOS 系统中,软件管理源(Repository)是所有软件包安装、更新和卸载的基础设施。无论是通过 yum(CentOS 7 及更早版本)还是 dnf(CentOS 8 及后续衍生版本),正确配置和管理软件源都能带来以下好处:
- 安全稳定:从可信的官方或社区仓库获取经过测试的软件包,降低安全风险。
- 版本控制:通过不同仓库提供不同版本的软件,满足开发与生产环境需求。
- 依赖解决:自动处理软件包之间的依赖关系,避免“依赖地狱”。
- 高效维护:统一管理成千上万个软件包,一键更新系统。
本文将深入介绍 CentOS 的软件管理源体系,包含官方源、EPEL、以及仓库配置文件的编写方法,并提供大量可直接操作的命令示例。
二、YUM 与 DNF 简介
CentOS 的包管理工具经历了从 yum 到 dnf 的演进,但两者在软件源管理的工作方式上高度相似。
- YUM (Yellowdog Updater Modified):CentOS 7 及更早版本使用的包管理器,通过
.repo文件定义仓库地址。 - DNF (Dandified YUM):CentOS 8 及后续版本(包括 CentOS Stream)的默认包管理器,语法与
yum几乎完全兼容,但内部实现更现代、性能更好。
由于绝大多数命令可以互换,本文统一以 yum 为例说明,dnf 用户直接替换命令即可。所有软件源配置文件的语法和位置完全相同。
三、仓库配置文件基础
3.1 仓库文件存储位置
CentOS 的软件源配置文件以 .repo 为扩展名,存放在以下两个目录:
- /etc/yum.repos.d/:用户自定义或第三方源存放目录,优先级最高。
- /etc/yum.repos.d 下的备份目录:通常包含系统自带的
CentOS-Base.repo等文件。
我们可以通过创建或修改 .repo 文件来添加新的软件源。
3.2 .repo 文件基本结构
一个典型的仓库配置段如下:
[repositoryid]
name=Repository Name
baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
# 或者使用 mirrorlist
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
enabled=1
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-7
各参数含义:
- [repositoryid]:仓库的唯一标识,不能重复。
- name:仓库的描述性名称,可读性好即可。
- baseurl:仓库的访问地址,支持
http://、https://、ftp://和本地路径file://。 - mirrorlist:镜像列表 URL,系统会自动选择最快的镜像。与
baseurl二选一,一般建议使用mirrorlist以提高下载速度。 - enabled:
1表示启用,0表示禁用。 - gpgcheck:
1表示启用 GPG 签名校验,强烈建议开启以保证安全。 - gpgkey:GPG 公钥的 URL 或本地路径,用于验证软件包来源。
- 常用变量:
$releasever(发行版本号,如 7、8)、$basearch(基础架构,如 x86_64、aarch64)。
四、CentOS 官方软件源详解
CentOS 自带的官方源包含多个仓库,分别提供不同类别的软件包。这些仓库在安装系统时已自动启用,但了解其用途有助于高级管理。
4.1 主要官方仓库
- base:发行版的核心软件包,是系统正常运行的基础,如内核、glibc、bash 等。
- updates:针对
base仓库中软件包的更新和重要补丁,建议始终启用。 - extras:提供额外的不影响核心系统功能的软件包,例如 Docker、Nginx、某些开发库等。
- centosplus:包含一些增强或替换基础仓库中软件包的包,比如更新版本的内核或工具链。该仓库默认禁用,因为其中的包可能破坏官方兼容性。
- fasttrack(CentOS 7):包含一些与 RHEL 异步发布的 bug 修复包,通常由社区维护。
可以在 /etc/yum.repos.d/CentOS-Base.repo 中看到这些仓库的详细配置。建议新手不要随意修改该文件,而是通过额外的 .repo 文件添加新源。
4.2 验证官方源状态
使用以下命令查看当前启用的仓库列表及其包含的包数量:
yum repolist
# 或查看所有仓库(含禁用的)
yum repolist all
示例输出:

五、EPEL:企业级 Linux 额外软件包
5.1 什么是 EPEL
EPEL(Extra Packages for Enterprise Linux)是由 Fedora 社区维护的一个高质量附加软件源,为 CentOS/RHEL 提供了大量不在官方源中的常用软件,例如 Nginx、htop、certbot、Python 3.6+ 等。EPEL 严格遵守不替换基础系统软件包的原则,安全性高,兼容性好。
5.2 安装 EPEL
CentOS 7/8 均可以通过一个 RPM 包快速安装 EPEL 源:
# CentOS 7
yum install -y epel-release
CentOS 8(若使用 CentOS Stream 或 AlmaLinux/Rocky 也适用)
yum install -y epel-release
或者手动安装:
yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
安装后会在 /etc/yum.repos.d/ 下生成 epel.repo 和 epel-testing.repo。其中 epel-testing 是测试仓库,包含更前沿但未充分测试的包,一般不建议在生产环境启用。
5.3 使用 EPEL
启用 EPEL 后,可以直接通过 yum 安装 EPEL 中的软件包:
yum install htop # htop 来自 EPEL,官方 base 源中不存在
如果要临时禁用 EPEL 而使用其他源,可以:
yum --disablerepo=epel install package-name
注意:由于 EPEL 与官方源可能存在包名称冲突,实际使用中极少遇到。如果真的出现冲突,可通过 excludepkgs 参数在配置文件中排除特定包。
Linux进程管理
一、引言
进程管理是 Linux 系统管理的核心技能之一。无论是排查系统性能问题、控制服务运行状态,还是优化资源分配,都离不开对进程的深入理解。Linux 提供了丰富的命令行工具和系统接口,帮助管理员全面掌控系统中每一个运行中的进程。本文将详细介绍进程的基本概念、查看与筛选进程的方法、进程控制命令、后台任务管理、/proc 文件系统以及 systemd 服务管理等内容,并提供大量可直接操作的命令示例。
二、进程基础概念
2.1 什么是进程
进程(Process)是程序的一次执行实例。当用户在终端运行一个命令或启动一个应用时,系统会为其创建一个进程。每个进程拥有独立的地址空间、内存、文件描述符等资源,并由内核统一调度。
与进程相关的核心标识包括:
- PID(Process ID):进程的唯一数字标识,在进程创建时由内核分配。
- PPID(Parent Process ID):父进程的 PID。Linux 中除 init/systemd(PID 1)外,所有进程都由其他进程创建。
- UID/GID:进程所属的用户 ID 和组 ID,决定了进程的权限。
- TTY:进程关联的终端设备。
2.2 进程类型
- 前台进程:直接与用户终端交互的进程,运行期间会占用终端。
- 后台进程:在后台运行的进程,不占用终端输入,但可以向终端输出信息。
- 守护进程(Daemon):在系统启动时自动运行、脱离终端控制的常驻后台进程,如 sshd、crond、httpd 等。
2.3 进程的生命周期
一个进程从创建到终止,大致经历以下阶段:
- 创建(fork):父进程通过 fork() 系统调用创建子进程。
- 就绪/运行:进程被调度器选中,在 CPU 上执行。
- 等待/阻塞:进程等待 I/O、信号或资源,暂时停止运行。
- 终止(exit):进程执行完毕或被强制终止。
- 僵尸(Zombie):子进程已终止但父进程尚未回收其退出状态。少量僵尸进程无害,但大量堆积会耗尽 PID 资源。
- 孤儿进程:父进程先于子进程终止,子进程会被 init/systemd 接管。
三、进程状态详解
在 Linux 中,每个进程在任何时刻都处于特定的状态。理解这些状态是排查问题的关键。
3.1 常见进程状态码
- R(Running/Runnable):正在运行或在运行队列中等待 CPU 调度。
- S(Interruptible Sleep):可中断睡眠,等待某个事件(如 I/O 操作)完成。绝大多数空闲进程处于此状态。
- D(Uninterruptible Sleep):不可中断睡眠,通常是在等待磁盘 I/O。此状态的进程无法被 kill 信号中断,是高负载 I/O 问题的典型特征。
- T(Stopped):进程被暂停(如收到 SIGSTOP 信号),可通过 SIGCONT 恢复。
- Z(Zombie):僵尸进程,已终止但未被父进程回收。
- X(Dead):进程即将被彻底销毁,极少见。
3.2 附加状态标识
- s:会话领导者(session leader)。
- +:前台进程组。
- l:多线程进程。
- <:高优先级进程。
- N:低优先级进程。
四、查看进程的命令
4.1 ps 命令
ps(Process Status)是最基础的进程查看命令,支持多种选项组合。
常用用法示例
# 查看当前 shell 中运行的进程
ps
查看所有用户的进程(BSD 风格)
ps aux
查看所有进程(标准语法)
ps -ef
按树形结构显示进程关系
ps -ejH
或
ps axjf
根据 PID 查看特定进程
ps -p 1234 -f
查看某个用户的所有进程
ps -u root
自定义输出列
ps -eo pid,ppid,user,%cpu,%mem,cmd --sort=-%cpu | head -20
ps aux 输出列说明
- USER:进程所属用户。
- PID:进程 ID。
- %CPU:CPU 使用率百分比。
- %MEM:物理内存使用率百分比。
- VSZ:虚拟内存大小(KB)。
- RSS:常驻物理内存大小(KB)。
- TTY:关联终端。
- STAT:进程状态。
- START:进程启动时间。
- TIME:累计 CPU 时间。
- COMMAND:命令行。
4.2 pstree 命令
pstree 以树形结构直观展示进程间的父子关系。
# 显示完整进程树
pstree
显示进程树并标注 PID
pstree -p
查看特定用户的进程树
pstree username
高亮当前进程
pstree -h
4.3 top 命令
top 是实时动态显示系统进程信息的交互式工具,类似于 Windows 的任务管理器。
# 启动 top
top
指定刷新间隔(秒)
top -d 2
显示特定用户的进程
top -u root
监控特定 PID
top -p 1234
top 交互快捷键
- P:按 CPU 使用率排序。
- M:按内存使用率排序。
- T:按运行时间排序。
- k:输入 PID 后发送信号终止进程。
- r:修改进程优先级(renice)。
- c:切换显示完整命令行。
- 1:切换显示每个 CPU 核心的使用情况。
- q:退出。
4.4 htop 命令
htop 是 top 的增强版,提供彩色界面、鼠标支持和更丰富的交互操作。需通过 EPEL 安装:
yum install -y htop
htop
htop 支持鼠标点击、垂直/水平滚动、进程树视图(F5)等特性,在日常运维中比 top 更受欢迎。
五、进程控制命令
5.1 信号机制
Linux 通过信号(Signal)与进程通信。进程收到信号后可以执行默认动作(终止、忽略、暂停等),也可以自定义处理函数(信号处理器)。
常用信号列表
| 信号编号 | 信号名称 | 默认动作 | 说明 |
|---|---|---|---|
| 1 | SIGHUP | 终止 | 终端挂断,常用于让守护进程重新加载配置 |
| 2 | SIGINT | 终止 | 来自键盘的中断信号(Ctrl+C) |
| 3 | SIGQUIT | 终止+core | 来自键盘的退出信号(Ctrl+\) |
| 9 | SIGKILL | 终止 | 强制终止,不可被捕获或忽略 |
| 15 | SIGTERM | 终止 | 默认终止信号,可被捕获,允许进程优雅退出 |
| 18 | SIGCONT | 继续 | 恢复被暂停的进程 |
| 19 | SIGSTOP | 暂停 | 暂停进程,不可被捕获或忽略 |
| 20 | SIGTSTP | 暂停 | 来自键盘的暂停信号(Ctrl+Z) |
5.2 kill 命令
kill 用于向进程发送信号,尽管名称叫 kill,但它不仅可以终止进程。
# 优雅终止进程(发送 SIGTERM)
kill 1234
强制终止进程(发送 SIGKILL)
kill -9 1234
重新加载配置文件(常用语 nginx、sshd 等守护进程)
kill -HUP 1234
或
kill -1 1234
列出所有支持的信号
kill -l
5.3 killall 命令
killall 根据进程名称而非 PID 来发送信号,可以一次性终止多个同名进程。
# 终止所有名为 nginx 的进程
killall nginx
强制终止
killall -9 nginx
交互式确认(CentOS 7 部分版本需要 -i 参数)
killall -i nginx
5.4 pkill 命令
pkill 支持更灵活的模式匹配和筛选条件。
# 按名称模式终止进程
pkill nginx
按用户筛选
pkill -u root
按终端筛选
pkill -t pts/0
只向最新的一个进程发送信号
pkill -n nginx
强制终止所有属于某个用户的进程
pkill -9 -u username
六、进程优先级与资源控制
6.1 nice 与 renice
Linux 使用 nice 值来影响进程的调度优先级。nice 值范围从 -20(最高优先级)到 19(最低优先级),默认值为 0。普通用户只能将 nice 值调高(降低优先级),只有 root 可以调低 nice 值(提高优先级)。
# 以指定 nice 值启动进程
nice -n 10 my_program
修改已运行进程的 nice 值
renice -n 5 -p 1234
修改某个用户所有进程的 nice 值
renice -n 10 -u username
6.2 资源限制(ulimit)
ulimit 可以限制 shell 及其子进程的资源使用,包括最大文件打开数、最大内存、最大进程数等。
# 查看所有限制
ulimit -a
查看最大文件打开数
ulimit -n
设置最大文件打开数(临时生效)
ulimit -n 65535
设置最大进程数
ulimit -u 4096
对于持久化配置,需要修改 /etc/security/limits.conf 文件。
七、后台进程与作业控制
7.1 & 符号
在命令末尾加上 & 符号,可以将进程直接放入后台运行。
# 启动后台任务
sleep 300 &
后台运行并忽略 HUP 信号(退出终端后继续运行)
nohup my_program &
7.2 jobs、fg、bg 命令
# 查看当前终端的作业列表
jobs
# -l 显示 PID
jobs -l
将后台作业调回前台
fg %1
将暂停的作业放入后台继续运行
bg %1
7.3 Ctrl+Z 与前后台切换
- 在进程运行时按 Ctrl+Z,进程会被暂停并放入后台(状态变为 T)。
- 使用
bg %作业号让暂停的进程在后台继续运行。 - 使用
fg %作业号将后台进程调回前台。
八、/proc 文件系统
/proc 是一个虚拟文件系统,不占用磁盘空间,由内核在内存中动态生成。它提供了进程和系统信息的接口,是排查问题和性能分析的重要数据来源。
8.1 进程相关目录
每个进程在 /proc 下都有一个以其 PID 命名的目录,包含该进程的详细信息。
# 查看进程的命令行参数
cat /proc/1234/cmdline
查看进程的环境变量
cat /proc/1234/environ | tr '\0' '\n'
查看进程状态信息
cat /proc/1234/status
查看进程的内存映射
cat /proc/1234/maps
查看进程打开的文件描述符
ls -l /proc/1234/fd/
查看进程的当前工作目录
ls -l /proc/1234/cwd
查看进程的可执行文件路径
ls -l /proc/1234/exe
8.2 常用系统级信息文件
# CPU 信息
cat /proc/cpuinfo
内存信息
cat /proc/meminfo
系统负载
cat /proc/loadavg
内核版本
cat /proc/version
系统运行时间和空闲时间
cat /proc/uptime
九、systemd 服务管理
在 CentOS 7 及更高版本中,systemd 取代了传统的 SysV init,成为系统和服务管理器。几乎所有的系统服务都以 systemd unit 的形式进行管理。
9.1 服务状态查看
# 查看所有已加载的 unit
systemctl list-units --type=service
查看特定服务的详细状态
systemctl status sshd
查看服务是否开机自启
systemctl is-enabled sshd
查看服务是否正在运行
systemctl is-active sshd
9.2 服务启动、停止与重启
# 启动服务
systemctl start nginx
停止服务
systemctl stop nginx
重启服务
systemctl restart nginx
重新加载配置(不中断服务)
systemctl reload nginx
重载 systemd 配置
systemctl daemon-reload
9.3 设置开机自启
# 启用开机自启
systemctl enable nginx
禁用开机自启
systemctl disable nginx
查看服务依赖关系
systemctl list-dependencies nginx
9.4 日志查看(journalctl)
# 查看特定服务的日志
journalctl -u nginx
实时跟踪服务日志
journalctl -u nginx -f
查看最近的日志(按时间筛选)
journalctl -u nginx --since "2026-07-06 22:00:00"
查看本次启动以来的日志
journalctl -b
十、常见问题排查
10.1 CPU 使用率过高
# 找出 CPU 占用最高的进程
ps aux --sort=-%cpu | head -10
使用 top 实时观察
top -o %CPU
查看进程的线程级 CPU 占用
top -H -p PID
10.2 内存泄漏排查
# 按内存占用排序
ps aux --sort=-%mem | head -10
查看进程详细内存信息
cat /proc/PID/status | grep -E "VmRSS|VmSize"
使用 smem 工具(需安装)
smem -r -s rss
10.3 僵尸进程处理
# 查找僵尸进程
ps aux | grep 'Z'
僵尸进程无法直接 kill,需找到其父进程
ps -o ppid= -p ZOMBIE_PID
终止父进程让僵尸进程被 init/systemd 接管回收
kill -HUP PARENT_PID
10.4 端口占用定位
# 查看端口被哪个进程占用
ss -tlnp | grep :80
# 或使用 lsof
lsof -i :80
根据 PID 查看详细信息
ps -p PID -f
10.5 进程卡死(D 状态)
处于 D 状态的进程通常是在等待磁盘 I/O。此时进程无法被 kill 信号中断。排查方向:
- 检查磁盘 I/O 负载:使用
iostat -x 1或iotop。 - 检查存储设备是否故障。
- 检查 NFS 或远程文件系统是否响应异常。
十一、总结与最佳实践
进程管理是 Linux 运维的基石。掌握以下要点,将帮助你在日常工作中游刃有余:
- 善用 ps 和 top:它们是排查问题的第一站,熟练使用排序和筛选功能。
- 优先使用 SIGTERM:终止进程时先用
kill PID给进程优雅退出的机会,仅必要时使用kill -9。 - 关注僵尸进程:少量僵尸进程可以忽略,但若数量持续增长,应及时排查父进程。
- 合理设置资源限制:通过 ulimit 和 cgroup 限制进程资源使用,防止单进程耗尽系统资源。
- 活用 /proc 文件系统:很多监控工具(如 Prometheus node_exporter)的数据来源就是 /proc,直接查看 /proc 有助于深度排错。
- 掌握 systemd:现代 CentOS 系统全面采用 systemd,熟练掌握 systemctl 和 journalctl 是运维的基本功。
- 保持文档记录:对关键服务的进程管理操作做好记录,便于审计和故障回溯。
Linux磁盘管理
一、引言
磁盘管理是 Linux 系统运维中最基础也最关键的技能之一。无论是安装系统时的分区规划、运行中的存储扩容,还是故障后的数据恢复,都离不开对磁盘体系的深入理解。CentOS 提供了 fdisk、parted、LVM、mkfs、mount 等丰富的命令行工具,帮助管理员灵活高效地管理存储资源。本文将围绕磁盘分区、逻辑卷管理(LVM)、文件系统操作、挂载与卸载、磁盘配额以及常见问题排查等内容展开,并给出大量可直接操作的命令示例。
二、磁盘与分区基础
2.1 磁盘命名规则
在 Linux 中,磁盘设备以文件形式存在于 /dev/ 目录下,命名遵循一定规则:
- IDE 硬盘:
/dev/hda、/dev/hdb…… - SATA/SCSI/SAS 硬盘:
/dev/sda、/dev/sdb、/dev/sdc…… - NVMe 固态硬盘:
/dev/nvme0n1、/dev/nvme1n1…… - 虚拟磁盘(KVM/VMware):
/dev/vda、/dev/vdb……
分区以数字后缀表示,例如 /dev/sda1 表示第一块 SATA 磁盘的第一个分区。
2.2 MBR 与 GPT 分区表
- MBR(Master Boot Record):传统分区表格式,最大支持 2TB 磁盘,最多 4 个主分区。可通过将其中一个主分区设为扩展分区来创建更多逻辑分区。
- GPT(GUID Partition Table):现代分区表格式,支持超过 2TB 的大磁盘,最多 128 个分区(可调整),并自带 CRC 校验和备份分区表,容错性更好。CentOS 7+ 建议使用 GPT。
2.3 查看磁盘与分区信息
# 列出所有块设备
lsblk
查看磁盘分区表
fdisk -l
查看磁盘详细信息(含 UUID、文件系统类型)
blkid
查看已挂载的文件系统及使用情况
df -h
查看分区详情(需 root)
parted -l
三、磁盘分区工具
3.1 fdisk 命令
fdisk 是传统的 MBR 分区工具,也支持 GPT(CentOS 7+)。适合管理 2TB 以下的磁盘。
# 进入交互式分区界面(以 /dev/sdb 为例)
fdisk /dev/sdb
常用交互命令:
m 查看帮助
p 显示当前分区表
n 创建新分区
d 删除分区
t 修改分区类型
w 写入分区表并退出
q 不保存退出
创建分区的典型流程:
- 执行
fdisk /dev/sdb进入交互模式。 - 输入
n创建新分区,选择分区类型(主分区/扩展分区)。 - 设置起始扇区和结束扇区(或指定大小如
+10G)。 - 输入
w写入分区表并退出。 - 执行
partprobe或重启让内核重新读取分区表。
3.2 parted 命令
parted 是更现代的分区工具,对 GPT 和大于 2TB 的磁盘支持更好。
# 交互式使用
parted /dev/sdb
常用交互命令:
print 显示分区表
mklabel gpt 创建 GPT 分区表(或 msdos 创建 MBR)
mkpart primary 0% 50% 创建主分区(从 0% 到 50%)
mkpart primary 50% 100% 创建主分区(从 50% 到 100%)
rm 1 删除编号为 1 的分区
quit 退出
非交互式创建分区表
parted /dev/sdb mklabel gpt
非交互式创建分区
parted /dev/sdb mkpart primary xfs 0% 100%
3.3 分区对齐
对于 SSD 和 4K 扇区的高级格式化磁盘,分区对齐至关重要。未对齐的分区会导致额外的读写操作,严重降低性能。使用 parted 时指定 align-check optimal 1 可检查对齐情况。现代工具(parted、fdisk 新版)默认会按 1MB 边界对齐,一般无需额外干预。
四、逻辑卷管理(LVM)
4.1 LVM 概述
LVM(Logical Volume Manager)在物理磁盘和文件系统之间添加了一个抽象层,使得存储管理更加灵活。LVM 的核心概念:
- PV(Physical Volume,物理卷):物理磁盘或分区,如
/dev/sdb1。 - VG(Volume Group,卷组):由一个或多个 PV 组成的存储池。
- LV(Logical Volume,逻辑卷):从 VG 中划分出的逻辑存储单元,类似于传统分区,但可以动态扩容和缩容。
- PE(Physical Extent,物理扩展块):VG 中的最小分配单元,默认 4MB。
4.2 创建 LVM
# 1. 创建物理卷(将分区或整盘标记为 PV)
pvcreate /dev/sdb1
pvcreate /dev/sdc1
2. 创建卷组(将多个 PV 加入同一个 VG)
vgcreate vg_data /dev/sdb1 /dev/sdc1
3. 创建逻辑卷
-n 指定名称,-L 指定大小
lvcreate -n lv_mysql -L 50G vg_data
4. 格式化逻辑卷
mkfs.xfs /dev/vg_data/lv_mysql
5. 挂载使用
mkdir /data/mysql
mount /dev/vg_data/lv_mysql /data/mysql
4.3 查看 LVM 信息
# 查看物理卷
pvdisplay
pvs
查看卷组
vgdisplay
vgs
查看逻辑卷
lvdisplay
lvs
4.4 扩容逻辑卷
LVM 的一大优势是可以在线扩容(无需卸载文件系统)。
# 1. 如果 VG 空间不足,先添加新 PV 并扩展到 VG
pvcreate /dev/sdd1
vgextend vg_data /dev/sdd1
2. 扩容逻辑卷(增加 20G)
lvextend -L +20G /dev/vg_data/lv_mysql
3. 扩容文件系统(XFS)
xfs_growfs /data/mysql
如果是 ext4 文件系统
resize2fs /dev/vg_data/lv_mysql
4.5 缩容逻辑卷
注意:XFS 文件系统不支持缩容!ext4 支持,但需要先卸载。
# ext4 缩容步骤(以 ext4 为例)
umount /data/test
1. 先缩文件系统
e2fsck -f /dev/vg_data/lv_test
resize2fs /dev/vg_data/lv_test 10G
2. 再缩逻辑卷
lvreduce -L 10G /dev/vg_data/lv_test
mount /data/test
五、文件系统管理
5.1 常见文件系统对比
| 文件系统 | 最大卷大小 | 最大文件大小 | 特点 |
|---|---|---|---|
| ext4 | 1EB | 16TB | 成熟稳定,支持缩容,CentOS 6 默认 |
| XFS | 8EB | 8EB | 高性能,支持在线扩容,不支持缩容,CentOS 7+ 默认 |
| Btrfs | 16EB | 16EB | 支持快照、压缩、子卷,仍在积极开发 |
5.2 创建文件系统
# 格式化为 ext4
mkfs.ext4 /dev/sdb1
格式化为 XFS
mkfs.xfs /dev/sdb1
格式化为 Btrfs
mkfs.btrfs /dev/sdb1
5.3 文件系统检查与修复
# ext4 文件系统检查
e2fsck -f /dev/sdb1
XFS 文件系统检查(需先卸载)
xfs_repair /dev/sdb1
修复前建议先备份重要数据
六、挂载与卸载
6.1 mount 命令
# 基本挂载
mount /dev/sdb1 /mnt/data
指定文件系统类型挂载
mount -t ext4 /dev/sdb1 /mnt/data
以只读方式挂载
mount -o ro /dev/sdb1 /mnt/data
挂载并允许执行二进制文件
mount -o exec /dev/sdb1 /mnt/data
查看当前所有挂载
mount | column -t
6.2 umount 命令
# 卸载文件系统
umount /mnt/data
强制卸载(进程占用时)
umount -l /mnt/data
查看哪个进程占用
lsof /mnt/data
fuser -m /mnt/data
6.3 开机自动挂载(/etc/fstab)
/etc/fstab 文件定义了系统启动时自动挂载的文件系统。每行格式:
设备/UUID 挂载点 文件系统类型 挂载选项 dump fsck顺序
示例:
# 使用 UUID 挂载(推荐,避免设备名变化)
UUID=a1b2c3d4-5678-90ab-cdef-1234567890ab /data xfs defaults 0 0
使用设备名挂载
/dev/sdb1 /backup ext4 defaults 0 0
挂载选项说明:
defaults = rw, suid, dev, exec, auto, nouser, async
noatime 不更新文件访问时间,可提升性能
# 编辑 /etc/fstab 后测试挂载(不重启验证)
mount -a
七、磁盘空间管理
7.1 查看磁盘使用情况
# 查看文件系统磁盘使用情况
df -h
查看 inode 使用情况(小文件过多时 inode 可能先耗尽)
df -i
查看目录/文件占用空间
du -sh /var/log/
du -h --max-depth=1 /home/
找出当前目录下最大的 10 个文件/目录
du -sh * | sort -rh | head -10
7.2 清理磁盘空间
# 查找大于 100MB 的文件
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null
清理 yum 缓存
yum clean all
清理旧内核(保留当前内核)
package-cleanup --oldkernels --count=2
清理 journal 日志(保留最近 3 天)
journalctl --vacuum-time=3d
清理 /tmp 目录中的旧文件
find /tmp -type f -atime +10 -delete
7.3 磁盘配额
磁盘配额用于限制用户或组对磁盘空间和 inode 的使用,防止单个用户耗尽磁盘。
# 1. 在 /etc/fstab 中添加配额选项
# /dev/sdb1 /data xfs defaults,usrquota,grpquota 0 0
# 或对 ext4 使用: defaults,usrquota,grpquota
2. 重新挂载
mount -o remount /data
3. 初始化配额数据库(ext4)
quotacheck -cug /data
4. 启用配额(ext4)
quotaon /data
5. 设置用户配额
edquota username
6. 查看配额使用情况
repquota /data
八、Swap 交换空间
8.1 Swap 的作用
Swap 是磁盘上的一块区域,当物理内存不足时,内核会将不活跃的内存页面换出到 Swap。适度的 Swap 有助于系统在内存紧张时保持稳定,但不能替代物理内存。
8.2 创建与启用 Swap
# 方法一:使用分区作为 Swap
mkswap /dev/sdb1
swapon /dev/sdb1
方法二:使用文件作为 Swap
dd if=/dev/zero of=/swapfile bs=1M count=4096
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
写入 /etc/fstab 永久生效
echo '/swapfile swap swap defaults 0 0' >> /etc/fstab
8.3 查看与调整 Swap
# 查看 Swap 使用情况
swapon --show
free -h
查看 Swap 使用程度(0-100,值越低越好)
cat /proc/sys/vm/swappiness
临时调整 swappiness(值越小越倾向使用物理内存)
sysctl vm.swappiness=10
永久调整
echo 'vm.swappiness=10' >> /etc/sysctl.conf
九、RAID 简介
RAID(Redundant Array of Independent Disks)通过组合多块磁盘来提升性能或提供冗余。Linux 支持软 RAID(通过 mdadm 实现)和硬 RAID(通过 RAID 控制器)。
9.1 常见 RAID 级别
- RAID 0:条带化,将数据分散写入多块磁盘,读写性能高,但无冗余,任意一块磁盘损坏则数据全丢。最少 2 块盘。
- RAID 1:镜像,数据同时写入两块磁盘,读性能提升,写性能略降,允许一块磁盘故障。最少 2 块盘,可用容量为总容量的 50%。
- RAID 5:分布式奇偶校验,读写性能较好,允许一块磁盘故障,可用容量为 N-1 块盘。最少 3 块盘。
- RAID 6:双奇偶校验,允许两块磁盘同时故障,可用容量为 N-2 块盘。最少 4 块盘。
- RAID 10(1+0):先镜像再条带化,兼顾性能与冗余,最少 4 块盘,可用容量为总容量的 50%。
9.2 使用 mdadm 创建软 RAID
# 安装 mdadm
yum install -y mdadm
创建 RAID 1(使用两块磁盘)
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
查看 RAID 状态
cat /proc/mdstat
mdadm --detail /dev/md0
格式化并挂载
mkfs.xfs /dev/md0
mount /dev/md0 /data
保存 RAID 配置(确保重启后自动组装)
mdadm --detail --scan >> /etc/mdadm.conf
十、常见问题排查
10.1 磁盘空间未释放
删除大文件后 df 显示空间未释放,通常是因为该文件仍被某个进程占用。
# 查找已删除但仍被占用的文件
lsof | grep deleted
重启占用进程或使用以下命令清空
echo > /proc/PID/fd/FD_NUMBER
10.2 无法卸载磁盘
# 查看占用进程
fuser -m /mnt/data
lsof /mnt/data
强制 kill 占用进程后卸载
fuser -km /mnt/data
umount /mnt/data
或者使用懒卸载
umount -l /mnt/data
10.3 磁盘 I/O 性能排查
# 查看磁盘 I/O 统计
iostat -x 1
查看哪个进程占用 I/O
iotop
使用 dd 测试磁盘读写速度
dd if=/dev/zero of=/tmp/test bs=1M count=1024 conv=fdatasync
dd if=/tmp/test of=/dev/null bs=1M count=1024
10.4 fstab 错误导致无法启动
如果 /etc/fstab 配置错误导致系统无法正常启动:
- 启动时进入紧急模式(emergency mode),输入 root 密码。
- 以读写方式重新挂载根目录:
mount -o remount,rw / - 编辑
/etc/fstab修正错误配置。 - 执行
mount -a测试配置是否正确。 - 重启系统。
十一、总结与最佳实践
磁盘管理贯穿 Linux 运维的整个生命周期。牢记以下原则,将帮助你构建稳健的存储体系:
- 规划先行:部署系统前评估存储需求,合理规划分区方案。生产环境优先选用 LVM + XFS 组合。
- 使用 UUID:在
/etc/fstab中使用 UUID 而非设备名,避免因磁盘识别顺序变化导致挂载失败。 - 监控空间:定期检查
df -h和df -i,设置告警阈值,防止空间或 inode 耗尽。 - 操作前备份:分区、缩容、格式化等危险操作前,务必备份关键数据并确认操作对象正确。
- 善用 LVM:为需要灵活扩容的场景(如数据库、日志存储)创建 LVM 逻辑卷,避免传统分区的扩容难题。
- 及时清理:定期清理旧日志、缓存文件和旧内核,释放磁盘空间。
- 测试 fstab:修改
/etc/fstab后先执行mount -a验证,确认无误后再重启。 - 配置 Swap:即使内存充足也建议配置适量 Swap(一般 2-4GB),以应对突发内存压力。
综合项目--搭建论坛
本节以 CentOS 环境为例,完整演示从零搭建 Discuz 论坛的全过程。整体流程分为五个步骤:安装 MariaDB 数据库 → 配置 PHP 运行环境 → 部署 Discuz 论坛源码 → 配置 Nginx Web 服务器 → 浏览器访问验证。每一步都给出了可直接执行的命令和关键配置说明。
一、安装 MariaDB 数据库
Discuz 论坛需要 MySQL/MariaDB 作为后端数据库,首先安装并初始化 MariaDB:
# 安装 MariaDB 服务
yum install -y mariadb-server.x86_64
设置开机自启并立即启动
systemctl enable --now mariadb
运行安全初始化脚本,设置 root 密码等
mysql_secure_installation
二、配置 PHP 运行环境
2.1 安装 SCL 软件源
CentOS 基础源的软件版本偏老(如默认 GCC、Python、PHP、MySQL 版本很低)。SCL(Software Collections)可以在不替换系统自带软件的前提下,并行安装新版软件(如 GCC 11、Python 3.9、PHP 8.1、rh-mariadb 10.5 等),通过 scl enable 命令即可临时切换到高版本环境:
yum install -y centos-release-scl.noarch
为提高下载速度,建议将镜像源替换为阿里云:


2.2 安装 PHP 7.3 及 PHP-FPM
安装 PHP 7.3 完整运行环境,并搭配 MySQL 原生数据库驱动,使 PHP 7.3 程序具备连接 MariaDB/MySQL 的能力:
yum install rh-php73.x86_64 rh-php73-php-mysqlnd.x86_64
安装 PHP-FPM(FastCGI Process Manager),用于处理 Nginx 转发的 PHP 请求:
yum install -y rh-php73-php-fpm
systemctl enable --now rh-php73-php-fpm
三、部署 Discuz 论坛源码
将 Discuz 论坛源码压缩包解压到当前目录,释放出 upload 目录(包含论坛全部程序文件)及安装说明等:
unzip Discuz_X3.5_SC_UTF8_20260504.zip
Discuz 在安装和运行过程中需要对 config、data、uc_client、uc_server 这四个核心目录进行读写,递归开放全部权限:
chmod -R 777 config data uc_client uc_server

使用 Nginx 作为 Web 服务器,将全部 Discuz 论坛程序移动到 Nginx 的网页根目录:

四、配置 Nginx Web 服务器
使用 vim 打开 Nginx 主配置文件:
vim /usr/local/nginx/conf/nginx.conf

4.1 设置网站默认首页优先级
在 Nginx 配置中添加 index 指令,当浏览器只访问 IP/域名(不带具体文件名)时,Nginx 会按以下顺序查找默认首页文件:
- 优先查找
index.php - 找不到则查找
index.html - 最后查找
index.htm
这行配置的作用:
- 设置网站默认首页优先级:浏览器只访问 IP/域名(不带文件名)时,Nginx 按上述顺序查找文件 —— 优先匹配
index.php→ 其次index.html→ 最后index.htm。 - 适配 Discuz 论坛:论坛入口是
index.php,如果没有这行配置,访问网站根目录不会自动打开论坛首页,会报 403 错误或显示空白目录列表。 - 确保直接访问生效:源码根目录下的
index.php就是 Discuz 入口,加上这行配置后,直接输入 IP 即可进入论坛安装页或主页。

4.2 配置 PHP 请求转发
添加以下 location 配置块,匹配所有以 .php 结尾的请求,并将其交给 PHP-FPM 程序解析。没有这段配置,Nginx 只会把 PHP 源码文件直接下载到浏览器,而不会执行页面。
逐行拆解说明:
location ~ \.php$—— 正则匹配:拦截所有.php后缀的 URL 请求(论坛所有 PHP 页面、安装页install/index.php都会命中此规则)。root html;—— 指定网站根目录为html(对应/usr/local/nginx/html,即 Discuz 源码所在目录),用于定位 PHP 文件的真实路径。fastcgi_pass 127.0.0.1:9000;—— 将 PHP 请求转发到本地 9000 端口的 PHP-FPM 服务(之前启动的rh-php73-php-fpm默认监听 9000),由 PHP 进程执行代码。fastcgi_index index.php;—— 指定 PHP 场景下的默认首页文件。#fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;—— 这是原配置文件中的注释行,指向错误的/scripts目录,不能使用。include fastcgi.conf;—— 引入 Nginx 自带的fastcgi.conf文件,其中包含正确的SCRIPT_FILENAME参数,会自动拼接网站根目录和 PHP 文件路径,使 PHP-FPM 能正确定位 Discuz 的 PHP 源码。
五、浏览器访问验证
完成以上所有配置后,打开浏览器访问服务器 IP 地址,即可进入 Discuz 论坛的安装引导页面:

8524



被折叠的 条评论
为什么被折叠?



