#!/usr/bin/env bash
# ==============================================================================
# 脚本名称: check_fs_health.sh
# 功能描述: 文件系统读写状态检测与内核底层 I/O 错误自动化巡检 (纯只读)
# 使用方式: 在目标 Linux 宿主机以 root 权限执行
# ==============================================================================
set -o pipefail
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
PLAIN='\033[0m'
echo -e "${BLUE}================================================================${PLAIN}"
echo -e "${BLUE} 系统底层磁盘读写状态与 I/O 健康度安全巡检 ${PLAIN}"
echo -e "${BLUE}================================================================${PLAIN}"
# 1. 检查挂载点的 Read-only 状态
echo -e "\n${YELLOW}[1/3] 检查当前文件系统挂载读写状态...${PLAIN}"
# 修复了 awk 正则表达式中的管道符乱码
RO_MOUNTS=$(awk '$4 ~ /(^|,)ro(,|$)/ && $3 !~ /^(sysfs|proc|tmpfs|devtmpfs|squashfs|iso9660|overlay|pstore|efivarfs|cgroup.*|debugfs|tracefs|nsfs|fuse.*)$/ {print $1, $2, $3}' /proc/mounts)
if [ -n "$RO_MOUNTS" ]; then
echo -e " -> ${RED}[ALERT] 检测到处于只读 (Read-only) 状态的挂载点:${PLAIN}"
echo "$RO_MOUNTS" | while read -r dev mountpoint fstype; do
# 修复了输出字符串中的管道符乱码
echo -e " 设备: ${YELLOW}${dev}${PLAIN} | 挂载点: ${RED}${mountpoint}${PLAIN} | 格式: ${fstype}"
done
echo -e " -> ${YELLOW}[提示] 请立即结合下方 dmesg 检查结果定界是文件系统逻辑错误还是物理磁盘坏道。${PLAIN}"
else
echo -e " -> ${GREEN}[OK] 所有常规物理分区均处于正常读写 (rw) 状态。${PLAIN}"
fi
# 2. 从 dmesg 检索文件系统逻辑错误 (EXT4/XFS error)
echo -e "\n${YELLOW}[2/3] 检索内核日志中的文件系统逻辑错误...${PLAIN}"
FS_ERRORS=$(dmesg -T 2>/dev/null | grep -iE "EXT4-fs error|XFS internal error|XFS.*corruption|Remounting filesystem read-only" | tail -n 5)
if [ -n "$FS_ERRORS" ]; then
echo -e " -> ${RED}[WARN] 检测到文件系统逻辑报错或只读降级记录:${PLAIN}"
echo -e "${YELLOW}${FS_ERRORS}${PLAIN}"
echo -e " -> ${GREEN}[处置建议] 若下方无硬件 I/O 报错,请创建磁盘快照后卸载对应分区,使用 fsck 或 xfs_repair 修复。${PLAIN}"
else
echo -e " -> ${GREEN}[OK] 未发现明显的 EXT4/XFS 文件系统元数据错误记录。${PLAIN}"
fi
# 3. 从 dmesg 检索底层物理硬件故障 (I/O error)
echo -e "\n${YELLOW}[3/3] 检索底层物理磁盘 I/O 错误与坏道告警...${PLAIN}"
IO_ERRORS=$(dmesg -T 2>/dev/null | grep -iE "I/O error|medium error|hard error|Buffer I/O error|blk_update_request" | tail -n 5)
if [ -n "$IO_ERRORS" ]; then
echo -e " -> ${RED}[DANGER] 检测到硬件级别的磁盘 I/O 报错,极可能存在物理坏道或存储链路故障:${PLAIN}"
echo -e "${RED}${IO_ERRORS}${PLAIN}"
echo -e " -> ${YELLOW}[操作禁忌] 严禁对此磁盘执行 fsck 扫描!请立即使用 rsync 跨机备份可读数据并联系硬件运维换盘。${PLAIN}"
else
echo -e " -> ${GREEN}[OK] 未发现底层物理磁盘 I/O 报错记录。${PLAIN}"
fi
echo -e "\n${BLUE}================================================================${PLAIN}"
echo -e "${BLUE}巡检完毕。生产环境配置 /etc/fstab 时建议保留 errors=remount-ro 参数以防止脏数据扩散。${PLAIN}"
echo -e "${BLUE}================================================================${PLAIN}"