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

问题描述:

我试图获取扇区大小,特别是我可以正确调整用O_DIRECT读/写的缓冲区大小。在没有原始文件系统权限的情况下获取磁盘扇区大小

,当我的应用程序的root身份运行下面的代码工作:

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

我怎样才能得到它不被作为root运行的扇区大小?

+0

您是否正在阅读(使用'O_DIRECT')原始分区或其中的文件系统上的某个文件? –

+0

你为什么问?你正在寻求最佳的IO性能,还是由于其他原因? –

+0

@BasileStarynkevitch我正在读取和写入文件,并使用O_DIRECT进行性能测试,因为我只是读取或写入随机定位的512字节块。 – Max

根据Linux联机帮助页的open():

在Linux中的对齐限制由文件系统和内核版本有所不同,可能会完全消失。但是,目前没有文件系统无关的接口,用于应用程序发现给定文件或文件系统的这些限制。一些文件系统为它们提供了自己的接口,例如xfsctl(3)中的XFS_IOC_DIOINFO操作。

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

由于您的基础块设备是一个Xen虚拟块设备,并且可能有任何数量的层(LVM,dm-crypt,另一个文件系统等)......我不确定这一切有多么有意义将真的为你。

您可以使用stat(2)和相关系统调用(可能在某个特定文件上),然后使用st_blksize字段。但是,这会产生与文件系统相关的块大小,而不是硬件所偏好的扇区大小。但是对于O_DIRECT输入(来自文件系统上的文件!)st_blocksize可能更相关。否则,我会建议您的读取大小(您可能希望将读取缓冲区与页面大小对齐,通常为4K字节)的大小为8KB或64KB,这可能是8KB或64KB。