Giám sát sức khỏe ổ cứng với smartctl và smartd trên Linux: Cảnh báo sớm nguy cơ hỏng đĩa

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Mình từng mất một ổ cứng 4TB trên production server mà không có bất kỳ cảnh báo nào — đơn giản vì hồi đó chưa cài smartd. Buổi sáng vào kiểm tra, RAID5 báo degraded, kéo log ra thì thấy ổ đó đã tích lũy hàng trăm Reallocated Sectors từ mấy tuần trước. S.M.A.R.T đã biết, nhưng không ai hỏi nó cả.

Từ đó mình bắt đầu tìm hiểu nghiêm túc về smartctl và smartd. Sáu tháng chạy thực tế trên chục server — từ Dell PowerEdge ở data center đến VPS Vultr có ổ NVMe — đây là những gì đáng biết nhất.

Ba cách giám sát ổ cứng — không phải cách nào cũng phù hợp

Ba hướng đi, mỗi cái phù hợp một hoàn cảnh khác nhau — chọn sai là tốn công không cần. So sánh nhanh:

Cách 1: Chạy smartctl thủ công

Đây là cách đơn giản nhất — chạy lệnh khi nào cần thì chạy. Phù hợp để kiểm tra nhanh một lần, hoặc khi bạn đang debug một ổ đĩa đáng ngờ.

# Xem thông tin tổng quan
sudo smartctl -a /dev/sda

# Chạy self-test ngắn (~2 phút)
sudo smartctl -t short /dev/sda

# Xem kết quả self-test
sudo smartctl -l selftest /dev/sda

Điểm mạnh: không cần cấu hình gì, kết quả ngay lập tức.
Điểm yếu: bạn phải chủ động kiểm tra — mà sysadmin thì hiếm khi nhớ làm điều đó trước khi có sự cố xảy ra.

Cách 2: smartd daemon — cảnh báo tự động

smartd chạy nền, tự động poll tất cả ổ cứng theo lịch, và gửi email/syslog khi phát hiện bất thường. Thứ này mình deploy lên tất cả server vật lý.

Điểm mạnh: set-and-forget, không cần nhớ kiểm tra, cảnh báo sớm trước khi hỏng hẳn.
Điểm yếu: cần mail server hoạt động được trên server, hơi overkill cho VPS hoặc container.

Cách 3: Exporter + Prometheus/Grafana

Dùng smartctl_exporter để expose metrics, Prometheus scrape, Grafana vẽ đồ thị. Phù hợp nếu bạn đã có stack monitoring tập trung.

Điểm mạnh: visualize lịch sử, alert rule linh hoạt, tích hợp vào hệ thống monitoring chung.
Điểm yếu: nặng hơn nhiều, không xứng đáng nếu chỉ cần giám sát ổ cứng đơn thuần.

Phân tích: Cái gì thực sự quan trọng trong S.M.A.R.T?

S.M.A.R.T liệt kê hàng chục số liệu, nhưng thực chiến mình chỉ cần theo dõi 5-6 cái. Những thứ dưới đây mình đã tận mắt thấy xuất hiện trước sự cố thật:

  • ID 5 — Reallocated_Sector_Ct: số sector bị lỗi đã được remapped. Nếu số này tăng dần, ổ đang chết từ từ. Ngưỡng nguy hiểm: > 0 trên HDD cũ, > 10 cần thay ngay.
  • ID 187 — Reported_Uncorrect: sector lỗi không thể sửa. Bất kỳ giá trị nào > 0 đều đáng lo ngại.
  • ID 197 — Current_Pending_Sector: sector đang chờ kiểm tra lại — dấu hiệu ổ sắp có vấn đề.
  • ID 198 — Offline_Uncorrectable: tương tự 197 nhưng được phát hiện khi offline test.
  • ID 190/194 — Temperature: nhiệt độ. HDD thường an toàn < 50°C, SSD < 70°C.

Hồi mới làm sysadmin, mình từng mất cả buổi chiều debug một cái lỗi kiểu này. Cứ tưởng filesystem corrupt do kernel bug, loay hoay check dmesg mãi — đến khi chạy smartctl -a mới thấy Reallocated_Sector_Ct đã leo lên 847.

Chọn approach phù hợp

  • Server vật lý, NAS, máy tính để bàn: dùng smartd. Chi phí setup thấp, lợi ích cao.
  • VPS cloud (AWS, GCP, DigitalOcean): smartctl thủ công hoặc bỏ qua — hypervisor thường không expose S.M.A.R.T đầy đủ.
  • Homelab hoặc văn phòng có nhiều máy: xem xét Prometheus exporter nếu bạn muốn dashboard đẹp.
  • Kiểm tra một lần trước khi mua/bán ổ cứng cũ: smartctl -a là đủ.

Triển khai: Cài đặt và cấu hình smartd

Bước 1: Cài đặt smartmontools

# Debian/Ubuntu
sudo apt install smartmontools -y

# RHEL/AlmaLinux/Rocky
sudo dnf install smartmontools -y

