PXE 启动

来自 Alpine Linux
此材料已过时...

这些指示是为仍然具有 grsecurity 的旧版本 Alpine 编写的,请更新。(讨论

此功能在很大程度上仍处于原型阶段。某些功能可能仍然无法正常工作。

选项指南

ip
PXE 必需。
设置 ip=dhcp 以通过 DHCP 获取 IP。(除了您的 NIC 所需的模块外,还需要 initrd 中的 af_packet.ko。)
设置 ip=client-ip::gateway-ip:netmask::[device]: 以手动指定 IP。device 是设备名称(例如 eth0)。如果未指定,则会自动选择一个。
apkovl
有效形式包括
  • apkovl.tar.gz 文件的 HTTP、HTTPS 或 FTP URL,该文件将被检索和应用。
  • device_name[:fs_type]:path,其中 device_name 不包括 /dev(例如,sda)。fs_type 是可选的(例如 ext4)。path 表示设备上 apkovl.tar.gz 文件的路径。
  • 相对于 alpine_dev 根目录的相对路径。
  • 如果未指定,则在 ovl_dev 的根目录中搜索匹配 *.apkovl.tar.gz 的文件。(如果设备根目录中存在多个,则全部忽略。)
alpine_dev(此参数不再使用)
alpine_dev 指定用于参考数据的设备,参考数据必须驻留在文件系统上;目前,这仅适用于内核模块。
如果未显式指定存储库,这也用于获取 APK;请参见下文。
有效形式包括
  • 设备名称,不包括 /dev/
  • UUID=filesystem-uuid
  • LABEL=filesystem-label
  • nfs:ip-address:path,指定要用作设备的 NFS 导出。您可能需要在 initrd 中添加模块。
ovl_dev(此参数不再使用)
有效形式包括
  • device_name[:fs_type]
  • 如果未指定,则在各种设备中搜索根目录下匹配 *.apkovl.tar.gz 的文件。
此参数可以包含字段 {MAC}{UUID},它们将分别替换为 Alpine 使用的 NIC 的 MAC 地址和系统的 DMI “Product UUID”。如果使用这些替换,则传递给 ovl_dev 的值必须用引号括起来。例如 ovl_dev="http://.../{MAC}.apkovl.tar.gz"
alpine_repo
必需。
/etc/apk/repositories 将由此填充。可以是 URL。否则,请尝试在 alpine_dev 上查找包含标记文件 .boot_repository 的目录。请注意,尽管“auto”可能在文档中显示为有效值,但在 PXE 启动时它将不起作用。
modloop
如果指定的文件协议是 http/ftp 或 https(如果安装了 wget),则 modloop 文件将被下载到 /lib 目录,并在之后挂载
例如 modloop=http://192.168.1.1/pxe/alpine/grsec.modloop.squashfs 在您的 引导加载程序的 append 部分
console
示例
  • tty0
  • ttyS1
  • ttyAMA0
acpi
有效形式包括
  • force
ssh_key
有效形式包括
  • 公共 SSH 密钥的 HTTP、HTTPS 或 FTP URL,该密钥将被检索并添加到授权 SSH 密钥列表中。
modules

操作指南

Alpine 可以从 Alpine 2.6-rc2 开始进行 PXE 启动。为了实现这一点,您必须完成以下步骤

  • 设置 DHCP 服务器并配置其支持 PXE 启动。
  • 设置 TFTP 服务器以提供 PXE 启动加载程序。
  • 设置 HTTP 服务器以提供其余的启动文件。
  • 设置 NFS 服务器,Alpine 可以从中加载内核模块。
  • 配置 mkinitfs 以生成可 PXE 启动的 initrd。

本文介绍使用 gpxe 作为 PXE 启动加载程序的设置,但您也可以使用 PXELINUX。

此处不介绍所有相关服务的标准设置;关于设置基本 DHCP/TFTP/HTTP/NFS 等的建议已广泛提供。

设置 DHCP 服务器并配置其支持 PXE 启动

如果您使用 ISC DHCP 服务器(软件包“dhcp”),请像这样修改您的 subnet

 next-server 10.0.0.1;
 filename "gpxe.kpxe";

设置 TFTP 服务器以提供 PXE 启动加载程序

安装 TFTP 服务器(软件包“tftp-hpa”)。您需要在 /var/tftproot/gpxe.kpxe 中放置 gPXE 镜像。您可以在 ROM-o-matic.eu[死链接] 在线生成镜像。选择“.kpxe”输出格式和“undionly”驱动程序。您将需要指定自定义启动脚本。选择“Customize”。以下启动脚本效果良好

 dhcp net0
 chain http://${net0/next-server}/gpxe-script

您可以在 URL 中包含 ${net0/mac}${uuid},分别用于接口 MAC 地址和机器 UUID。

请注意,在撰写本文时,除非与“undionly”驱动程序一起使用,否则 ROM-o-matic 似乎会生成有缺陷的镜像。如果您需要不同的驱动程序,请考虑自行构建 gPXE,尤其是当您遇到莫名其妙的连接问题时。常见的症状是看似配置正确,随机功能的网络连接,该连接似乎遭受了极端的丢包。

设置 HTTP 服务器以提供其余的 PXE 启动文件

假设您已配置 HTTP 服务器以从 /srv/http 提供服务。将适当的 gPXE 脚本(例如以下脚本)放置在 /srv/http/prov/gpxe-script

 #!gpxe
 kernel http://${net0/next-server}/prov/grsec ip=dhcp alpine_dev=nfs:${net0/next-server}:/srv/nfs/depot alpine_repo=http://nl.alpinelinux.org/alpine/v2.5/main/
 initrd http://${net0/next-server}/prov/pxerd
 boot

ip=dhcp 指示 initrd 通过 DHCP 获取 IP。将挂载由 alpine_dev 指定的 NFS 共享。alpine_repo 指定要使用的 apk 存储库。

使用 lpxelinux 而不是 gPXE

自 syslinux 的最新版本以来,pxelinux 也支持通过 ftp/http 启动。
pxelinux.cfg/default 文件(或特定的 MAC 地址文件名)应与常规 syslinux 格式相同。
您将需要使用安装在 alpine 上的 syslinux 中找到的 lpxelinux.0 的副本:/usr/share/syslinux/lpxelinux.0,并将其复制到您的 tftp 服务器。
不要忘记也复制 ldlinux.c32,因为它是 syslinux 变体的依赖项(请参阅文档)。

DEFAULT alpine
LINUX http://ipaddr/grsec
INITRD http://ipaddr/grsec.gz
APPEND ip=dhcp modules=loop,squashfs,sd-mod,usb-storage alpine_repo=http://repo-url modloop=http://ipaddr/grsec.modloop.squashfs apkovl=http://ipaddr/localhost.apkovl.tar.gz

使用 pxelinux 而不是 gPXE

自 syslinux 的最新版本以来,pxelinux 也支持通过 tftp 启动。
pxelinux.cfg/default 文件(或特定的 MAC 地址文件名)应与常规 syslinux 格式相同。
您将需要使用安装在 alpine 上的 syslinux 中找到的 pxelinux.0 的副本:/usr/share/syslinux/pxelinux.0 并将其复制到您的 tftp 服务器。
不要忘记也复制 ldlinux.c32,因为它是 syslinux 变体的依赖项(请参阅文档)。

PROMPT 0
TIMEOUT 3
default alpine
LABEL alpine
LINUX alpine-vmlinuz-grsec
INITRD alpine-pxerd
APPEND ip=dhcp alpine_dev=nfs:192.168.1.1:/srv/boot/alpine modloop=http://192.168.1.1/modloop-grsec nomodeset quiet apkovl=http://192.168.1.1/localhost.apkovl.tar.gz

vmlinuz-grsec 取自从 usb 内存运行的系统。
pxerd 在从 usb 内存运行的系统上生成。添加了网络 nfs 和 virtio_net。
/srv/boot/alpine 是从 usb 内存运行的系统中 /media/usb 的副本。
modules=loop,squashfs,sd-mod,usb-storage 不是必需的,因为 loop 和 squashfs 已硬编码到 init 脚本中,并且我们不使用 sd 或 usb。
modloop=http://ipaddr/grsec.modloop.squashfs 似乎不起作用。没有...(*)
apkovl=http://ipaddr/localhost.apkovl.tar.gz.

(*) 关于 modloop 问题:/etc/init.d/modloop 尝试从 /media/nfs 而不是 /media/alpine 加载文件,并开始尝试挂载它!(未成功)对此的修复方法是(一个建议)参见 #4015

设置 NFS 服务器,Alpine 可以从中加载内核模块

注意:通过添加对 http 支持的 modloop,这不再需要模块。

/srv/nfs/depot 设置 NFS 共享并通过 /etc/exports 导出它

 /srv/nfs/depot  *(ro,no_root_squash,no_subtree_check)

此导出当前不需要包含任何内容,除非您希望使用它来提供 apk,在这种情况下,请确保在包含架构子目录的目录中创建一个文件“.boot_repository”,并从内核参数中删除 alpine_repo。存储库将通过搜索“.boot_repository”自动检测到。最终,Alpine 将能够从此导出加载内核模块。

配置 mkinitfs 以生成可 PXE 启动的 initrd

注意: 目前有一个专门用于网络的 mkinitfs 配置文件:network。使用它将自动添加 pxe 支持和所有以太网驱动程序到 initramfs。

您需要为您可能用于 PXE 启动的任何以太网卡添加驱动程序到您的 initrd。为此,请创建 /etc/mkinitfs/features.d/network.modules。列出您的以太网卡所需的任何内核驱动程序。如果您使用的是 Intel E1000 卡(VMware 和 VirtualBox 使用此卡,因此非常适合测试),请添加

 kernel/drivers/net/ethernet/intel/e1000/*.ko

您还必须创建以下文件,以便将 DHCP 和 NFS 所需的模块和脚本插入到 initrd 中。

 /etc/mkinitfs/features.d/dhcp.files, containing:
   /usr/share/udhcpc/default.script
 /etc/mkinitfs/features.d/dhcp.modules, containing:
   kernel/net/packet/af_packet.ko
 /etc/mkinitfs/features.d/nfs.modules, containing:
   kernel/fs/nfs/*

最后,编辑 /etc/mkinitfs/mkinitfs.conf 并添加功能 squashfs、network、dhcp 和 nfs

通过运行以下命令生成支持 PXE 的 initrd

mkinitfs -o /srv/http/prov/pxerd

您现在应该能够 PXE 启动 Alpine Linux。此功能仍在开发中,并且可能会出现非致命的 initrd 后启动错误(关于 modloop 等)。

指定 apkovl

要加载的 .apkovl 的位置可以使用内核参数 `apkovl` 指定。(完整定义见上文。)

例如,要从设备 sda5 加载 apkovl,请添加到内核参数

apkovl=sda5

或者,要从 HTTP 服务器加载特定的 apkovl

 apkovl=http://example.net/file.apkovl.tar.gz

此参数中所有出现的 {MAC} 和 {UUID} 字符串都将分别替换为启动接口的 MAC 地址和机器 UUID。如果您使用这些字符串,请确保将 URL 放在引号中。

关于 UEFI 的注意事项

如果您正在启动 uefi 系统,您将需要将 initrd=initrdname 附加到内核选项以正确启动。