我正在尝试 PXE 启动 UEFI 客户端。我当前的 BIOS 客户端设置使用 pxelinux.0 和 pxelinux.cfg/default,如下所示:
DEFAULT vmlinuz-3.8.0-25-generic
APPEND initrd=initrd.img-3.8.0-25-generic root=/dev/nfs nfsroot=10.17.76.1:/var/lib/tribble/ephemeral ip=dhcp ro nomodeset
但是我在使用 UEFI 时遇到了困难,因为有太多不同的方法可以采用,但好的文档却太少。
按照此在 UEFI 上通过 PXE 启动 netboot mini.iso 的指南,我能够通过 PXE 启动进入安装程序,但到目前为止我还没有弄清楚如何根据我的用例调整这些说明。
所以我追求的是以下几点:
推荐使用哪个引导加载程序来 PXE 引导 UEFI 客户端?
您能否指出一个使用上述引导加载程序通过 NFS 导出 rootfs 的 UEFI 客户端的 PXE 引导示例?
我见过很多教程引用郵件和pxe命令grub 模块,但是这些模块在 Ubuntu 13.04 上不存在...它们是否已被弃用?如果是,那么用什么来替代它们?
我正在考虑的选项:
使用埃利洛
使用grub2
使用Linux EFI 存根加载器(有点麻烦,因为我们必须用硬编码的启动参数来编译我们自己的内核)
在众多选择中,我希望找到一个低风险的解决方案,并能继续得到 Ubuntu 的良好支持。
答案1
如何使用 ELILO 进行网络启动
如何让 EFI 进入网络启动?
您不需要任何附加软件即可让 EFI 启动网络启动会话。任何 EFI 机器都可以配置为启动 PXE/DHCP 会话(前提是它具有支持 UNDI/PXE 协议的网络适配器)。大多数现代卡都具有此类支持。
要启用网络启动,您需要进入 EFI 启动管理器维护菜单并“添加启动选项”。屏幕上将显示要启动的设备列表。其中至少有一个设备应采用以下形式:
Load File [Acpi(PNP0A03,0)/Pci(5|0)/Mac(00D0B7A6FC25)]
代表以太网卡(Mac 地址)。如果没有此选项,则意味着您的机器中没有网络适配器,或者其选项 ROM 中没有 UNDI/PXE 支持。
您需要选择此选项并为其指定一个逻辑名称,例如“netboot”。接下来,您离开维护菜单并返回主菜单。您现在有一个新的启动菜单选项。如果您选择“netboot”,则 EFI 将启动 PXE/DCHP 发现请求并寻找服务器以获取 IP 地址。
在服务器端,您可以使用标准 DHCP 服务器。
使用 PXE 网络启动
EFI 内置了对 PXE 的支持。事实上,它首先尝试 PXE,当找不到有效的 PXE 服务器时,它会默认使用 DHCP。
Linux/ia32 提供了一个 PXE 服务器包,但是该包没有与 EFI 端通信所需的扩展。
无需特殊选项或编译时标志即可让 elilo 使用 PXE 而不是标准 DHCP。当网络启动时,elilo 将自动检测是否已通过 PXE 或 DHCP 下载,并调整后续文件的请求方式。
您需要 Internet 软件联盟 (http://www.isc.org) 带有一个特殊补丁来添加 PXE 扩展。不幸的是,截至版本 3.0xx,该补丁尚未进入官方树。它应该出现在 dhcpd 服务器的 3.1 版本中。
无论如何,elilo 软件包包含一个简单的示例,说明如何/etc/dhcpd.conf
使用补丁中提供的扩展为 PXE 感知 DHCP 服务器配置文件。您可以查看examples/dhcpd-pxe.conf
。语法与标准 dhcpd 服务器有很大不同。
要牢记的关键要素是 elilo 用于请求不同文件的 PXE 层:
Layer 0 : to get the name of the boot loader (elilo.efi)
Layer 1 : to get the name of the elilo config file
Layer 2 : to get the name of the kernel image
这些层之间有一个重要的区别。前两个层(0、1)是系统请求的,而最后一个层仅在找不到配置文件时使用,即要启动的默认内核是什么。实际文件仍然通过 TFTP 下载。因此,还必须配置 TFTP 服务器(有关详细信息,请参阅上一节)。
获取配置文件
在此模式下,elilo 使用 PXE 第 1 层来获取要使用的配置文件。因此必须在服务器端设置。Elilo 在查找配置文件时将使用以下顺序:
- use the name provide by the PXE server Layer 1 or
- elilo-ia64.conf/elilo-ia32.conf/elilo-x86_64 or
- elilo.conf
elilo.conf 文件示例
chooser=textmenu
default=install
delay=20
prompt
message=boot-screens/elilo_menu.msg
f1=boot-screens/general.msg
f2=boot-screens/params.msg
relocatable
image=vmlinuz
label=install
description="Install"
initrd=initrd.gz
append="--"
read-only
image=vmlinuz
label=expert
description="Install [Expert mode]"
initrd=initrd.gz
append="priority=low --"
read-only
image=vmlinuz
label=rescue
description="Rescue"
initrd=initrd.gz
append="rescue/enable=true --"
read-only
另一个
boot=/dev/sda1
delay=30
timeout=50
default=Gentoo
append="console=ttyS0,9600"
prompt
image=/vmlinuz
label=Gentoo
root=/dev/sda2
read-only
image=/vmlinuz.old
label=Gentoo.old
root=/dev/sda2
read-only
另请查看elilo.conf, 和管理 Linux 的 EFI 引导加载程序:使用 ELILO
Elilo 在第一次匹配时停止。使用 PXE,elilo 不会像使用 DHCP 那样尝试下载以分配的 IP 地址命名的配置文件,因为 PXE 服务器配置具有足够的灵活性来执行此操作。
获取内核映像
当没有配置文件时,elilo 将使用 PXE 第 2 层返回的内核名称。如果没有指定,则默认为“vmlinux”。
获取初始 ramdisk
ramdisk 的文件名必须来自配置文件。Elilo 不使用 PXE 层来请求默认名称。
获取 IP 地址信息
当 elilo 进行网络启动时,网络文件系统模块会使用从 DHCP 服务器收到的信息初始化一些 elilo 变量。至少,它会收到 IP 地址。
以下信息存储于如下所示的变量中:
assigned IP address -> %I
assigned netmask -> %M
assigned domainname -> %D
assigned gateway -> %G
这些变量可用于动态调整传递给内核的命令行参数。
来源:生命值
答案2
仅作为“唤醒”问题:
这些客户端必须使用 UEFI 吗? -
您不能在每个客户端上禁用 UEFI 并仅在其上启用 EFI 吗? -
那么使用 grub2 启动所有安装可能会更容易。
您可以考虑将 BIOS 设置调整为 EFI 启动而不是 UEFI 启动 - 因为对于 Windows 7 或 Windows 8 等而言,使用 UEFI 双启动并不十分可靠。我知道在某些安装中,带有 UEFI 双启动 Win7 的 Ubuntu 经常崩溃并回到 gdm。