Настройка времени ожидания простоя с помощью hdparm во время загрузки через правило udev не работает.

Вопрос или проблема

Я установил уровень APM и таймаут простоя для своих жестких дисков во время загрузки с помощью правила udev:

ACTION=="add|change", KERNEL=="sd[b-z]", ATTR{queue/rotational}=="1", RUN+="/usr/bin/hdparm -B 63 -S 36 /dev/%k"

Я проверил, что правило выполняется, заменив команду RUN на создание файла и с помощью udevadm test /sys/class/block/sdb:

вызываем: test
версия 227
Эта программа предназначена только для отладки, она не запускает никакую программу
указанную ключом RUN. Она может показать неверные результаты, потому что
некоторые значения могут отличаться или быть недоступны в процессе симуляции.

=== три для диска ===
версия инструмента:          227
размер файла:         6660537 байт
размер заголовка             80 байт
строки            1715721 байт
узлы              4944736 байт
Загрузка индекса модуля
временная метка '/etc/systemd/network' изменилась
Обработан файл конфигурации /usr/lib/systemd/network/99-default.link
Создан контекст конфигурации ссылки.
временная метка '/etc/udev/rules.d' изменилась
Чтение файла правил: /usr/lib/udev/rules.d/10-dm.rules
Чтение файла правил: /usr/lib/udev/rules.d/11-dm-lvm.rules
Чтение файла правил: /usr/lib/udev/rules.d/13-dm-disk.rules
Чтение файла правил: /etc/udev/rules.d/50-hdparm.rules
Чтение файла правил: /usr/lib/udev/rules.d/50-udev-default.rules
Чтение файла правил: /etc/udev/rules.d/51-tests.rules
Чтение файла правил: /usr/lib/udev/rules.d/60-block.rules
Чтение файла правил: /usr/lib/udev/rules.d/60-cdrom_id.rules
Чтение файла правил: /usr/lib/udev/rules.d/60-drm.rules
Чтение файла правил: /usr/lib/udev/rules.d/60-evdev.rules
Чтение файла правил: /usr/lib/udev/rules.d/60-pcmcia.rules
Чтение файла правил: /usr/lib/udev/rules.d/60-persistent-alsa.rules
Чтение файла правил: /usr/lib/udev/rules.d/60-persistent-input.rules
Чтение файла правил: /usr/lib/udev/rules.d/60-persistent-storage-tape.rules
Чтение файла правил: /usr/lib/udev/rules.d/60-persistent-storage.rules
Чтение файла правил: /usr/lib/udev/rules.d/60-persistent-v4l.rules
Чтение файла правил: /usr/lib/udev/rules.d/60-serial.rules
Чтение файла правил: /usr/lib/udev/rules.d/63-md-raid-arrays.rules
Чтение файла правил: /usr/lib/udev/rules.d/64-btrfs.rules
Чтение файла правил: /usr/lib/udev/rules.d/64-md-raid-assembly.rules
Чтение файла правил: /usr/lib/udev/rules.d/69-dm-lvm-metad.rules
Чтение файла правил: /usr/lib/udev/rules.d/70-mouse.rules
Чтение файла правил: /usr/lib/udev/rules.d/70-power-switch.rules
Чтение файла правил: /usr/lib/udev/rules.d/70-uaccess.rules
Чтение файла правил: /usr/lib/udev/rules.d/71-seat.rules
Чтение файла правил: /usr/lib/udev/rules.d/73-seat-late.rules
Чтение файла правил: /usr/lib/udev/rules.d/75-net-description.rules
Чтение файла правил: /usr/lib/udev/rules.d/75-probe_mtd.rules
Чтение файла правил: /usr/lib/udev/rules.d/78-sound-card.rules
Чтение файла правил: /usr/lib/udev/rules.d/80-drivers.rules
Чтение файла правил: /usr/lib/udev/rules.d/80-net-setup-link.rules
Чтение файла правил: /usr/lib/udev/rules.d/85-regulatory.rules
Чтение файла правил: /usr/lib/udev/rules.d/90-vconsole.rules
Чтение файла правил: /usr/lib/udev/rules.d/95-dm-notify.rules
Чтение файла правил: /usr/lib/udev/rules.d/99-systemd.rules
правила содержат 24576 байт токенов (2048 * 12 байт), 11755 байт строк
1710 строк (21440 байт), 1124 уникализировано (10272 байт), 587 узлов три использовано
RUN '/usr/bin/hdparm -B 63 -S 36 /dev/%k' /etc/udev/rules.d/50-hdparm.rules:1
GROUP 6 /usr/lib/udev/rules.d/50-udev-default.rules:55
RUN '/usr/bin/touch /tmp/udev-%k' /etc/udev/rules.d/51-tests.rules:1
IMPORT 'ata_id --export /dev/sdb' /usr/lib/udev/rules.d/60-persistent-storage.rules:22
запуск 'ata_id --export /dev/sdb'
'ata_id --export /dev/sdb'(out) 'ID_ATA=1'
'ata_id --export /dev/sdb'(out) 'ID_TYPE=disk'
'ata_id --export /dev/sdb'(out) 'ID_BUS=ata'
'ata_id --export /dev/sdb'(out) 'ID_MODEL=ST2000VN000-1HJ164'
'ata_id --export /dev/sdb'(out) 'ID_MODEL_ENC=ST2000VN000-1HJ164\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'
'ata_id --export /dev/sdb'(out) 'ID_REVISION=SC60'
'ata_id --export /dev/sdb'(out) 'ID_SERIAL=ST2000VN000-1HJ164_W7209GX3'
'ata_id --export /dev/sdb'(out) 'ID_SERIAL_SHORT=W7209GX3'
'ata_id --export /dev/sdb'(out) 'ID_ATA_WRITE_CACHE=1'
'ata_id --export /dev/sdb'(out) 'ID_ATA_WRITE_CACHE_ENABLED=1'
'ata_id --export /dev/sdb'(out) 'ID_ATA_FEATURE_SET_HPA=1'
'ata_id --export /dev/sdb'(out) 'ID_ATA_FEATURE_SET_HPA_ENABLED=1'
'ata_id --export /dev/sdb'(out) 'ID_ATA_FEATURE_SET_PM=1'
'ata_id --export /dev/sdb'(out) 'ID_ATA_FEATURE_SET_PM_ENABLED=1'
'ata_id --export /dev/sdb'(out) 'ID_ATA_FEATURE_SET_SECURITY=1'
'ata_id --export /dev/sdb'(out) 'ID_ATA_FEATURE_SET_SECURITY_ENABLED=0'
'ata_id --export /dev/sdb'(out) 'ID_ATA_FEATURE_SET_SECURITY_ERASE_UNIT_MIN=236'
'ata_id --export /dev/sdb'(out) 'ID_ATA_FEATURE_SET_SECURITY_ENHANCED_ERASE_UNIT_MIN=236'
'ata_id --export /dev/sdb'(out) 'ID_ATA_FEATURE_SET_SMART=1'
'ata_id --export /dev/sdb'(out) 'ID_ATA_FEATURE_SET_SMART_ENABLED=1'
'ata_id --export /dev/sdb'(out) 'ID_ATA_FEATURE_SET_PUIS=1'
'ata_id --export /dev/sdb'(out) 'ID_ATA_FEATURE_SET_PUIS_ENABLED=0'
'ata_id --export /dev/sdb'(out) 'ID_ATA_FEATURE_SET_APM=1'
'ata_id --export /dev/sdb'(out) 'ID_ATA_FEATURE_SET_APM_ENABLED=1'
'ata_id --export /dev/sdb'(out) 'ID_ATA_FEATURE_SET_APM_CURRENT_VALUE=63'
'ata_id --export /dev/sdb'(out) 'ID_ATA_DOWNLOAD_MICROCODE=1'
'ata_id --export /dev/sdb'(out) 'ID_ATA_SATA=1'
'ata_id --export /dev/sdb'(out) 'ID_ATA_SATA_SIGNAL_RATE_GEN2=1'
'ata_id --export /dev/sdb'(out) 'ID_ATA_SATA_SIGNAL_RATE_GEN1=1'
'ata_id --export /dev/sdb'(out) 'ID_ATA_ROTATION_RATE_RPM=5900'
'ata_id --export /dev/sdb'(out) 'ID_WWN=0x5000c5008b32e037'
'ata_id --export /dev/sdb'(out) 'ID_WWN_WITH_EXTENSION=0x5000c5008b32e037'
Процесс 'ata_id --export /dev/sdb' завершился успешно.
LINK 'disk/by-id/ata-ST2000VN000-1HJ164_W7209GX3' /usr/lib/udev/rules.d/60-persistent-storage.rules:36
IMPORT встроенный 'path_id' /usr/lib/udev/rules.d/60-persistent-storage.rules:54
LINK 'disk/by-path/pci-0000:01:00.0-ata-1' /usr/lib/udev/rules.d/60-persistent-storage.rules:55
IMPORT встроенный 'blkid' /usr/lib/udev/rules.d/60-persistent-storage.rules:66
probe /dev/sdb raid offset=0
LINK 'disk/by-id/wwn-0x5000c5008b32e037' /usr/lib/udev/rules.d/60-persistent-storage.rules:73
обработка узла устройства '/dev/sdb', devnum=b8:16, mode=0660, uid=0, gid=6
сохранить разрешения /dev/sdb, 060660, uid=0, gid=6
оставить уже существующий символ '/dev/block/8:16' на '../sdb'
найден 'b8:16', заявляющий '/run/udev/links/\x2fdisk\x2fby-id\x2fata-ST2000VN000-1HJ164_W7209GX3'
создана ссылка '/dev/disk/by-id/ata-ST2000VN000-1HJ164_W7209GX3' на '/dev/sdb'
оставить уже существующий символ '/dev/disk/by-id/ata-ST2000VN000-1HJ164_W7209GX3' на '../../sdb'
найден 'b8:16', заявляющий '/run/udev/links/\x2fdisk\x2fby-id\x2fwwn-0x5000c5008b32e037'
создана ссылка '/dev/disk/by-id/wwn-0x5000c5008b32e037' на '/dev/sdb'
оставить уже существующий символ '/dev/disk/by-id/wwn-0x5000c5008b32e037' на '../../sdb'
найден 'b8:16', заявляющий '/run/udev/links/\x2fdisk\x2fby-path\x2fpci-0000:01:00.0-ata-1'
создана ссылка '/dev/disk/by-path/pci-0000:01:00.0-ata-1' на '/dev/sdb'
оставить уже существующий символ '/dev/disk/by-path/pci-0000:01:00.0-ata-1' на '../../sdb'
создан файл БД '/run/udev/data/b8:16' для '/devices/pci0000:00/0000:00:02.1/0000:01:00.0/ata3/host2/target2:0:0/2:0:0:0/block/sdb'
.ID_FS_TYPE_NEW=
ACTION=add
DEVLINKS=/dev/disk/by-path/pci-0000:01:00.0-ata-1 /dev/disk/by-id/wwn-0x5000c5008b32e037 /dev/disk/by-id/ata-ST2000VN000-1HJ164_W7209GX3
DEVNAME=/dev/sdb
DEVPATH=/devices/pci0000:00/0000:00:02.1/0000:01:00.0/ata3/host2/target2:0:0/2:0:0:0/block/sdb
DEVTYPE=disk
ID_ATA=1
ID_ATA_DOWNLOAD_MICROCODE=1
ID_ATA_FEATURE_SET_APM=1
ID_ATA_FEATURE_SET_APM_CURRENT_VALUE=63
ID_ATA_FEATURE_SET_APM_ENABLED=1
ID_ATA_FEATURE_SET_HPA=1
ID_ATA_FEATURE_SET_HPA_ENABLED=1
ID_ATA_FEATURE_SET_PM=1
ID_ATA_FEATURE_SET_PM_ENABLED=1
ID_ATA_FEATURE_SET_PUIS=1
ID_ATA_FEATURE_SET_PUIS_ENABLED=0
ID_ATA_FEATURE_SET_SECURITY=1
ID_ATA_FEATURE_SET_SECURITY_ENABLED=0
ID_ATA_FEATURE_SET_SECURITY_ENHANCED_ERASE_UNIT_MIN=236
ID_ATA_FEATURE_SET_SECURITY_ERASE_UNIT_MIN=236
ID_ATA_FEATURE_SET_SMART=1
ID_ATA_FEATURE_SET_SMART_ENABLED=1
ID_ATA_ROTATION_RATE_RPM=5900
ID_ATA_SATA=1
ID_ATA_SATA_SIGNAL_RATE_GEN1=1
ID_ATA_SATA_SIGNAL_RATE_GEN2=1
ID_ATA_WRITE_CACHE=1
ID_ATA_WRITE_CACHE_ENABLED=1
ID_BUS=ata
ID_FS_TYPE=
ID_MODEL=ST2000VN000-1HJ164
ID_MODEL_ENC=ST2000VN000-1HJ164\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20
ID_PART_TABLE_TYPE=gpt
ID_PART_TABLE_UUID=fde78847-0d93-4ab7-bd9c-47d6dff3bf35
ID_PATH=pci-0000:01:00.0-ata-1
ID_PATH_TAG=pci-0000_01_00_0-ata-1
ID_REVISION=SC60
ID_SERIAL=ST2000VN000-1HJ164_W7209GX3
ID_SERIAL_SHORT=W7209GX3
ID_TYPE=disk
ID_WWN=0x5000c5008b32e037
ID_WWN_WITH_EXTENSION=0x5000c5008b32e037
MAJOR=8
MINOR=16
SUBSYSTEM=block
TAGS=:systemd:
USEC_INITIALIZED=5571888
run: '/usr/bin/hdparm -B 63 -S 36 /dev/sdb'
run: '/usr/bin/touch /tmp/udev-sdb'
Снять загрузку индекса модуля
Контекст конфигурации ссылки выгружен.

