[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:09576] Re: 8G over disk setup



佐野@浜松です。

  -> 武藤@イソターネット協会 さん:

> 結局13.6Gの件ですが、Logicalパーティションを作ると駄目みたいです。
> Logicalパーティションが1024シリンダを超えるところに現れると
> 何かマズいらしく、Physicalパーティションで作ったところ問題が出ませんでした。

後で (1024シリンダを越えるところに書き込もうとした時に) 問題が出る
可能性が高そうです。

 Primary パーティションのテーブルは MBR (先頭の 512byte) 内ですが
 Logical パーティションのテーブルは Extended パーティションの中の
それぞれの Logical パーティションの前に作られますから、、、
(後はおわかりですよね)

> #でも4つまでしか作れない。。。/varを分けたいのに。

というだけでは済まないでしょう。

> 最初はcfdiskで試し、失敗したので諦めながらfdiskも実行したのでした。

とりあえずインストールできてしまえば sfdisk も使えるので、
 BIOS = LARGE, C/H/S=1653/255/63 な状態で 200MByte 程度の
「緊急起動用 root」を作ってしまって (後で何か起きた時にも
役に立つでしょう) そこにとりあえず最小限のシステムを構築
してしまうというのはいかが ?

 fdisk は特に大容量 HDD を相手にする時はなるべく使わないように
していったほうが良いでしょう。現時点で知られている問題は無い
みたいですが、コードのメンテがしばらく前から止まっています。
 fdisk を 4GB 以上に対応させるパッチを書いた本人が、もうあの
コードで作業するのは嫌だからゼロから作り直したと sfdisk.c の
コメントに書いています。

# 私自身もこれからなるべく sfdisk を使っていこうと思っている
# のですが、まだ bo なので実際には使ったことが無いです。 ^^;;

ただ、 hamm のインストーラディスクには cfdisk と fdisk しか
ありませんから、せめて cfdisk にしましょう。

> 正確には2014MBですね。
> 「hda: Maxtor 91360D8, 2014MB w/256kB Cache, CHS=1653/255/63」
> (LBA起動時)

これを出しているのは、 ide.c の

        printk ("%s: %.40s, %ldMB w/%dkB Cache, CHS=%d/%d/%d",
         drive->name, id->model, current_capacity(drive)/2048L, id->buf_size/2,
         drive->bios_cyl, drive->bios_head, drive->bios_sect);

ですね。これでみると、 current_capacity(drive)/2048L -> 2014
ですからセクター数は 2048*2014 = 4124672 (or +2047) のあたりに
ありそうです。

で、問題なのは、 C*H*S から計算されるセクター数より LBA セクター数と
して HDD から渡されるセクター数が小さい場合には current_capacity() で

                if (id->lba_capacity >= capacity) {
                        drive->cyl = id->lba_capacity / (drive->head * drive->sect);
                        capacity = id->lba_capacity;
                        drive->select.b.lba = 1;
                }

に該当せず、 drive->select.b.lba = 0 のままになってしまうことですね。
このフラッグが 1 にならないと、 do_rw_disk() のコメントにあるように
 READ/WRITE で LBA アクセスではなく CHS アクセスが使われます。
この時 IDE コントローラが 1024 を越えるシリンダへのアクセスを
ちゃんと HDD に伝えてくれれば良いですが、マザーボードによっては
それをしない場合もあるような、、、 (普通はそういう HDD なら LBA
アクセスを使うからという理由なのかもしれませんが)

/*
 * do_rw_disk() issues READ and WRITE commands to a disk,
 * using LBA if supported, or CHS otherwise, to address sectors.
 * It also takes care of issuing special DRIVE_CMDs.
 */

既に鍋谷@阪大さんが

 | この意味ありげな 2014 という数字は、ハードディスクのジャンパ
 | の設定が関係あるかもしれません。ジャンパの設定で、わざと 2GB
 | しか認識させないセーフモードがあったりします。

と書かれていましたが、私もこの可能性が高いと思います。このせいで
 LBA アクセスできなくなっているのではないでしょうか。

「緊急用 root 」へ最小限のシステムをインストールしてから、
 hdparm をインストールして hdparm -i /dev/hda で確認してみて
下さい。 ( hdparm には -g や -v などのオプションもあります)

> LBAの状態でディスクを空にした状態で
> cfdisk -P s /dev/hda
> # Type FirstSector LastSector Offset Length Filesystem Type (ID) Flags
> ----------------------------------------------------------------------
>   Pri/Log        0   26555444     0#2655445 Free Space
> None(00)
> です。cfdisk -P tだと全部0ですね(空にしてるから当然か)。

 cfdisk.c のコードを見ましたが、ここで LastSector / Length として
表示している数値は clear_p_info() の中で C/H/S から計算していますね。
やはりカーネル起動時の 2014MB に相当するセクター数しか HDD から
渡されていないのではないかと思います。 hdparm -i /dev/hda の結果を
見ればセクター数が確認できます。

> ディスクパーティションの書き込みに失敗してしまうと
> FATAL ERROR: Cannot read disk drive
> となってしまってcfdiskでの調査は出来ませんです。

 cfdisk -z /dev/hda で起動することは可能ですか ?

> Debian 2.0インストーラから起動したddでは
> dd if=/dev/zero of=/dev/hda bs=512 count=1
> はUsageが出てきてしまって動きませんでした。
> 他にMBRをクリアする良い方法はありますか?
> MS-DOSのFDISKだとどうなるんだろう…。

笹山さんの書かれたとおりリダイレクトして
 dd bs=512 count=1 </dev/zero >/dev/hda としてみては ?

# レスキューディスクの root.bin をループバックでマウントして
#  ls -i bin すると dd は cat, ls, cp, date など他の 28 の
# コマンドとハードリンクされていることがわかりますね。

> うー、これはちと辛いですね。すぐに使えるLinux環境はノート
> しかないのです。

とりあえずトラブル対策用に「緊急用ルート」を作ったほうが
インストールディスクだけでどうにかしようとするより何かと便利
でしょうし、早道だったりするかもしれませんよ。

 LBA アクセスできるようになっても C/H/S が変更されなければ
そのまま使えるかもしれませんし、もしアクセス方法の変更でその
パーティションが使えなくなったとしても、その時点でトラブル
対策の必要も無くなっているわけですから問題無いでしょう。

> sano>  MBR を dd でゼロクリアして、 cfdisk -z /dev/hda または
> sano>  cfdisk -z -c 1653 -h 255 -s 63 /dev/hda で cfdisk を起動すれば
> sano> パーティション設定後 W で書き込みできたりしませんか ?

> dd がうまく出来ないのが問題なのかもしれませんが、
> どちらを試してもやはりFATAL ERRORが出てしまうようです。うーん。

 HDD に LBA アクセスできないのが原因だとすれば、 1024 シリンダを
越える領域に書き込みできないのは仕方無いですね。

ジャンパーの設定で LBA capacity を本来の値に変更できれば
良いのでしょうが、もしできなければカーネルにパッチを当てる
必要があるかもしれません。 LBA を使うかどうかの制御は
ブートオプションではできないみたいですから。

あるいは、マザーボードを交換してみるか、、、

-- 
  public: <xlj06203@xxxxxxxxxxx>
  office: <sano@xxxxxxxxxxxxxxxxxxxxxxxxxx>