HDIO_GETGEO
ioctl 返回的柱面数类型为 short。这意味着如果您的柱面数超过 65535,该数字将被截断,并且(对于典型的 1 MiB 柱面的 SCSI 设置)一个 80 GiB 的硬盘可能显示为 16 GiB。一旦认识到问题所在,就很容易避免。请使用 fdisk 2.10i 或更新版本。
(编程约定是使用 BLKGETSIZE
ioctl 获取总大小,使用 HDIO_GETGEO
获取磁头数和扇区数/磁道,并且如果需要,通过 C = size/(H*S) 获取柱面数 C。)
(以下是关于 Linux 内核问题的讨论。BIOS 问题和限制容量的跳线已在上面讨论过。)
大于 33.8 GB 的硬盘将无法在低于 2.0.39 / 2.2.14 / 2.3.21 的内核版本上工作。详细信息如下。假设您购买了一个新的 IBM-DPTA-373420 硬盘,容量为 66835440 扇区(34.2 GB)。2.3.21 之前的内核会告诉您,大小为 769*16*63 = 775152 扇区(0.4 GB),这有点令人失望。并且给出命令行参数 hdc=4160,255,63 也无济于事 - 这些参数会被忽略。发生了什么?例程 idedisk_setup() 检索硬盘报告的几何参数(即 16383/16/63),并覆盖用户在命令行上指定的参数,因此用户数据仅用于 BIOS 几何参数。例程 current_capacity() 或 idedisk_capacity() 将柱面数重新计算为 66835440/(16*63)=66305,但由于它存储在一个 short 类型中,它会变成 769。由于 lba_capacity_is_ok() 破坏了 id->cyls,因此之后对其的每次调用都将返回 false,从而导致硬盘容量变为 769*16*63。对于几个内核版本,补丁是可用的。2.0.38 的补丁可以在 ftp.kernel.org 找到。2.2.12 的补丁可以在 www.uwsg.indiana.edu 找到(可能需要进行一些编辑以去除 html 标记)。2.2.14 内核确实支持这些硬盘。在 2.3.* 内核系列中,自 2.3.21 起开始支持这些硬盘。也可以通过使用跳线将大小限制为 33.8 GB 来“解决”硬件问题。在许多情况下,如果想要从硬盘启动,则需要进行 BIOS 升级。