我正在开发一个基于 OpenStack 的项目。现在我们需要一个虚拟机来从 PXE 启动。我找不到任何相关文档。nova 支持 PXE 启动吗?如果是,我该如何创建一个相当于从 PXE 启动的裸机的 KVM 映像?
答案1
您可以安装启动到磁盘上并使用 syslinux(或其他引导程序)加载它;这将使您获得与通过 PXE BIOS 启动的系统完全相同的行为。iPXE 发行版包含用于构建可启动 ISO 映像的工具,您可以使用该工具在 OpenStack 中启动系统,或者您可以使用非常相似的设置构建硬盘映像。
创建磁盘映像:
$ dd if=/dev/zero of=/tmp/boot.img bs=1M count=4
对图像进行分区:
$ fdisk /tmp/boot.img
你需要设置气缸数。
创建类型的单个分区
b
并使其可启动(n
创建、a
切换启动标志)。将图像连接到环回设备。
# losetup -fP /tmp/boot.img
创建一个 msdos 文件系统。
# mkdosfs -I /dev/loop0p1
挂载文件系统。
# mount /dev/loop0p1 /mnt
安装 syslinux。
# syslinux --install /dev/loop0p1
复制
ipxe.krn
到设备上(从某处...您自己构建它或者从 ipxe ISO 复制它)。创建适当的 syslinux 配置,例如:
DEFAULT ipxe LABEL ipxe KERNEL ipxe.krn
通过在本地 KVM 实例上启动它来测试它。将其上传到 openstack 并使用它启动。请注意,在此示例中,我们创建了一个非常小的(4M)磁盘映像,但您也可以创建一个大磁盘映像,然后在其上放置一个小分区。这完全取决于您要完成的任务。
答案2
经过进一步的研究,我发现事情并没有那么困难。我们只需要修改 nova 代码,添加一行
<boot dev=network>
在 vm 配置 xml 文件中。因为 nova 使用 libvirt,而 libvirt 已经支持 PXE 启动。无论如何,感谢大家的帮助。
答案3
云的周边框架需要支持传递这些选项。如果您使用实例私有网络功能,这将限制您,因为当前设置不允许将额外选项传递给提供 DHCP 支持的 dnsmasq 守护程序。您必须修改产品的源代码以提供用于输入 PXE 选项的接口以及将这些选项传递给底层 dnsmasq 进程的适当机制。
但是,如果您使用的是“扁平”网络并提供自己的 DHCP 服务,那么可以——可以使用支持 PXE 的适当启动映像,并且您将进行 PXE 启动。
我工作的公司,灵光,使用 KVM 和 DNSmasq 的方式与 NOVA 相同。至少在内部,我们使用酶联免疫吸附试验启动实例。磁盘映像在启动时具有 gPXE 加载程序,其余部分是用于所需卷大小的稀疏空间。
至于对启动 PXE 的统一支持,我可能会在下一个小版本发布周期将其纳入我们的产品中,并且有可能在之后的某个时间移植到 NOVA。
答案4
为了<boot dev=network>
在 IceHouse v.2014.1.5 中向 XML 添加标签,我必须添加以下行:
os.append(etree.Element("boot", dev='network'))
代码之前(for循环之外):
for boot_dev in self.os_boot_dev:
os.append(etree.Element("boot", dev=boot_dev))
1195 号线附近/usr/lib/python2.7/dist-packages/nova/virt/libvirt/config.py(我还必须删除同一目录中的 config.pyc 并重新启动 nova 服务)