Имена устройств не всегда гарантированно присоединяются к одним и тем же физическим дискам после перезагрузки. В некоторых случаях имена дисков по умолчанию могут быть переупорядочены, так что /dev/sdX и /dev/sdY могут указывать на разные дисковые устройства после перезагрузки. Изменение порядка дисков может произойти, если на вашем сервере установлено более одного контроллера дисков SATA, SCSI или IDE. Порядок, в котором добавляются соответствующие узлы устройств, произвольный. Существует четыре различных схемы постоянного именования дисков: by-label, by-uuid, by-id (WWID) и by-path.
В этой статье я расскажу как написать правило UDEV для смены типа I/O планировщика на основе привязки к WWID диска.
Исходные данные: ОС Oracle Linux 7;
Задача: Активация i/o планировщика mq-deadline для определенных дисков на основе WWID
WWID (World Wide Identifier) — это уникальный идентификатор устройства и он никогда не меняется в отличии от пути блочного устройства (/dev/sdX или /dev/sdY).
Определить WWID можно достаточно легко с помощью команды ls
# ls -al /dev/disk/by-id/ total 0 drwxr-xr-x 2 root root 400 Dec 17 18:58 . drwxr-xr-x 8 root root 160 Dec 17 18:58 .. lrwxrwxrwx 1 root root 9 Dec 22 21:59 scsi-3600062b205512f8027668785bc704b31 -> ../../sda lrwxrwxrwx 1 root root 10 Dec 22 21:59 scsi-3600062b205512f8027668785bc704b31-part1 -> ../../sda1 lrwxrwxrwx 1 root root 10 Dec 22 21:59 scsi-3600062b205512f8027668785bc704b31-part2 -> ../../sda2 lrwxrwxrwx 1 root root 10 Dec 22 21:59 scsi-3600062b205512f8027668785bc704b31-part3 -> ../../sda3 lrwxrwxrwx 1 root root 9 Dec 22 21:59 scsi-3600062b205512f80276687bf11fc0cc9 -> ../../sdb lrwxrwxrwx 1 root root 10 Dec 22 21:59 scsi-3600062b205512f80276687bf11fc0cc9-part1 -> ../../sdb1 lrwxrwxrwx 1 root root 9 Dec 22 21:59 wwn-0x600062b205512f8027668785bc704b31 -> ../../sda lrwxrwxrwx 1 root root 10 Dec 22 21:59 wwn-0x600062b205512f8027668785bc704b31-part1 -> ../../sda1 lrwxrwxrwx 1 root root 10 Dec 22 21:59 wwn-0x600062b205512f8027668785bc704b31-part2 -> ../../sda2 lrwxrwxrwx 1 root root 10 Dec 22 21:59 wwn-0x600062b205512f8027668785bc704b31-part3 -> ../../sda3 lrwxrwxrwx 1 root root 9 Dec 22 21:59 wwn-0x600062b205512f80276687bf11fc0cc9 -> ../../sdb lrwxrwxrwx 1 root root 10 Dec 22 21:59 wwn-0x600062b205512f80276687bf11fc0cc9-part1 -> ../../sdb1
Здесь мы видим, что на сервере есть 2 диска: /dev/sda и /dev/sdb
Я точно знаю, что диск /dev/sda — это SAS диск т.к. на нем находятся 3 раздела с ОС, а диск /dev/sdb — это SSD диск для базы данных.
Но проблема в том, что иногда имена устройств меняются и /dev/sda становится SSD диском, а /dev/sdb — SAS.
Мне необходимо настроить определенные параметры для каждого диска, в частности queue/scheduler, queue/rotational и read_ahead_kb для SSD диска.
В статье Установка нового ядра UEK на Oracle Linux 7.6 и активация I/O Scheduler mq-deadline или kyber я описывал как создать правило UDEV, то там шла привязка к имени устройства.
Чтобы узнать WWID для /dev/sda выполните:
udevadm info --attribute-walk --name=/dev/sda | grep wwid
Результат:
ATTRS{wwid}=="naa.600062b205512f8027668785bc704b31"
Чтобы узнать WWID для /dev/sdb выполните:
udevadm info --attribute-walk --name=/dev/sdb | grep wwid
Результат:
ATTRS{wwid}=="naa.600062b205512f80276687bf11fc0cc9"
Далее мы пропишем в файле /etc/udev/rules.d/60-schedulers.rules правила для UDEV с привязкой к WWID (не копируйте мои правило не поняв что в нем меняется!):
ACTION=="add|change", SUBSYSTEM=="block", ATTRS{wwid}=="naa.600062b205512f8027668785bc704b31", ATTR{queue/rotational}="1", ATTR{queue/scheduler}="mq-deadline" ACTION=="add|change", SUBSYSTEM=="block", ATTRS{wwid}=="naa.600062b205512f80276687bf11fc0cc9", ATTR{bdi/read_ahead_kb}="16384", ATTR{queue/rotational}="0", ATTR{queue/scheduler}="mq-deadline"
У нас 2 правила: в первой строке мы меняем 2 параметра для /dev/sda — это queue/rotational и queue/scheduler, во второй строке мы меняем 3 параметра для /dev/sdb — это read_ahead_kb, queue/rotational и queue/scheduler.
После внесения изменений не забываем выполнить пару команд udevadm для перезагрузки правил и их применения:
udevadm control --reload-rules udevadm trigger --type=devices --action=change
Теперь проверим установленные параметры:
# cat /sys/block/sda/queue/scheduler [mq-deadline] kyber bfq none # cat /sys/block/sda/queue/rotational 1 # cat /sys/block/sda/queue/read_ahead_kb 128 # cat /sys/block/sdb/queue/scheduler [mq-deadline] kyber bfq none # cat /sys/block/sdb/queue/rotational 0 # cat /sys/block/sdb/queue/read_ahead_kb 16384
Как мы видим, нужные параметры применились к нужным дискам по их WWID.
На этом все, до скорых встреч. Если у Вас возникли вопросы или Вы хотите чтобы я помог Вам, то Вы всегда можете связаться со мной разными доступными способами.
Профессионально занимаюсь системным администрированием Linux -серверов и баз данных (MySQL, PostgreSQL) на протяжении последних 24 лет.