许多人认为他们遇到了问题,而实际上并没有任何问题。或者,他们认为他们遇到的问题是由于磁盘几何结构造成的,而实际上磁盘几何结构与此事无关。以上所有内容听起来可能很复杂,但磁盘几何结构处理非常简单:什么都不做,一切都很好;或者,如果 LILO 在启动时卡在 `LI`,则可以给它关键字 lba32
。注意内核启动消息,并记住:你越是摆弄几何结构(为 LILO 和 fdisk 以及内核命令行指定磁头和柱面),事情就越不可能正常工作。粗略地说,默认情况下一切都很好。
请记住:Linux 中任何地方都不使用磁盘几何结构,因此你在运行 Linux 时遇到的任何问题都不可能是由磁盘几何结构引起的。实际上,磁盘几何结构仅由 LILO 和 fdisk 使用。因此,如果 LILO 无法启动内核,那可能是几何结构问题。如果不同的操作系统不理解分区表,那可能是几何结构问题。仅此而已。特别是,如果 mount 似乎不起作用,永远不要担心磁盘几何结构 - 问题出在其他地方。
磁盘很可能获得错误的几何结构。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 信息,所有磁盘都会出现相同的问题。请参见下文。
`我有两个相同的 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 信息,并且前两个磁盘的不同处理方式已经消失。
由于几何结构不存在,因此 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 是否正常。
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 个(太多了)。