Initial commit

This commit is contained in:
Zhongwei Li
2025-11-29 18:24:37 +08:00
commit 8cd5c7679d
61 changed files with 6788 additions and 0 deletions

View File

@@ -0,0 +1,246 @@
#!/bin/bash
# 磁盘健康检查器 - 检查磁盘空间、inode使用和健康状态
set -e
DISK_PATH="${1:-/}"
THRESHOLD="${2:-80}"
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# 帮助信息
usage() {
echo "💾 磁盘健康检查器"
echo ""
echo "使用: $0 [路径] [阈值]"
echo ""
echo "参数:"
echo " 路径 要检查的磁盘路径 (默认: /)"
echo " 阈值 空间使用警报阈值百分比 (默认: 80%)"
echo ""
echo "示例:"
echo " $0 # 检查根目录阈值80%"
echo " $0 /home 85 # 检查/home目录阈值85%"
echo " $0 /var/log 90 # 检查日志目录阈值90%"
echo ""
}
# 检查参数
if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
usage
exit 0
fi
# 检查路径是否存在
if [ ! -d "$DISK_PATH" ]; then
echo "❌ 错误: 路径不存在: $DISK_PATH"
exit 1
fi
# 数字验证
if ! [[ "$THRESHOLD" =~ ^[0-9]+$ ]] || [ "$THRESHOLD" -lt 1 ] || [ "$THRESHOLD" -gt 100 ]; then
echo "❌ 错误: 阈值必须是1-100之间的数字"
exit 1
fi
echo "💾 磁盘健康检查器"
echo "=========================================="
echo "检查路径: ${BLUE}$DISK_PATH${NC}"
echo "警报阈值: ${THRESHOLD}%"
echo "=========================================="
echo ""
# 获取磁盘使用情况
DISK_INFO=$(df -h "$DISK_PATH" | tail -1)
DISK_DEVICE=$(echo "$DISK_INFO" | awk '{print $1}')
DISK_SIZE=$(echo "$DISK_INFO" | awk '{print $2}')
DISK_USED=$(echo "$DISK_INFO" | awk '{print $3}')
DISK_AVAIL=$(echo "$DISK_INFO" | awk '{print $4}')
DISK_USAGE_PERCENT=$(echo "$DISK_INFO" | awk '{print $5}' | sed 's/%//')
echo "📊 磁盘使用概况:"
echo "=========================================="
echo -e "设备: ${CYAN}$DISK_DEVICE${NC}"
echo -e "总容量: ${BLUE}$DISK_SIZE${NC}"
echo -e "已使用: ${YELLOW}$DISK_USED${NC}"
echo -e "可用: ${GREEN}$DISK_AVAIL${NC}"
# 使用百分比颜色标记
if [ "$DISK_USAGE_PERCENT" -gt 90 ]; then
USAGE_COLOR="$RED"
STATUS="🔴 严重"
elif [ "$DISK_USAGE_PERCENT" -gt "$THRESHOLD" ]; then
USAGE_COLOR="$YELLOW"
STATUS="🟡 警告"
else
USAGE_COLOR="$GREEN"
STATUS="🟢 正常"
fi
echo -e "使用率: ${USAGE_COLOR}${DISK_USAGE_PERCENT}%${NC} $STATUS"
echo ""
# inode检查
echo "=========================================="
echo "📂 Inode使用概况:"
echo "=========================================="
INODE_INFO=$(df -i "$DISK_PATH" | tail -1)
INODE_USED_PERCENT=$(echo "$INODE_INFO" | awk '{print $5}' | sed 's/%//')
INODE_TOTAL=$(echo "$INODE_INFO" | awk '{print $2}')
INODE_USED=$(echo "$INODE_INFO" | awk '{print $3}')
INODE_AVAIL=$(echo "$INODE_INFO" | awk '{print $4}')
echo -e "总数: ${BLUE}$INODE_TOTAL${NC}"
echo -e "已使用: ${YELLOW}$INODE_USED${NC}"
echo -e "可用: ${GREEN}$INODE_AVAIL${NC}"
# Inode百分比颜色
if [ "$INODE_USED_PERCENT" -gt 90 ]; then
INODE_COLOR="$RED"
INODE_STATUS="🔴 严重"
elif [ "$INODE_USED_PERCENT" -gt "$THRESHOLD" ]; then
INODE_COLOR="$YELLOW"
INODE_STATUS="🟡 警告"
else
INODE_COLOR="$GREEN"
INODE_STATUS="🟢 正常"
fi
echo -e "使用率: ${INODE_COLOR}${INODE_USED_PERCENT}%${NC} $INODE_STATUS"
echo ""
# 详细信息检测
echo "=========================================="
echo "🔍 详细信息:"
echo "=========================================="
# 文件系统类型
FS_TYPE=$(df -T "$DISK_PATH" | tail -1 | awk '{print $2}')
echo -e "文件系统类型: ${CYAN}$FS_TYPE${NC}"
# 挂载点
MOUNT_POINT=$(df "$DISK_PATH" | tail -1 | awk '{print $NF}')
echo -e "挂载点: ${BLUE}$MOUNT_POINT${NC}"
# 可读写性检测
if [ -w "$DISK_PATH" ]; then
RW_STATUS="${GREEN}可读写${NC}"
else
RW_STATUS="${RED}只读${NC}"
fi
echo -e "访问权限: $RW_STATUS"
echo ""
# 警报检查
echo "=========================================="
echo "🚨 警报检查:"
echo "=========================================="
ALERT_COUNT=0
if [ "$DISK_USAGE_PERCENT" -gt 90 ]; then
echo -e "⚠️ 磁盘使用率过高: ${RED}${DISK_USAGE_PERCENT}%${NC}"
((ALERT_COUNT++))
fi
if [ "$DISK_USAGE_PERCENT" -gt "$THRESHOLD" ]; then
echo -e "⚠️ 磁盘使用率超过阈值": "${DISK_USAGE_PERCENT}% > ${THRESHOLD}%"
fi
if [ "$INODE_USED_PERCENT" -gt 90 ]; then
echo -e "⚠️ Inode使用率过高: ${RED}${INODE_USED_PERCENT}%${NC}"
((ALERT_COUNT++))
fi
if [ "$INODE_USED_PERCENT" -gt "$THRESHOLD" ]; then
echo -e "⚠️ Inode使用率超过阈值": "${INODE_USED_PERCENT}% > ${THRESHOLD}%"
fi
if [ ! -w "$DISK_PATH" ]; then
echo -e "⚠️ ${YELLOW}磁盘为只读状态${NC}"
((ALERT_COUNT++))
fi
echo ""
echo "=========================================="
echo "📈 性能指标:"
echo "=========================================="
# 检查磁盘是被大量小文件填满还是少数大文件
echo "按大小排序的顶级目录:"
du -h "$DISK_PATH" 2>/dev/null | sort -hr | head -5 | while read -r size path; do
echo -e " ${YELLOW}$size${NC}\t$path"
done
echo ""
echo "按数量排序的顶级目录:"
find "$DISK_PATH" -maxdepth 2 -type d 2>/dev/null | head -10 | while read -r dir; do
count=$(find "$dir" -maxdepth 1 -type f 2>/dev/null | wc -l)
if [ "$count" -gt 100 ]; then
echo -e " ${YELLOW}$count${NC}个文件\t$dir"
fi
done
echo ""
echo "=========================================="
echo "💡 建议:"
echo "=========================================="
if [ "$ALERT_COUNT" -gt 0 ]; then
echo "🚨 发现 $ALERT_COUNT 个问题需要处理:"
echo ""
if [ "$DISK_USAGE_PERCENT" -gt 90 ]; then
echo " 磁盘使用率超过90%:"
echo " - 建议立即清理日志文件(/var/log"
echo " - 检查临时文件(/tmp"
echo " - 考虑扩容或迁移数据"
echo ""
fi
if [ "$INODE_USED_PERCENT" -gt 90 ]; then
echo " Inode使用率高:"
echo " - 通常由大量小文件导致"
echo " - 检查并清理临时文件"
echo " - 查找并删除空文件"
echo " - 可能是邮件队列或缓存文件过多"
echo ""
fi
if [ ! -w "$DISK_PATH" ]; then
echo " 磁盘只读:"
echo " - 检查文件系统错误fsck"
echo " - 可能是磁盘故障或挂载问题"
echo " - 需要root权限检查和修复"
echo ""
fi
else
echo "✅ 磁盘健康状况良好"
echo ""
if [ "$DISK_USAGE_PERCENT" -lt 70 ]; then
echo " - 使用率充足,暂无扩容需求"
fi
if [ "$INODE_USED_PERCENT" -lt 70 ]; then
echo " - Inode充足无小文件问题"
fi
echo ""
echo " 💡 建议定期运行此工具监控磁盘状态"
fi
echo ""
echo "=========================================="
echo "磁盘检查完成"
echo "=========================================="
exit 0