Измените планировщик ввода-вывода, не используя sd * для обращения к диску - PullRequest
1 голос
/ 03 сентября 2011

Я бы хотел изменить планировщик ввода-вывода на крайний срок для одного конкретного диска в моей системе.Однако все ресурсы, которые я нашел, используют методы, которые я не могу использовать, потому что они либо ссылаются на диск с помощью sd * (sda, sdb и т. Д.), Либо используют Grub вместо Grub2.

Причина, по которой я могуИспользование меток, таких как sd *, для обозначения диска очевидно: оно может и будет изменено для диска.Я посмотрел на UUID (/ dev / disk / by-uuid), чтобы увидеть, могут ли они предложить решение, но, увы.Множество ресурсов, найденных в Интернете, говорят о ссылках на диск или диск с помощью UUID, в то время как вы действительно можете ссылаться только на раздел на диске.Мне кажется, что ссылка на разделы, использующие UUID, - это долгожданное изменение, позволяющее безопасно ссылаться на разделы, но отсутствие чего-то похожего для дисков в целом - действительно позор.

Любое из следующего не подходит:

В / etc / default / grub

GRUB_CMDLINE_LINUX_DEFAULT="elevator=deadline quiet splash"

В результате один и тот же планировщик будет использоваться для всех дисков.

В /etc / rc.local

echo deadline > /sys/block/sda/queue/scheduler
echo 1 > /sys/block/sda/queue/iosched/fifo_batch

Использует метки sd *.

In / etc / sysfs.conf

block/sda/queue/scheduler = deadline

Использует ли снова метки sd *.

Как можно изменить планировщик ввода-вывода, используя безопасный способ обращения к диску?

1 Ответ

0 голосов
/ 05 сентября 2011

Полагаю, нет более простого / чистого решения, чем создание сценария, как предложил osgx.

В dmesg я не нашел ничего похожего на SerialID дисков, поэтому я нашел другое решение, которое другим было бы проще применить.

Создайте файл с именем setscheduler.sh в / etc / init.d / и добавьте следующее содержимое:

#!/bin/bash

# List of UUIDs (one per line)
# For each drive: Add the UUID of a single partition located on the drive of which you want to change the I/O-scheduler
UUID_LIST=(
    2669b09e-75cd-4f45-bedb-8cb405444287
)

DISK_PATH="/dev/disk/by-uuid"
BLOCK_PATH="/sys/block"

for UUID in ${UUID_LIST[@]} ; do
    if [[ -L "${DISK_PATH}/${UUID}" ]] ; then
        TARGET=$( readlink "${DISK_PATH}/${UUID}" )
        DISK=`expr "${TARGET}" : '.*\(sd[a-z]\)'`

        if [[ -d "${BLOCK_PATH}/${DISK}" ]] ; then
            echo deadline > "${BLOCK_PATH}/${DISK}/queue/scheduler"
            echo 1 > "${BLOCK_PATH}/${DISK}/queue/iosched/fifo_batch"
        fi
    fi
done

Сделать файл исполняемым:

sudo chmod +x /etc/init.d/setscheduler.sh

Зарегистрируйте его как скрипт init.d: ​​

sudo update-rc.d setscheduler.sh defaults
...