Загорелся я идеей остановить вращение шпинделя. Пол дня копания в нете привело к обнаружению довольно интересной команды atacontrol.
Судя по мануалке команда используется для управления ATA-устройствами, управления ими в RAID, подключении и отключении.
# atacontrol
usage: atacontrol
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
Перезагружаемся, ждем, проходит минута-полторы и тишина :)
З.Ы. Все эти пляски с бубном имели место лишь потому, что железо старое и с флешки грузиться не умеет. Умей грузиться - стартовало бы с флешки.
очень похоже, что все это работает под FreeBSD 7.
ОтветитьУдалитьпо крайней мере во FreeBSD 6.1, atacontrol не имеет команды "spindown device"
не работает ни черта
ОтветитьУдалитьКоманда
ОтветитьУдалитьatacontrol spindown ad0 5
Приводит к остановке вращения хотябы на несколько секунд?
ad0 имя диска,который нужно остановить, у меня был /dev/ad0, нужно брать именно имя устройства, а не путь к нему.
Какая ОС используется?