次のページ 前のページ 目次へ

9. 結論

結局どうだというのでしょう? Linux 利用者にとっては一点だけが重要です。 それは、LILO と fdisk が正しいジオメトリを使わなければならないことです。 ここでの「正しい」とは、fdisk に関しては同じディスク上の他の OS がそのジオメトリを使用しているという意味であり、 また LILO に関しては起動時に BIOS とやり取りして起動が成功する ジオメトリであるということです。(普通はこの 2つは一致します。)

fdisk は、どうやってジオメトリを調べるのでしょう? HDIO_GETGEO ioctl を使用してカーネルに問い合わせるのです。 しかし、利用者は対話的に、あるいはコマンドラインからジオメトリを強制できます。

LILO は、どうやってジオメトリを調べるのでしょう? HDIO_GETGEO ioctl を使用してカーネルに問い合わせるのです。 しかし、利用者は /etc/lilo.conf 内の "disk=" オプションを使って、 ジオメトリを強制できます (lilo.conf(5) を参照してください)。 linear オプションを LILO に指定することもできます。 その場合、LILO は CHS アドレスの代わりに LBA アドレスをマップファイルに格納し、 起動するときにそれを使用します。 (ドライブのジオメトリを問い合わせるために INT 13 のファンクション 8 を使います)

カーネルは(fdisk や LILO に訊かれた)答をどうやって調べるのでしょうか? ええと、おそらく手動か、または カーネルにそのようなオプションを渡すように ブートローダに質問されて、 最初に利用者が `hda=cyls,heads,secs' というカーネルコマンドラインオプション(bootparam(7) を参照のこと) によって明示的にこれを指定するかもしれません。 例えば、/etc/lilo.conf 内に `append = "hda=cyls,heads,secs"' というような行を追加することにより、 そのようなオプションを LILO に与えることができます(lilo.conf(5) を参照のこと)。 でなければ、カーネルは 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
#

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 セクタであることを知る 2つの方法があります。 カーネルの出力
# dmesg | grep hdc
...
hdc: Maxtor 93652U8, 34837MB w/2048kB Cache, CHS=70780/16/63
 hdc: [PTBL] [4441/255/63] hdc1 hdc2 hdc3! hdc4 < hdc5 > ...
は(少なくとも) 34837*2048=71346176 か(少なくとも) 70780*16*63=71346240 セクタであることを教えてくれます。 この場合では、2番目の値は (訳注: 上記 hdparm での値と) 偶然にもまったく同じですが、 一般的にこれらの値は端数が切り捨てられています。 これは hdparm が利用できない時にディスクサイズを概算するいい方法です。 決して cyls に大きすぎる値を与えないように! SCSI ディスクの場合には、 正確なセクタ数はカーネルのブートメッセージに表示されます:
SCSI device sda: hdwr sector= 512 bytes. Sectors= 17755792 [8669 MB] [8.7 GB]
(MB や GB は丸められていますが、切り捨てられてはいません。 また 2進で計算しています)


次のページ 前のページ 目次へ