結局どうだというのでしょう? 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
#
カーネルのコマンドラインに
`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進で計算しています)