Как отключить неиспользуемые винчестеры

Sep 26, 2016 06:58

Обновлено для винчестеров Seagate, см. первоисточник: Как отключить неиспользуемые винчестеры

Скопилось у меня некоторое количество старых винчестеров малого объёма: несколько по 40, 200, 250 Гиг. Как бы в домашнюю машину их впихивать нелогично - шумят и кушают по 5-10 Вт электричества, а так, чтоб на полке лежали - жаба душит. Вот если бы они выключались когда не нужно и включались по обращению к ним - было бы очень хорошо. Поисследовал вопрос - оказывается можно.

В стандартной поставке ubuntu есть утилита hdparm для получения/установки параметров винчестеров. По идее hdparm с опцией -s должен задавать время, после которого винчестер, если к нему нет обращения, переходит в режим standby (засыпает), т.е. отключается вращение дисков. То что нам и нужно: не шумит, кушает 1 Вт - красота. Но вот не отрабатывает у меня почему-то эта команда на всех вениках, да ещё и на одной из материнок из старых. Почему уж так - не стал разбираться, т.к. надыбал ещё пару заклинаний, на основе которых можно построить скриптик отключения.

Первое заклинание - всё тот же hdparm с опциями -B (разрешает функционал управления электропитанием), -Y (перевод винчестера в standby) и -С (запросить состояние винчестера)

Второе - выдаёт статистику винчестера:

xxx@server:~$ cat /proc/diskstats
1 0 ram0 0 0 0 0 0 0 0 0 0 0 0
1 1 ram1 0 0 0 0 0 0 0 0 0 0 0
1 2 ram2 0 0 0 0 0 0 0 0 0 0 0
1 3 ram3 0 0 0 0 0 0 0 0 0 0 0
1 4 ram4 0 0 0 0 0 0 0 0 0 0 0
1 5 ram5 0 0 0 0 0 0 0 0 0 0 0
1 6 ram6 0 0 0 0 0 0 0 0 0 0 0
1 7 ram7 0 0 0 0 0 0 0 0 0 0 0
1 8 ram8 0 0 0 0 0 0 0 0 0 0 0
1 9 ram9 0 0 0 0 0 0 0 0 0 0 0
1 10 ram10 0 0 0 0 0 0 0 0 0 0 0
1 11 ram11 0 0 0 0 0 0 0 0 0 0 0
1 12 ram12 0 0 0 0 0 0 0 0 0 0 0
1 13 ram13 0 0 0 0 0 0 0 0 0 0 0
1 14 ram14 0 0 0 0 0 0 0 0 0 0 0
1 15 ram15 0 0 0 0 0 0 0 0 0 0 0
7 0 loop0 0 0 0 0 0 0 0 0 0 0 0
7 1 loop1 0 0 0 0 0 0 0 0 0 0 0
7 2 loop2 0 0 0 0 0 0 0 0 0 0 0
7 3 loop3 0 0 0 0 0 0 0 0 0 0 0
7 4 loop4 0 0 0 0 0 0 0 0 0 0 0
7 5 loop5 0 0 0 0 0 0 0 0 0 0 0
7 6 loop6 0 0 0 0 0 0 0 0 0 0 0
7 7 loop7 0 0 0 0 0 0 0 0 0 0 0
8 0 sda 15106 3536 1803612 480344 12526 9813 511256 304776 0 153952 785020
8 1 sda1 99 22 6856 1948 279 2649 23424 1352 0 2148 3300
8 2 sda2 10157 3484 799610 434068 11994 6947 484312 168372 0 124432 602400
8 3 sda3 4767 30 992906 42276 223 217 3520 134448 0 30472 176664
8 16 sdb 975 29 21338 16572 20284 613229 5068088 6004768 0 104188 6021128
8 17 sdb1 943 29 19202 13556 20282 613229 5068088 6004732 0 101144 6018076

Третья колонка - имя устройства, четвёртая - общее количество чтений с устройства, восьмая - общее количество записи на устройство. Алгоритм скрипта прост - запоминаем эту информацию и при следующем вызове сравниваем текущие значения и сохранённые. Если равны, значит работы с винчестером не было и его можно глушить.

#!/bin/bash

TMP_DIR=/tmp/diskidle

if [ ! -d "$TMP_DIR" ]; then
sudo mkdir $TMP_DIR
fi
mv $TMP_DIR/diskstats $TMP_DIR/diskstats.prev
cp /proc/diskstats $TMP_DIR/diskstats

DEVICES=( $1 )
for DEV in "$DEVICES[@]"
do
res=$( /sbin/hdparm -C /dev/$DEV | grep -c standby )
if [ $res -eq 1 ]; then
continue
fi

a=( $( cat $TMP_DIR/diskstats | grep "$DEV " ) )
b=( $( cat $TMP_DIR/diskstats.prev | grep "$DEV " ) )

EX=0
if [ "$a[3]" == "$b[3]" ]; then
if [ "$a[7]" == "$b[7]" ]; then
EX=1
fi
fi

if [ "$EX" -eq 1 ]; then
/sbin/hdparm -B 1 -Y /dev/$DEV
fi
done

Вызываем список заданий root-а

sudo crontab -e

И добавляем вызов нашего скрипта раз в минуту с указанием устройств, которые он должен обслуживать (sdb). Если нужно несколько устройств, то указываем их через пробел, например «sdb sdc»

* * * * * /data/Scripts/hddidle.sh "sdb" >/dev/null 2>/dev/null

hdd, standby, винчестер

Previous post Next post
Up