更改I / O调度程序而不使用sd *来引用磁盘

时间:2011-09-03 17:34:16

标签: linux ubuntu uuid scheduler

我想将I / O调度程序更改为系统上某个特定磁盘的截止日期。但是,我找到的所有资源都使用了我无法使用的方法,因为它们使用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 *标签。

/etc/sysfs.conf

block/sda/queue/scheduler = deadline

再次使用sd *标签。

如何使用安全的方式更改I / O调度程序以引用磁盘?

1 个答案:

答案 0 :(得分:0)

我认为创建脚本没有更简单/更清晰的解决方案,正如osgx建议的那样。

在dmesg中,我没有发现任何类似磁盘的SerialID,所以我提出了一个不同的解决方案,其他人也可以更容易应用。

/etc/init.d / 中创建一个名为 setscheduler.sh 的文件,并添加以下内容:

#!/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