Linux系统故障修复、日志管理与安全加固实战指南
前言
一、系统启动故障修复:从 GRUB 到根文件系统
1.1 GRUB 引导配置文件丢失(grub.cfg)
现象:开机后直接进入grub>命令行,看不到内核选择菜单。
原因:/boot/grub2/grub.cfg文件丢失或损坏,GRUB2 无法加载引导配置。
手动引导修复:
# 1. 列出所有磁盘分区grub> ls(hd0) (hd0,msdos1) (hd0,msdos2) (hd0,msdos3)# 2. 找到 boot 分区(通常是第一个分区)grub> set root=(hd0,msdos1)# 3. 指定内核和 initramfs 路径grub> linux /vmlinuz-5.14.0-362.el9.x86_64 root=/dev/mapper/rhel-rootgrub> initrd /initramfs-5.14.0-362.el9.x86_64.img# 4. 启动grub> boot根文件系统路径说明:
- 逻辑卷:
/dev/mapper/卷组名-root(如 RHEL 为/dev/mapper/rhel-root)- 普通分区(SCSI):
/dev/sda2- NVMe 磁盘:
/dev/nvme0n1p2
进入系统后重新生成配置文件:
grub2-mkconfig -o /boot/grub2/grub.cfg更简单的方法:使用安装光盘进入救援模式,chroot到真实根目录后执行上述命令。
1.2 GRUB2 引导程序丢失(传统 BIOS)
现象:开机直接进入安装界面或网络启动,无法加载 GRUB。
原因:硬盘前 446 字节(MBR)的引导程序被破坏。
模拟故障(仅供测试):
dd if=/dev/zero of=/dev/sda bs=446 count=1修复方法(救援模式):
# 进入救援模式,切换到真实根chroot /mnt/sysimage# 重新安装 GRUBgrub2-install /dev/sdaUEFI 环境:引导程序位于
/boot/efi/,修复方式为重新安装efi-filesystem和shim-x64两个 RPM 包,或从其他机器拷贝文件。
1.3 内核文件或 initramfs 丢失
现象:开机提示找不到vmlinuz或initramfs。
修复方法:进入救援模式,重新安装内核相关的 RPM 包:
# 查看已安装的内核版本rpm -qa | grep kernel# 重新安装内核(以 kernel-core 为例)dnf reinstall kernel-core1.4 boot 分区文件全部丢失
现象:开机后 GRUB 提示file '/boot/grub2/i386-pc/normal.mod' not found。
修复方法:救援模式下重新安装 GRUB 并生成配置文件:
chroot /mnt/sysimagegrub2-install /dev/sdagrub2-mkconfig -o /boot/grub2/grub.cfg1.5 fstab 文件导致紧急模式
现象:开机进入emergency mode,提示挂载文件系统超时。
原因:/etc/fstab中配置了无法挂载的分区或错误的 UUID。
修复步骤:
- 输入 root 密码进入 shell。
- 执行
mount -a检查具体哪个挂载点出错。 - 编辑
/etc/fstab,注释或修正错误的行。 - 重启系统。
1.6 GRUB2 加固(防止密码重置)
为防止他人通过编辑内核菜单重置 root 密码,可以对 GRUB2 进行密码保护。
设置 GRUB2 密码:
grub2-setpassword# 输入两次密码,生成 /boot/grub2/user.cfg取消保护:
rm -f /boot/grub2/user.cfg手动生成加密密码(可选):
grub2-mkpasswd-pbkdf2# 将生成的内容替换到 /boot/grub2/grub.cfg 中二、日志管理:从临时到持久,从本地到集中
2.1 systemd-journald:临时日志的“第一现场”
systemd-journald是系统启动后的第一个日志服务,日志默认保存在/run/log/journal/(内存中),重启即丢失。
常用 journalctl 命令:
# 查看所有日志journalctl# 实时跟踪journalctl -f# 查看指定服务日志journalctl -u sshd.service# 查看指定时间段的日志journalctl --since "2026-07-12 10:00:00" --until "2026-07-12 10:10:00"# 查看启动日志(类似 dmesg)journalctl -k# 查看详细信息(含错误码)journalctl -xe持久化存储配置:
# 创建目录mkdir /var/log/journal# 重新加载 journaldsystemctl restart systemd-journald# 或强制执行刷新journalctl --flush持久化后,日志将保存在/var/log/journal,重启不丢失。
2.2 rsyslog:分类存储的“档案室”
rsyslog负责将日志按类型写入不同文件,默认存储于/var/log/,属于持久化存储。
常见日志文件:
| 文件 | 内容 |
|---|---|
/var/log/messages | 通用系统日志(最常用) |
/var/log/secure | 认证和安全日志(如 SSH 登录) |
/var/log/cron | 计划任务日志 |
/var/log/boot.log | 开机启动日志 |
/var/log/dnf.log | 软件包管理日志 |
/var/log/httpd/ | Apache 访问和错误日志 |
配置文件:/etc/rsyslog.conf定义了日志分类规则,例如:
*.info;mail.none;authpriv.none;cron.none /var/log/messagesauthpriv.* /var/log/secure手动发送测试日志:
logger -t mytest -i -p user.info "This is a test log"2.3 logrotate:自动轮转,防止日志撑爆磁盘
logrotate定期切割、压缩、删除旧日志,默认每天轮转,保留 7 个副本。
全局配置:/etc/logrotate.conf
自定义配置目录:/etc/logrotate.d/
示例:自定义日志轮转策略:
cat /etc/logrotate.d/myapp/var/log/myapp/*.log { daily rotate 7 missingok notifempty copytruncate}手动触发轮转:
logrotate -f /etc/logrotate.conf2.4 集中日志服务器:统一收集,方便审计
服务端配置(/etc/rsyslog.conf打开 UDP/TCP 接收):
module(load="imudp")input(type="imudp" port="514")module(load="imtcp")input(type="imtcp" port="514")重启服务并开放防火墙。
客户端配置(发送日志到服务器):
# 在 /etc/rsyslog.conf 末尾添加*.info @192.168.200.128 # UDP# 或使用 @@ 表示 TCP三、时间同步服务:chronyd 的前世今生
时间同步是集群环境的基石(Ceph、OpenStack、K8S 均要求时间一致)。RHEL 8 起,ntpd被chronyd取代。
查看时间状态:
timedatectl手动设置时间(需先关闭 NTP 服务):
timedatectl set-ntp 0timedatectl set-time "2026-07-12 15:00:00"修改时区:
timedatectl list-timezonestimedatectl set-timezone Asia/Shanghai配置 chrony 客户端(/etc/chrony.conf):
pool ntp.aliyun.com iburst # 指定时间源查看同步状态:
chronyc sources^*表示当前已同步的时间源^?表示无法连接
部署内部时间服务器:
在服务端的/etc/chrony.conf中添加:
allow 192.168.0.0/16 # 允许的网段local stratum 10 # 即使未同步也作为时间源重启chronyd服务即可。
四、SELinux:安全加固的“卫士”与“拦路虎”
SELinux 是内核级安全模块,通过文件标签、端口标签和布尔值三项机制控制进程行为。
4.1 三种工作模式
| 模式 | 行为 |
|---|---|
enforcing | 强制执行策略,拒绝违规操作并记录日志 |
permissive | 只告警不拦截,用于调试 |
disabled | 完全关闭,不加载策略 |
查看当前模式:
getenforce临时切换(需在 enforcing 或 permissive 之间):
setenforce 0 # 切换为 permissivesetenforce 1 # 切换为 enforcing永久修改:编辑/etc/selinux/config,设置SELINUX=disabled等,需重启生效。
注意:
disabled模式下无法直接切换到其他模式,必须重启。
4.2 文件标签管理(安全上下文)
每个文件和进程都有 SELinux 标签(安全上下文)。进程的标签必须与文件标签匹配才能访问。
查看标签:
ps -efZ # 进程标签ll -Z /etc/passwd # 文件标签(如 system_u:object_r:passwd_file_t:s0)临时修改标签(chcon):
chcon -t httpd_sys_content_t /var/www/html/index.html# 恢复默认标签restorecon -v /var/www/html/index.html永久修改标签(semanage fcontext):
semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?"restorecon -Rv /var/www/html修改永久生效,即使重启也不会丢失。
典型场景:将
/root/index.html移动到/var/www/html/,其标签仍为admin_home_t,Apache 进程(httpd_t)无法读取,需修改标签为httpd_sys_content_t。
4.3 端口标签管理
服务监听端口也必须拥有正确的端口标签,否则 SELinux 会拒绝绑定。
查看端口标签:
semanage port -l | grep httphttp_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000为自定义端口添加标签(例如 Apache 监听 82):
semanage port -a -t http_port_t -p tcp 82故障排查:如果 Apache 修改了端口后启动失败,查看日志会提示Permission denied: make_sock: could not bind to address,此时应为新端口添加标签。
4.4 布尔值管理:控制程序行为
布尔值用于允许或禁止某个进程访问其他资源(如 NFS、FTP 等)。
查看与 HTTP 相关的布尔值:
semanage boolean -l | grep http开启 Apache 访问 NFS 共享:
setsebool -P httpd_use_nfs on-P表示永久生效,不加则临时生效。
常用布尔值:
httpd_can_network_connect:允许 Apache 向外发起网络连接httpd_enable_homedirs:允许访问用户家目录ftp_home_dir:允许 FTP 访问家目录
4.5 查看 SELinux 日志
SELinux 日志默认记录在审计日志/var/log/audit/audit.log中,但不易读。借助setroubleshoot服务,可将其转换为易读格式并输出到/var/log/messages。
查看 SELinux 相关日志:
grep -i selinux /var/log/messages使用 sealert 获取详细解决建议:
sealert -l <UUID>常用诊断命令:
# 查看所有违反策略的事件ausearch -m avc# 或者使用 journalctljournalctl -t setroubleshoot结语
系统故障不可怕,可怕的是不知道从哪里入手。掌握 GRUB 引导修复、日志分析方法、时间同步配置以及 SELinux 策略调优,你就拥有了排查绝大多数系统级问题的“工具箱”。
在实际运维中,建议按以下顺序排错:
- 查看日志(先
journalctl -xe,再tail -f /var/log/messages) - 检查 SELinux 是否拦截(查看
audit.log或messages) - 检查时间同步是否正常(集群环境尤其重要)
- 最后才考虑启动层面的故障
希望这篇指南能成为你日常运维的得力助手。如果你遇到文中未覆盖的问题,欢迎留言讨论!
📌本文基于 RHEL9 系列编写,部分命令可能因发行版或版本不同略有差异,请以实际环境为准。