104 lines
3.0 KiB
Bash
Executable File
104 lines
3.0 KiB
Bash
Executable File
#! /bin/sh
|
|
#
|
|
# This script adjusts hard drive APM settings using hdparm. The hardware
|
|
# defaults (usually hdparm -B 127) cause excessive head load/unload cycles
|
|
# on many modern hard drives. We therefore set hdparm -B 254 while on AC
|
|
# power. On battery we set hdparm -B 128; this still does not guarantee
|
|
# disk parking, but is safer than causing lots of mechanical wear on disks
|
|
# as we seem to get currently with 127.
|
|
#
|
|
# Refactored from acpi-support's 90-hdparm.sh for pm-utils
|
|
|
|
if grep -wq "nohdparm" /proc/cmdline ; then
|
|
exit 0
|
|
fi
|
|
|
|
# Do nothing when called via /etc/init.d/acpi-support; udev rules take care
|
|
# of setting the initial hdparm policy for us.
|
|
if ([ "$previous" ] && [ "$runlevel" ]) || [ "$runlevel" = S ]; then
|
|
exit 0
|
|
fi
|
|
|
|
if [ -e /usr/sbin/laptop_mode ] ; then
|
|
LMT_CONTROL_HD_POWERMGMT=$(. /etc/laptop-mode/laptop-mode.conf && echo "$CONTROL_HD_POWERMGMT")
|
|
if [ "$LMT_CONTROL_HD_POWERMGMT" != 0 ] \
|
|
&& [ -e /var/run/laptop-mode-tools/enabled ]
|
|
then
|
|
# Laptop mode controls hdparm -B settings, we don't.
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
. /lib/hdparm/hdparm-functions
|
|
|
|
resume_hdparm_apm()
|
|
{
|
|
for dev in /dev/sd? /dev/hd? ; do
|
|
apm_opt=
|
|
if [ -b $dev ] && hdparm_try_apm $dev ; then
|
|
for option in $(hdparm_options $dev); do
|
|
case $option in
|
|
-B*)
|
|
apm_opt=$option
|
|
;;
|
|
*)
|
|
;;
|
|
esac
|
|
done
|
|
if [ -n "$apm_opt" ]; then
|
|
hdparm $apm_opt $dev
|
|
fi
|
|
fi
|
|
done
|
|
}
|
|
|
|
resume_hdparm_spindown()
|
|
{
|
|
for dev in /dev/sd? /dev/hd? ; do
|
|
# Check for force_spindown_time option
|
|
# If defined apply hdaprm -S even if APM is not supported
|
|
# See also #758988
|
|
ignore_apm=
|
|
options=$(hdparm_options $dev)
|
|
case $options in
|
|
(*'force_spindown_time'*)
|
|
ignore_apm='true'
|
|
;;
|
|
esac
|
|
apm_opt=
|
|
if [ -b $dev ]; then
|
|
if hdparm_try_apm $dev || [ "$ignore_apm" = true ] ; then
|
|
for option in $(hdparm_options $dev); do
|
|
# Convert manually introduced option "force_spindown_time"
|
|
# back to "-S" understandable by hdparm
|
|
option=$(echo $option| sed 's/force_spindown_time/-S/')
|
|
case $option in
|
|
-S*)
|
|
apm_opt=$option
|
|
;;
|
|
*)
|
|
;;
|
|
esac
|
|
done
|
|
if [ -n "$apm_opt" ]; then
|
|
hdparm $apm_opt $dev
|
|
fi
|
|
fi
|
|
fi
|
|
done
|
|
}
|
|
|
|
case "$1" in
|
|
true|false) # powersaving on/off
|
|
resume_hdparm_apm
|
|
;;
|
|
thaw|resume)
|
|
resume_hdparm_apm
|
|
# only set the -S option on resuming, not necessary for power.d
|
|
resume_hdparm_spindown
|
|
;;
|
|
*)
|
|
exit 254
|
|
;;
|
|
esac
|