grub.cfg を作成しています

grub.cfg を作成しています
  • GPT パーティションから起動するにはどうすればいいですか?
  • ブート可能フラグがオンになっているパーティションが必要な MBR 方式のようなものですか?
  • Linux で GPT パーティションを起動可能としてマークするにはどうすればよいですか?

答え1

GPT パーティションから起動するにはどうすればいいですか?

Linuxインストールの起動には、複数の段階とソフトウェアコンポーネントが含まれます。ファームウェア初期化、実行ブートローダー、ロードと起動Linuxカーネルイメージ、そして様々な起動スクリプトそしてデーモンこれらの各段階と構成要素には、異なるバリエーションとアプローチがあります。たとえば、グラブリロSYSLINUXまたはロードリンブートローダーとして使用することができ、スタートアップスクリプトは従来の初期化スタイル、またはシステム構成は、次のような現代的な代替手段によって実行できます。システムまたはアップスタート

起動時に使用するもう一つの一般的なプログラムは再検索1つのUEFI ブートマネージャー発射可能エフィスタブカーネル。

電子フィ(拡張ファームウェアインターフェース)システムパーティションまたは超能力は、コンピュータが使用するデータストレージデバイス(通常はハードディスクドライブまたはソリッドステートドライブ)上のパーティションです。統合拡張ファームウェアインターフェース(UEFI)。コンピュータが起動したUEFI ファームウェアは、ESP に保存されているファイルを読み込み、インストールされているオペレーティング システムやさまざまなユーティリティを起動します。

ESPには、ブートローダーまたはカーネルイメージインストールされているすべてのオペレーティングシステム

ブート可能フラグがオンになっているパーティションが必要な MBR 方式のようなものですか?

ブートフラグ古代からある、MBRパーティションはブート可能として記録されるため、ブート ローダーが配置されている場所を示すことができます。したがって、質問への回答としては、ブート パーティションをブート可能としてフラグ付けする必要はありません。

グローバルに一意な識別子ガイド) のために電子フィシステムパーティションGUID パーティション テーブルGPT)スキームはC12A7328-F81F-11D2-BA4B-00A0C93EC93B、そのIDはマスターブートレコードMBR)パーティションテーブル方式は0xEF

