获取没有原始文件系统权限的磁盘扇区大小

时间:2012-10-17 17:12:58

标签: linux posix ioctl

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

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

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

如果没有以root身份运行,我怎样才能获得扇区大小?

2 个答案:

答案 0 :(得分:1)

根据open()的Linux手册页:

  

在Linux中,对齐限制因文件系统和内核版本而异,可能完全不存在。但是,当前没有与文件系统无关的接口,应用程序可以发现给定文件或文件系统的这些限制。某些文件系统提供了自己的接口,例如xfsctl(3)中的XFS_IOC_DIOINFO操作。

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

由于你的底层块设备是一个Xen虚拟块设备,下面可能有任意数量的层(LVM,dm-crypt,另一个文件系统等等),我不确定这一切都有多大意义真的适合你。

答案 1 :(得分:0)

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

否则,我会建议你的O_DIRECT ed读取的大小为2的2的大小,可能是8K字节或64K字节(你可能想要将读缓冲区与页面大小对齐,通常4K字节)。