在Linux

时间:2016-10-16 09:42:06

标签: c linux hard-drive sysfs

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

但是,当我在CentOS 5.11中测试时,文件hw_sector_size丢失了,我只找到了max_hw_sectors_kbmax_sectors_kb

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

1 个答案:

答案 0 :(得分:4)

fdisk实用程序显示此信息(并且在比CentOS 5上的2.6.x年份更早的内核上成功运行),因此这似乎是寻找答案的可能位置。幸运的是,我们生活在开源的精彩世界中,所以它只需要一点调查。

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));

所以,看起来我们需要找到fdisk_get_sector_size中定义的unsigned long fdisk_get_sector_size(struct fdisk_context *cxt) { assert(cxt); return cxt->sector_size; }

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

我将从cxt->sector_size = get_sector_size(cxt->dev_fd); 开始,因为该文件名听起来很有希望。通过该文件查看我用于列出文件的相同正则表达式,我们找到libfdisk/src/context.c

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;
}

这导致我:

blkdev_get_sector_size

这反过来又让我了解this#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似乎很有用。搜索{{1}}会将我们引导至lib/blkdev.c,其中包含评论中的以下信息:

  

对于记录:BLKSSZGET =逻辑块大小,BLKBSZGET =物理   块大小,BLKGETSIZE64 =设备大小(以字节为单位),BLKGETSIZE = device   大小/ 512。至少如果fs.h和我的实验中的评论可以   值得信赖的。 - Edward Falk Jul 10' 12 at 19:33