Жёсткий диск WD Scorpio Blue 640 Gb 2.5″.
У жёстких жисков Western Digital для ноутбуков (как минимум у модели на 640 Gb) есть неприятные особенности в работе на Mac OS X, независимо от того, используется ли он как загрузочный или как внешний. Во время простоя диск останавливается и вновь раскручивается по нескольку раз за минуту. Причём это происходит независимо от настроек энергосбережения в Mac OS X. Мне кажется, такое поведение не только раздражает, но может и навредить самому устройству.
Сообщество предлагает действенное решение проблемы: HDAPM. Эта утилита меняет настройки для винчестера, так что он работает постоянно до перезагрузки системы и не останавливается. Однако hdapm работает только с внутренними дисками SATA и неприменим к внешним дисками USB. Поэтому требуется другое решение.
Моей идеей было постоянно давать файловой системе какое-нибудь задание, чтобы диск крутился постоянно. Сначала я написал скрипт на AppleScript, но через какое-то время он выдавал сообщение о переполнении стека. Поэтому я решил переписать скрипт для Терминала. Скрипты для BASH как-то попримитивнее и должны быть надёжнее.
Ниже приводится текст скрипта. Он использует несколько переменных, в т.ч. имя диска (или имя его первого раздела), тип уведомлений (текстом в Терминале или голосом).
Чтобы использовать скрипт, скопируйте текст из рамки и вставьте в какой-нибудь текстовый редактор, измените имя диска на то, которое у Вас, и сохраните с расширением .command
Создайте в корне диска пустой (или маленький тесктовый) файл driveWakeUp (без расширения).
Теперь Вы можете запустить скрипт.
#/bin/bash
disk_connected=0
disk_name="WD 640 Gb"
disk_path="/Volumes/$disk_name"
waker_file="$disk_path/driveWakeUp"
waker_filecp="$disk_path/driveWakeUp0"
string_connected="Backup drive connected."
string_disconnected="Backup drive disconnected."
string_activated="Disk waker activated."
string_voice="Victoria"
voice_output=true
cycle_number=0
cycles_number=60*60*24*7*4
echo "Target disk is "$disk_name"."
reportDriveStatus () {
disk_connected_prev=$disk_connected
checkDriveStatus
if ! [ "$disk_connected" = "$disk_connected_prev" ]
then
if [ "$disk_connected" = 1 ]
then
if $voice_output
then
say -v "$string_voice" "$string_connected"
else
echo "$string_connected"
fi
else
if $voice_output
then
say -v "$string_voice" "$string_disconnected"
else
echo "$string_disconnected"
fi
fi
fi
}
checkDriveStatus () {
disks_count=0
if [ -d "$disk_path" ]
then
disk_connected=1
else
disk_connected=0
fi
}
wakeDrive() {
if [ -f "$waker_filecp" ]
then
rm "$waker_filecp"
else
cp "$waker_file" "$waker_filecp"
fi
}
if $voice_output
then
say -v "$string_voice" "$string_activated"
else
echo "$string_activated"
fi
coreCycle() {
for ((i=1; i <= cycles_number ; i++))
do
reportDriveStatus
# echo -n "$i "
if [ "$disk_connected" = 1 ]
then
wakeDrive
sleep 1
else
sleep 15
fi
done
}
coreCycle
Да, можно было сделать выделенную функцию для выдачи сообщений, но было уже лень (:
Здравствуйте, Григорий. Не подскажете — Ваш скрипт предназначен именно для внешнего диска? Если его использовать для внутреннего (с целью не дать ему парковать головки) — то какие изменения нужно внести в него? Заранее спасибо за возможный ответ.
Для внутреннего диска проще использовать hdparm.
[update]
Диск я продал, так что уже не могу проверить те или иные решения проблемы.
Даже вот: http://habrahabr.ru/blogs/apple/40549/
В конце статьи написано, как на низком уровне можно отрубить частую парковку головок для мака.
Под линуксом почти для всей линейки WD SCROPION BLUE подойдет комманда hdparm -B 255 /dev/sda (где sda это диск) начисто отключая эту богомерзкую парковку. Под FreeBSD ataidle -P 0 /dev/adx
Наверняка и под маком есть утилиты для работы с Advanced Power Management.