从程序获取和设置Linux上的IO调度程序

从程序获取和设置Linux上的IO调度程序,linux,io,scheduler,system-calls,Linux,Io,Scheduler,System Calls,我有一个绝对路径(例如“/mnt/target/benchmarkTest/Run1”),我希望获得可用IO调度程序的列表,并为该路径实际驻留的设备设置IO调度程序 编程语言并不重要,可以说它是c或bash脚本 我知道您可以使用sysfs文件系统上的/sys/block/sda/queue/scheduler文件设置IO调度程序 我知道我可以使用 readlink -f `df -T -P /mnt/target/benchmarkTest/Run1 | awk 'NR>1 {printf

我有一个绝对路径(例如“/mnt/target/benchmarkTest/Run1”),我希望获得可用IO调度程序的列表,并为该路径实际驻留的设备设置IO调度程序

编程语言并不重要,可以说它是c或bash脚本

我知道您可以使用
sysfs
文件系统上的
/sys/block/sda/queue/scheduler
文件设置IO调度程序

我知道我可以使用

readlink -f `df -T -P /mnt/target/benchmarkTest/Run1 | awk 'NR>1 {printf $1}'`
这可能至少返回(列表不完整)

  • 具有分区号的典型块设备,例如
    /dev/sda3
  • 如果数据直接存储在设备上而没有任何分区(例如USB记忆棒),则不带Praction编号的块设备,例如
    /dev/sdd
  • 如果使用LVM(或类似设备),设备映射器会阻塞设备,例如
    /dev/dm-2
  • 对于每种返回类型,我需要检查IO调度程序的不同位置:

  • 以某种方式获取实际包含分区的设备。也许是扔掉所有的数字,把它当作一个装置
  • 我可以将设备直接放入
    sysfs
    文件中
  • 现在变得很棘手:我需要检查lvm卷所在的设备(可能很多),然后为每个设备设置调度程序。请记住:LVM没有自己的IO调度程序
  • 这个过程可以简化吗?这个入口点或另一个入口点是否有内核系统调用来简化这个过程?目前的方法似乎非常容易出错

    谢谢