我想用C编写一个小程序,该程序可以确定硬盘的扇区大小。我想读取/sys/block/sd[X]/queue/hw_sector_size中的文件,它在CentOS 6/7中起作用。

但是,当我在CentOS 5.11中进行测试时,缺少文件hw_sector_size,而我只找到了max_hw_sectors_kbmax_sectors_kb

因此,我想知道如何确定(API)CentOS 5中的扇区大小,或者还有其他更好的方法来做到这一点。谢谢。

最佳答案

fdisk实用程序将显示此信息(并且可以在甚至比CentOS 5上的2.6.x vintage内核更早的内核上运行),因此这似乎是寻找答案的地方。幸运的是,我们生活在开放源码的美好世界中,因此只需做一点调查即可。
fdisk程序由util-linux包提供,因此我们首先需要它。

扇区大小显示在fdisk的输出中,如下所示:

Disk /dev/sda: 477 GiB, 512110190592 bytes, 1000215216 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes

如果我们在util-linux代码中查找Sector size,则会在disk-utils/fdisk-list.c中找到它:
fdisk_info(cxt, _("Sector size (logical/physical): %lu bytes / %lu bytes"),
            fdisk_get_sector_size(cxt),
            fdisk_get_physector_size(cxt));

因此,看起来我们需要找到libfdisk/src/context.c定义的fdisk_get_sector_size:
unsigned long fdisk_get_sector_size(struct fdisk_context *cxt)
{
    assert(cxt);
    return cxt->sector_size;
}

好吧,那不是 super 有帮助。我们需要找出设置cxt->sector_size的位置:
$ grep -lri 'cxt->sector_size.*=' | grep -v tests
libfdisk/src/alignment.c
libfdisk/src/context.c
libfdisk/src/dos.c
libfdisk/src/gpt.c
libfdisk/src/utils.c

我将从alignment.c开始,因为该文件名听起来很有希望。在该文件中查找与我用来列出文件的正则表达式相同的正则表达式,我们发现this:
cxt->sector_size = get_sector_size(cxt->dev_fd);

这导致我:
static unsigned long get_sector_size(int fd)
{
    int sect_sz;

    if (!blkdev_get_sector_size(fd, &sect_sz))
        return (unsigned long) sect_sz;
    return DEFAULT_SECTOR_SIZE;
}

这又将我引到lib/blkdev.cblkdev_get_sector_size的定义:
#ifdef BLKSSZGET
int blkdev_get_sector_size(int fd, int *sector_size)
{
    if (ioctl(fd, BLKSSZGET, sector_size) >= 0)
        return 0;
    return -1;
}
#else
int blkdev_get_sector_size(int fd __attribute__((__unused__)), int *sector_size)
{
    *sector_size = DEFAULT_SECTOR_SIZE;
    return 0;
}
#endif

然后我们走了。有一个BLKSSZGET ioctl似乎很有用。搜索BLKSSZGET会将我们引至this stackoverflow question,它在注释中包含以下信息:

关于c - 确定Linux中扇区大小的可移植方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40068904/

10-11 17:00