Skip to content

Instantly share code, notes, and snippets.

@lijunle
Created June 17, 2026 07:07
Show Gist options
  • Select an option

  • Save lijunle/cbdc629050abe01b3755875951aa169d to your computer and use it in GitHub Desktop.

Select an option

Save lijunle/cbdc629050abe01b3755875951aa169d to your computer and use it in GitHub Desktop.
Quiet a WD Ultrastar DC HC550 NAS disk via EPC Idle_B (no spin-down)

Quieting a WD Ultrastar DC HC550 (EPC Idle_B, no spin-down)

Scripts to silence the periodic "da-da-da" idle-actuator noise on a WD Ultrastar DC HC550 used as a NAS disk — without spinning the drive down.

The problem

A WD Ultrastar DC HC550 (18TB SATA) makes a soft da-da-da clicking sound roughly every 6 seconds while idle. Investigation showed:

  • The drive is healthy (Reallocated=0, Pending=0, Helium=100%).
  • The heads stay loaded the whole time — Load_Cycle_Count does not increment — so this is not head parking/unloading.
  • There is no host I/O (the disk was unmounted).

The noise is the drive's firmware running a periodic actuator sweep while it sits in the fully-active power state. The drive's EPC (Extended Power Conditions) idle timers were present but runtime-disabled (Current Timer = 0), so the drive never dropped into a quiet idle state.

The fix

Enable the drive's EPC Idle_B power condition with a short timer. After the timer elapses (15s here) the actuator quiesces and the drive goes silent, while:

  • the platters keep spinning (no spin-down, no spin-up wear/latency),
  • the heads stay loaded (zero load/unload wear),
  • wake latency is ~1.1s.

This is the sweet spot for a quiet, always-ready NAS disk.

Manual commands (Linux, openSeaChest)

Order matters — EPC must be enabled before the per-state timer is set, otherwise the timer set fails with Invalid Field in CDB:

openSeaChest_PowerControl -d /dev/sgX --EPCfeature enable
openSeaChest_PowerControl -d /dev/sgX --idle_b 15000 --standby_z disable --standby_y disable
# verify:
openSeaChest_PowerControl -d /dev/sgX --showEPCSettings   # Idle_B Current should be *150

Why a boot script is (or isn't) needed

The Idle_B timer value is saved to the drive's non-volatile memory and is never lost. The open question is whether the drive auto-applies it on power-up.

On Linux, it does not persist across reboots — but not because the drive forgets. Linux's libata driver re-enables APM on every drive init, and on this drive APM and EPC are mutually exclusive, so APM masks the saved Idle_B (Current resets to 0). This was confirmed: after a forced re-init the drive came back APM [Enabled] / EPC disabled with no user action.

On macOS (the intended NAS OS), the AHCI stack does not manage APM the way libata does, so per the ATA spec the saved EPC config will likely auto-apply on boot with no script at all. Verify once on the real machine:

openSeaChest_PowerControl -d <dev> --showEPCSettings   # Idle_B Current == *150 ?

If Current is *150 after a reboot, you're done — delete the LaunchDaemon. If it resets to 0, install the LaunchDaemon below as a safety net.

Files

File Purpose
quiet-hc550.sh Finds the HC550 by serial and applies EPC + Idle_B.
com.local.quiet-hc550.plist macOS LaunchDaemon that runs the script at every boot.

Install (macOS NAS)

Requires the openSeaChest macOS build. Adjust the OSC path inside quiet-hc550.sh to your install location.

sudo cp quiet-hc550.sh /usr/local/sbin/
sudo chmod +x /usr/local/sbin/quiet-hc550.sh
sudo cp com.local.quiet-hc550.plist /Library/LaunchDaemons/
sudo launchctl load /Library/LaunchDaemons/com.local.quiet-hc550.plist

Logs go to /var/log/quiet-hc550.log.

Notes / gotchas

  • APM is not the lever. Setting APM to 128 had no audible effect and did not unload heads. DIPM is also irrelevant (it's SATA link power, not mechanical).
  • Do not use --standby_z / --standby_y enable unless you actually want spin-down; they are explicitly disabled here.
  • The drive serial is hard-coded in the script (5DJP4T1P) so the disk handle can change safely between boots — change it for a different drive.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.local.quiet-hc550</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/sbin/quiet-hc550.sh</string>
</array>
<!-- Run once at every boot. -->
<key>RunAtLoad</key>
<true/>
<key>StandardOutPath</key>
<string>/var/log/quiet-hc550.log</string>
<key>StandardErrorPath</key>
<string>/var/log/quiet-hc550.log</string>
</dict>
</plist>
#!/bin/bash
# Quiet the WD Ultrastar DC HC550 by enabling EPC + Idle_B (no spin-down).
# Requires openSeaChest macOS build installed (adjust OSC path below).
# Drive is matched by serial so the disk handle can change safely.
SERIAL="5DJP4T1P"
OSC="/usr/local/bin/openSeaChest_PowerControl" # adjust to your install path
IDLE_B_MS=15000
[ -x "$OSC" ] || { echo "openSeaChest not found at $OSC"; exit 1; }
# Find the device handle whose info matches our serial.
HANDLE=""
for d in $("$OSC" --scan 2>/dev/null | awk '/dev/{print $1}'); do
if "$OSC" -d "$d" -i 2>/dev/null | grep -q "$SERIAL"; then
HANDLE="$d"; break
fi
done
[ -n "$HANDLE" ] || { echo "HC550 ($SERIAL) not found"; exit 1; }
# Order matters: enable EPC first, then set the Idle_B timer; no spin-down.
"$OSC" -d "$HANDLE" --EPCfeature enable
"$OSC" -d "$HANDLE" --idle_b "$IDLE_B_MS" --standby_z disable --standby_y disable
echo "HC550 quiet config applied to $HANDLE"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment