22.2. ユーザー領域のアクセス

常に正しく調整された正しいサイズの入出力を使用するよう注意してください。とくに、ダイレクトな入出力アクセスの場合には重要となります。ダイレクトな入出力は logical_block_size の境界上で、logical_block_size の倍数単位で調整してください。
ネイティブの 4K デバイス (つまり、 logical_block_size が 4K という意味) では、アプリケーションがデバイスの logical_block_size の倍数単位でダイレクトな入出力を行うことが重要となってきます。つまり、4k の調整した入出力ではなく 512 バイトの調整した入出力を行うネイティブな 4k デバイスではアプリケーションの実行は失敗することになります。
これを回避するには、正しい入出力調整とサイズを使用していることを確認するためアプリケーションにデバイスの入出力パラメーターの問い合わせを行わせる必要があります。前述のように入出力のパラメーターは sysfs とブロックデバイス ioctl の両方のインターフェースを介して公開されます。
詳細は man libblkid をご覧ください。man ページは libblkid-devel パッケージで提供しています。

sysfs インターフェース

  • /sys/block/disk/alignment_offset
    または
    /sys/block/disk/partition/alignment_offset

    注記

    ファイルの場所は、ディスクが物理ディスク (ローカルディスク、ローカル RAID、またはマルチパス LUN) または仮想ディスクであるかによって異なります。最初のファイルの場所は物理ディスクに適用でき、2 つ目のファイルの場所は仮想ディスクに適用できます。これは、virtio-blk は常にパーティションのアライメント値を報告するためです。物理ディスクはアライメント値を報告する場合と報告しない場合があります。
  • /sys/block/disk/queue/physical_block_size
  • /sys/block/disk/queue/logical_block_size
  • /sys/block/disk/queue/minimum_io_size
  • /sys/block/disk/queue/optimal_io_size
カーネルは、入出力のパラメーター情報を提供しないレガシーなデバイス用にこれらの sysfs 属性をエクスポートします。たとえば、以下のようになります。

例22.1 sysfs インターフェース

alignment_offset:    0
physical_block_size: 512
logical_block_size:  512
minimum_io_size:     512
optimal_io_size:     0

ブロックデバイス ioctls

  • BLKALIGNOFF: alignment_offset
  • BLKPBSZGET: physical_block_size
  • BLKSSZGET: logical_block_size
  • BLKIOMIN: minimum_io_size
  • BLKIOOPT: optimal_io_size