Вопрос или проблема
Я хотел бы, чтобы deadline
стал планировщиком ввода-вывода по умолчанию для моей системы, и я не хочу потерять эту конфигурацию при перезагрузке. Как правильно это сделать? (Я использую Debian)
Некоторые подсказки:
- иметь скрипт запуска, который выполняет
echo deadline >| /sys/block/sda/queue/scheduler
, - использовать параметр ядра
elevator=deadline
в конфигурации загрузчика GRUB, - использовать правило
udev
типаSUBSYSTEM=="block", ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="deadline"
, - и т.д.
Какое “предпочтительное” решение?
ИЗМЕНЕНИЕ: могу ли я иметь конфигурацию, которая устанавливает iosched на deadline
только для дисков, присутствующих при загрузке, но не для последующих подключенных горячим способом дисков (например, USB-накопителей)?
Это действительно зависит от ситуации. При равных других условиях, я бы предпочел подход с GRUB, просто потому что он простой и вы получаете выбранный вами планировщик сразу в начале загрузки.
Основная проблема в том, что это системная настройка, и если у вас больше одного диска и вы хотите разные планировщики для каждого, то это не подойдет. Подход с udev
лучше в этом случае, он предлагает более детальный контроль. Вы даже можете установить разные планировщики для внешних дисков, и они будут активированы при подключении.
Наименее предпочтительный для меня вариант – это скрипт запуска. Варианты здесь либо положить его в скрипт /etc/rc.local
, в этом случае планировщик не изменится до (очень) позднего момента загрузки, либо включить его с другими скриптами sysvinit
. Последний вариант самый сложный, так как требует написания LSB
тегов и т.д., чтобы сделать это правильно. Кроме того, для меня, по крайней мере, сложнее надежно получить правильный диск через /sys
. Обратите внимание, что пример, который вы приводите, не сработает, если диск, для которого вы пытаетесь установить планировщик, больше не является sda
по какой-либо причине. С помощью udev
вы можете сопоставить устройство(а) в зависимости от различных свойств.
Правила udev – хороший способ установить планировщик блока. Например, это общее правило активирует bfq на всех устройствах, где это возможно.
/etc/udev/rules.d/10-io-scheduler.rules
:
# Установить планировщик ввода-вывода в bfq, если это поддерживается.
ACTION=="add|change", ATTR{queue/scheduler}=="*bfq*", \
ATTR{queue/scheduler}="bfq"
Ответ или решение
Для установки планировщика ввода-вывода (IO scheduler) по умолчанию на Linux, особенно в рамках системы Debian, важно учитывать несколько способов, каждый из которых имеет свои преимущества и недостатки. Если вашей целью является установка планировщика deadline и сохранение этого параметра после перезагрузки, существуют несколько методов, каждый из которых подойдет для различных сценариев использования.
1. Использование параметра ядра в GRUB
Наиболее простым и надежным методом является использование параметра ядра elevator=deadline
в конфигурации загрузчика GRUB. Это гарантирует, что выбранный планировщик будет активирован на начальном этапе загрузки системы, и срок действия данной настройки будет сохраняться при каждой загрузке. Чтобы применить этот метод, выполните следующие шаги:
-
Откройте файл конфигурации GRUB:
sudo nano /etc/default/grub
-
Найдите строку:
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
и измените ее на:
GRUB_CMDLINE_LINUX_DEFAULT="quiet elevator=deadline"
-
Обновите конфигурацию GRUB:
sudo update-grub
После перезагрузки системы планировщик ввода-вывода будет установлен на deadline.
2. Создание udev-правила
Если вам необходимо более гибкое решение (например, разные планировщики для разных дисков), рекомендуется использовать udev правила. Это позволяет настроить планировщик для конкретных устройств, а также управлять ими в реальном времени.
-
Создайте новый файл для правил udev:
sudo nano /etc/udev/rules.d/10-io-scheduler.rules
-
Добавьте следующее правило для установки планировщика deadline:
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="deadline"
Это правило будет применяться к всем блочным устройствам с именами, начинающимися на «sd».
-
Перезагрузите службу udev для применения изменений:
sudo udevadm control --reload-rules sudo udevadm trigger
Это решение позволяет установить планировщик «deadline» только для дисков, подключенных в момент загрузки, не затрагивая последующие горячие подключения.
3. Скрипт при старте системы
Хотя это менее предпочтительно, вы также можете создать скрипт для установки планировщика во время загрузки. Однако это не самый надежный способ, так как может привести к задержкам в применении правил:
-
Откройте файл
/etc/rc.local
(или создайте его, если его нет):sudo nano /etc/rc.local
-
Добавьте следующую строку перед
exit 0
:echo deadline >| /sys/block/sda/queue/scheduler
Это не является оптимальным вариантом, так как может не сработать, если диск в определенный момент не будет называться sda
.
Вывод
На основании вышеизложенного, выбор подхода зависит от ваших конкретных требований. Если вам нужен простой и универсальный подход, параметр ядра GRUB будет лучшим выбором. Для более сложных сценариев, включая использование различных планировщиков для разных устройств, используйте udev-правила. Метод с использованием скриптов при старте системы следует рассматривать как последний вариант.
В конечном итоге, учитывайте, что правильный выбор способа установки планировщика будет зависеть от ваших нужд и конфигурации системы.