Linux 更改不使用sd*引用磁盘的I/O计划程序

Linux 更改不使用sd*引用磁盘的I/O计划程序,linux,ubuntu,uuid,scheduler,Linux,Ubuntu,Uuid,Scheduler,我想将系统上某个特定磁盘的I/O计划程序更改为截止日期。但是,我找到的所有资源都使用我无法使用的方法,因为它们要么引用使用sd*(sda、sdb等)的磁盘,要么使用Grub而不是Grub2 我不能使用像sd*这样的标签来指代磁盘的原因很明显:它可以并且将改变磁盘。 我已经研究了uuid(/dev/disk/by-uuid),看看它们是否可以提供解决方案,但遗憾的是。internet上的许多资源都谈到使用UUID引用驱动器或磁盘,而实际上只能通过这种方式引用磁盘上的分区。 在我看来,使用UUID引

我想将系统上某个特定磁盘的I/O计划程序更改为截止日期。但是,我找到的所有资源都使用我无法使用的方法,因为它们要么引用使用sd*(sda、sdb等)的磁盘,要么使用Grub而不是Grub2

我不能使用像sd*这样的标签来指代磁盘的原因很明显:它可以并且将改变磁盘。 我已经研究了uuid(/dev/disk/by-uuid),看看它们是否可以提供解决方案,但遗憾的是。internet上的许多资源都谈到使用UUID引用驱动器或磁盘,而实际上只能通过这种方式引用磁盘上的分区。 在我看来,使用UUID引用分区是一个受欢迎的安全引用分区的变化,但缺少类似的磁盘整体功能确实令人遗憾

以下任何一项都不是选项:

在/etc/default/grub中

将导致对所有磁盘使用相同的计划程序

In/etc/rc.local

正在使用sd*标签

在/etc/sysfs.conf中

正在再次使用sd*标签


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

我想没有比osgx建议的创建脚本更简单/更干净的解决方案了

在dmesg中,我并没有找到类似于磁盘序列ID的任何东西,所以我提出了一个不同的解决方案,其他人也可以更容易地应用它

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

#/bin/bash
#UUID列表(每行一个)
#对于每个驱动器:添加位于要更改其I/O调度程序的驱动器上的单个分区的UUID
UUID_列表=(
2669b09e-75cd-4f45-bedb-8cb405444287
)
DISK_PATH=“/dev/DISK/by uuid”
BLOCK_PATH=“/sys/BLOCK”
对于${UUID_LIST[@]}中的UUID;做
如果[[-L“${DISK_PATH}/${UUID}”];然后
目标=$(读链接“${DISK\u PATH}/${UUID}”)
DISK=`expr“${TARGET}”:“.*\(sd[a-z]\)”`
如果[[-d“${BLOCK_PATH}/${DISK}]”;然后
回显截止日期>“${BLOCK_PATH}/${DISK}/queue/scheduler”
echo 1>“${BLOCK_PATH}/${DISK}/queue/iosched/fifo_batch”
fi
fi
完成
使文件可执行:

sudo chmod +x /etc/init.d/setscheduler.sh
将其注册为init.d脚本:

sudo update-rc.d setscheduler.sh defaults

编写init.d脚本,对dmesg进行解析。每个sd*磁盘都有SerialID,因此您可以找到当前引导的磁盘sd#编号。此外,您还可以迭代所有sd*并直接请求序列号(例如,smartctl可以这样做)。
block/sda/queue/scheduler = deadline
sudo chmod +x /etc/init.d/setscheduler.sh
sudo update-rc.d setscheduler.sh defaults