この文書は fj.os.bsd.freebsd に投稿された | From: shoo kajitani | Subject: Windows95 fdisk problem? A ufs logical partition crashed. | Newsgroups: fj.os.bsd.freebsd | Date: 18 Aug 2000 22:07:52 +0900 | Message-ID: <8njcfu$q22$1@pooh.isoternet.org> | | 30GB のハードディスクを入手し、以下のように物理パーティションを | 作ることにしました。 | |1GB(DOS 基本領域)|7GB(FreeBSD 4.1-R)|22GB(DOS 拡張領域)| 中略 | その後 FreeBSD を立ち上げてみると、/home だけが壊れていました。 という記事へフォローアップしたものです。 要点は 「1024シリンダ以上のスライスを確保した状態で fdisk.exe を使って新たな領域を確保すると、 問答無用で 1024 シリンダ目から確保されちゃう!!」 ということです。 内容は無保証です。 From: candy Subject: Re: Windows95 fdisk problem? A ufs logical partition crashed. Newsgroups: fj.os.bsd.freebsd Date: 30 Aug 2000 21:32:03 +0900 Message-ID: References: <8njcfu$q22$1@pooh.isoternet.org> <8nuadi$1cm$1@pooh.isoternet.org> <8o5mdd$182$1@pooh.isoternet.org> candy writes: > 20G のディスクで追試したら再現しませんでした (^^;; 再現しました。原因らしきものも分かり、対処法も思い付きました。 (ちなみに、再現しなかったのは、BIOS が古くて大きなディスクに 対応してなかったためでした。) 以下長くなりますが報告です。 (この文章は無保証です) Windows98SE と FreeBSD 4.0R で |DOS基本(4G)|FreeBSD(4G)|DOS 拡張(12G)| という構成を作るべく、 1. fdisk.exe で DOS 基本(C:) 4096M を作成。(フォーマット不要) 2. FreeBSD インストーラで FreeBSD スライス 4096M を作成。 3. fdisk.exe で DOS 拡張(残り全て)を作成し、 D: (拡張領域全て)を作成。(フォーマット不要) を実行。この手順により slice id start size C S H 1 11 63 8401932 0 1 1 (開始CSH) 522 63 254 (終了CSH) 2 165 8401995 8385930 523 1 0 1023 63 254 (正しい終了CSHは 1043/63/254) 3 15 16450560 23631615 1023 1 0 1023 63 254 というスライステーブル(詳細は後述)が作られました。 ここで s2 の start + size = 16787925 なので、 s3 の start が s2 に食い込んでいるのが分かります。 では s3 の start = 16450560 というのがどこから出て来るかと言うと、 s2 の終了 C/S/H である 1023/63/254 の「次」のセクタである 1024/1/0 という位置に相当します。(16450560 = 1024 * 63 * 255) すなわち、 「fdisk.exe は s2 の終了 C/S/H を見て、s3 の開始セクタを計算する」(予想1) と思われます。 従ってこれを回避するには、 「s2 の終了セクタが真に 1023/63/254 以内であること」(対処1) 「s2 の開始セクタ+終了セクタ < 16450560 であること」(対処1') が必要になると思われます。 んじゃ fdisk.exe で、 |DOS 基本 8G|DOS 拡張 12G| ならどうなるのかな? と思い試してみました。結果は slice id start size C S H 1 12 63 16787862 0 1 1 1023 63 254 2 15 16787925 23294249 1023 1 0 1023 63 254 なんと s1 の id が 11 から 12 に変わり、 (s1 の start + size) = (s2 の start) になりました。 こういうインチキをされるとは予想しませんでした。 「fdisk.exe は id = 12 なら start/size を使って開始セクタを計算する」(予想2) 従って |DOS基本|FreeBSD|DOS 拡張| という構成を実現するには、 基本 + FreeBSD < 1024シリンダ(約8G) なら問題なし、そうでなければ (対処2) 1. fdisk.exe で s1 + s2 のサイズ分 DOS 基本で確保し、 2. DOS 拡張を確保し、その中に D: を確保し、 3. DOS 基本を解放し、本来のサイズで確保しなおす。 4. 空いた部分に FreeBSD を入れる。 または、 (対処3) 1. FreeBSD のインストーラ(スライスエディタ)で、 DOS 基本(id=11 または id=12) FreeBSD (id=165) DOS 拡張(id=15) を確保し、 2. fdisk.exe で「拡張領域中に DOS ドライブを作る」を選び D: を確保する。 のいずれかで可能だと思われます。 私は fdisk.exe が大嫌いになったので、対処3 を試しました。 で、C: D: をフォーマットして巨大なファイルを書いたりしましたが、 今のところ問題ないようです。(保証はしません) ●スライステーブルについて /dev/rad0 の 446 から 16 * 4 バイト分の領域です。 +0 アクティブフラグ (0x00 or 0x80) +1 .. +3 開始 H S C(Sの上位2ビットは、C に合成して10ビットとします) +4 ID (fat32 = 11, fat32+LBA = 12, FreeBSD = 165) +5 .. +7 終了 H S C +8 .. +b 開始セクタ (little endian) +c .. +f セクタ数 (little endian) という構造が 4 つ並びます。 神田敏広