HDIO_GETGEO
ioctl は short (訳注: short int つまり 16ビット)
でシリンダ数を返します。
これは、65535 シリンダより多い場合には数字が切り捨てられて、
例えば(典型的な SCSI の設定では 1 シリンダ 1 MiB なので)
80 GiB のディスクは 16 GiB に見えるかもしれないことを意味します。
いったん何が問題なのか分かってしまえば、それを回避することは簡単です。
33.8 GB より大容量なドライブは、2.3.21 より古いカーネルではうまく動作しません。 (訳注: この章の最後の方にも書いてありますが、2.2.14 以降でもサポートしています。) その詳細は以下の通りです。 ある日あなたが新たに 66835440 セクタ (34.2 GB) の IBM-DPTA-373420 ディスクを買ってきたとしましょう。 2.3.21 以前のカーネルは、それのサイズを 769*16*63 = 775152 セクタ (0.4 GB) と報告し、ちょっとがっかりするでしょう。 そしてコマンドラインパラメータ hdc=4160,255,63 を与えても、 事態はまったく解決しないのです - これは無視されます。 一体何が起きているのでしょう? ルーチン idedisk_setup() では、 ディスクが報告するジオメトリ(16383/16/63 です)を受け取り、 ユーザがコマンドラインで指定した値で上書きします。 この値は BIOS ジオメトリのためだけに使用されるものです。 ルーチン current_capacity() や idedisk_capacity() は、 66835440/(16*63)=66305 という感じでシリンダ数を再計算しますが、 この値は short で格納されるので、 769 になってしまいます。 lba_capacity_is_ok() は id->cyls を破壊するので、 その後の呼び出しすべてに対して嘘の値を返し、 その結果ディスクの容量は 769*16*63 になります。 いくつかのカーネルに対してはパッチが提供されています。 2.0.38 用のパッチは ftp.kernel.org に用意されています。 2.2.12 用のパッチは www.uwsg.indiana.edu. に用意されています。 2.2.14pre カーネルはこれらのディスクをサポートしています。 2.3.* カーネルシリーズでは、2.3.21 からこれらのディスクをサポートしています。 また、ディスクのサイズを 33.8GB に切り詰めるために、ハードウェア的に ジャンパを設定する ことでも問題を「解決」することができます。 ハードディスクからブートしようとするのならば、 多くの場合 BIOS アップグレード が必要になるでしょう。