Linux で GPT パーティションを起動可能としてマークするにはどうすればよいですか?

  • gdisk、タイプコードをEF00に設定します。(gdiskは、ディスク上の実際のタイプコードに展開される2バイトのタイプコードを使用します。「EF00」は「C12A7328-F81F-11D2-BA4B-00A0C93EC93B「」。
  • GPartedまたは parted を使用する場合は、「ブート フラグ」を設定します。ただし、これは GPT ディスクでのみ機能することに注意してください。これらのプログラムを使用して MBR ディスクに ESP タイプ コードを設定することはできません。(EFI ベースのコンピューターは通常 GPT ディスクから起動するため、これは通常大きな問題ではありません。)
  • 最近のLinuxのバージョンではfdiskパーティション タイプは、番号 (GPT ディスクの「EFI システム」の場合は 1、MBR ディスクの場合は 0xEF) で設定するか、GPT ディスクの完全なタイプ コードを入力して設定します。

答え2

ブート可能フラグがオンになっているパーティションが必要な MBR 方式のようなものですか?

うーん、その前に、BIOS がブート実行のフォローをどのように引き継ぐかについて簡単に思い出してみましょう。

  1. BIOS はブート メディアの最初のセクター (512 バイト) を読み取ります。
  2. セクターの最後の 2 バイトが 55 AA の場合、そのセクターが実行されます。これで BIOS の役割は終了です。

切り取られた 440 バイトのコードは MBR (マスター ブート レコード) と呼ばれ、その目的は 4 つのパーティション テーブル エントリでブート可能フラグを探すことです。ブート可能としてマークされたパーティションの場合は、最初のセクターをロードし、ブート実行のフローをこのセクターのコードに渡します。

互換性の理由から、GPT を使用する場合でも、いわゆる保護 MBR が存在することに注意してください。(GPT は 2 番目のセクターから始まります)

つまり、MBR コードが「ブート可能フラグ」を管理します。ただし、切り取られた 440 バイトの MBR コードは変更されたり、異なるものになったりする可能性があります。実際、GRUB をインストールするときはその通りです。たとえば、GRUB2 を次のようにインストールします。

sudo grub-install --boot-directory=/mnt/boot --force --target=i386-pc /dev/sdb   -v 

標準の MBR コードを独自のコードに完全に置き換えます。(そのコードのコピーは /boot/grub/i386-pc/boot.img にあります)

結論: -> Grub コードはブート可能なフラグを一切考慮しません。

非 EFI GPT デバイスに grub をインストールする

「非 EFI」とは、BIOS に UEFI が搭載されていない、または UEFI が CSM (互換性サポート モジュール) モードで実行され、上で説明した従来の方法で起動する古いデバイスを意味します。

Grub が「ブロックリスト」経由でインストールされると、MBR と最初のブート セクターの間のパーティション ギャップにインストールされます。ただし、GPT が使用されている場合、Grub はそのパーティション ギャップへのインストールを拒否します。代わりに、コードを安全にインストールできる小さなパーティションを作成することを要求します。

これが私たちがこれを設定する方法ですGparted:

  1. 1MBのフォーマットされたパーティションを作成する
  2. そのパーティションを「bios-grub」としてマークします。gparted で「bios-grub」チェックボックスを有効にすると、GPT タイプが「BIOS ブート パーティション」に変更されます。

gdisk -l /dev/sdbあるいは、以下を使用して確認し、... することもできます 。

sgdisk -t 3:ef02 /dev/sdb ^- 3番目のパーティションを ef02 としてマーク => 'BIOS ブート パーティション'

... gparted を使用せずに同じことを実現します。注: 「ef02」は「BIOS ブート パーティション」または GUID の略です21686148-6449-6E6F-744E-656564454649

はい、これで完了です。これで Grub セットアップを実行できます。

Linux(または/boot/grubパーティション)を/mnt/bootにマウントして実行します。

  1. sudo grub-install --boot-directory=/mnt/boot --force --target=i386-pc /dev/sdb   -v 
    

運が良ければ、すべてがうまくいき、次の画面が表示されます。

grub-install: Info: setting the root device to `hostdisk//dev/sda,gpt6'.
grub-install: Info: saving <556324864,0,512>.
...

そのため、そのコンテンツが/boot/grub/i386-pc/core.img1 MB の「BIOS ブート パーティション」に直接コピーされる --force必要があります。そうしないと、GRUB はブロック リスト経由でのインストールを拒否します。失敗した場合に備えて、インストールのブロック リスト部分から再度開始するためのショートカットを以下に示します。

grub-bios-setup --verbose --force --directory= /mnt/boot/grub/i386-pc  /dev/sdb

つまり、grub-bios-セットアップコピーします

/mnt/boot/grub/i386-pc/boot.img -> Sector 0 (MBR)
/mnt/boot/grub/i386-pc/core.img -> Sector 556324864 (BIOS boot partition)

しかし、最も重要な部分である core.img の「コンパイル」はこれによって実行されません。

私が使うバーチャルボックス起動プロセスをテストするには:

sudo chmod 666 /dev/sd*
VBoxManage  internalcommands createrawvmdk -filename ~/sdb.vmdk -rawdisk /dev/sdb

このコマンドは、物理デバイス全体を仮想マシンに取り込む場合に特に便利です。

<右Ctrl> + R でVMを再起動します

食料救助で「楽しい」>

おそらく途中で遭遇することになるので、ちょっと急いで説明します。目標は、次の 2 つのコマンドをエラーなしで実行することです。

> insmod normal
> normal

set何が設定されているかを確認するのに便利です。 lsパーティションが表示され、 ls (hd0,2)パーティション #1 にどのようなファイルがあるかが表示されます。見つかった場合は、(hd0,2) の grub フォルダー set prefix=(hd0,2)/boot/grubが、ここから抜け出すためのコマンドです。これでinsmod normalnormal「通常の」 grub メニューに入ることができます。normal.mod を実行したら、1 つだけ注目すべきことがあります。

ls (hd0,<tab>

どのようなパーティションが存在するか、それらの名前は何であるか、使用されているファイルシステムは何であるかなど、より詳細な情報が表示されます。

さて、本題に戻りましょう。

grub.cfg でパーティションをマークするにはどうすればいいですか?

これは grub をインストールするときに間接的に発生します。その後は修正され、変更することはほぼ不可能です。いくつかの愚かな設計上の決定のせいです。では、grub の適切に設計されていない部分を詳しく見てみましょう。

このcore.imgのキー。GRUBのセットアップ中に、この目的のために作成した1MBのパーティションに直接書き込まれます。これには、次のようなスクリプトが含まれています。

set prefix=(hd0,2)/boot/grub
insmod normal
normal

このスクリプトと、grub ファイルを含むパーティションにアクセスするために必要なすべてのファイルシステム ドライバーは、core.img にまとめられ、圧縮 (!!!) されます。圧縮されているため、ディスク エディターを使用して表示したり、(hd0,2) を (hd0,4) に変更するなどの小さな変更を行ったりすることはできません。また、gdisk を使用して GPT パーティションを並べ替えたり、その他の変更を行ったりする必要がある場合があります。圧縮を無効にする方法もありません (または、スイッチはありますが、機能しません)。また、そのスクリプトは自動生成されるため、変更してよりスマートにすることはできません。たとえば、固定パーティション番号ではなく search.label を使用して、必要な Grub パーティションを検索します。部分的に実行できることは、grub セットアップを再実行して、起動が問題なく行われることを期待することだけです。

注: 不思議なことに、EFI を使用すると、よりオープンでフレンドリーになり、カスタマイズが簡単になります。

残念ながら、私はまだ「grub-install」がどのように動作するか研究中です。現在、次のような奇妙なことを試しています。sda私は明示的に使用すべきだと指定していますがsdb

もっと詳しくわかったら、後でこの投稿を編集するかもしれません。編集: では、始めましょう。これが「不可能」を実現する方法です。

nano /mnt/boot/grub/i386-pc/load.cfg

以来

search.fs_uuid 39ff90d3-00b1-4cb9-8b94-03a7a9053352 root hd0,gpt6 
set prefix=($root)'/mnt/boot/grub'

これはダメで、私が必要としているものではありません。次のように変更します。

search.fs_label boot root hd0,gpt5 
set prefix=($root)/grub

わあ、見栄えが良くなりました。:) ... 次は 'core.img' を生成します... :

grub-mkimage -O i386-pc -o /mnt/boot/grub/i386-pc/core.img  -C none \
    --prefix /grub -c /mnt/boot/grub/i386-pc/load.cfg  \
    ext2 ntfs part_gpt biosdisk search_label normal

注: ntfs の他に、レスキュー コンソールをより快適にするために「normal」モジュールも追加しました。これで、コマンドを完了するためのタブと、コマンド履歴をスクロールするためのカーソルが上下に機能するようになりました。 前述のとおり、現在は--Compression none効果がありません。Core.img は常に xz で圧縮されます。

... それをディスクに書き込みます:

grub-bios-setup -v -f -d /mnt/boot/grub/i386-pc  /dev/sdb

したがって、どのパーティションから開始されるかは、grub.cfg に書き込まれた内容と、もちろんユーザーが起動するように選択した内容によって決まります。

grub.cfg を作成しています

Linux システムを /mnt/MINT にマウントし、次を実行します。

grub-mkconfig -o /mnt/MINT/boot/grub/grub.cfg

UEFI サポートの追加

準備: Gparted で 1 MB の FAT32 パーティションを追加します。タイプを「ef00 EFI システム パーティション」に設定します。 sgdisk -t 11:ef00 /dev/sdb ^- は 11 番目のパーティションを ef00 => 「EFI システム パーティション」としてマークします。

gdisk -l /dev/sdb結果を確認します。ただし、ほとんどの場合、すでに「EFI システム パーティション」が存在します。その場合は、追加で作成するのではなく、使用するだけです。

「EFI システム パーティション」には、後で EFI BIOS によって読み込まれ実行される grubx64.efi が保存されます。EFI-Bios はデフォルトで FAT32 だけでなく GPT も読み取る方法を認識していることに注意してください。 今マウント

/mnt/boot -> Linux System containing grub.cfg
/mnt/UEFI -> The 'EFI system partition'

次にgrub-installを実行します:

sudo grub-install --boot-directory=/mnt/boot \
        --efi-directory=/mnt/UEFI  --target=x86_64-efi   /dev/sdb   -v 

あまり変わっていません。--force はもう必要ありませんが、別の --target があり、追加の引数 --efi-directory が必要です。

関連情報