2

特に、O_DIRECTを使用して読み取り/書き込み用にバッファーのサイズを正しく設定できるように、セクターサイズを取得しようとしています。

次のコードは、アプリをrootとして実行したときに機能します。

int fd = open("/dev/xvda1", O_RDONLY|O_NONBLOCK);
size_t blockSize;
int rc = ioctl(fd, BLKSSZGET, &blockSize);

ルートとして実行せずにセクターサイズを取得するにはどうすればよいですか?

4

2 に答える 2

1

open() の Linux マンページによると:

Linux では、アラインメントの制限はファイル システムとカーネルのバージョンによって異なり、完全に存在しない場合があります。ただし、現在、アプリケーションが特定のファイルまたはファイル システムのこれらの制限を検出するための、ファイル システムに依存しないインターフェイスはありません。xfsctl(3) の XFS_IOC_DIOINFO 操作のように、一部のファイル システムはそれを行うための独自のインターフェースを提供します。

したがって、xfs を使用している場合は、xfsctl() を使用してこの情報を取得できるようです。

基礎となるブロックデバイスは Xen 仮想ブロックデバイスであり、その下に任意の数のレイヤー (LVM、dm-crypt、別のファイルシステムなど) がある可能性があるため、これらすべてが実際にどれほど意味があるかはわかりません。あなた。

于 2012-10-17T18:20:17.097 に答える
0

stat(2)および関連するシステムコール (おそらく特定のファイル) を使用してから、フィールドを使用できst_blksizeます。ただし、これにより、ハードウェアが優先するセクターのサイズではなく、ファイルシステムに関連するブロックサイズが得られます。しかし、O_DIRECT(ファイルシステム上のファイルからの)入力についてst_blocksizeは、より関連性があるかもしれません。

それ以外の場合は、-ed 読み取りのサイズとして、2 の累乗のサイズ、おそらく 8K バイトまたは 64K バイトをおO_DIRECT勧めします (また、読み取りバッファーをページ サイズ (通常は 4K バイト) に合わせたい場合があります)。

于 2012-10-17T18:56:16.447 に答える