У меня есть несколько машин Ubuntu и с SSD и с традиционным жестким диском, где жесткий диск используется только иногда.
По причинам сокращения шума, тепла, и потребляемой мощности и расширения времени жизни жесткого диска, я хотел бы выключить его на каждой начальной загрузке и разбудить его только при необходимости.
hdparm -y
(или -Y
) работы вполне прилично над командной строкой и делают точно, что я хочу.
Но при записи systemd сервиса для выполнения hdparm
не работает. Быть более точным: Это работает, и диск действительно засыпает (как отладка шоу), но это сразу разбужено снова (и остается не спящим), потому что существует что-то в системе, которая действительно получает доступ к жестким дискам (и таким образом будит его) в самом конце systemd процесса начальной загрузки.
Таким образом, как я могу поместить a hdparm -y
в процессе начальной загрузки достаточно поздно, что это больше не сопровождается никаким другим процессом.
Мое последнее предположение должно было бы изменить цель systemd по умолчанию от графического до нового (sleepydisks), который затем зависит от бывшей графической цели.
Но нет ли более легкий и более простой способ выключить диски?
С уважением
Откройте дисковую утилиту и установите диск автоматически вращаться вниз после 10 минут неактивности.
Используйте-S опцию hdparm. Это устанавливает вращение вниз тайм-аут, который, как предполагается, сохраняется диском.
$ hdparm --help
-S Set standby (spindown) timeout
$ hdparm -S 60 /dev/sdd
/dev/sdd:
setting standby to 60 (5 minutes)
Действительно отмечают, что это - прописной 'S'.
Я использую следующий сценарий для "вызывания" бездействующих дисков к spindown, где силой я значу прямую инструкцию для диска, поскольку много дисков WD являются проблемными с self-spindown. Возможно, можно расширить это до потребностей. Сценарий хорошо прокомментирован так, необходимо смочь изменить его довольно легко. Я называю его от cron
каждые 20 минут корректируйтесь по мере необходимости:
spindown.sh
#!/usr/bin/env bash
logger "[SPINDOWN] Checking disk activity and spinning down idles..."
# Exit during maintenance
if pgrep snapraid > /dev/null; then
logger "[SPINDOWN] Detected snapRAID maintenance. Exiting.";
exit 0
fi
# Specify any drives you want to ignore; separate multiple drives by spaces; e.g. "sda sdb"
IGNORE_DRIVES=""
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
# Check for idle disks and spin them down unless smartd is running tests
# Create a file on the ramdisk and cycle it to test for disk activity
( if [ ! -f /dev/shm/diskstats_1 ]; then
logger "[SPINDOWN] Creating initial state file on ramdisk";
touch /dev/shm/diskstats_1;
fi ;
logger "[SPINDOWN] Updating state files on ramdisk";
mv /dev/shm/diskstats_1 /dev/shm/diskstats_2;
cat /proc/diskstats > /dev/shm/diskstats_1 ) > /dev/null 2>&1
# Find all removable USB drives, so we can ignore them later,
# see http://superuser.com/a/465953
REMOVABLE_DRIVES=""
for _device in /sys/block/*/device; do
if echo $(readlink -f "$_device")|egrep -q "usb"; then
_disk=$(echo "$_device" | cut -f4 -d/)
REMOVABLE_DRIVES="$REMOVABLE_DRIVES $_disk"
fi
done
# Append detected removable drives to manually ignored drives
IGNORE_DRIVES="$IGNORE_DRIVES $REMOVABLE_DRIVES"
# Loop through all the array disks and spin down the idle disks. Will find all drives sda > sdz AND sdaa > sdaz...
logger "[SPINDOWN] Looping through drives to detect idle state"
for disk in `find /dev/ -regex '/dev/sd[a-z]+' | cut -d/ -f3`
do
# Skip removable USB drives and those the user wants to ignore
if [[ $IGNORE_DRIVES =~ $disk ]]; then
continue
fi
# Skip SSDs
if [[ $(cat /sys/block/$disk/queue/rotational) -eq 0 ]]; then
continue
fi
# Check if drive exists
if [ -e /dev/$disk ]; then
logger "[SPINDOWN] Checking drive $disk"
# Check if drive is currently spinning
if [ "$(smartctl -i -n standby /dev/$disk | grep "ACTIVE or IDLE")" ]; then
logger "[SPINDOWN] Disk $disk is ACTIVE or IDLE. Checking for selftest"
# Check if smartctl is currently not running a self test
if [ $(smartctl -a /dev/$disk | grep -c "Self-test routine in progress") = 0 ]; then
logger "[SPINDOWN] Disk $disk is not running a self test. Checking activity."
# Check if drive has been non idle since last run
if [ "$(diff /dev/shm/diskstats_1 /dev/shm/diskstats_2 | grep $disk )" = "" ]; then
logger "[SPINDOWN] Spinning down /dev/$disk `df -h | grep /dev/$disk | rev | cut -d ' ' -f 1 | rev`"
hdparm -y /dev/$disk
fi
else
logger "[SPINDOWN] /dev/$disk is running Self-test routine. Skipping."
fi
fi
fi
done
Согласно конкретному вопросу, как сделать это с systemd?... создайте файл таймера, который называет этот сценарий (Касательно: https://wiki.archlinux.org/index.php/Systemd/Timers)