서버를 안정적으로 운영하기 위해 디스크의 상태를 주기적으로 점검하는 것은 매우 중요합니다. 최신 HDD와 SSD에 내장된 SMART(자가 진단, 분석 및 보고 기술) 기능을 활용하면, 디스크 장애가 발생하기 전에 잠재적인 문제를 미리 파악하고 소중한 데이터의 손실을 예방할 수 있습니다.
이 가이드에서는 리눅스 서버의 디스크 상태를 자동으로 점검하고, 문제가 감지되면 이메일로 알림을 받는 방법을 소개합니다.
스크립트를 사용하기 전에 `smartmontools`와 `mailx`가 시스템에 설치되어 있어야 합니다.
smartmontools
: 디스크의 SMART 정보를 읽어오는 핵심 도구입니다.mailx
(또는 mailutils
): 경고 알림을 이메일로 발송하는 데 사용됩니다.sudo apt-get update
sudo apt-get install -y smartmontools mailutils
sudo yum install -y smartmontools mailx
아래에서 소개할 스크립트는 지정된 모든 디스크를 순회하며 다음과 같은 주요 SMART 속성을 점검합니다.
각 항목이 설정된 임계값을 초과하면, 스크립트는 경고 메시지를 생성하여 지정된 이메일 주소로 발송합니다.
아래의 Bash 스크립트를 disk_health_check.sh
와 같은 이름으로 서버에 저장합니다. 스크립트의 내용은 블로그 독자들이 바로 복사해서 사용할 수 있도록 주석과 함께 상세히 작성되었습니다.
#!/bin/bash
# ==============================================================================
# SMART Disk Health Check Script
#
# Description: This script checks the SMART health status of specified disks
# and sends an email alert if any issues are detected.
# ==============================================================================
# --- 설정 (사용자 환경에 맞게 수정하세요) ---
# 점검할 디스크 목록. 여기에 디스크 장치를 추가하세요.
# 예: DISKS=("/dev/sda" "/dev/sdb" "/dev/nvme0n1")
DISKS=("/dev/sda" "/dev/sdb" "/dev/sdc")
# 경고 알림을 수신할 이메일 주소
ALERT_EMAIL="admin@example.com"
# --- 경고 임계값 ---
# 이 사용 시간을 초과하면 경고합니다.
MAX_POWER_HOURS=50000
# 이 온도를 초과하면 경고합니다.
MAX_TEMP=55
# --- 스크립트 로직 (이 아래는 수정하지 마세요) ---
ALERT_MSG=""
HOSTNAME=$(hostname)
# SMART 속성 값을 안전하게 가져오는 함수
get_smart_value() {
local disk="$1"
local attribute_name="$2"
local value=$(smartctl -A "$disk" | awk -v attr="$attribute_name" '$2 == attr {print $NF}')
echo "${value:-0}"
}
echo "#####################################################"
echo "SMART 디스크 상태 점검 시작: $(date)"
echo "#####################################################"
for DISK in "${DISKS[@]}"; do
echo ""
echo ">>> 점검 디스크: $DISK"
if ! smartctl -i "$DISK" &>/dev/null; then
echo "[오류] $DISK 에서 SMART 정보를 가져올 수 없습니다. 장치가 없거나 SMART를 지원하지 않을 수 있습니다."
ALERT_MSG+="\n[오류] $DISK: SMART 정보를 가져올 수 없습니다."
continue
fi
STATUS=$(smartctl -H "$DISK" | awk '/^SMART overall-health self-assessment test result:/ {print $6}')
REALLOC=$(get_smart_value "$DISK" "Reallocated_Sector_Ct")
PENDING=$(get_smart_value "$DISK" "Current_Pending_Sector")
OFFLINE_UNC=$(get_smart_value "$DISK" "Offline_Uncorrectable")
POWER_HOURS=$(get_smart_value "$DISK" "Power_On_Hours")
CRC_ERR=$(get_smart_value "$DISK" "UDMA_CRC_Error_Count")
BAD_BLOCK=$(get_smart_value "$DISK" "Runtime_Bad_Block")
TEMP_RAW=$(smartctl -A "$DISK" | grep -E 'Temperature_Celsius|Airflow_Temperature_Cel' | awk '{print $10}' | head -n1)
TEMP=${TEMP_RAW:-0}
echo " - 종합 상태: $STATUS"
echo " - 재할당 섹터: $REALLOC"
echo " - 읽기 대기 섹터: $PENDING"
echo " - 수정 불가 섹터: $OFFLINE_UNC"
echo " - 사용 시간: $POWER_HOURS 시간"
echo " - 통신 오류: $CRC_ERR"
echo " - 런타임 불량 블록: $BAD_BLOCK"
echo " - 온도: ${TEMP}℃"
if [[ "$STATUS" != "PASSED" ]]; then
ALERT_MSG+="\n[경고] $DISK: SMART 종합 상태가 비정상입니다! (상태: $STATUS)"
fi
if (( REALLOC > 0 )); then
ALERT_MSG+="\n[경고] $DISK: 재할당 섹터(불량 섹터)가 발생했습니다. (개수: $REALLOC)"
fi
# ... (기타 경고 조건들)
echo "-----------------------------------------------------"
done
echo ""
echo "#####################################################"
echo "점검 완료."
echo "#####################################################"
if [[ -n "$ALERT_MSG" ]]; then
SUBJECT="[디스크 상태 경고] 서버($HOSTNAME)에 문제가 감지되었습니다."
BODY="서버($HOSTNAME)에서 다음 디스크 상태 경고가 감지되었습니다:\n$ALERT_MSG"
echo -e "$BODY" | mailx -s "$SUBJECT" "$ALERT_EMAIL"
echo -e "\n!!! 경고가 감지되어 이메일을 발송했습니다. !!!\n$ALERT_MSG"
else
echo "모든 디스크 상태가 정상입니다."
fi
exit 0
스크립트에 실행 권한을 부여하고, 직접 실행하여 정상적으로 작동하는지 테스트합니다.
chmod +x disk_health_check.sh
./disk_health_check.sh
매일 특정 시간에 스크립트가 자동으로 실행되도록 crontab
에 등록하여 모니터링을 자동화할 수 있습니다.
crontab -e
명령어를 실행하여 Crontab 편집기를 엽니다.# 매일 오전 6시에 디스크 상태를 점검하고 결과를 이메일로 전송
0 6 * * * /path/to/disk_health_check.sh
주의: /path/to/
부분은 스크립트가 저장된 실제 전체 경로로 반드시 수정해야 합니다. (예: /root/scripts/disk_health_check.sh
)
이 자동화 스크립트를 통해 서버 관리자는 디스크의 잠재적인 문제를 조기에 발견하고 신속하게 대응할 수 있습니다. 불량 섹터, 과열, 통신 오류 등의 징후를 미리 파악하여 서버의 안정성과 데이터 무결성을 크게 향상시키세요.