使用 VMware 的 PowerCLI,您可以在客户机内部调用脚本,甚至在客户机具有网络连接之前,使用 Invoke-VMScript Cmdlet(需要安装 vmtools)。
在网络可用之前,是否有类似的机制可用于调用 KVM 客户机内部的脚本?
我需要进行部署后定制。
作为一种解决方法,我考虑安装磁盘映像并进行 chrooting,但我正在寻找一种更“可脚本化”且更直接的方法。
谢谢。
答案1
我们为每个客户机提供一个附加到主机上纯文件的辅助只读块设备。VM 主机可以使用此通道以安全的单向方式将客户机特定的信息传输给客户机:在我们的安装中,它只是一个带有文件系统自定义和初始化脚本的 tar 文件。客户机->主机的攻击面很小,我们不必处理 libguestfs 带来的大量开销。
以下是我们使用的 libvirt 客户机 XML 片段:
<disk type='file' device='disk'>
<driver name='qemu' type='raw' cache='none' io='native'/>
<source file='/vm/hostconf/testhost.hostconf.tar'/>
<target dev='vdb' bus='virtio'/>
<readonly/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</disk>
在客户机上,一个小的初始化脚本会解压 tar 文件并进行必要的更改。
答案2
因此这里有三个选择:
- 使用 libvirtd api 获取控制台访问权限并以此方式执行命令。我不建议这样做,因为它有点肮脏。除非您默认禁用网络立即启动,否则您将不得不
- 使用 libguestfs 挂载磁盘并在启动前调整设置。这就是我设计的系统所做的,实际上它很容易做到,管理起来也不复杂。我们使用 perl,Sys::GuestFS 允许我们编写命令脚本而不会出现太多问题。
- 设置机器通过 dhcp 启动网络,并运行为其提供临时 IP 地址的 dhcpd 服务器,然后通过 ssh 连接并调整网络配置并重新加载。这是最强大的解决方案,但它需要您编写 dhcpd 服务器脚本。希望对您有所帮助。
答案3
有一种非常标准的方法来运行脚本任何Linux 发行版在网络启动之前启动,即在网络启动之前将它们放入启动顺序中。例如,在我的 CentOS 6 机器上,网络由 启动/etc/rc3.d/S10network
。因此,如果我想在网络启动之前运行某些程序,我可以将其放入 中/etc/rc3.d/S05myscript
。
对于已经 drink theupstart
或systemd
coolaid 的分布,将会有其他更复杂的方法来做到这一点;但这一点仍然适用。
编辑:这正是您所说的“联网之前”的意思,但不是“调用脚本”的意思。您想从机器本身以外的某个地方(在本例中,来自 KVM 主机),这很好,而且我坦率地承认我的解决方案没有帮助 - 但你真的应该彻底检查你的问题,以使你的要求更清楚!
顺便说一句,我不知道如何使用 KVM 来做到这一点。