31. 附录与维护建议
本章作为全套教程的运维手册附录,提供系统配置记录规范、备份与恢复流程、日常维护检查清单,以及快照管理策略。这些内容应作为持续性运维工作的标准操作程序(SOP),定期执行,是系统长期稳定运行的制度保障。
31.1 前提条件
- 通过 SecureCRT(SSH 端口 2222)以
ops用户、密钥认证方式登录192.168.1.100,执行sudo -i切换至 root 环境。 - 备份目录
/backup已存在并有足够磁盘空间(第 17 章)。
31.2 系统配置记录
定期记录系统关键配置,便于故障后快速重建和精准追踪变更。
mkdir -p /root/config-records
CONFIG_DIR="/root/config-records"
DATE=$(date +%F)
# 已启用服务列表
systemctl list-units --type=service --state=enabled \
> "${CONFIG_DIR}/services-enabled-${DATE}.txt"
# 防火墙规则(所有 zone)
firewall-cmd --list-all-zones \
> "${CONFIG_DIR}/firewall-${DATE}.txt"
# SELinux 状态与所有本地自定义策略
{
sestatus
echo ""
echo "--- 自定义端口上下文 ---"
semanage port -l -C
echo ""
echo "--- 自定义文件上下文 ---"
semanage fcontext -l -C
echo ""
echo "--- 已开启的布尔值 ---"
getsebool -a | grep " on$"
} > "${CONFIG_DIR}/selinux-${DATE}.txt"
# 已安装软件包
dnf list installed > "${CONFIG_DIR}/packages-${DATE}.txt"
# 网络配置
{
nmcli connection show
echo ""
ip addr show
echo ""
ip route show
} > "${CONFIG_DIR}/network-${DATE}.txt"
# 磁盘与挂载信息
{
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT
echo ""
echo "--- /etc/fstab ---"
cat /etc/fstab
} > "${CONFIG_DIR}/disk-layout-${DATE}.txt"
# LVM 详情
{
pvs
echo ""
vgs
echo ""
lvs
} > "${CONFIG_DIR}/lvm-${DATE}.txt"
echo "配置记录已保存至 ${CONFIG_DIR}/"
ls -lh "${CONFIG_DIR}/"
将配置记录纳入 Git 版本控制
将 /root/config-records/ 目录推送到私有 Git 仓库,可精确追踪每次配置变更、对比差异(git diff),实现配置变更的版本化审计:
cd /root/config-records
git init
git add .
git commit -m "config: snapshot $(date +%F)"
git remote add origin git@github.com:<org>/linuxdc-configs.git
git push -u origin main
31.3 备份与恢复流程
31.3.1 创建完整系统快照备份
tar -czpf /backup/system-full-$(date +%F).tar.gz \
--exclude=/backup \
--exclude=/proc \
--exclude=/sys \
--exclude=/dev \
--exclude=/run \
--exclude=/tmp \
/etc /home /root /var/log /root/config-records
# 验证备份文件完整性(退出码 0 = 正常)
tar -tzvf /backup/system-full-$(date +%F).tar.gz > /dev/null
echo "备份完整性验证:退出码 $?"
ls -lh /backup/system-full-$(date +%F).tar.gz
31.3.2 恢复关键配置文件
BACKUP_FILE="/backup/system-full-$(date +%F).tar.gz"
# 先备份当前版本(恢复前的安全保障)
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.before-restore
# 从备份中提取指定文件(路径不含前导 /)
mkdir -p /tmp/restore
tar -xzvf "${BACKUP_FILE}" \
-C /tmp/restore \
etc/ssh/sshd_config
# 恢复文件
cp /tmp/restore/etc/ssh/sshd_config /etc/ssh/sshd_config
# 修复 SELinux 上下文
restorecon -v /etc/ssh/sshd_config
# 验证语法并重载服务
sshd -t && systemctl reload sshd
# 清理临时目录
rm -rf /tmp/restore
31.3.3 生成系统诊断报告(sosreport)
dnf install -y sos
sos report \
--tmp-dir /tmp \
--batch \
--label "linuxdc-$(date +%F)"
# 通过 SecureFX 将报告下载到本地
ls -lh /tmp/sosreport-*.tar.xz
31.4 日常维护检查清单
31.4.1 每日快速巡检(约 5 分钟)
tee /usr/local/bin/daily-check.sh << 'EOF'
#!/usr/bin/env bash
set -euo pipefail
echo "=== $(date '+%F %T') 每日巡检 - linuxdc (192.168.1.100) ==="
# 磁盘空间(超过 80% 告警)
echo ""
echo "--- 磁盘空间 ---"
df -hT | grep -v tmpfs | awk 'NR>1 {
gsub(/%/, "", $6)
if ($6 + 0 >= 80)
printf "⚠ 警告: %-30s 使用率 %s%%\n", $7, $6
else
printf "✓ 正常: %-30s 使用率 %s%%\n", $7, $6
}'
# 系统负载
echo ""
echo "--- 系统负载 ---"
uptime
# 关键服务状态
echo ""
echo "--- 关键服务 ---"
for svc in sshd chronyd firewalld auditd; do
status=$(systemctl is-active "$svc" 2>/dev/null)
if [[ "${status}" == "active" ]]; then
echo "✓ ${svc}: 运行中"
else
echo "⚠ ${svc}: ${status}(需检查)"
fi
done
# 最近 1 小时内的错误日志(仅显示前 5 条)
echo ""
echo "--- 近 1 小时错误日志 ---"
journalctl -p err --since "1 hour ago" --no-pager | tail -5
echo ""
echo "=== 巡检完成 ==="
EOF
chmod +x /usr/local/bin/daily-check.sh
/usr/local/bin/daily-check.sh
31.4.2 每周检查
# 可用安全更新数量
dnf updateinfo summary --security
# 磁盘健康状态(物理机)
smartctl -H /dev/sda 2>/dev/null || echo "SMART 不可用(虚拟机环境属正常)"
# 失败的 systemd 单元
systemctl list-units --state=failed
# Journal 日志磁盘占用
journalctl --disk-usage
# 检查可登录账户(确认无意外账户)
grep -v '/sbin/nologin\|/bin/false' /etc/passwd | \
awk -F: '$3 >= 1000 {print $1, $3, $7}'
31.4.3 每月维护
# 安装安全补丁
dnf update --security -y
# 清理旧内核(保留最新两个,含当前运行内核)
dnf remove --oldinstallonly --setopt installonly_limit=2 kernel -y
# 清理 journal 日志(保留最近 30 天)
journalctl --vacuum-time=30d
# 清理 dnf 元数据缓存
dnf clean all
# 备份完整性抽样验证(随机取最近一个备份文件)
BACKUP=$(ls -t /backup/system-full-*.tar.gz 2>/dev/null | head -1)
if [[ -n "${BACKUP}" ]]; then
tar -tzvf "${BACKUP}" > /dev/null && \
echo "✓ 备份验证通过: ${BACKUP}" || \
echo "✗ 备份文件损坏: ${BACKUP}"
else
echo "警告: 未找到备份文件,请检查备份任务是否正常执行"
fi
# 更新系统配置记录
# 重新执行 31.2 节的配置记录脚本
31.5 VMware 快照管理规范
| 快照命名格式 | 使用时机 | 保留策略 |
|---|---|---|
RHEL9-Base-YYYYMMDD |
系统初始安装完成后 | 永久保留 |
RHEL9-Before-<操作名>-YYYYMMDD |
重大变更前(升级、配置变更) | 变更验证通过后可删除 |
RHEL9-<阶段名>-YYYYMMDD |
每个教程阶段完成后 | 进入下一阶段后可考虑删除 |
RHEL9-SSH-Secured-YYYYMMDD |
SSH 安全配置完成后 | 建议长期保留作参考锚点 |
快照管理原则:
- 保留过多快照会消耗大量磁盘空间并降低虚拟机 I/O 性能
- 每项重大变更前创建快照,变更验证成功后及时清理
- 快照不能替代备份——快照与虚拟机存储在同一磁盘,磁盘故障时同时丢失
31.6 自测问题
Q1:如何快速确认某次变更是否影响了系统稳定性?
结合三个维度判断:① diff 对比变更前后的配置记录文件(diff config-before.txt config-after.txt);② 查看变更后的错误日志(journalctl -p err -b);③ 执行每日巡检脚本确认关键服务状态。若有 VMware 快照,可直接对比两个时间点的快照状态。
Q2:sos report 生成的报告包含哪些内容,何时使用?
sosreport 收集全面的系统诊断信息:已安装软件包列表、运行中的服务状态、完整系统日志、网络配置详情、内核参数、硬件信息、SELinux 策略等。主要使用场景:向 Red Hat 技术支持提交服务请求时作为附件(Red Hat 要求);离线环境中将诊断信息转移给有经验的工程师分析;系统故障后留存诊断快照以便事后根因分析。
Q3:为什么备份验证(恢复测试)比创建备份本身更重要?
备份的唯一价值在于能够成功恢复数据。未经验证的备份可能因以下原因在真正需要时失败:磁盘坏道导致文件损坏、归档格式不兼容(跨版本恢复)、权限或 SELinux 上下文丢失、备份路径错误导致关键文件未包含。定期执行恢复测试(哪怕只是 tar -tzvf backup.tar.gz > /dev/null 验证完整性)才能确保备份策略真正有效。"未经测试的备份等于没有备份"是运维领域的基本准则。
31.7 章节总结
本章作为全套教程的运维手册附录,提供了系统配置记录(版本化 Git 管理)、备份与恢复(含完整性验证流程)、每日/每周/每月三级检查清单,以及 VMware 快照命名规范和管理原则。建议将每日巡检脚本配置为 systemd timer 自动执行,将配置记录纳入私有 Git 仓库进行版本化审计,将月度维护任务写入团队运维日历,形成制度化的持续运维体系。