hdparm (Русский)

From ArchWiki

Состояние перевода: На этой странице представлен перевод статьи hdparm. Дата последней синхронизации: 27 марта 2023. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

hdparm и sdparm — инструменты командной строки для просмотра и изменения аппаратных параметров жёстких дисков. hdparm также можно использовать как простой инструмент для тестирования производительности.

Первоначально hdparm создавался для IDE-дисков, а sdparm — для SCSI-дисков. Начиная примерно с 2010 года, интерфейсы устройств хранения данных представляют собой улучшенную смесь IDE и SCSI, hdparm и sdparm дополняют друг друга.

Важно: Изменение параметров диска по умолчанию может привести к зависанию системы или даже необратимому повреждению диска.

Установка

Установите пакет hdparm. Для работы со SCSI-устройствами установите пакет sdparm.

Использование

Информация о диске

Для получения информации о жёстком диске выполните:

# hdparm -I /dev/sda

Тестирование производительности

Смотрите Benchmarking (Русский)#hdparm.

Настройка управления питанием

Современные жёсткие диски поддерживают множество функций управления питанием. Наиболее распространённые из них приведены в следующей таблице. Полный список доступен в hdparm(8).

Важно: Слишком агрессивное управление питанием может сократить срок службы жёстких дисков из-за частых парковок и остановок вращения.
Параметр Описание
-B Устанавливает Advanced Power Management. Возможные значения от 1 до 255, низкие значения означают более агрессивное управление питанием, а более высокие — лучшую производительность. Значения от 1 до 127 разрешают остановку вращения, а значения от 128 до 254 — нет. Значение 255 полностью отключает эту функцию.
-S Устанавливает таймаут ожидания (spindown) для диска. Задаёт время, которое бездействующий диск подождёт перед выключением двигателя для экономии энергии. Значение 0 отключает таймаут, значения от 1 до 240 задают значения кратные 5 секундам, а значения от 241 до 251 — кратные 30 минутам.
-M Устанавливает Automatic Acoustic Management. Большинство современных жёстких дисков имеют возможность замедлить движение головок для снижения уровня шума. Возможное значение зависит от диска, некоторые диски могут не поддерживать эту функцию.
Примечание:
  • При передаче обоих параметров -B и -S значения APM менее 128 могут привести к тому, что диск выключится до истечения таймаута -S. See [1].
  • Узнать текущие значения -S и -M нельзя.

Чтобы узнать текущее значение параметра -B, укажите его без значения:

# hdparm -B /dev/sda

Для изменения параметра, например, чтобы изменить APM на 127:

# hdparm -B 127 /dev/sda

Кэш записи

Кэширование записи — это процесс временного кэширования файлов во внутренней памяти диска перед их записью на сам диск, что повышает производительность. Эта функция предоставляется большинством жёстких дисков и в большинстве случаев включена по умолчанию. Чтобы проверить, так ли это, выполните:

$ hdparm -W /dev/sdX
Важно: Хотя кэш записи повышает производительность, есть и обратная сторона: его использование повышает риск потери данных при внезапном отключении питания.

Если он отключен, его можно включить такой командой:

$ hdparm -W 1 /dev/sdX

А отключить — такой:

$ hdparm -W 0 /dev/sdX

Отключение питания жёсткого диска

Типичная ситуация, когда это может понадобиться, — при использовании дисков, подключенных к дешёвому внешнему USB/SATA/FireWire корпусу или мосту. Если он не отправляет диску команду остановки должным образом при отключении питания, диск вынужден выполнять аварийную парковку головок. Регулярное выполнение аварийных парковок рано или поздно приведёт к поломке накопителя. Одно из решений заключается в том, чтобы, убедившись, что данные записаны на носитель, отправить диску команду выключения питания:

# hdparm -Y /dev/sdX
Важно: Обязательно убедитесь, что
  1. Данные действительно были записаны на носитель. Рекомендуется также подождать некоторое время, чтобы диск перёшел в режим ожидания.
  2. Устройство, в данном примере /dev/sdX, действительно является именно тем устройством, которое вы хотите отключить.

Советы и рекомендации

Запрос состояния диска без его пробуждения

Известно, что запрос состояния в hdparm будит некоторые диски. В этом случае попробуйте использовать команду smartctl из пакета smartmontools для выполнения запроса состояния, который не разбудит спящий диск. Например:

# smartctl -i -n standby /dev/sda
smartctl 6.5 2016-05-07 r4318 [x86_64-linux-4.10.13-1-ARCH] (local build)
Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org

Device is in STANDBY mode, exit(2)

Сохранение настроек с помощью правила udev

Чтобы настройки сохранялись при перезагрузках, можно использовать правило udev:

/etc/udev/rules.d/69-hdparm.rules
ACTION=="add", SUBSYSTEM=="block", KERNEL=="sda", RUN+="/usr/bin/hdparm -B 254 -S 0 /dev/sda"

Поскольку название диска /dev/sdX может меняться случайным образом, идентифицировать диск также можно по его серийному номеру, как описано в разделе udev (Русский)#Определение диска по серийному номеру.

Системы с несколькими жёсткими дисками могут гибко применять это правило в соответствии с некоторыми критериями. Например, чтобы применить настройки питания ко всем вращающимся дискам (жёсткий диск с вращающейся головкой, исключая, в частности, твердотельные накопители), используйте следующее правило:

/etc/udev/rules.d/69-hdparm.rules
ACTION=="add|change", KERNEL=="sd[a-z]", ATTRS{queue/rotational}=="1", RUN+="/usr/bin/hdparm -B 127 /dev/%k"

Применение настроек после пробуждения из сна

