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

11. Linux の IDE 8 GiB の壁

Linux の IDE ドライバは ATA IDENTIFY DEVICE リクエストを使用することにより、 ディスクのジオメトリと容量(とその他多くの情報)を得ます。 最近まで、C*H*S により計算された容量よりも 10% 以上大きい場合は、 ドライバは返された lba_capacity の値を信用しませんでした。 しかし、業界の規定により (16514064 セクタを越える) 大きな IDE ディスクは、 実際のサイズとは無関係の、 計 16514064 セクタ (7.8 GB (訳注: 7.8 GiB または 8.4 GB が正しい)) となる C=16383, H=16, S=63 を返し、実際のサイズは lba_capacity で返します。

最近の Linux カーネル (2.0.34 や 2.1.90) はこのことを知っていて 正しい動作をします。 もし古い Linux カーネルを使っていてアップグレードもしたくなく、 その結果 8 GiB を越える大容量ディスクの 8 GiB しか扱えないようならば、 /usr/src/linux/drivers/block/ide.c 内のルーチン lba_capacity_is_ok を以下のように変更してください。 (訳注: でも特別な理由がない限り、 どうせカーネルの再コンパイルを行うのならば、 素直にアップグレードした方がいいと思います)

static int lba_capacity_is_ok (struct hd_driveid *id) {
        id->cyls = id->lba_capacity / (id->heads * id->sectors);
        return 1;
}
より良いパッチについては、カーネル 2.1.90 を見てください。

11.1 BIOS の複雑化

今いったように、大容量ディスクは実際のサイズとは無関係なジオメトリ C=16383, H=16, S=63 を返し、実際のサイズは LBAcapacity の値で返します。 いくつかの BIOS はこれを理解せず、 この 16383/16/63 をより小さいシリンダ数とより大きいヘッド数、 例えば 1024/255/63 や 1027/255/63 といった値に変換します。 そう、カーネルは単一のジオメトリ 16383/16/63 だけではなく、 BIOS によって変換されてしまったジオメトリも見分けなければなりません。 カーネル 2.2.2 からこれは正しく処理されます( BIOS に問い合わせて H と S を得、C = capacity/(H*S) と計算することによって)。 通常この問題は、BIOS 設定でディスクを Normal と設定することで解決します (あるいは、よりよい方法は、None と設定して BIOS に一切認識させない)。 この HDD から起動させなければいけないとか、 DOS/Windows でも使うなどの理由でこれが不可能で、 さらにカーネルを 2.2.2 かそれ以降にアップグレードするという選択も無理ならば、 カーネルの起動パラメータを使ってください。

BIOS が 16320/16/63 と報告する場合は、 それは変換後に 1024/255/63 を得る目的で報告されているのです。

11.2 ヘッド数を決めるためのジャンパ

多くのディスクは 15 ヘッドか 16 ヘッドかのジオメトリを選択可能にする ジャンパを用意しています。 デフォルトの設定は 16 ヘッドのディスクになっているでしょう。 いずれのジオメトリでも同じ総セクタ数の時もあれば、 15 ヘッドの方が総セクタ数が少ない時もあります。 こんなセットアップの際にはよい理由があるかもしれません: Petri Kaukasoina はこういってます: 「10.1 GB の IBM Deskstar 16 GP (model IBM-DTTA-351010) はデフォルトでは 16 ヘッドにジャンパが設定されているが、 この (AMI BIOS の) 古い PC ではブートしないので、 15 ヘッドの方にジャンパを設定する必要があった。 hdparm -i は RawCHS=16383/15/63 で LBAsects=19807200 と報告している。 私はすべての容量を得るために 20960/15/63 で使っている。」 ジャンパの設定については、以下を参照してください。 http://www.storage.ibm.com/techsup/hddtech/hddtech.htm.

11.3 総容量を隠すためのジャンパ

多くのディスクはディスクをより小さく見せかけることを可能にする ジャンパを用意しています。 それはばかげたことで、 これを使用したがる Linux ユーザはおそらくいないでしょうが、 大容量ディスクを接続すると一部の BIOS はクラッシュしてしまいます。 通常の解決方法は、ディスクを完全に BIOS に認識させないことです。 しかしこれは起動ディスクではない時しか利用できないでしょう。

最初の深刻な制限は 4096シリンダ制限です (これは 16 ヘッドと 63 セクタ毎トラックの場合 2.11GB です)。 例えば、富士通 MPB3032ATU という 3.24 GB のディスクはデフォルトで 6704/15/63 というジオメトリですが、 ジャンパを設定することで 4092/16/63 に見せかけることが可能です。 そして LBAcapacity に対して 4124736 セクタと報告するので、 OS はこのディスクが実際はもっと大容量であると知ることはできません。 (実際にディスクの容量が大きすぎて BIOS がクラッシュするので、 ジャンパが必要になるという)このようなケースでは、 ディスクのサイズについて Linux に教えるために ブートパラメータを指定する必要があります。

これはあまりよくない例です。 多くのディスクはジャンパを設定することにより、 2GB のディスクであるかのように見せ、 4092/16/63 や 4096/16/63 といった切り詰めたジオメトリを報告します。 しかし LBAcapacity では完全な値を報告するのです。 このようなディスクは正常に動作しますし、 ジャンパの設定に関わらず Linux の下ではすべての容量を利用できます。

もっとも最近の制限は 33.8 GB の壁 です。 2.3.21 より古い Linux カーネルでは、 これより容量の大きな IDE ディスクをうまく処理するにはパッチが必要です。 この制限より大きなディスクのいくつかでは 33.8GB ディスクに見せかけるためのジャンパ設定が可能なものがあります。 例えば、IBM Deskstar 37.5 GB disk (DPTA-353750) といったようなこの制限より大きなディスクは、 33.8 GB のディスクに見せかけるためのジャンパ設定が可能で、 (訳注: 2.1 GB に見せかけることのできる) 他の大容量ディスクのように 16383/16/63 というジオメトリを報告しますが、 LBAcapacity は (訳注: 33.8GB に相当する) 66055248 と報告します (65531/16/63 や 4111/255/63 に相当します)。 33.8GB に見せかけるためのジャンパ設定をしたこれらのディスクもまた、 Linux の下ですべての容量を利用するためにブートパラメータを必要とします。 the BIOS 33.8 GB limit も参照してください。


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