起動するテストハードウェアは、UEFIを搭載したx86マシンであるMinnowBoard Max Turbotです。これまで、ソースからGRUB2を正常に構築し、USBからカーネルを正常に起動しました。
では、ネットワークからLinuxカーネルとrootfsを起動したいと思います。 MinnowboardのUEFIファームウェアはPXEをサポートしていないため(ネットワークドライバは利用できません)、ネットワークドライバとして構築できるGRUB2を介して入手することにしました。
dhcpサーバーとtftpサーバーを設定できますが、grub2 tftpサーバーとdhcpサーバーのIPアドレスを指定する方法に関するWiki /チュートリアルが見つかりません。 GRUB2がネットワークから起動するように指示するにはどうすればよいですか?
私が見つけることができる最善は次のとおりです。 https://tr.opensuse.org/SDB:Booting_from_the_Network_with_GRUB
しかし、グルーブレガシーを使用します。 GRUB2文書も不明です。
grub2にネットワークからカーネルを起動するように指示する手順とコマンドを知らせる人はいますか?また、GRUB2を構築するためにどのモジュールを使用する必要がありますか? (GRUB2を構築するための完全なコマンドを使用することは非常に感謝します)
編集する
次のコマンドを使用してGRUB2を構築しました。
./grub-mkimage -d ./grub-core -o bootx64.efi -O x86_64-efi -p "" fat iso9660 part_gpt part_msdos normal boot linux configfile loopback chain efifwsetup efi_gop efi_uga ls search search_label search_fs_uuid search_fs_file gfxterm gfxterm_background gfxterm_menu test all_video loadenv exfat ext2 ntfs btrfs hfsplus udf tftp efinet
IP abcdで実行されているtftpサーバーがあり、linux
GRUB2コンソールでこれを次のように設定します。
linux (tftp,a.b.c.d)/tftpboot/bzImage
エラーが発生しましたdestination unreachable
。また、これを行うと、net_ls_cards
リストされたカードはありません。しかし、このボードからUbuntuを起動して、イーサネット経由のインターネットが機能していることを確認しました。
編集2
64ビット版にはネットワークUEFIサポートが必要であることを指摘してくれた@telcoMに感謝します。これは私に一日の時間をかけて試してみることができる自信を与え、結局成功しました。
私はtftp、dhcp、およびnfsサーバーを設定しました(このタイトルの範囲外)。
GRUB2でをクリックしましたが、net_bootp
ここにジュースがあります。名前は誤解を招くが、DHCPサーバーにIPを要求する最初のステップです。これにより、ハードウェアが正当なネットワーク設定を持つネットワークに配置されます。これでカーネルパスを設定できます
grub> linux (tftp,a.b.c.d)/tftpboot/bzImage
これでカーネルが起動します。しかし、私はまだ一歩遅れています - rootfs! rootfsをロードするとカーネルが失敗します。これは予想される現象です。
grub2にrootfsの場所をNFSサーバーに設定するように指示する方法がわかりません。同様の機能がありますか(tftp)
?書類を確認しています。既にご存知の方はご指摘ください。
答え1
これマザーボードの最新ファームウェアのリリースノート(2018年11月にリリース)は、64ビットバージョンのファームウェアがHTTP / HTTPSプロトコルを使用しても実際にネットワークブートをサポートしていることを示しているようです。 32ビットバージョンのファームウェアのみがUEFIネットワークサポートを無効にします。ファームウェアのアップグレードで問題を解決できますか?
efinet
GRUBネットワークドライバモジュールを使用しています。ファームウェアがネットワークインターフェイスを初期化し、DHCP またはファームウェア構成を通じて IP アドレスを受信したとします。
ファームウェアがハードウェアを初期化できず、GRUBで使用するための適切なUEFIプロトコルを提供できない場合、ドライバはefinet
機能しません。もちろん、Intel Support Web ページで正しい UEFI ネットワークドライバを探し、アドオンモードで起動する前に、最初に一部の UEFI スクリプトを作成しない限り、ドライバは動作しません。メディアはNICドライバとTCP / IPドライバスタックをロードして設定しますgrubx64.efi
。しかし、この種の行動はネットワーク起動の目的に反しています。
UEFI PXE ブートおよび UEFI 2.5 HTTP(S) ブートをサポートするには、DHCP サーバーがクライアントの DHCP 要求で PXE アーキテクチャ オプションを検出し、DHCP 応答に適切なブート情報を追加できる必要があります。 ISC を DHCP サーバーとして使用する場合、dhcpd
ネットワーク ブートに関連する DHCP サーバーの構成部分は次のようになります。
option pxearch code 93 = unsigned integer 16;
class "pxeclients" {
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
next-server <IP address of boot server>; # bootp style option
option tftp-server-name "<IP address of boot server>"; # DHCP style option
if option pxearch = 00:10 {
# 0x0010 = UEFI 2.5 HTTP boot for x86_64
filename "<HTTP or HTTPS URL pointing to a .efi bootloader file>";
} elsif option pxearch = 00:0f {
# 0x000f = UEFI 2.5 HTTP boot for 32-bit x86
filename "<HTTP or HTTPS URL pointing to a .efi bootloader file>"
} elsif option pxearch = 00:09 {
# TFTP-based UEFI PXE boot for x86_64 according to original RFC 4578
filename "/some/TFTP/path/grubx64.efi";
option boot-size <nnnn>; # size of grubx64.efi as reported by "du -B 512 grubx64.efi"
} elsif option pxearch = 00:07 {
# TFTP-based UEFI PXE boot for x86_64 according to current IANA registry
# and RFC 4578 errata
filename "/some/TFTP/path/grubx64.efi";
option boot-size <nnnn>; # as above
} elsif option pxearch = 00:06 {
# TFTP-based UEFI PXE boot for 32-bit x86
filename "/some/TFTP/path/grubia32.efi";
option boot-size <nnnn>;
} else {
# plain old x86 BIOS PXE boot options here
}
# end of PXE boot specific options
}
GRUBでルートファイルシステムを指定するには、ip=dhcp root=/dev/nfs nfsroot=nfs.server.ip.address:/root/filesystem/share
GRUBlinux
コマンドラインに似た起動オプションを追加するか、コマンドをinitrd
入力する前にGRUBコマンドを使用してカーネルと同じTFTPサーバーからinitramfsをロードできますboot
。
initramfsには、必要に応じてiSCSIストレージに接続し、そのストレージのファイルシステムをルートファイルシステムとして使用するなど、任意に複雑な設定のためのツールを含めることができます。