Как вы можете видеть (ближе к концу), команда

/usr/bin/hdparm -B 63 -S 36 /dev/sdb

выполняется.

Проблема в том, что диски не переходят в режим ожидания через 3 минуты после загрузки, т.е. опция -S 36 не применяется. Однако APM установлен на 63, как показывает hdparm -B.

Если я войду под root после загрузки и снова выполню команду hdparm выше, таймер ожидания устанавливается на 3 минуты, и жесткие диски действительно переходят в режим ожидания, как и ожидалось.

Какие-либо идеи, почему hdparm -S 36 не применяется, если запускается udev во время загрузки?

Я столкнулся с той же проблемой и заметил, что hdparm на самом деле находится по адресу /usr/sbin/hdparm

Ответ или решение

Установка времени ожидания в режиме ожидания с помощью hdparm через правило udev не работает

Вы сталкиваетесь с проблемой, когда правило udev, предназначенное для настройки уровней APM и времени ожидания жестких дисков при загрузке, не выполняет команду -S 36 для установки времени ожидания. Давайте рассмотрим возможные причины и решения этой проблемы.

Проблема

Ваше правило udev выглядит следующим образом:

ACTION=="add|change", KERNEL=="sd[b-z]", ATTR{queue/rotational}=="1", RUN+="/usr/bin/hdparm -B 63 -S 36 /dev/%k"

