在 Linux 中确定扇区大小的便携式方法
Portable way to determine sector size in Linux
我想用C写一个小程序,可以判断硬盘的扇区大小。我想读取位于 /sys/block/sd[X]/queue/hw_sector_size
的文件,它在 CentOS 6/7 中有效。
但是我在CentOS 5.11测试时,文件hw_sector_size
不见了,我只找到了max_hw_sectors_kb
和max_sectors_kb
。
因此,我想知道如何确定(API)CentOS 5 中的扇区大小,或者是否有其他更好的方法。谢谢。
fdisk
实用程序显示此信息(并且在甚至比 2.6.x vintage 在 CentOS 5 上更早的内核上成功运行),所以这似乎是一个寻找答案的地方.幸运的是,我们生活在开源的美好世界中,所以它所需要的只是一点调查。
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
,它定义在 libfdisk/src/context.c:
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
开始,因为该文件名听起来很有前途。通过该文件查找我用来列出文件的相同正则表达式,我们发现 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, §_sz))
return (unsigned long) sect_sz;
return DEFAULT_SECTOR_SIZE;
}
这又让我找到 lib/blkdev.c 中 blkdev_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 Whosebug question,其中在评论中包含以下信息:
For the record: BLKSSZGET = logical block size, BLKBSZGET = physical
block size, BLKGETSIZE64 = device size in bytes, BLKGETSIZE = device
size/512. At least if the comments in fs.h and my experiments can be
trusted. – Edward Falk Jul 10 '12 at 19:33
我想用C写一个小程序,可以判断硬盘的扇区大小。我想读取位于 /sys/block/sd[X]/queue/hw_sector_size
的文件,它在 CentOS 6/7 中有效。
但是我在CentOS 5.11测试时,文件hw_sector_size
不见了,我只找到了max_hw_sectors_kb
和max_sectors_kb
。
因此,我想知道如何确定(API)CentOS 5 中的扇区大小,或者是否有其他更好的方法。谢谢。
fdisk
实用程序显示此信息(并且在甚至比 2.6.x vintage 在 CentOS 5 上更早的内核上成功运行),所以这似乎是一个寻找答案的地方.幸运的是,我们生活在开源的美好世界中,所以它所需要的只是一点调查。
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
,它定义在 libfdisk/src/context.c:
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
开始,因为该文件名听起来很有前途。通过该文件查找我用来列出文件的相同正则表达式,我们发现 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, §_sz))
return (unsigned long) sect_sz;
return DEFAULT_SECTOR_SIZE;
}
这又让我找到 lib/blkdev.c 中 blkdev_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 Whosebug question,其中在评论中包含以下信息:
For the record: BLKSSZGET = logical block size, BLKBSZGET = physical block size, BLKGETSIZE64 = device size in bytes, BLKGETSIZE = device size/512. At least if the comments in fs.h and my experiments can be trusted. – Edward Falk Jul 10 '12 at 19:33