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/sda2NVMe 磁盘/dev/nvme0n1p2进入系统后重新生成配置文件grub2-mkconfig -o /boot/grub2/grub.cfg更简单的方法使用安装光盘进入救援模式chroot到真实根目录后执行上述命令。1.2 GRUB2 引导程序丢失传统 BIOS现象开机直接进入安装界面或网络启动无法加载 GRUB。原因硬盘前 446 字节MBR的引导程序被破坏。模拟故障仅供测试dd if/dev/zero of/dev/sda bs446 count1修复方法救援模式# 进入救援模式切换到真实根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# 查看启动日志类似 dmesgjournalctl -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 log2.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(loadimudp)input(typeimudp port514)module(loadimtcp)input(typeimtcp port514)重启服务并开放防火墙。客户端配置发送日志到服务器# 在 /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.confpool 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设置SELINUXdisabled等需重启生效。注意disabled模式下无法直接切换到其他模式必须重启。4.2 文件标签管理安全上下文每个文件和进程都有 SELinux 标签安全上下文。进程的标签必须与文件标签匹配才能访问。查看标签ps -efZ # 进程标签ll -Z /etc/passwd # 文件标签如 system_u:object_r:passwd_file_t:s0临时修改标签chconchcon -t httpd_sys_content_t /var/www/html/index.html# 恢复默认标签restorecon -v /var/www/html/index.html永久修改标签semanage fcontextsemanage fcontext -a -t httpd_sys_content_t /var/www/html(/.*)?restorecon -Rv /var/www/html修改永久生效即使重启也不会丢失。典型场景将/root/index.html移动到/var/www/html/其标签仍为admin_home_tApache 进程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 监听 82semanage 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 系列编写部分命令可能因发行版或版本不同略有差异请以实际环境为准。