Вы проверили, что правило выполняется, но команда hdparm -S не работает так, как предполагалось. Диски не уходит в режим ожидания через 3 минуты после загрузки, в то время как команда hdparm -B 63 -S 36 /dev/sdb работает корректно, если выполнять её вручную после загрузки.

Возможные причины

  1. Разное местоположение утилиты hdparm:
    Как вы правильно заметили, утилита hdparm может находиться в папке /usr/sbin, а не в /usr/bin. Запуск команды с неправильным путем может привести к её неисполнению. Проверьте и исправьте правило udev следующим образом:

    RUN+="/usr/sbin/hdparm -B 63 -S 36 /dev/%k"
  2. Проблемы с правами доступа:
    Убедитесь, что у udev есть необходимые права для выполнения этой команды. Команды, запускаемые udev, могут выполняться с ограниченными правами. Для устранения этой проблемы можно попробовать установить выполнение команды от имени пользователя root, однако для этого потребуется более полное понимание механизма, используя такие утилиты, как sudo.

  3. Необходимость в дополнительных ожиданиях:
    Иногда устройства не готовы к моменту выполнения правил udev. Это может произойти, если система получает устройство недостаточно быстро. Вы можете добавить задержку в выполнение команды, используя утилиту sleep:

    RUN+="/bin/sleep 1; /usr/sbin/hdparm -B 63 -S 36 /dev/%k"

    Этот метод придаст вашей системе немного времени для полной инициализации жестких дисков.

  4. Системная конфигурация:
    Убедитесь, что ваша система и драйверы поддерживают управление питанием таким образом, как вы ожидаете. Различные версии ядра и конфигурации систем могут обрабатывать управление питанием по-разному.

  5. Логирование и отладка:
    Расширьте отладку вашего правила. Вы можете перенаправить вывод команды в файл журнала для анализа:

    RUN+="/usr/sbin/hdparm -B 63 -S 36 /dev/%k > /tmp/hdparm.log 2>&1"

    Это поможет вам понять, есть ли какие-то ошибки или предупреждения при выполнении команды.

Заключение

Для эффективного задания времени ожидания через hdparm с помощью правил udev, убедитесь, что вы используете правильный путь к утилите, проверяйте права доступа, добавьте возможные задержки в выполнение и логируйте вывод для дальнейшего анализа. Следуя этим рекомендациям, вы сможете успешно настроить режим ожидания ваших дисков.

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

Капча загружается...