我想将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调度程序以引用磁盘?
答案 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