我正在努力确定"正确"来自块设备的CHS:
#include <sys/ioctl.h>
#include <linux/hdreg.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
int main(int argv, char **argv) {
int r;
int f;
struct hd_geometry g;
f = open(*(argv+1), 0);
if (f < 0) {
printf("open fail: %d\n", errno);
return 1;
}
r = ioctl(f, HDIO_GETGEO, (void*)&g);
if (r == -1) {
printf("ioctl fail: %d\n", errno);
return 2;
}
close(f);
printf("c: %d\nh: %d\ns: %d\nstart: %d\n", g.cylinders, g.heads, g.sectors, g.start);
return 0;
}
在usb棒上使用它我得到:
c: 1020
h: 247
s: 62
start: 0
然而,fdisk --units=cylinders -l /dev/sdc
给出了:
Geometry: 255 heads, 63 sectors/track, 1020 cylinders
可能它从其他地方获取信息。那么它可能使用哪些其他来源?
有没有办法确定&#34;正确&#34;一?据我所知,CHS在现代时期由hw制造商完全任意设定。
环境:
fdisk libs:
linux-vdso.so.1 (0x00007ffeb7be8000)
libfdisk.so.1 => /usr/lib/libfdisk.so.1 (0x00007fe4b040f000)
libsmartcols.so.1 => /usr/lib/libsmartcols.so.1 (0x00007fe4b01dd000)
libtinfo.so.6 => /usr/lib/libtinfo.so.6 (0x00007fe4aff70000)
libreadline.so.7 => /usr/lib/libreadline.so.7 (0x00007fe4afd22000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007fe4af96b000)
libblkid.so.1 => /usr/lib/libblkid.so.1 (0x00007fe4af71d000)
libuuid.so.1 => /usr/lib/libuuid.so.1 (0x00007fe4af516000)
/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007fe4b0896000)
答案 0 :(得分:2)
大多数处理CHS的工具只是构成了自己的价值观。这是产生您在fdisk
from a util-linux repo on github中看到的值的函数。
static void recount_geometry(struct fdisk_context *cxt)
{
if (!cxt->geom.heads)
cxt->geom.heads = 255;
if (!cxt->geom.sectors)
cxt->geom.sectors = 63;
cxt->geom.cylinders = cxt->total_sectors /
(cxt->geom.heads * cxt->geom.sectors);
}
正如您所看到的,它只是将heads
和sectors
固定为固定值,然后计算cylinders
值,以便计算出总驱动器容量。
HDIO_GETGEO
ioctl返回来自您正在使用的特定设备驱动程序的数字。如果您感到好奇,可以向下钻取drivers/scsi/sd.c
并找出具体值的来源。
考虑阅读wikipedia page on CHS addressing。这些领域并不是什么意思 - 特别是在固态USB记忆棒上!