부팅하려는 테스트 하드웨어는 UEFI가 포함된 x86 머신인 MinnowBoard Max Turbot입니다. 지금까지 소스에서 GRUB2를 성공적으로 구축했으며 USB에서 커널을 성공적으로 부팅했습니다.
이제 네트워크에서 Linux 커널과 rootfs를 부팅하고 싶습니다. Minnowboard의 UEFI 펌웨어는 PXE를 지원하지 않기 때문에(네트워크 드라이버를 사용할 수 없음) 네트워크 드라이버로 구축할 수 있는 GRUB2를 통해 얻기로 결정했습니다.
dhcp 서버와 tftp 서버를 설정할 수 있지만 grub2 tftp 및 dhcp 서버의 IP 주소를 지정하는 방법에 대한 위키/튜토리얼을 찾을 수 없습니다. GRUB2가 네트워크에서 부팅하도록 어떻게 지시합니까?
내가 찾을 수 있는 최선은 다음과 같습니다. https://tr.opensuse.org/SDB:Booting_from_the_Network_with_GRUB
그러나 grub-legacy를 사용합니다. 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
작동하지 않습니다. 물론 인텔 지원 웹 페이지에서 올바른 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
GRUB linux
명령줄 과 유사한 부팅 옵션을 추가하거나 initrd
명령을 입력하기 전에 GRUB 명령을 사용하여 커널과 동일한 TFTP 서버에서 initramfs를 로드할 수 있습니다 boot
.
initramfs에는 원하는 경우 iSCSI 스토리지에 연결하고 해당 스토리지의 파일 시스템을 루트 파일 시스템으로 사용하는 등 임의로 복잡한 설정을 위한 도구를 포함할 수 있습니다.