PXE 启动
![]() 这些指示是为仍然具有 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
您需要为您可能用于 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 附加到内核选项以正确启动。