Linux IDE 驱动程序通过使用 ATA IDENTIFY 请求来获取硬盘的几何结构和容量(以及许多其他信息)。如果 lba_capacity 返回的值比 C*
H*
S 计算出的容量大 10% 以上,则 2.0.34/2.1.90 之前的 Linux 内核不会相信该值。然而,根据行业协议,大型 IDE 硬盘(超过 16514064 个扇区)返回 C=16383,H=16,S=63,总共 16514064 个扇区(7.8 GB),这与它们的实际大小无关,但会在 lba_capacity 中给出它们的实际大小。
从 2.0.34/2.1.90 版本开始,Linux 内核了解了这一点并进行了正确的处理。如果您使用的是较旧的 Linux 内核并且不想升级,并且此内核仅看到远大于 8 GiB 的硬盘的 8 GiB,那么请尝试将 /usr/src/linux/drivers/block/ide.c
中的 lba_capacity_is_ok
例程更改为类似如下的内容
static int lba_capacity_is_ok (struct hd_driveid *id) {
id->cyls = id->lba_capacity / (id->heads * id->sectors);
return 1;
}
更谨慎的补丁,请参阅 2.1.90。
正如刚才提到的,大型硬盘返回的几何结构 C=16383,H=16,S=63 与实际大小无关,而实际大小在 LBAcapacity 值中返回。一些 BIOS 无法识别这一点,并将 16383/16/63 转换为柱面数更少、磁头数更多的结构,例如 1024/255/63 或 1027/255/63。因此,内核不仅必须识别单一的几何结构 16383/16/63,还必须识别所有 BIOS 修改的版本。自 2.2.2 版本以来,这个问题已得到正确解决(通过采用 BIOS 的 H 和 S 概念,并计算 C = 容量/(H*S))。通常,这个问题可以通过在 BIOS 设置中将硬盘设置为“Normal”(或更好的是“None”,完全不向 BIOS 提及)来解决。如果由于您必须从中启动或将其与 DOS/Windows 一起使用而无法做到这一点,并且升级到 2.2.2 或更高版本不是一个选项,请使用内核引导参数。
如果 BIOS 报告 16320/16/63,那么这通常是为了在转换后得到 1024/255/63。
这里还有一个额外的问题。如果硬盘是使用几何结构转换进行分区的,那么内核在启动时可能会看到分区表中使用了这种几何结构,并报告 hda: [PTBL] [1027/255/63]
。这很糟糕,因为现在硬盘只有 8.4 GB。这个问题在 2.3.21 版本中得到了修复。同样,内核引导参数会有所帮助。
许多硬盘都有跳线,允许您在 15 磁头和 16 磁头几何结构之间进行选择。默认设置将为您提供 16 磁头硬盘。有时两种几何结构寻址的扇区数相同,有时 15 磁头版本更小。这种设置可能有一个很好的理由:Petri Kaukasoina 写道:“一块 10.1 GB 的 IBM Deskstar 16 GP(型号 IBM-DTTA-351010)默认跳线为 16 磁头,但这台旧 PC(带有 AMI BIOS)无法启动,我不得不将其跳线为 15 磁头。hdparm -i 显示 RawCHS=16383/15/63 和 LBAsects=19807200。我使用 20960/15/63 来获得全部容量。” 有关跳线设置,请参阅 http://www.hitachigst.com/hdd/support/jumpers.htm。
许多硬盘都有跳线,允许您使硬盘看起来比实际容量小。这似乎很傻,可能没有 Linux 用户会想使用它,但有些 BIOS 在遇到大容量硬盘时会崩溃。通常的解决方案是将硬盘完全排除在 BIOS 设置之外。但这可能只在硬盘不是您的启动盘时才可行。
第一个严重的限制是 4096 柱面限制(即,16 磁头和 63 扇区/磁道,2.11 GB)。例如,一块 3.24 GB 的富士通 MPB3032ATU 硬盘的默认几何结构为 6704/15/63,但可以跳线使其显示为 4092/16/63,然后报告 LBAcapacity 为 4124736 个扇区,这样操作系统就无法猜测到它的实际容量更大。在这种情况下(如果 BIOS 在得知硬盘的实际容量有多大时会崩溃,因此需要跳线),则需要引导参数来告知 Linux 硬盘的大小。
这很不幸。大多数硬盘都可以通过跳线使其显示为 2 GB 硬盘,然后报告一个限制的几何结构,如 4092/16/63 或 4096/16/63,但仍然报告完整的 LBAcapacity。这样的硬盘在 Linux 下可以很好地工作,并使用全部容量,而与跳线设置无关。
更新的限制是 33.8 GB 限制。早于 2.2.14 / 2.3.21 的 Linux 内核需要补丁才能处理大于此容量的 IDE 硬盘。
对于旧的 BIOS 和大于 33.8 GB 的硬盘,BIOS 可能会挂起,在这种情况下,即使从 CMOS 设置中移除硬盘,也可能无法启动。
因此,大型 IBM、Maxtor 和 Seagate 硬盘都带有一个跳线,使硬盘显示为 33.8 GB 硬盘。例如,IBM Deskstar 37.5 GB (DPTA-353750) 硬盘具有 73261440 个扇区(对应于 72680/16/63 或 4560/255/63),可以通过跳线使其显示为 33.8 GB 硬盘,然后像任何大型硬盘一样报告几何结构 16383/16/63,但 LBAcapacity 为 66055248(对应于 65531/16/63 或 4111/255/63)。最近的大型 Maxtor 硬盘也存在类似情况。
以下是一些曾经相关但现在可能可以忽略的更多细节。
在存在跳线的情况下,几何结构 (16383/16/63) 和大小 (66055248) 都是传统的,并且不提供有关实际大小的信息。此外,尝试访问扇区 66055248 及以上扇区会产生 I/O 错误。但是,在 Maxtor 硬盘上,可以使用 READ NATIVE MAX ADDRESS 和 SET MAX ADDRESS 命令找到并访问实际大小。据推测,这就是 MaxBlast/EZ-Drive 所做的事情。有一个小的 Linux 实用程序 setmax.c 可以做同样的事情。只有极少数硬盘需要它 - 几乎总是 CONFIG_IDEDISK_STROKE 就能解决问题。
对于大于 137 GB 的硬盘,READ NATIVE MAX ADDRESS 也返回一个传统值,即 0xfffffff,对应于 137 GB。这里需要 READ NATIVE MAX ADDRESS EXT 和 SET MAX ADDRESS EXT(使用 48 位寻址)。setmax
实用程序尚不了解这一点。一个非常小的补丁使 2.5.3 可以处理这种情况。
早期的 Maxtor 大型硬盘有一个额外的细节:对于这些 34-40 GB 的硬盘,J46 跳线将几何结构从 16383/16/63 更改为 4092/16/63,并且不更改报告的 LBAcapacity。这意味着即使存在跳线,BIOS(旧的 Award 4.5*)在启动时也会挂起。对于这种情况,Maxtor 提供了一个实用程序 JUMPON.EXE,用于升级固件以使 J46 的行为如上所述。
在最近的 Maxtor 硬盘上,调用 setmax -d 0 /dev/hdX
将再次为您提供最大容量。但是,在稍旧的硬盘上,固件错误不允许您使用 -d 0
,而 setmax -d 255 /dev/hdX
会使您恢复到几乎全部容量。有关 Maxtor D540X-4K,请参见下文。
对于 IBM 来说,情况更糟:跳线确实会限制容量,并且没有软件方法可以恢复它。解决方案是不使用跳线,而是使用 setmax -m 66055248 /dev/hdX
来软件限制硬盘容量。您可能会问:“如何操作?我无法启动!”。IBM 给出提示:如果带有 Award BIOS 的系统在驱动器检测期间挂起:重新启动系统并按住 F4 键以绕过驱动器的自动检测。 如果这没有帮助,请找到另一台计算机,将硬盘连接到该计算机,并在那里运行 setmax
。完成此操作后,您回到第一台机器,情况与跳线 Maxtor 硬盘的情况相同:启动正常,并且在通过 BIOS 后,打过补丁的内核或 setmax -d 0
都可以让您获得全部容量。
Thomas Charbonnel 报告了一种不同的方法:“我有一块 80 GB 的 IBM IC35L080AVVA07-0 硬盘,并安装了 IBM 的 Disk Manager。将我的引导加载程序安装在硬盘的 MBR 上。一切工作正常。请注意,IDE 硬盘必须成为启动盘,这样才能使用这种方法仅安装一个 34+ GB 的硬盘。”
Seagate 硬盘有一个跳线,可以将报告的柱面数限制为小于 33.8 GB 的硬盘上的 4092,而对于更大的硬盘,它会将报告的 LBA 容量(Identify words 60/61)限制为 33.8 GB。
对于型号 ST-340810A、ST-360020A、ST-380020A:可以使用 ATA Read Native Max 和 Set Max 命令来重置真正的全部容量。
对于型号 ST-340016A、ST-340823A、ST-340824A、ST-360021A、ST-380021A:ATA Set Features F1 子命令将使 Identify Data words 60-61 报告真正的全部容量。
Maxtor Diamond Max 硬盘 4K080H4、4K060H3、4K040H2(又名 D540X-4K)与硬盘 4D080H4、4D060H3、4D040H2(又名 D540X-4D)完全相同,只是跳线设置不同。Maxtor FAQ 指定了它们的主盘/从盘/电缆选择设置,但“4K”硬盘的容量限制跳线似乎没有文档记录。Nils Ohlmeier 报告说,他通过实验发现,它是最靠近电源连接器的 J42 跳线(“保留供工厂使用”)。(“4D”硬盘使用 J46 跳线,就像所有其他 Maxtor 硬盘一样。)
但是,可能这种未记录的跳线的作用类似于 IBM 跳线:机器启动正常,但硬盘已被限制为 33 GB,并且 setmax -d 0
无助于恢复全部容量。而 IBM 的解决方案有效:不要使用任何硬盘容量限制跳线,而是首先将硬盘放在一台具有非损坏 BIOS 的机器中,使用 setmax -m 66055248 /dev/hdX
软限制它,然后将其放回第一台机器中,并在启动后运行 setmax -d 0 /dev/hdX
以再次获得全部容量。
与此同时,Maxtor 网站上出现了一些文档和图片,证实了上述部分内容。请比较
有关信息,包括容量限制跳线的设置,请参阅 Western Digital 网站。我不知道这些跳线的具体作用。
如果 IDE/ATA 硬盘支持 Host Protected Area (HPA) 功能集,则可以将 LBA 容量设置为低于实际容量的任何值。访问超出指定点的位置通常会导致 I/O 错误。由于传统软件通过查看 Identify 信息的 LBA 容量字段来了解硬盘大小,因此此类软件不会怀疑硬盘实际上更大。
硬盘的实际总大小是使用 READ NATIVE MAX ADDRESS 命令读取的。这个“软硬盘大小”是使用 SET MAX ADDRESS 命令设置的。它有两种类型:如果设置了“volatile”位,则该命令的效果将持续到下次重新启动或硬件重置;否则,效果是永久性的。可以使用密码保护设置。(有关详细信息,请参阅 ATA 标准。)
这种限制的容量(至少)有两个应用:一方面,可以伪造一个较小的硬盘,这样 BIOS 就不会出现问题,并让 Linux 或(对于 DOS/Windows)磁盘管理器恢复全部容量;另一方面,可以在末尾设置一个供应商区域,普通用户无法访问。
对于上面讨论的许多硬盘,设置跳线正是具有这种效果:LBA 容量减小,而原生最大容量保持不变,并且 SET MAX ADDRESS 将恢复全部容量。
Linux 2.4.19/2.5.3 及更高版本的 CONFIG_IDEDISK_STROKE 选项将告诉 Linux 读取原生最大容量并执行 SET MAX ADDRESS 以访问全部容量。此配置选项位于内核配置部分的“IDE, ATA and ATAPI block devices”下的“Auto-Geometry Resizing support”标题下。
该配置选项在 2.6.7 版本中消失了,并被一个(每个硬盘)引导参数取代,因此可以写成 "hda=stroke"。
使用此 "stroke" 选项,跳线硬盘在许多情况下将得到正确处理,即,即使存在跳线,也会看到全部容量。当硬盘以其他方式(非跳线方式)获得 Host Protected Area 时,情况也是如此。
这是处理由于 BIOS 损坏而需要跳线的硬盘的首选方法。