下一页 上一页 目录

14. 问题解决

许多人认为他们遇到了问题,而实际上并没有任何问题。或者,他们认为他们遇到的问题是由于磁盘几何结构造成的,而实际上磁盘几何结构与此事无关。以上所有内容听起来可能很复杂,但磁盘几何结构处理非常简单:什么都不做,一切都很好;或者,如果 LILO 在启动时卡在 `LI`,则可以给它关键字 lba32。注意内核启动消息,并记住:你越是摆弄几何结构(为 LILO 和 fdisk 以及内核命令行指定磁头和柱面),事情就越不可能正常工作。粗略地说,默认情况下一切都很好。

请记住:Linux 中任何地方都不使用磁盘几何结构,因此你在运行 Linux 时遇到的任何问题都不可能是由磁盘几何结构引起的。实际上,磁盘几何结构仅由 LILO 和 fdisk 使用。因此,如果 LILO 无法启动内核,那可能是几何结构问题。如果不同的操作系统不理解分区表,那可能是几何结构问题。仅此而已。特别是,如果 mount 似乎不起作用,永远不要担心磁盘几何结构 - 问题出在其他地方。

14.1 问题:当从 SCSI 启动时,我的 IDE 磁盘获得了错误的几何结构。

磁盘很可能获得错误的几何结构。Linux 内核向 BIOS 询问 hd0 和 hd1(BIOS 驱动器编号为 80H 和 81H),并假设此数据用于 hda 和 hdb。但是在从 SCSI 启动的系统上,前两个磁盘很可能是 SCSI 磁盘,因此可能会发生第五个磁盘,即第一个 IDE 磁盘 hda,被分配了属于 sda 的几何结构。通过在启动时或在 /etc/lilo.conf 中给出启动参数 `hda=C,H,S` 以及适当的数字 C、H 和 S,可以轻松解决此类问题。

自 Linux 2.5.51 起,不再使用此 BIOS 信息,所有磁盘都会出现相同的问题。请参见下文。

14.2 非问题:相同的磁盘具有不同的几何结构?

`我有两个相同的 10 GB IBM 磁盘。但是,fdisk 给出的它们的大小不同。看

# fdisk -l /dev/hdb
Disk /dev/hdb: 255 heads, 63 sectors, 1232 cylinders
Units = cylinders of 16065 * 512 bytes

   Device Boot  Start      End   Blocks   Id  System
/dev/hdb1           1     1232  9896008+  83  Linux native
# fdisk -l /dev/hdd
Disk /dev/hdd: 16 heads, 63 sectors, 19650 cylinders
Units = cylinders of 1008 * 512 bytes

   Device Boot  Start      End   Blocks   Id  System
/dev/hdd1           1    19650  9903568+  83  Linux native
这是怎么回事?'

这里发生了什么?嗯,首先,这些驱动器确实是 10GB 的:hdb 的大小为 255*63*1232*512 = 10133544960,hdd 的大小为 16*63*19650*512 = 10141286400,所以,没有任何问题,内核将两者都视为 10.1 GB。为什么大小有差异?那是因为内核从 BIOS 获取前两个 IDE 磁盘的数据,并且 BIOS 已将 hdb 重新映射为具有 255 个磁头(和 16*19650/255=1232 个柱面)。这里的向下舍入损失了近 8 MB。

如果你想以相同的方式重新映射 hdd,请给出内核启动参数 `hdd=1232,255,63`。

另一方面,如果磁盘不与 DOS 等共享,则最好在 BIOS 设置中将 hdb 设置为 Normal,而不是请求像 LBA 这样的转换。

自 Linux 2.5.51 起,IDE 驱动程序不再使用前两个磁盘的 BIOS 信息,并且前两个磁盘的不同处理方式已经消失。

14.3 问题:2.4 和 2.6 报告不同的几何结构? 2.6 报告错误的几何结构?2.6 完全不报告几何结构?

由于几何结构不存在,因此 2.0/2.2/2.4/2.6 中的每一个都报告略有不同的磁盘几何结构也就不足为奇了。

有些人会坚持认为几何结构 *确实* 存在,在这种情况下,他们指的不是磁盘的属性,而是 BIOS 报告的值。这是其他几个操作系统将使用的值。自 Linux 2.5.51 起,内核不再使用 BIOS 报告的值 - 很难将 BIOS 设备编号与 Linux 磁盘名称匹配,可能只有两个磁盘的数据可用,可能某些磁盘在 BIOS 设置中不存在等等。但是,如果需要这些值,自 Linux 2.6.5 起,可以设置 CONFIG_EDD 并挂载 sysfs,然后在 /sys/firmware/edd/int13_dev* 下找到各种磁盘的 BIOS 数据。现在,用户空间软件可以完成 BIOS 编号(以 int13_dev82 等目录名称表示)与 Linux 名称(如 sda)的匹配,可能需要用户的帮助。

当许多在同一磁盘上同时使用 Linux 和 Windows 的用户从 2.4 升级到 2.6,并使用尚未更新的分区工具 parted 程序时,这个 2.5.51 的更改引起了问题。我还没有检查当前的 parted 是否正常。

14.4 非问题:fdisk 看到的空间比 df 多得多?

fdisk 会告诉你磁盘上有多少块。如果你在磁盘上创建文件系统,例如使用 mke2fs,那么这个文件系统需要一些空间用于簿记 - 通常大约是文件系统大小的 4%,如果你在 mke2fs 期间请求大量 inode,则会更多。例如

# sfdisk -s /dev/hda9
4095976
# mke2fs -i 1024 /dev/hda9
mke2fs 1.12, 9-Jul-98 for EXT2 FS 0.5b, 95/08/09
...
204798 blocks (5.00%) reserved for the super user
...
# mount /dev/hda9 /somewhere
# df /somewhere
Filesystem         1024-blocks  Used Available Capacity Mounted on
/dev/hda9            3574475      13  3369664      0%   /mnt
# df -i /somewhere
Filesystem           Inodes   IUsed   IFree  %IUsed Mounted on
/dev/hda9            4096000      11 4095989     0%  /mnt
#
我们有一个包含 4095976 个块的分区,在上面创建一个 ext2 文件系统,将其挂载到某个位置,发现它只有 3574475 个块 - 521501 个块(12%)丢失给了 inode 和其他簿记。请注意,总共 3574475 个可用块和用户可用的 3369664 个块之间的差异是 13 个正在使用的块加上为 root 保留的 204798 个块。后一个数字可以通过 tune2fs 更改。这个 `-i 1024` 仅对新闻组和类似的东西是合理的,其中包含大量小文件。默认值将是
# mke2fs /dev/hda9
# mount /dev/hda9 /somewhere
# df /somewhere
Filesystem         1024-blocks  Used Available Capacity Mounted on
/dev/hda9            3958475      13  3753664      0%   /mnt
# df -i /somewhere
Filesystem           Inodes   IUsed   IFree  %IUsed Mounted on
/dev/hda9            1024000      11 1023989     0%  /mnt
#
现在只有 137501 个块(3.3%)用于 inode,因此我们比以前多了 384 MB。(显然,每个 inode 占用 128 字节。)另一方面,这个文件系统最多可以有 1024000 个文件(绰绰有余),而之前是 4096000 个(太多了)。


下一页 上一页 目录