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

Posted

技术标签:

【中文标题】在没有原始文件系统权限的情况下获取磁盘扇区大小【英文标题】:Getting disk sector size without raw filesystem permission 【发布时间】:2012-10-17 17:12:57 【问题描述】:

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

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

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

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

【问题讨论】:

您是在读取(使用O_DIRECT)原始分区,还是其中的文件系统上的某个文件? 你为什么要问?您是在寻求最佳 IO 性能,还是出于其他原因? @BasileStarynkevitch 我正在读取和写入文件,并使用 O_DIRECT 来提高性能,因为我只读取或写入随机定位的 512 字节块。 【参考方案1】:

根据 open() 的 Linux 手册页:

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

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于在没有原始文件系统权限的情况下获取磁盘扇区大小的主要内容,如果未能解决你的问题,请参考以下文章

文件的磁盘扇区和块分配

深入理解磁盘文件系统之inode

深入理解磁盘文件系统之inode(转)

如何查看Linux磁盘空间大小

获取具有未知文件格式的磁盘和/或驱动器的大小,C# .NET Framework?

Mac OS:在查找器属性中显示自定义文件大小并在没有内核的情况下获取信息