본문 바로가기
카테고리 없음

리눅스 서버 디스크 상태(SMART) 자동 점검 가이드

by 고지존 2025. 9. 2.

서버를 안정적으로 운영하기 위해 디스크의 상태를 주기적으로 점검하는 것은 매우 중요합니다. 최신 HDD와 SSD에 내장된 SMART(자가 진단, 분석 및 보고 기술) 기능을 활용하면, 디스크 장애가 발생하기 전에 잠재적인 문제를 미리 파악하고 소중한 데이터의 손실을 예방할 수 있습니다.

이 가이드에서는 리눅스 서버의 디스크 상태를 자동으로 점검하고, 문제가 감지되면 이메일로 알림을 받는 방법을 소개합니다.

1. 사전 준비: 필수 패키지 설치

스크립트를 사용하기 전에 `smartmontools`와 `mailx`가 시스템에 설치되어 있어야 합니다.

  • smartmontools: 디스크의 SMART 정보를 읽어오는 핵심 도구입니다.
  • mailx (또는 mailutils): 경고 알림을 이메일로 발송하는 데 사용됩니다.

Debian/Ubuntu 기반 설치 명령어:

sudo apt-get update
sudo apt-get install -y smartmontools mailutils

Red Hat/CentOS 기반 설치 명령어:

sudo yum install -y smartmontools mailx

2. 자동 점검 스크립트의 주요 기능

아래에서 소개할 스크립트는 지정된 모든 디스크를 순회하며 다음과 같은 주요 SMART 속성을 점검합니다.

  • 종합 건강 상태 (Overall Health): 디스크의 전반적인 상태가 'PASSED'인지 확인합니다.
  • 불량 섹터 (Reallocated Sector Count): 영구적인 손상으로 인해 예비 공간으로 대체된 섹터(불량 섹터)의 수를 확인합니다.
  • 보류 중인 섹터 (Current Pending Sector): 읽기/쓰기 오류가 발생하여 재할당을 기다리는 불안정한 섹터 수를 확인합니다.
  • 수정 불가능한 섹터 (Offline Uncorrectable): 디스크가 수정을 포기한 섹터 수를 확인합니다.
  • 디스크 사용 시간 (Power-On Hours): 디스크의 총 누적 작동 시간을 확인합니다.
  • 통신 오류 (UDMA CRC Error Count): 디스크와 컨트롤러 간 데이터 전송 오류 횟수를 확인합니다. (주로 케이블 불량 의심)
  • 런타임 불량 블록 (Runtime Bad Block): 작동 중에 발견된 불량 블록 수를 확인합니다.
  • 디스크 온도 (Temperature): 디스크의 현재 온도를 확인합니다.

각 항목이 설정된 임계값을 초과하면, 스크립트는 경고 메시지를 생성하여 지정된 이메일 주소로 발송합니다.

3. 사용 방법

1단계: 스크립트 파일 생성

아래의 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

실행 결과값

2단계: 실행 권한 부여 및 테스트

스크립트에 실행 권한을 부여하고, 직접 실행하여 정상적으로 작동하는지 테스트합니다.

chmod +x disk_health_check.sh
./disk_health_check.sh

4. 자동 실행 설정 (Cron)

매일 특정 시간에 스크립트가 자동으로 실행되도록 crontab에 등록하여 모니터링을 자동화할 수 있습니다.

  1. crontab -e 명령어를 실행하여 Crontab 편집기를 엽니다.
  2. 아래 내용을 파일 하단에 추가하고 저장합니다.
# 매일 오전 6시에 디스크 상태를 점검하고 결과를 이메일로 전송
0 6 * * * /path/to/disk_health_check.sh

주의: /path/to/ 부분은 스크립트가 저장된 실제 전체 경로로 반드시 수정해야 합니다. (예: /root/scripts/disk_health_check.sh)

결론

이 자동화 스크립트를 통해 서버 관리자는 디스크의 잠재적인 문제를 조기에 발견하고 신속하게 대응할 수 있습니다. 불량 섹터, 과열, 통신 오류 등의 징후를 미리 파악하여 서버의 안정성과 데이터 무결성을 크게 향상시키세요.