WD Scorpio blue 640 Gb drive
Жёсткий диск 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

Да, можно было сделать выделенную функцию для выдачи сообщений, но было уже лень (:

4 thoughts on “Решение проблемы: WD Scorpio Blue 640 Gb (WD6400BEVT) раскручивается и останавливается, macOS”

  1. Здравствуйте, Григорий. Не подскажете — Ваш скрипт предназначен именно для внешнего диска? Если его использовать для внутреннего (с целью не дать ему парковать головки) — то какие изменения нужно внести в него? Заранее спасибо за возможный ответ.

  2. Под линуксом почти для всей линейки WD SCROPION BLUE подойдет комманда hdparm -B 255 /dev/sda (где sda это диск) начисто отключая эту богомерзкую парковку. Под FreeBSD ataidle -P 0 /dev/adx
    Наверняка и под маком есть утилиты для работы с Advanced Power Management.

Добавить комментарий