下一页 上一页 目录

9. 后果

这一切意味着什么?对于 Linux 用户来说,只有一件事:他们必须确保 LILO 和 fdisk 使用正确的几何参数。“正确” 对于 fdisk 的定义是与其他操作系统在同一磁盘上使用的几何参数一致,而对于 LILO 的定义是能够成功与启动时的 BIOS 交互的几何参数。(通常这两者是一致的。)

fdisk 如何知道几何参数?有三个信息来源。首先,如果用户交互式地或在命令行上指定了几何参数,那么我们采用用户输入。其次,如果可以从分区表中猜测出使用的几何参数,那么我们使用该参数。第三,当没有其他可用信息时,fdisk 会询问内核,使用 HDIO_GETGEO ioctl。

LILO 如何知道几何参数?它询问内核,使用 HDIO_GETGEO ioctl。但是用户可以使用 /etc/lilo.conf 中的 `disk=' 选项覆盖几何参数(参见 lilo.conf(5))。也可以给 LILO linear 选项,它将把 LBA 地址而不是 CHS 地址存储在其映射文件中,并在启动时找出要使用的几何参数(通过使用 INT 13 功能 8 来询问驱动器几何参数)。

内核如何知道要回答什么?首先,用户可能已经使用 `hda=cyls,heads,secs' 内核命令行选项(参见 bootparam(7))指定了显式的几何参数,可能是手动指定的,或者通过要求引导加载程序向内核提供这样的选项。例如,可以通过在 /etc/lilo.conf 中添加 `append = "hda=cyls,heads,secs"' 行来告诉 LILO 提供这样的选项(参见 lilo.conf(5))。否则,内核将进行猜测,可能使用从 BIOS 或硬件获得的值。

请注意,内核猜测的值非常不可靠。内核没有好的方法来找出 BIOS 使用的值,甚至不知道磁盘是否为 BIOS 所知。

从 Linux 2.1.79 开始,可以使用 /proc 文件系统来更改内核对几何参数的理解。例如

# sfdisk -g /dev/hdc
/dev/hdc: 4441 cylinders, 255 heads, 63 sectors/track
# cd /proc/ide/ide1/hdc
# echo bios_cyl:17418 bios_head:128 bios_sect:32 > settings
# sfdisk -g /dev/hdc
/dev/hdc: 17418 cylinders, 128 heads, 32 sectors/track
#
如果您需要太多的启动参数以至于溢出 LILO(非常有限的)命令行长度,这尤其有用。(如果您想影响一个通过 HDIO_GETGEO ioctl 从内核获取几何参数信息的实用程序,这也很有帮助。)

自 Linux 2.6.5 起,内核(当使用 CONFIG_EDD 编译时)将使用 INT 13/AH=08h 向 BIOS 询问 legacy_cylinders、legacy_heads、legacy_sectors。获得的值在 /sys/firmware/edd/int13_dev{80,81,82,83}/legacy_* 中可用。在 2.6.5 中,文件名为 legacy_{cylinders,heads,sectors}(内容以十六进制表示,例如 254 为 0xfe),但这些名称令人困惑,在 2.6.7 中,它们被更改为 legacy_max_cylinderlegacy_max_headlegacy_sectors_per_track(内容以十进制表示)。像 C/H/S=1000/255/63 这样的几何参数在这里被找到为 999、254、63。

# insmod edd.ko
# cd /sys/firmware/edd/int13_dev83
# cat legacy_max_head
254
# cat sectors
120064896
#
因此,我们在这里看到一个磁盘,它有 255 个磁头,总共有 120064896 个扇区。仔细比较表明这是 /dev/hdf

BIOS 如何知道几何参数?用户可能已经在 CMOS 设置中指定了它。或者几何参数是从磁盘读取的,并可能按照设置中的指定进行转换。对于 SCSI 磁盘,其中不存在几何参数,BIOS 必须发明的几何参数通常可以通过跳线或设置选项来指定。(例如,Adaptec 控制器有可能在常用的 H=64、S=32 和“扩展转换” H=255、S=63 之间进行选择。)有时 BIOS 读取分区表以查看磁盘上次分区时使用的几何参数 - 当 55aa 签名存在时,它将假定存在有效的分区表。这很好,因为它允许将磁盘移动到不同的机器。但是让 BIOS 的行为依赖于磁盘内容也会导致奇怪的问题。(例如,有报告称,一个 2.5 GB 的磁盘被识别为 528 MB,因为 BIOS 读取了分区表并得出结论,它应该使用未转换的 CHS。另一个影响在报告中发现,未分区的磁盘比分区的磁盘慢,因为 BIOS 通过读取 MBR 并查看是否正确获得了 55aa 签名来测试 32 位模式。)

磁盘如何知道几何参数?嗯,制造商发明了一种几何参数,该参数相乘后大致等于正确的容量。许多磁盘都有跳线来更改报告的几何参数,以避免 BIOS 错误。例如,所有 IBM 磁盘都允许用户在 15 个磁头和 16 个磁头之间进行选择,许多制造商都添加了跳线,使磁盘看起来小于 2.1 GB 或 33.8 GB。另请参阅下文。有时有实用程序可以更改磁盘固件。

9.1 计算 LILO 参数

有时,通过在内核命令行上添加 `hda=cyls,heads,secs' 来强制使用特定几何参数是很有用的。几乎总是希望 secs=63,添加此参数的目的是指定 heads。(今天合理的取值是 heads=16 和 heads=255。)cyls 应该指定什么?精确地说是那个能够给出正确的总容量 C*H*S 扇区数的数字。例如,对于一个具有 71346240 个扇区(36529274880 字节)的驱动器,人们会将 C 计算为 71346240/(255*63)=4441(例如使用程序 bc),并给出启动参数 hdc=4441,255,63。如何知道正确的总容量?例如,

# hdparm -g /dev/hdc | grep sectors
 geometry     = 4441/255/63, sectors = 71346240, start = 0
# hdparm -i /dev/hdc | grep LBAsects
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=71346240
给出了两种查找扇区总数 71346240 的方法。最近的内核还在启动消息中给出了精确的大小
# dmesg | grep hde
hde: Maxtor 93652U8, ATA DISK drive
hde: 71346240 sectors (36529 MB) w/2048KiB Cache, CHS=70780/16/63
 hde: hde1 hde2 hde3 < hde5 > hde4
 hde2: <bsd: hde6 hde7 hde8 hde9 >
旧的内核只给出 MB 和 CHS。通常 CHS 值向下舍入,因此上面的输出告诉我们至少有 70780*16*63=71346240 个扇区。在本例中,这恰好是精确值。MB 值可能会被四舍五入而不是截断,并且在旧内核中可能是“二进制”(MiB)而不是十进制。请注意内核大小(MB)和 Maxtor 型号之间的协议。同样在 SCSI 磁盘的情况下,精确的扇区数在内核启动消息中给出
SCSI device sda: 17755792 512-byte hdwr sectors (9091 MB)


下一页 上一页 目录