絶対パス (「/mnt/target/benchmarkTest/Run1」など) があり、使用可能な IO スケジューラのリストを取得し、このパスが物理的に存在するデバイスの IO スケジューラも設定したいと考えています。
プログラミング言語は問題ではありません。それが c または bash スクリプトであるとしましょう。
/sys/block/sda/queue/scheduler
ファイルシステム上のファイルを使用して IO スケジューラを設定できることは知っていsysfs
ます。
を使用して物理デバイスブロックデバイスを取得できることを知っています
readlink -f `df -T -P /mnt/target/benchmarkTest/Run1 | awk 'NR>1 {printf $1}'`
これは少なくとも返される可能性があります(リストは不完全です)
- パーティション番号を持つ典型的なブロックデバイス。
/dev/sda3
- データがパーティション化されずにデバイスに直接保存されている場合 (USB スティックなど)、分割番号のないブロック デバイス。
/dev/sdd
- LVM (または同様のもの) が使用されている場合のデバイス マッパー ブロック デバイス。
/dev/dm-2
これらの戻り値の型ごとに、IO スケジューラの別の場所を確認する必要があります。
- どういうわけか、実際にパーティションを含むデバイスを取得します。おそらく、すべての数字を捨てて、これをデバイスとして採用することによって.
sysfs
デバイスをファイルに直接取り込むことができます- ここでややこしくなります: lvm ボリュームが存在するデバイス (多くの場合があります) を確認し、それぞれにスケジューラを設定する必要があります。注意: LVM には独自の IO スケジューラがありません。
このプロセスを何とか簡素化できますか? プロセスを簡素化する、このエントリポイントまたは別のエントリポイントのカーネル syscall はありますか? 現在のアプローチは非常にエラーが発生しやすいようです。
ありがとう!