Если после возвращения системы из ждущего или спящего режима настройки теряются, их можно применить повторно с помощью system-sleep.

Создайте скрипт в каталоге /usr/lib/systemd/system-sleep/ и сделайте его исполняемым:

/usr/lib/systemd/system-sleep/hdparm
#!/bin/sh

case $1 in post)
        /usr/bin/hdparm -B 254 -S 0 /dev/sda
        ;;
esac

Перевод диска в спящий режим сразу после загрузки

Устройство, к которому редко обращаются, можно перевести в спящий режим сразу после загрузки системы. Это не работает с приведённым выше правилом udev, потому что оно срабатывает слишком рано. Чтобы отправить диску команду после завершения загрузки, можно создать службу systemd и включить её:

/etc/systemd/system/hdparm.service
[Unit]
Description=hdparm sleep

[Service]
Type=oneshot
ExecStart=/usr/bin/hdparm -q -S 120 -y /dev/sdb

[Install]
WantedBy=multi-user.target

Работа с неподдерживаемыми устройствами

Некоторые диски не поддерживают остановку вращения через hdparm. Диагностическое сообщение об ошибке, подобное следующему, является хорошим признаком того, что дело обстоит именно так:

# hdparm -S 240 /dev/sda
/dev/sda:
setting standby to 240 (20 minutes)
HDIO_DRIVE_CMD(setidle) failed: Invalid argument

На некоторых дисках команда hdparm успешно выполняется, но диск не следует заданным параметрам (APM или таймаут spindown). Это наблюдалось с жёстким диском Toshiba P300 (model HDWD120).

Некоторые диски можно остановить с помощью hd-idleAUR, который предоставляет службу systemd. Отредактируйте значение HD_IDLE_OPTS в файле /etc/conf.d/hd-idle, затем запустите и включите службу hd-idle.service.

Пример, использующий время бездействия 10 минут для /dev/sda и 1 минуту для /dev/disk/by-uuid/01CF0AC9AA5EAF70:

HD_IDLE_OPTS="-i 0 -a /dev/sda -i 600 -a /dev/disk/by-uuid/01CF0AC9AA5EAF70 -i 60"

Параметр -i 0 в начале означает, что для остальных дисков hd-idle отключен.

Управление питанием Western Digital Green

Жёсткие диски Western Digital Green имеют специальный таймер idle3, который контролирует время бездействия диска перед парковкой головок и переходом в состояние низкого энергопотребления. По умолчанию установлено очень маленькое значение 8 секунд, что может привести к тысячам парковок головок за короткий промежуток времени и в конечном итоге к преждевременному выходу из строя, не говоря уже о влиянии на производительность диска, которому часто приходится просыпаться перед выполнением обычного ввода/вывода. Компания Western Digital выступила с заявлением, в котором утверждается, что Linux не оптимизирован для устройств хранения данных с низким энергопотреблением, и советует уменьшить частоту логирования. Есть несколько способов изменения idle3:

  1. Western Digital поставляет DOS-утилиту wdidle3.exe для настройки этого параметра. Она предназначена только для обновления прошивки следующих жёстких дисков: WD1000FYPS, WD7500AYPS, WD7501AYPS, но известно, что она может изменять таймер idle3 и на других моделях Green.
  2. hdparm предоставляет реализацию, созданную с помощью реверс-инжиниринга, с флагом -J, которая не так полна, как оригинальная официальная программа, хотя, похоже, она работает по крайней мере на нескольких дисках. Для использования в Linux рекомендуется значение 30 секунд. Можно указать ноль (0), чтобы полностью отключить таймер WD idle3 (не рекомендуется):
    # hdparm -J 30 --please-destroy-my-drive /dev/sda
    Для автоматического применения этого параметра на поддерживаемых дисках смотрите раздел #Сохранение настроек с помощью правила udev.
  3. Ещё одна неофициальная утилита предоставляется пакетом idle3-tools. Сырое значение idle3 передаётся в качестве параметра команде idle3ctl. Соответствие между этим значением и таймаутом в секундах указано в таблице в idle3ctl(8). Следующая команда устанавливает таймер на 30 секунд:
    # idle3ctl -s 129 /dev/sdc
    Следующая команда полностью отключает таймер (не рекомендуется):
    # idle3ctl -d /dev/sdc
Примечание:
  • Для применения изменения требуется полное отключение питания диска, независимо от используемой программы из списка выше. Это означает, что диск необходимо полностью выключить, а затем включить; простой перезагрузки системы недостаточно.
  • Также известно, что некоторые диски Western Digital Green по-другому интерпретируют параметр таймаута ожидания hdparm -S 1, в результате чего таймер работает 10 минут, а не 5 секунд.
  • Энергопотребление диска Green обычно составляет около 5,3 Вт во время чтения/записи, 4,7 Вт при бездействии и 0,7 Вт в режиме ожидания.

Решение проблем

Значение APM сбрасывается после сна

Значение APM может сбрасываться после ждущего режима и требовать повторного изменения параметра после каждого пробуждения. Это можно автоматизировать с помощью следующего юнита systemd (адаптировано из темы на форуме):

/etc/systemd/system/apm.service
[Unit]
Description=Local system resume actions
After=suspend.target hybrid-sleep.target hibernate.target

[Service]
Type=simple
ExecStart=/usr/bin/hdparm -B 254 /dev/sda

[Install]
WantedBy=sleep.target
Примечание: Цель sleep.target подтягивается всеми целями suspend, hybrid-sleep и hibernate, но она завершает свой запуск перед фактическим уходом системы в сон, поэтому эти три цели должны быть указаны явно. Смотрите [2].

В качестве альтернативы можно создать хук в /usr/lib/systemd/system-sleep.

Смотрите также