Поиск по этому блогу

вторник, 24 марта 2009 г.

Остановка вращения шпинделя HDD под FreeBSD

Поднял шлюз на FreeBSD, а через пару дней он таки достал громкой работой - гул старого винчестера довольно сильно раздражает.
Загорелся я идеей остановить вращение шпинделя. Пол дня копания в нете привело к обнаружению довольно интересной команды atacontrol.
Судя по мануалке команда используется для управления ATA-устройствами, управления ими в RAID, подключении и отключении.

# atacontrol
usage: atacontrol args:
atacontrol list
atacontrol info channel
atacontrol attach channel
atacontrol detach channel
atacontrol reinit channel
atacontrol create type [interleave] disk0 ... diskN
atacontrol delete array
atacontrol addspare array disk
atacontrol rebuild array
atacontrol status array
atacontrol mode device [mode]
atacontrol cap device
atacontrol spindown device [seconds]

В данном случае нас интересует только последняя строчка

atacontrol spindown device [seconds]


К примеру

#atacontrol spindown ad0 60

должно привести к отключению вращения шпинделя устройства ad0, если к нему нет обращений в течении 60 секунд. Используеться имено имя устройства "ad0", а не путь к устройству "/dev/ad0".
Для отключения остановки HDD т.е. чтоб гудел постоянно нужно сказать

#atacontrol spindown ad0 0

А для просмотра текущего состояния говорим

#atacontrol spindown ad0

т.е. без указания вермени

Приступим к полевым испытаниям:

#atacontrol spindown ad0 60

Ждем, ждем, ждем и ничего.

Уменьшаем время до 5 секунд:

#atacontrol spindown ad0 5

ad0: Idle, spin down
ad0: drive spun down.
ad0: request while spun down, starting.

Винт издает звуки остановки и тут же запускаеться заново :( Получаеться что остановка всетаки отрабатывает но ктото постоянно делает обращение к файлам. Так вспоминаем... и смотрим ps ax... Надо бы отключить sendmail, cron и всех остальных кто юзает винт. В данном случае комп используется как роутер и юзать винт ему особо ненадо. Также прийдется пожертвовать хранением логов.

Добавляем в rc.conf чтобы полностью вырубить sendmail и cron:

sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
cron_enable="NO"

Перезагружаемся, пробуем

#atacontrol spindown ad0 5

ad0: Idle, spin down
ad0: drive spun down.
ad0: request while spun down, starting.

Опять тож самое, винт дернулся и запустился заново. Подозрения падают на логи, причем самый разные, включая консольные команды юзера. И тут вспоминаю про то, как ставил FreeBSD на флешку. Ведь mount умеет монтировать не только разделы, а и память, создавая нечто похожее на файловую систему в оперативной памяти. В конечном итоге /etc/fstab
принял такой вид:

# cat /etc/fstab
# Device Mountpoint FStype Options Dump Pass#
/dev/ad0s1a / ufs rw 1 1
/dev/acd0 /cdrom cd9660 ro,noauto 0 0
md /tmp mfs rw,-s16M,nosuid,noatime 0 0
md /var/tmp mfs rw,-s16M,nosuid,noatime 0 0
md /var/run mfs rw,-s4M,nosuid,noatime 0 0
md /var/log mfs rw,-s16M,nosuid,noatime 0 0
md /root mfs rw,-s4M,nosuid,noatime 0 0
md /home mfs rw,-s4M,nosuid,noatime 0 0
/proc /proc procfs rw,noauto 0 0

Тоетсь реально монтируется только корневой раздел, а папки с файлами которых происходит какая-либо работа отображаются в память и никоим образом не связаны с реальными на диске. Также следует заметить, что своп не монтируется и его использование при остановка винчестера нелогично.
Все каталоги, примонтированные в память, создаются пустыми, поэтому в каталоги, в которых хранятся какие-либо конфиги эти конфиги нужно скопировать обратно. Для этого делаем их копии в какую либо папку, а потом копируем скриптом обратно в папки, примонтированные в память(ниже в
скрипте hddstop.sh).

Перезагружаемся пробуем

#atacontrol spindown ad0 5

ad0: Idle, spin down
ad0: drive spun down.

И тишина :)

Теперь чтобы выключение HDD происходило после загрузки системы создаем скрипт с любым именем в /usr/local/etc/rc.d и не забываем сделать его исполняемым.

К примеру:

# cat /usr/local/etc/rc.d/hddstop.sh

#!/bin/sh
#echo -n ' FooBar'

case "$1" in
start)
#copy mgety config and ppp files
######
cp /usr/share/mgetty_config_copy/mgetty+sendfax/* /usr/local/etc/mgetty+sendfax/
cp /usr/share/mgetty_config_copy/ppp/* /etc/ppp/
cp -R /usr/share/mgetty_config_copy/spool/* /var/spool/
######

atacontrol spindown ad0 50

echo "Spindown after 50 seconds" >&2
;;
stop)
atacontrol spindown ad0 0
echo "Spindown disabled" >&2
;;
*)
echo "This comand just start ataconfig" >&2
exit 64
;;
esac
exit 0



Перезагружаемся, ждем, проходит минута-полторы и тишина :)

З.Ы. Все эти пляски с бубном имели место лишь потому, что железо старое и с флешки грузиться не умеет. Умей грузиться - стартовало бы с флешки.

3 комментария:

  1. очень похоже, что все это работает под FreeBSD 7.
    по крайней мере во FreeBSD 6.1, atacontrol не имеет команды "spindown device"

    ОтветитьУдалить
  2. не работает ни черта

    ОтветитьУдалить
  3. Команда

    atacontrol spindown ad0 5

    Приводит к остановке вращения хотябы на несколько секунд?

    ad0 имя диска,который нужно остановить, у меня был /dev/ad0, нужно брать именно имя устройства, а не путь к нему.


    Какая ОС используется?

    ОтветитьУдалить