RHEL 7.9を実行する第1世代の仮想マシンを搭載したWindows 10ノートブックにHyper-Vがインストールされています。 UEFIブートを使用してGen 2 VMで実行するように更新しようとしています。
Gen 2仮想マシンへの移行中は、UEFIブートコードを/ bootパーティションにインストールする必要があります。
私に必要な次のパッケージをインストールしました。
grub2-efi-x64.x86_64 (1:2.02-0.07.el7_9.9)
shim-x64.x86_64 (15-11.el7)
grub2-efi-x64-modules.noarch (1:2.02-0.07.el7_9.9)
shim-unsigned-x64.x86_64 (15-9.el7)
efibootmgr -v
以下を表示します。
ご覧のとおり、いくつかの他の設定を試してみましたが、efibootmgr
そのうち何も機能しないようです。
VM起動設定:
したがって、理論的には\EFI\redhat\shimx64.efi
、仮想マシンはから/boot/efi/EFI/redhat/shimx64.efi
起動する必要があります。
df -h
リカバリDVDから起動するときのI/boot
以降のインストールを表示します/dev/sda1
。chroot /mnt/sysimage
/bootパーティションのスクリーンショットに示すように、カーネルの有効なinitramfsファイルがあるようです(まだ到達していないと思います)。
また、グラブの設定をリセットしてみました。
grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
ファイルgrub.cfg
にはカーネルバージョンの観点から見ると正しく見えるメニュー項目が含まれていますが、grubメニューを見たことがないのでまだここまで届いていないと思います。 UEFIブートローダの問題のようですが、解決策がわかりません。
DVDを取り外してコンピュータを起動すると、Hyper-Vはネットワークアダプタに到達するまで起動順序を下げます。
結局、Hyper-Vは次のことを示しました。
私は何が間違っていましたか?
リカバリDVDから起動し、grubメニューのコマンドラインに移動してをc
実行すると、インストールさconfigfile (hd0,gpt1)/efi/EFI/redhat/grub.cfg
れているLinux OSを起動できます。
mount | grep -i "boot"
オペレーティングシステムから起動すると、以下が表示されます。
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
答え1
UEFIには「ブートブロック」のようなものがないことを理解する必要があります。UEFIファームウェアはファイルシステムを理解します。そしてファイルのロード。
ブート*.efi
ファイルは、UEFIファームウェア(またはハイパーバイザー)が理解しているファイルシステムに存在する必要があります。 UEFI仕様にはファームウェアのみが必要です。〜しなければならない他の種類のファイルシステムについて学びます。可能必要に応じて追加できます。
ただし、RHEL 7.xのデフォルトのファイルシステムタイプはXFSであり、HyperVの仮想ファームウェアにはXFSファイルシステムのサポートは含まれていません。
したがって、システムディスクに小さなパーティションを追加し(512Mで十分であれば、それより小さい場合は十分です。最新のディスクでは、ディスクを1 GB未満のパーティションに分割することはファイン管理だと思います)、次の種類に設定する必要があります。システムディスクがMBRパーティションであるかのようにパーティションテーブル0xef
またはGPTパーティションを使用している場合は、選択したパーティションツールを使用してパーティションタイプをESP(= EFIシステムパーティション)に設定します。次に、mkfs.fat
そのパーティションで実行し、/boot/efi
現在の内容を新しいパーティションに移動できる場所にマウントし、新しいパーティションを/boot/efi
。
後でこのefibootmgr
コマンドを使用して以前の試行をクリアしてgrub2-install
再実行して、正しいUEFIブート変数エントリを自動的にビルドできます。またはefibootmgr
、必要に応じて自分で行うこともできます。表示される起動エントリのUUID文字列は、インストールefibootmgr -v
するFAT32パーティションのPARTUUIDと一致する必要があります/boot/efi
。 ( を利用して確認できますlsblk -o +PARTUUID
。)
答え2
上記の答えは現在非常に優れていますが、問題の根本原因を適切に強調しません。
infodumpを読むと、Linux形式の/bootパーティションしかありませんが、UEFIシステムを起動するのに十分ではありません。
ディスクが UEFI で指定した起動可能なディスクレイアウトと一致しません。
前述のように、UEFIを使用すると、ブートローダの設定方法の新しい世界に入り、要件は以前のBIOSアプローチとはまったく異なります。 UEFIは新しいパーティションテーブル形式を使用し、ファイルシステム(!)を理解します。
これは、UEFIファームウェアがディスクをUEFI起動可能ディスクとして認識し、次回から起動するための最も簡単な基本要件です。
- ディスクはGPTパーティションスキームを使用してパーティションを分割する必要があります。
- ディスクのどこかに、GPTパーティションテーブルに次のものが必要です。一つとまったく一つredhat anacondaのような自動化された単純化設定には、いわゆるESPと呼ばれるべきパーティションがあります。
EFI System Partition
これは通常、約512MBのGPTパーティションです。 - パーティションはファイルシステムでフォーマットする必要があり、そのドライバはUEFIファームウェアに配置する必要があります(つまり、VMエミュレーションUEFIチップでもマザーボードチップの内部UEFIインストールに「インストール」)。
- すべてのUEFIインストールで、UEFI仕様に従って常に必須でインストールする必要がある唯一のUEFIファイルシステムドライバはFAT32です。つまり、ESPフォーマットの最も安全な(/唯一の)オプションです。
- 指定されたESPパーティションには
\EFI\BOOT\BOOTx64.EFI
特別なUEFI EXE(64ビットシステムの場合)があり、有効な実行可能ブートローダexeである必要があります。 - このファイルが見つからない場合は、さまざまなパスを確認できますが、EFIVARは
efibootmgr
エディタとして使用されるカスタムブートローダexeパスですべてのパスをオーバーライドできます。
設定には、ファイルシステムがマウントされたsda1
パーティションが1つしかないようです。xfs
/boot
もちろん、UEFIにはXFSドライバがインストールされていないため、パーティションを読み取ることはできません。 XFSドライバを使用してもESPタイプでない限り、パーティションから起動できません。
を追加するのを忘れたので、これが最善の推測ですfdisk -l
。
最新のUEFIでは、LinuxはESPをインストールしませんが、/boot
/boot/efiのように/boot内のより深い場所にインストールされます!
修正方法は比較的簡単です。パーティションテーブルがGPTタイプであることを確認し(grub行によると、すでにGPTタイプである)、新しいパーティションを追加してFAT32でフォーマットし、パーティションテーブルがGPTタイプではないことを確認する必要がESP type
あります。一般タイプの/boot
場合として表示されます。ESP
/boot
Linux filesystem
GPTスキームでは、パーティションタイプはUUIDです(ただし、パーティションタイプUUIDとパーティション識別UUIDを混同しないでください!)。したがって、ESPはEFI System (C12A7328-F81F-11D2-BA4B-00A0C93EC93B)
正確なタイプですLinux filesystem
が、いくつかのタイプの1つLinux root (x86-64) (4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709)
です。 Linuxタイプ/boot
。
これで、UEFIはESPにのみ興味を持ち、ESPを見つけることができる限り、そこで見つけたすべてのUEFI exeを実行します。この「魔法の」exeは「ブートローダ」と呼ばれたプログラムです。実際のオペレーティングシステムをロードする必要があります。
これで、ブートローダの「インストール」がexeをFAT32形式のESPにコピーするのと同じくらい簡単になったため、ブートローダのインストールプロセスはユーザーにとって「簡単になりました」。 UEFI exeはWindows PE exeから派生したよく知られた形式なので、ブートローダの作成も簡単になりました。その結果、選択できるブートローダが増えました。
いくつかの例は次のとおりです。
- 再検索
- システム起動
- ゴムブーツ
- システムLinux
- Linux(!!!)
- そして…ワーム
はい、そうです。 EFIスタブ(ほとんど)でコンパイルされた最新のLinuxカーネルは、フル機能のUEFIブートローダです。実際、中間ジャンクなしでESPから直接起動します。したがって、すでにUEFIからLinuxに直接簡単に起動できます。
残念ながら、ここで言及されているすべてのブートローダのうち、grubはおそらく最悪です。この否定できない品質のため、選ぶ市販のLinuxディストリビューションの95%(これらの動作はLinuxエコシステムで一般的です)です。
この選択の理由はしばしば非常にトリッキーです。それはおそらく、起動時にgrubが提供する廃止されたカーネル選択メニュー、およびメニューに表示される新しいカーネルインストールをパッケージ管理に統合するためにディストリビューションでスクリプトを完成するのにかかった時間のためです。船から。
したがって、ESPが準備され、正しくフォーマットされており、正しくLinuxで直接起動できるようになっても、「grub問題」と呼ばれる2番目の大きなLinux起動問題が引き続き発生します。
GRUB は UEFI の前にリリースされ、UEFI と同じ方法で古い BIOS の多くのブート問題を解決します。 UEFIはマザーボードに直接プリロードされて提供されることを除いて、デフォルトではWindows 98レベルのオペレーティングシステムの独自バージョンであることに注意する必要があります。また、非常に複雑です。
同様に、GRUBは既存のパーティションにプリインストールされた独自の特殊ミニOSです/boot
(UEFIと同様に独自のファイルシステムドライバがあり、UEFIと同様に独自のシェルがあり、UEFIと同様に他の愚かな機能もあります)。誰もそれらを使用して扱う方法を知らないか覚えていません)。これを放棄することができますが、カーネルパッケージの更新(yum / dnfを介して)と組み合わせた自動カーネル更新をしたい場合は、それを修正する必要があります。
したがって、あなたの場合、ブートチェーンはUEFI(OS)-> GRUB(OS)-> LINUX(OS)と同じでなければなりません。
したがって、上記のUEFI前提条件を変更したら、GRUB前提条件を変更する必要があります。 UEFIがESPから起動できるように、GRUBをESPに正しくインストールし、その後Linuxを起動するように設定する必要があります。
これで、Linux/
ツリーで動作するためにESPをインストールする場所はディストリビューションによって大きく異なります/boot/efi
。
したがって、rm -rf
ディレクトリを/boot
空にするように設定し、vfatドライバを使用してフォーマットされた空のESPをそのディレクトリ(/boot/efi
)にマウントする必要があります。これが完了したら、インストールにchrootを適用し、ローカルGRUBにUEFIモードで "/ dev / sda / esp"でインストールを再構築するように強制する必要があります/boot/efi
。
これはディストリビューションによって異なり、grub のバージョンによって異なり、次の値になります。
grub-install /dev/sdX
update-grub
到着
grub-install --target=x86_64-efi /dev/sdbX
grub-install --recheck /dev/sdX
chrootの内部から。
正しく実行した場合は、以前に空であったESPパーティションにGRUBインストールファイルが表示され、UUIDを介して同様のものを指す\EFI\redhat\shimx64.efi
新しいEFIVARが表示されることがあります。ESP
efbootmgr
追加されたエントリを確認できるように、grubの再構築/再インストールの前に未使用のブートefvarをすべて削除することをお勧めします。
完了すると、再起動後にgrubカーネルの起動メニューが表示されます。
この質問に関連する良い夜の読書を提案します。
https://en.wikipedia.org/wiki/GUID_Partition_Table
https://wiki.archlinux.org/title/Unified_Extensible_Firmware_Interface
答え3
将来の訪問者のために何をすべきかを正確に文書化します。他の回答に記載されている詳細がないと、はるかに難しくなります。
私のHyper-Vコンピュータを「第1世代」から「第2世代」に切り替えています。主な違いは、ブートメカニズムがBIOSにブートセクタをメモリに直接ロードしてそれを実行させる検証済みの方法で、UEFIファームウェアが「ESP」または「BOOT」パーティションを見つけてEFIをロードできるようにすることです。そこのドキュメントから起動します。
UEFIブートでは、UEFIファームウェアはパーティションを起動可能としてマークする必要があり、UEFIファームウェアはFAT形式のパーティション以外には何も認識できません。 Hyper-VはMicrosoft製品なので、NTFSでフォーマットされたパーティションから起動する方法もわかっています。
Red Hat Enterprise Linux 7は、デフォルトでUEFIファームウェアで読み取れないXFSファイルシステムを使用します。
だから私が取ったアクションは次のとおりです。
マイファイルシステムをバックアップします
/boot
。私の仮想マシンには、次のようにマウントされたセカンダリVHDXディスクが接続されているので、/data
それをバックアップの場所として使用します。mkdir /data/old_boot cp --archive /boot /data/old_boot
ファイルシステムを
lsblk
含むデバイスを確認するために使用されます。/boot
> lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 129G 0 disk ├─sda1 8:1 0 499M 0 part /boot └─sda2 8:2 0 126.5G 0 part ├─rhel-root 253:0 0 50G 0 lvm / ├─rhel-swap 253:1 0 7.9G 0 lvm [SWAP] └─rhel-home 253:2 0 68.6G 0 lvm /home sdb 8:16 0 512G 0 disk /data
parted
既存のパーティションを削除するには/boot
:> parted /dev/sda print Model: Msft Virtual Disk (scsi) Disk /dev/sda: 139GB Sector size (logical/physical): 512B/4096B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 524MB 523MB xfs primary 2 525MB 136GB 136GB Linux LVM lvm
上記でコマンドを実行し
parted
てprint
パーティションのリストを表示するので、/dev/sda
削除するパーティションは次のようになります。/dev/sda1
サイズの違いは、1GB = 1,000,000,000バイトを使用し、1GB = 1,073,741,824バイトを使用するためです。lsblk
parted
parted
lsblk
このコマンドはシェル内で実行され、
parted
実際にパーティションを削除します。rm 1
新しいパーティションを作成し、UEFIファームウェアに起動しようとしているパーティションであることを知らせるために、または
efi
フラグを割り当てます。boot
> parted (parted) mkpart primary fat32 1 524 (parted) print Model: Msft Virtual Disk (scsi) Disk /dev/sda: 139GB Sector size (logical/physical): 512B/4096B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 524MB 523MB fat32 primary 2 525MB 136GB 136GB Linux LVM lvm
フラグ設定
boot
:(parted) set 1 boot on (parted) print Model: Msft Virtual Disk (scsi) Disk /dev/sda: 139GB Sector size (logical/physical): 512B/4096B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 524MB 523MB fat32 primary boot 2 525MB 136GB 136GB Linux LVM lvm
ご覧のとおり、
boot
フラグがパーティション番号1に設定されました。次に、新しいパーティションをフォーマットします。
> mkfs.fat -F 32 /dev/sda1
/etc/fstab
正しい項目が表示されていることを確認する必要があります。Timed out waiting for device
それ以外の場合は、LinuxがDependency failed for /boot
。以下では、ブートデバイスのパーティションUUIDが必要ですlsblk
。> lsblk -o +PARTUUID NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT PARTUUID sda 8:0 0 129G 0 disk ├─sda1 8:1 0 499M 0 part /boot 93be2242-cfa5-4759-86a8-e563092da88d └─sda2 8:2 0 126.5G 0 part 484a1ac4-eba0-49b4-9910-b6471462d8b0 ├─rhel-root 253:0 0 50G 0 lvm / ├─rhel-swap 253:1 0 7.9G 0 lvm [SWAP] └─rhel-home 253:2 0 68.6G 0 lvm /home
私の場合、パーティションUUIDは
93be2242-cfa5-4759-86a8-e563092da88d
あなたのものでした。〜するこれらの識別子は設計上普遍的に一意であるため、互いに異なります。/etc/fstab
次に、ファイルにデバイスの正しいパーティションUUIDが含まれていることを確認します/boot
。> cat /etc/fstab # # /etc/fstab # Created by anaconda on Mon Jan 16 22:52:23 2017 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/rhel-root / xfs defaults 0 0 /dev/sda1 /boot vfat defaults 0 0 /dev/mapper/rhel-home /home xfs defaults 0 0 /dev/mapper/rhel-swap swap swap defaults 0 0
上記の例では、デバイスが何であるかを
/boot
知ることができ/dev/sda1
、代わりにシステムが起動する前にこの行があることを確認する必要がありますPARTUUID=93be2242-cfa5-4759-86a8-e563092da88d
。/dev/sda1
使った肉変更を加えるが、気に入らないエディタを試してみてください。変更したら、次のようになります。# # /etc/fstab # Created by anaconda on Mon Jan 16 22:52:23 2017 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/rhel-root / xfs defaults 0 0 PARTUUID=93be2242-cfa5-4759-86a8-e563092da88d /boot vfat defaults 0 0 /dev/mapper/rhel-home /home xfs defaults 0 0 /dev/mapper/rhel-swap swap swap defaults 0 0
/boot
前のパーティションからファイルを回復するには、次のコマンドを使用しますcp
。> cp --archive /data/old_boot /boot
グラップ構成の更新:
> grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
必要なUEFIブートコンポーネントをインストールします。
> yum reinstall grub2 grub2-efi-x64 grubby shim-x64
efibootmgr
.efiブートファイルを指すエントリを作成するために使用されます。> efibootmgr -c -d /dev/sda -p 1 -l '\efi\EFI\redhat\shimx64.efi' -L 'Red Hat Enterprise Linux'
efibootmgr
次に、UEFIブートオプションのリストを確認します。> efibootmgr -v BootCurrent: 0006 Timeout: 0 seconds BootOrder: 0000 Boot0000* Red Hat Enterprise Linux HD(1,GPT,93be2242-cfa5-4759-86a8-e563092da88d,0x800,0xf9800)/File(\efi\EFI\redhat\shimx64.efi)
これで再起動でき、Linuxが正しく起動します。