2

我正在尝试获取扇区大小,特别是这样我就可以正确调整缓冲区的大小,以便使用 O_DIRECT 进行读/写。

当我的应用程序以 root 身份运行时,以下代码有效:

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

如何在不以 root 身份运行的情况下获得扇区大小?

4

2 回答 2

1

根据 open() 的 Linux 手册页:

在 Linux 中,对齐限制因文件系统和内核版本而异,并且可能完全不存在。然而,目前没有独立于文件系统的接口供应用程序发现给定文件或文件系统的这些限制。一些文件系统为此提供了自己的接口,例如 xfsctl(3) 中的 XFS_IOC_DIOINFO 操作。

所以看起来您可以使用 xfsctl() 获取此信息...如果您使用的是 xfs。

由于您的底层块设备是 Xen 虚拟块设备,并且在其之下可能有任意数量的层(LVM、dm-crypt、另一个文件系统等),我不确定所有这些对于真正的意义有多大你。

于 2012-10-17T18:20:17.097 回答
0

您可以使用stat(2)和相关的系统调用(可能在某些特定文件上),然后使用该st_blksize字段。但是,这将给出与文件系统相关的块大小,而不是硬件首选的扇区大小。但是对于可能更相关的O_DIRECT输入(来自文件系统上的文件!) 。st_blocksize

否则,我建议使用 2 的幂大小,可能是 8Kbytes 或 64Kbytes,作为O_DIRECT-ed 读取的大小(并且您可能希望将读取缓冲区与页面大小对齐,通常为 4Kbytes)。

于 2012-10-17T18:56:16.447 回答