grub1でGPTを有効にする方法

grub1でGPTを有効にする方法

grub1をGPTで動作させようとしています。現時点では、実際のマシンに移行する前のテストステップとして、仮想マシンにいます。

/bootgrub stage1.5を含める別のパーティションとパーティションを作成しました。これはgdiskが表示するGPTパーティションテーブルです。

Number  Start (sector)    End (sector) Size        Code  Name
   1             2048           104447 50.0 MiB    8300  boot
   2           104448           206847 50.0 MiB    EF00  EFI
   3           206848         16984063 8.0 GiB     8E00  
   4             1024             2047 512.0 KiB   EF02  GRUB1

EFIパーティションはそのままにしてください。この場合は使用されません。後でシステムをUEFIにアップグレードする予定で(grub1に別れを告げて)、パーティションを早く作成したかっただけです。

grub1はGPTを理解していないので、最初のパーティションと4番目のパーティションで構成されるハイブリッドMBRを作成しました。ハイブリッドMBRについてgdiskが言う内容は次のとおりです。

   Number  Boot  Start Sector   End Sector   Status      Code
   1                        1         1023   primary     0xEE
   2         *           2048       104447   primary     0x83
   3                     1024         2047   primary     0xEF
   4                   104448     20971519   primary     0xEE

私の意図は、stage1.5を1MB未満の小さなパーティションに配置し、そのbootパーティション(GPT 1 / MBR 2)に実際のブートパーティション(stage2、grub構成、およびカーネルイメージを含む)を置くことです。しかし、インストールの段階でグラブを得ることはできません。

grubコマンドを実行するとfind /grub/menu.lst表示されるため、(hd0,0)組み込みパーティションがある実行中のカーネルパーティションレイアウトを使用しているようです(hd0,3)。しかし、与えることがroot (hd0,3)私に与えられた

ファイルシステムタイプが不明、パーティションタイプ0x83

パーティションが空であるため、ファイルシステムタイプは驚くべきことではありませんが、パーティションタイプを設定しましたが表示されません。

stage1.5をパーティションに含めようとすると(使用)embed (hd0,0)/grub/e2fs_stage1_5 (hd0,3)エラーが発生します。

エラー17:選択したパーティションをマウントできません。

そのパーティションにreiserfs3を作成しようとしましたが(reiserfs3にはブートローダを含めるスペースが16KBであるため)、エラーは同じです。ところで、私が作成したFSは非標準で、通常のFSを作成するには512KBが不足してログが別のデバイスにあります。

cat (hd0,3)+1パーティションの最初のセクタに何かを書き、grubシェルで実行すると、予想される出力が得られるので(hd0,3)が正しいドライブであることを確認しました。

実行方法の他のオプションはありますか? stage1.5を選択したパーティション(cat /boot/grub/e2fs_stage1_5 > /dev/sda4)に手動で挿入し、適切に変更しようとしています(I推測する最初のセクターのブロックリストと2番目のセクターのstage2の位置)から始まりますが、うまく機能したいです。

私が使っているバージョンはGentooのsys-boot/grub-0.97-r18です。

ベストアンサー1

予想していたよりも簡単で難しかったです。

まず、Gentoo(そして私が知っている限り他の多くのディストリビューション)はGPTを読むことができるようにGrubをパッチしました。

setup (hd0,0)「起動可能なシステムの作成」のように標準が機能するため、より簡単です。しかし、システムは私の標準と比較して十分に強力ではありません。setupstage1.5はどこにも組み込むことができないため、stage2をパッチし、MBRにディスクの場所を含める方法を使用します。したがって、stage2を移動して以前にあったブロックを変更すると、起動できないシステムが発生します。さらに悪いことは、おそらく最初に気づかないことです。アップグレードにより stage2 は別の場所に移動しますが、以前の場所は同じままです。システムはまだ起動中ですが、何も表示されません。ただし、起動時に使用されたコードはファイルシステムPOVの空き領域になるため、後でランダムに上書きされてブームが発生します。

そのため、質問の最後に説明されている手順を実行し、stage1.5を手動で挿入しました。

まず、stage1.5ファイルのコピーを作成し、コピーから16進エディタを実行します。便利なツールがなければ、vimとxxdを使って成功しました。ファイルを編集し、:!xxd<enter>ファイルを16進数で編集するように入力し、入力して:!xxd -r<enter>保存します。ファイルの末尾に追加の改行がありますが、無害です。この場合、右側のASCII部分は完全に無視され、16進数のみが使用されることに注意してください。このファイルで3つの編集が必要です。

  • ブロック番号を入力してください第二stage1.5のブロックはoffsetに挿入されます0xf8。これはリトルエンディアンで、ディスクの先頭に相対的です。 BIOSブートパーティションはセクタ1024で始まるため、1025バイトまたは0x0401(リトルエンディアン)バイトです0104
  • stage1.5の512バイトセクタ番号をオフセットから1を引いた位置に配置します0x1fc。私のstage1.5は9908バイト(9909に改行)なので、20個のセクター(19個のセクターは19*512=972810240バイト、20個のセクターは10240バイト)があるため、13Put in 19または16進数が必要です。
  • ffオフセット219を近くに00触れないでください。ff

元のファイルと変更されたファイルの16進ダンプの違いは次のとおりです。

-000001f0  00 00 00 00 00 00 00 00  02 00 00 00 00 00 20 02  |.............. .|
+000001f0  00 00 00 00 00 00 00 00  01 04 00 00 13 00 20 02  |.............. .|
 00000200  ea 70 22 00 00 00 03 02  ff ff ff 00 00 00 00 00  |.p".............|
-00000210  02 00 30 2e 39 37 00 ff  ff ff ff 2f 62 6f 6f 74  |..0.97...../boot|
+00000210  02 00 30 2e 39 37 00 ff  ff 00 ff 2f 62 6f 6f 74  |..0.97...../boot|

動作方法は、stage1.5の最初のセクタが最後から数字を読み込み、ディスクの先頭の指定されたセクタから始めて、それほど多くのセクタを読み取ることです。これは、stage1.5の残りのセクタをメモリにロードしてから実行します。 3番目の部分は、実際にはgrubが正しいパーティションを見つける必要があるディスクの場所です。誰もが興味があれば、関連コードはgrubのソースコードにあります。stage2/disk_io.c使用する部分はにあり、#ifdef STAGE1_5残りをロードする最初のセクタはにあることを忘れないでくださいstage2/start.S。複数の個々のセクションにstage1.5を含めることは可能かもしれませんが、まだ試していません。

cat変更されたstage1.5を作成した後、または必要に応じてターゲットパーティション(例では4番目のパーティション)にコピーするだけですdd

最後に grub シェルで実行します。

install /boot/grub/stage1 (hd0) (hd0)1024+20

(hd0)は、使用しているデバイスのグラブ名、1024組み込みstage1.5の始まり(ただしBIOSブートパーティションの始まり)、20ブロック単位のstage1.5のサイズです。これでプロセス全体が完了します。

おすすめ記事