Skip to content

Instantly share code, notes, and snippets.

@phalconyx
Created August 2, 2026 09:28
Show Gist options
  • Select an option

  • Save phalconyx/f9b1bd03ed2c8f899dc9c039cdf9be68 to your computer and use it in GitHub Desktop.

Select an option

Save phalconyx/f9b1bd03ed2c8f899dc9c039cdf9be68 to your computer and use it in GitHub Desktop.

Graceful HDD Spin-Down saat Shutdown — Raspberry Pi + HDD USB (Samba Server)

Tutorial lengkap membuat hardisk USB parkir dengan halus setiap kali Raspberry Pi poweroff/reboot, sehingga tidak terjadi emergency head-retract (suara "clunk/goresan") saat daya USB diputus mendadak.

  • Tanggal dibuat: 2026-08-02
  • Board: Raspberry Pi 4 Model B
  • OS: Raspberry Pi OS (systemd)
  • Drive: Seagate One Touch w/PW 1 TB (USB 3.0, bus-powered), ext4 di /srv/storage
  • Peran: Samba file/storage server

Daftar Isi

  1. Masalah & Penyebab
  2. Ringkasan Solusi
  3. Diagnosa Sistem
  4. Instalasi Manual (langkah demi langkah)
  5. Isi File Lengkap
  6. Pengujian
  7. Verifikasi & Monitoring
  8. Cara Kerja Ordering systemd
  9. Catatan SMART (keterbatasan enclosure)
  10. Troubleshooting & Fallback
  11. Uninstall

1. Masalah & Penyebab

Saat menjalankan sudo poweroff terdengar suara goresan/"clunk" dari hardisk. Ada dua hal berbeda yang sering tertukar:

Aspek Status Penjelasan
Keamanan data ✅ Aman poweroff menghentikan Samba lalu meng-unmount /srv/storage (flush + sync, ext4 journaling). Data tidak korup.
Spin-down mekanis ⚠️ Tidak halus OS tidak menyuruh drive berhenti sebelum daya USB diputus.

Penyebab suara: karena drive bus-powered, begitu Pi memutus daya USB saat halt, piringan masih berputar → firmware drive melakukan emergency head retract (menarik head ke ramp parkir memakai sisa putaran piringan sebagai listrik darurat). Bunyi "clunk" + piringan yang melambat berhenti = suara yang terdengar.

Apakah berbahaya? Untuk drive 2.5" dengan load/unload ramp, head parkir di ramp (di luar area piringan), bukan menyentuh permukaan data — jadi bukan head crash. Emergency unload dirating puluhan ribu kali, tapi spin-down yang dikomando lebih halus dan mengurangi keausan. Tutorial ini membuat spin-down halus itu otomatis.


2. Ringkasan Solusi

Sebuah systemd service (storage-spindown.service) yang, pada saat shutdown/reboot, menjalankan sebuah script setelah /srv/storage di-unmount dan sebelum daya diputus. Script itu memerintahkan drive spin-down via sg_start --stop (SCSI STOP UNIT — tanpa daemon, andal untuk USB), dengan fallback hdparm lalu udisksctl power-off.

Shutdown/reboot
   │
   ├─ Samba (smbd/nmbd) dihentikan
   ├─ /srv/storage di-unmount (data flush)
   ├─ >>> storage-spindown.service ExecStop → sg_start --stop /dev/sda   (drive PARKIR)
   └─ daya USB diputus  → drive sudah diam → tidak ada emergency retract

3. Diagnosa Sistem

Perintah read-only untuk memahami setup (sesuaikan hasil untuk sistem Anda):

# Block device + cara koneksi (TRAN=usb) + model
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,MODEL,TRAN,VENDOR

# Identitas STABIL drive (dipakai di script; jangan andalkan /dev/sda yang bisa berubah)
ls -l /dev/disk/by-id/ | grep -i seagate
#  usb-Seagate_One_Touch_w_PW_00000000NABTA3Z5-0:0       -> ../../sda
#  usb-Seagate_One_Touch_w_PW_00000000NABTA3Z5-0:0-part1 -> ../../sda1

# Nama unit mount systemd untuk /srv/storage (mount point -> unit)
systemctl status srv-storage.mount        # /srv/storage  ==  srv-storage.mount
findmnt /srv/storage

# fstab (pastikan ada nofail agar boot tak macet bila drive absen)
cat /etc/fstab
#  UUID=752937b0-... /srv/storage ext4 defaults,noatime,nofail,x-systemd.device-timeout=30s 0 2

Konversi nama unit mount: /srv/storagesrv-storage.mount. Path dengan beberapa segmen di-escape memakai - (mis. /mnt/datamnt-data.mount). Cek pasti dengan systemctl list-units --type=mount.


4. Instalasi Manual (langkah demi langkah)

Ganti nilai berikut sesuai sistem Anda: DISK_ID (dari by-id), dan nama unit mount (srv-storage.mount) di file service.

4.1. Pasang alat bantu

sudo apt-get update
sudo apt-get install -y sg3-utils hdparm

4.2. Buat helper script

sudo tee /usr/local/sbin/storage-spindown.sh >/dev/null <<'EOF'
#!/bin/sh
# Park/spin-down HDD USB saat shutdown/reboot supaya tidak emergency head-retract
# ketika daya USB diputus. Dijalankan sebagai ExecStop= service.
set -u
DISK_ID="/dev/disk/by-id/usb-Seagate_One_Touch_w_PW_00000000NABTA3Z5-0:0"
LOGFILE="/var/log/storage-spindown.log"
log(){
  logger -t storage-spindown "$*" 2>/dev/null || true
  printf '%s  %s\n' "$(date '+%F %T')" "$*" >> "$LOGFILE" 2>/dev/null || true
}
DEV="$(readlink -f "$DISK_ID" 2>/dev/null || true)"; [ -b "${DEV:-}" ] || DEV=/dev/sda
if [ ! -b "$DEV" ]; then log "storage drive not present; nothing to spin down"; exit 0; fi
sync
if command -v sg_start >/dev/null 2>&1 && timeout 25 sg_start --stop "$DEV" >/dev/null 2>&1; then
  log "parked $DEV via sg_start --stop"; exit 0
fi
if command -v hdparm >/dev/null 2>&1 && timeout 25 hdparm -Y "$DEV" >/dev/null 2>&1; then
  log "parked $DEV via hdparm -Y"; exit 0
fi
if command -v udisksctl >/dev/null 2>&1 && timeout 25 udisksctl power-off -b "$DEV" >/dev/null 2>&1; then
  log "powered off $DEV via udisksctl"; exit 0
fi
log "WARNING: no spin-down method succeeded for $DEV"
exit 0   # jangan pernah memblokir shutdown
EOF
sudo chmod 0755 /usr/local/sbin/storage-spindown.sh

4.3. Buat unit service

sudo tee /etc/systemd/system/storage-spindown.service >/dev/null <<'EOF'
[Unit]
Description=Gracefully spin down the /srv/storage USB drive on shutdown/reboot
Documentation=man:sg_start(8)
DefaultDependencies=no
# Start SEBELUM mount → (kebalikannya) ExecStop jalan SETELAH /srv/storage di-unmount.
# Conflicts+Before=umount.target membuat unit di-stop (ExecStop dipicu) pada fase
# unmount saat shutdown/reboot, selagi device masih bertenaga.
Before=srv-storage.mount
Conflicts=umount.target
Before=umount.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/true
ExecStop=/usr/local/sbin/storage-spindown.sh
TimeoutStopSec=45

[Install]
WantedBy=srv-storage.mount multi-user.target
EOF

4.4. Aktifkan & validasi

sudo systemctl daemon-reload
sudo systemctl enable storage-spindown.service
sudo systemctl start  storage-spindown.service
sudo systemd-analyze verify storage-spindown.service   # harus tanpa output = tidak ada cycle

5. Isi File Lengkap

Dua file yang terpasang:

  • /usr/local/sbin/storage-spindown.sh — helper (lihat 4.2)
  • /etc/systemd/system/storage-spindown.service — unit (lihat 4.3)
  • Log runtime: /var/log/storage-spindown.log (satu baris per shutdown)

Skrip installer & pengujian otomatis (opsional) disimpan di scratchpad sesi: setup-storage-spindown.sh, update-storage-spindown.sh, check-smart.sh, smart-probe.sh.


6. Pengujian

6.1. Uji reversible (tanpa reboot, aman untuk server live)

Membuktikan perintah spin-down benar-benar menghentikan piringan, lalu memutarnya lagi:

DEV=/dev/sda
# baca "hangat" (drive berputar) — baseline
sync; { time dd if=$DEV of=/dev/null bs=4096 count=1 iflag=direct; } 2>&1 | grep real
# park lalu ukur latensi baca pertama (harus melonjak → bukti piringan berhenti)
sync; sudo sg_start --stop $DEV
sleep 1
sync; { time dd if=$DEV of=/dev/null bs=4096 count=1 iflag=direct; } 2>&1 | grep real

Interpretasi:

  • Baca baseline ~5–15 ms.
  • Baca setelah park ≥ ~1.5 detik (contoh nyata di sistem ini: 1918 ms) → piringan benar-benar spin-down, lalu spin-up untuk melayani baca. LULUS.
  • Kalau baca setelah park tetap cepat (~10 ms): drive tidak spin-down. Catatan: ini bisa false-negative bila filesystem masih aktif (ext4 commit ~5 dtk memutarnya lagi). Saat shutdown tidak terjadi karena /srv/storage sudah di-unmount duluan.

6.2. Uji shutdown nyata

sudo reboot

Dengarkan: harusnya kini drive melambat halus, bukan "clunk" mendadak. Setelah Pi hidup:

cat /var/log/storage-spindown.log
# contoh output yang benar:
# 2026-08-02 10:12:45  parked /dev/sda via sg_start --stop

7. Verifikasi & Monitoring

# Status service
systemctl status storage-spindown.service
systemctl is-enabled storage-spindown.service   # enabled
systemctl is-active  storage-spindown.service   # active

# Log tiap shutdown (file, persisten di SD card)
cat /var/log/storage-spindown.log

# Log dari boot sebelumnya via journald
journalctl -b -1 -u storage-spindown

8. Cara Kerja Ordering systemd

Inti trik: Before=srv-storage.mount.

  • Aturan systemd: Before=X (start sebelum X) ⇒ pada shutdown, unit di-stop SETELAH X di-stop.
  • Karena srv-storage.mount "di-stop" = di-unmount, maka ExecStop helper kita berjalan setelah /srv/storage di-unmount. Tepat yang diinginkan (kalau spin-down sebelum unmount, proses unmount menulis journal/superblock → drive spin-up lagi → percuma).
  • DefaultDependencies=no wajib: tanpa ini, dependency default (After=basic.target) bertabrakan dengan Before=(mount) dan membentuk ordering cycle.
  • Conflicts=umount.target + Before=umount.target: idiom resmi agar unit ikut di-stop (ExecStop terpicu) pada fase unmount saat shutdown — berlaku untuk poweroff dan reboot.
  • RemainAfterExit=yes + ExecStart=/bin/true: unit "aktif" selama sistem jalan, sehingga saat shutdown ia di-stop dan ExecStop dieksekusi.

Validasi tidak ada cycle: systemd-analyze verify storage-spindown.service (output kosong = OK).


9. Catatan SMART (keterbatasan enclosure)

Enclosure Seagate One Touch "w/PW" (hardware-encrypting) memblokir SMART passthrough. Semua tipe device gagal:

sudo apt-get install -y smartmontools
sudo smartctl --scan-open                 # menyarankan: /dev/sda -d sat
sudo smartctl -a -d sat  /dev/sda         # Read Device Identity failed: unsupported field...
sudo smartctl -a -d scsi /dev/sda         # hanya info SCSI (Product/Capacity), tanpa atribut ATA
# -d sat,12 / sat,16 / usbjmicron / usbsunplus / usbcypress / usbprolific → semua gagal

Artinya Power-Off_Retract_Count, Load_Cycle_Count, Reallocated_Sector, dll tidak bisa dibaca lewat USB. Ini keterbatasan, bukan kerusakan. Untuk membaca SMART, drive harus dicolok langsung via SATA (tanpa enclosure enkripsi).

Menginstal smartmontools otomatis mengaktifkan smartd yang membangunkan drive tiap ~30 menit. Bila tak diperlukan: sudo systemctl disable --now smartd.

Kesehatan tanpa SMART: drive membaca cepat (~6 ms) dan melayani Samba normal (read path sehat, bukan head crash), serta merespons spin-down/spin-up dengan bersih (spindle & aktuator sehat).


10. Troubleshooting & Fallback

Suara masih "clunk" sama persis setelah fix → drive mungkin hanya mau park saat koneksi USB hilang. Ganti aksi utama ke safe-remove level USB. Edit ExecStop helper agar mendahulukan:

# ganti blok metode di storage-spindown.sh menjadi (urutan):
# 1) udisksctl power-off  (safe-remove USB penuh; butuh daemon UDisks2)
command -v udisksctl >/dev/null 2>&1 && timeout 20 udisksctl power-off -b "$DEV" >/dev/null 2>&1 \
  && { log "safe-removed $DEV via udisksctl"; sleep 2; exit 0; }
# 2) fallback tanpa daemon: de-authorize USB via sysfs (paksa disconnect → drive parkir)
base="$(basename "$DEV")"
syspath="$(readlink -f "/sys/block/$base" 2>/dev/null || true)"
usbdev="$(printf '%s\n' "$syspath" | grep -oE '/[0-9]+-[0-9]+(\.[0-9]+)*/' | tail -1 | tr -d /)"
[ -n "$usbdev" ] && [ -w "/sys/bus/usb/devices/$usbdev/authorized" ] \
  && echo 0 > "/sys/bus/usb/devices/$usbdev/authorized" \
  && { log "de-authorized USB $usbdev"; sleep 3; exit 0; }

sg_start --stop di-terima tapi tak spin-down saat tes live → normal; filesystem aktif memutar ulang. Saat shutdown (fs sudah unmount) akan bekerja. Lihat 6.1.

Boot macet saat drive dicabut → pastikan nofail (dan x-systemd.device-timeout=30s) ada di baris fstab /srv/storage.

hdparm -Y vs -y-Y = sleep (perlu reset untuk bangun), -y = standby (bangun saat diakses). Untuk shutdown keduanya oke; untuk tes reversible pakai -y agar mudah dibangunkan.

Nama device berubah (sda→sdb) → script sudah memakai path by-id yang stabil; /dev/sda hanya fallback.


11. Uninstall

sudo systemctl disable --now storage-spindown.service
sudo rm /etc/systemd/system/storage-spindown.service
sudo rm /usr/local/sbin/storage-spindown.sh
sudo systemctl daemon-reload
# opsional:
sudo rm /var/log/storage-spindown.log
sudo apt-get remove --purge sg3-utils hdparm smartmontools   # jika tidak dipakai hal lain

Ringkasan setup ini juga tercatat di memori Claude Code sebagai rpi-samba-storage-spindown.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment