Linux에서 디스크 상태 추측 그만: SMART + NVMe 검사와 systemd 타이머 알림
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
smartmontools은smartctl과smartd를 제공합니다.nvme-cli은nvme명령을 제공합니다.jq는nvme 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. 운영 메모