# Arch Linux
sudo pacman -S smartmontools

Bước 2: Kiểm tra ổ cứng được nhận diện không

# Liệt kê tất cả ổ đĩa
lsblk -d -o NAME,SIZE,TYPE,ROTA

# Kiểm tra SMART support
sudo smartctl -i /dev/sda

# Nếu ổ nằm sau RAID controller (LSI, HP Smart Array)
# Cần thêm device type, ví dụ:
sudo smartctl -d megaraid,0 -a /dev/sda

Nếu thấy dòng SMART support is: Enabled thì ổn. Nếu là Disabled:

sudo smartctl -s on /dev/sda

Bước 3: Đọc kết quả smartctl -a

sudo smartctl -a /dev/sda

Phần quan trọng nhất là SMART Attributes Data Structure. Cột VALUE là giá trị hiện tại — càng cao càng tốt. Cột THRESH là ngưỡng tối thiểu nhà sản xuất đặt ra. Cột RAW_VALUE là con số thô thực tế. Khi VALUE xuống dưới THRESH, ổ đã chính thức thất bại theo tiêu chí của nhà sản xuất.

Bước 4: Cấu hình smartd

File cấu hình chính là /etc/smartd.conf. Mình dùng cấu hình này trên production:

sudo nano /etc/smartd.conf
# Giám sát tất cả ổ ATA/SCSI tự động tìm thấy
DEFAULTS -a -o on -S on -n standby,q \
  -s (S/../.././02|L/../../6/03) \
  -W 4,45,50 \
  -m root \
  -M exec /usr/share/smartmontools/smartd-runner

# Scan tự động tất cả ổ đĩa
DEVICESOCAN

Giải thích các option quan trọng:

  • -a: bật tất cả kiểm tra mặc định
  • -o on: bật Automatic Offline Testing
  • -S on: bật Attribute Autosave
  • -s (S/../.././02|L/../../6/03): chạy short test lúc 2h sáng mỗi ngày, long test lúc 3h sáng thứ 7
  • -W 4,45,50: cảnh báo khi nhiệt độ tăng 4°C, hoặc vượt 45°C, critical ở 50°C
  • -m root: gửi email cho root

Muốn nhận mail trực tiếp thay vì qua root, đổi -m root thành -m [email protected]. Nhớ cài postfix hoặc msmtp để server gửi được mail ra ngoài.

Bước 5: Khởi động smartd

# Khởi động và enable auto-start
sudo systemctl enable --now smartd

# Kiểm tra trạng thái
sudo systemctl status smartd

# Xem log
sudo journalctl -u smartd -f

Bước 6: Test thủ công để chắc chắn smartd hoạt động

# Gửi test email ngay lập tức
sudo smartd -d -q onecheck

# Chạy short test ngay trên /dev/sdb
sudo smartctl -t short /dev/sdb

# Theo dõi kết quả test (chờ ~2 phút)
sudo smartctl -l selftest /dev/sdb

Xử lý một số tình huống thực tế

Ổ SSD NVMe

NVMe không dùng cùng attribute format với HDD/SATA SSD. Cần dùng -d nvme:

sudo smartctl -a -d nvme /dev/nvme0

Với NVMe, chú ý Percentage Used (phần trăm tuổi thọ đã dùng) và Available Spare (spare blocks còn lại). Khi Available Spare < Available Spare Threshold thì cần lên kế hoạch thay thế.

Ổ cứng qua USB (backup drive)

# USB-SATA bridge thường cần -d sat
sudo smartctl -d sat -a /dev/sdb

Script kiểm tra nhanh tất cả ổ

Cái script này mình hay chạy khi cần snapshot nhanh tình trạng tất cả ổ — 10 giây có ngay một bức tranh tổng quan, không cần đọc từng page output dài:

#!/bin/bash
for disk in $(lsblk -d -n -o NAME,TYPE | awk '$2=="disk"{print $1}'); do
  echo "=== /dev/$disk ==="
  sudo smartctl -H /dev/$disk 2>/dev/null | grep -E '(overall-health|SMART overall)'
  sudo smartctl -A /dev/$disk 2>/dev/null | awk '$1 ~ /^(5|187|197|198|190|194)$/ {printf "ID%-4s %-35s %s\n", $1, $2, $NF}'
  echo
done

Output gọn — chỉ 6 attribute quan trọng nhất, kèm raw value để so ngay.

Tóm lại

S.M.A.R.T không phải là oracle — nó không dự đoán được 100% khi nào ổ hỏng. Nhưng trong kinh nghiệm thực tế của mình, khoảng 80% các ổ hỏng đều có dấu hiệu trước trong S.M.A.R.T từ vài ngày đến vài tuần. smartd giúp bạn không bỏ lỡ khoảng thời gian đó.

Setup cả hệ thống chỉ mất khoảng 15 phút, nhưng có thể giúp bạn tránh được một buổi tối mất ngủ restore backup vào lúc 2 giờ sáng. Mình nói từ kinh nghiệm đau thương.

Share: