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
- Masalah & Penyebab
- Ringkasan Solusi
- Diagnosa Sistem
- Instalasi Manual (langkah demi langkah)
- Isi File Lengkap
- Pengujian
- Verifikasi & Monitoring
- Cara Kerja Ordering systemd
- Catatan SMART (keterbatasan enclosure)
- Troubleshooting & Fallback
- Uninstall
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 | 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.
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
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 2Konversi nama unit mount:
/srv/storage→srv-storage.mount. Path dengan beberapa segmen di-escape memakai-(mis./mnt/data→mnt-data.mount). Cek pasti dengansystemctl list-units --type=mount.
Ganti nilai berikut sesuai sistem Anda:
DISK_ID(dariby-id), dan nama unit mount (srv-storage.mount) di file service.
sudo apt-get update
sudo apt-get install -y sg3-utils hdparmsudo 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.shsudo 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
EOFsudo 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 cycleDua 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.
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 realInterpretasi:
- 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/storagesudah di-unmount duluan.
sudo rebootDengarkan: 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# 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-spindownInti 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, makaExecStophelper kita berjalan setelah/srv/storagedi-unmount. Tepat yang diinginkan (kalau spin-down sebelum unmount, proses unmount menulis journal/superblock → drive spin-up lagi → percuma). DefaultDependencies=nowajib: tanpa ini, dependency default (After=basic.target) bertabrakan denganBefore=(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 danExecStopdieksekusi.
Validasi tidak ada cycle: systemd-analyze verify storage-spindown.service (output kosong = OK).
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 gagalArtinya 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
smartmontoolsotomatis mengaktifkansmartdyang 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).
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.
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 lainRingkasan setup ini juga tercatat di memori Claude Code sebagai rpi-samba-storage-spindown.