Linux에서 디스크 상태 추측 그만: SMART + NVMe 검사와 systemd 타이머 알림

발행: (2026년 3월 7일 PM 02:01 GMT+9)
3 분 소요
원문: Dev.to

Source: Dev.to

Overview

백업이 완벽하고 서비스가 강화돼 있더라도 스토리지 상태가 조용히 악화되면 주말(그리고 때로는 데이터)까지도 잃을 수 있습니다.
이 가이드는 Linux에서 실용적이고 감사 가능한 디스크‑헬스 워크플로를 제공합니다:

  • ATA/SATA/SAS/NVMe 장치 스캔
  • smartctl 로 건강 검사 수행
  • nvme smart‑log 로 NVMe 텔레메트리 수집
  • 문제가 발생하면 systemd/journald 에 크게 알림
  • 영구 타이머로 검사 일정 설정

대시보드는 필요 없습니다—신뢰할 수 있는 신호만 있으면 됩니다.

Installation

# Debian/Ubuntu
sudo apt update
sudo apt install -y smartmontools nvme-cli jq

# Fedora/CentOS
sudo dnf install -y smartmontools nvme-cli jq
  • smartmontoolssmartctlsmartd 를 제공합니다.
  • nvme-clinvme 명령을 제공합니다.
  • jqnvme smart‑log 의 JSON 출력을 파싱하는 데 사용됩니다.

Enumerate Devices

sudo smartctl --scan-open

Typical output:

/dev/sda -d sat # /dev/sda, ATA device
/dev/nvme0 -d nvme # /dev/nvme0, NVMe device

스캔 결과에서 -d 타입을 유지하세요. 이는 일부 컨트롤러에서 모호한 탐지를 방지합니다.

Health‑Check Script

Save the following as /usr/local/sbin/check-disk-health.sh and make it executable.

#!/usr/bin/env bash
set -euo pipefail

LOG_TAG="disk-health-check"
RC=0

log() {
  systemd-cat -t "$LOG_TAG" echo "$*"
}

# Returns 0 when healthy enough, non‑zero when warning/failure bits are present.
check_smart() {
  local dev="$1"
  local dtype="$2"

  # -H overall health, -A attributes, -l error/selftest logs
  if smartctl -H -A -l error -l selftest -d "$dtype" "$dev" >/tmp/smart-${dev##*/}.log 2>&1; then
    log "OK SMART: $dev ($dtype)"
  else
    local c=$?
    log "WARN SMART: $dev ($dtype) exit=$c"
    log "DETAIL SMART: $(tail -n 5 /tmp/smart-${dev##*/}.log | tr '\n' ' ' | sed 's/  */ /g')"
    RC=1
  fi
}

check_nvme() {
  local dev="$1"

  if out=$(nvme smart-log "$dev" -o json 2>/dev/null); then
    cw=$(printf '%s' "$out" | jq -r '.critical_warning // 0')
    temp_k=$(printf '%s' "$out" | jq -r '.temperature // empty')
    used=$(printf '%s' "$out" | jq -r '.percentage_used // empty')

    if [[ "$cw" != "0" ]]; then
      log "WARN NVMe: $dev critical_warning=$cw percentage_used=${used:-n/a} temperature(K)=${temp_k:-n/a}"
      RC=1
    else
      log "OK NVMe: $dev percentage_used=${used:-n/a} temperature(K)=${temp_k:-n/a}"
    fi
  else
    log "WARN NVMe: failed to read smart-log for $dev"
    RC=1
  fi
}

main() {
  command -v smartctl >/dev/null || { echo "smartctl missing"; exit 2; }
  command -v nvme >/dev/null || { echo "nvme-cli missing"; exit 2; }
  command -v jq >/dev/null || { echo "jq missing (install jq)"; exit 2; }

  mapfile -t scanned
}
  • 스크립트는 disk-health-check 태그와 함께 systemd-journald 로 결과를 기록합니다.
  • 어떤 장치에서든 경고가 보고되면 비‑제로 상태 코드로 종료합니다.

References

  • systemd.timer(5)
  • nvme-smart-log(1)
  • Debian smartmontools 패키지 상세 정보
  • ArchWiki S.M.A.R.T. 운영 메모
0 조회
Back to Blog

관련 글

더 보기 »