grub1をGPTで動作させようとしています。現時点では、実際のマシンに移行する前のテストステップとして、仮想マシンにいます。
/boot
grub 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)
「起動可能なシステムの作成」のように標準が機能するため、より簡単です。しかし、システムは私の標準と比較して十分に強力ではありません。setup
stage1.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=9728
10240バイト、20個のセクターは10240バイト)があるため、13
Put 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のサイズです。これでプロセス全体が完了します。