Large Disk mini-HOWTO 大硬盘( 四 )



另一方面, 对於 geometry 驱动程式需要两个值: 其中之一是 G_fdisk, 由 HDIO_GETGEO ioctl 传回, 另一个是 G_used , 这是执行输出/入时实际使用的.如果给定 G_user 则 G-fdisk 以及 G_used 两者都会设为 G_user, 当此资讯是根据 CMOS 所提供时则设为 G_bios , 其它情形设为 G_phys.如果 G_log 看起来合理则 G_used 就设为 G_log.不然, 如果 G_used 不合理而 G_phys 看起来合理那麽 G_used 就设为 G_phys.此处的"合理"代表磁头数在 1-16 的□围内.

换个方式说: 指令列选项大於 BIOS , 并且决定 fdisk 看到的样子, 但如果它指定转换的 geometry(磁头数大於 16), 则核心会藉由 IDENTIFY 指令的输出重定它.


6.2 SCSI 细节
在 SCSI 方面情况有一点点不同, 因为 SCSI 指令已经使用逻辑区块号码, 所以 "geometry" 对实际的输出/入完全没关系.然而, 分割区的格式仍然是相同的, 所以 fdisk 必须得捏造些 geometry , 并且也在此使用 HDIO_GETGEO - 真的, fdisk 不会分辨 IDE 以及 SCSI 磁碟.你可以从下面的详细描述见到各种驱动程式捏造一些个不同的 geometry .真是, 一团混乱.

如果你没有使用 DOS 或这类系统, 那麽避免使用所有额外的转换设定, 可能的话, 尽管使用 64 磁头, 每磁轨 32 磁区 (良好的, 方便每磁簇 1 MB), 如此当你把磁碟从一个控制器换到另一个去时不会遇到任何问题.某些 SCSI 磁碟驱动程式 (aha152x,pas16,ppa,qlogicfas,qlogicisp)非常在意与 DOS 的相容性而不允许只有 Linux 的系统使用超过 8 GB 的容量, 这是只臭□.

真实的 geometry 是什麽? 最简单的答案是没有这种东西.如果真有的话, 你不会想知道, 而且的的确确从不, 永不需告诉 fdisk 或是 LILO 或核心有关它的事.这绝对是 SCSI 控制器与磁碟之间的事.让我重覆这句话: 只有蠢蛋会告诉 fdisk/LILO/Kernel SCSI 磁碟真实的 geometry .

但如果你好学且坚持, 可以问磁碟机自己.有个重要指令 READ CAPACITY 将会传回磁碟的总容量, 而且有个 MODE SENSE 指令 Rigid Disk Drive Page(page 04) 会传回磁簇以及磁头的数目(这是不能改变的资讯), 而在 Format Page(page 03)有每磁区的位元组, 以及每磁轨的磁区数.这数字一般与 notch 有关, 而且每磁轨的磁区数是变动的 - 外围的磁轨拥有比内圈磁轨多的磁区.Linux 程式 scsiinfo 会给予这项资讯.其中有许多繁琐的细节, 而且很明白的, 没有人(也许甚至是作业系统)需要使用这项资讯.还有, 因为我们只关心 fdisk 以及 LILO , 一般得到的回答像 C/H/S=4476/27/171 - 这样的值 fdisk 根本不能使用, 因为分割表只保留 10resp. 8resp. 6 bits 给 C/H/S.

那核心之 HDIO_GETGEO 从何处取得其资讯? 嗯, 不是从 SCSI 控制器, 就是推论猜测.有些驱动程式似乎认为我们想知道 "真相" , 但我们当然只想知道 DOS 或 OS/2 FDISK (或 Adaptec AFDISK 等等)所用的.

注意, Linux fdisk 需要磁头数 H 以及每磁轨磁区数 S 以便转换 LBA 磁区号码成为 c/h/s 位址, 但磁簇数 C 在此转换中并未扮演什麽角色.有些驱动程式使用 (C,H,S) = (1023,255,63) 来表示磁碟容量至少为 1023*255*63 个磁区.这是不幸的, 因为这不能显示实际的大小, 而且将限制大部份版本之 fdisk 的使用者其磁碟最大到 8 GB - 现今实际的限制.

在下面的描述中, M 表示磁碟的全部容量, 而 C,H,S 是磁簇, 磁头以及每磁轨磁区数.如果我们把 C 当作 M/(H*S) 那给 H,S 就可以满足.

推荐阅读