如何定义系统重启的回调函数
How to define a callback function for system reboot
我正在用 Go 编写一个小程序,稍后我想用它来启动虚拟机。虚拟机都是基于centos7.0的。 kickstartfile 用于根据相同的方案安装 VM。
要使用 kickstartfile 的功能,我必须激活直接内核引导。我将路径传递给内核 (vmlinuz
)、initrd (initrd.img
) 和参数 (ks=http://172.25.35.165/kvm-centos.ks
).
安装后,VM 通过 kickstart 文件再次启动,这会导致永久安装例程。
我现在正在寻找一个 EventHandler 来通知我的 go 程序 VM 正在重新启动。然后我可以使用 kickstartfile 参数禁用内核启动设置。
我已经尝试过DomainEventRegister,但事件没有触发。 libvirt-go 包在事件处理方面的文档也很少。
有人知道如何在成功安装 VM 后为重启操作设置 CallbackFunction 以禁用内核启动设置吗?
这是我的 go 函数:
// CreateDomain
func CreateDomain(domainCfg *libvirtxml.Domain, conn *libvirt.Connect) error {
domainXML, err := domainCfg.Marshal()
if err != nil {
return err
}
domain, err := conn.DomainDefineXML(domainXML)
if err != nil {
return err
}
conn.DomainEventRegister(nil, func(c *libvirt.Connect, d *libvirt.Domain, event *libvirt.Event) {
log.Println("Reboot")
})
err = domain.CreateWithFlags(libvirt.DOMAIN_NONE)
if err != nil {
return err
}
domainState, _, err := domain.GetState()
for domainState == libvirt.DOMAIN_RUNNING {
state, _, err := domain.GetState()
if err != nil {
return err
}
time.Sleep(time.Second * 10)
log.Println(state)
if state != libvirt.DOMAIN_RUNNING {
break
}
}
return nil
}
这不是您在新 VM 上安装 OS 的方式。
相反,您应该定义域两次:第一次是使用安装配置,第二次是使用永久配置。
首先,您使用安装配置XML调用conn.DomainDefineXML()
,然后在启动它后运行,您使用永久配置再次调用相同的功能XML。因为域已经存在,新的配置会替换旧的,但是新的配置要等到域关闭后才会生效。
要完全使用此功能,您需要在安装XML 中设置<on_reboot>destroy</on_reboot>
。这会导致 VM 在安装程序重新启动时关闭。然后您可以再次启动它,它将提供您的永久配置。
我正在用 Go 编写一个小程序,稍后我想用它来启动虚拟机。虚拟机都是基于centos7.0的。 kickstartfile 用于根据相同的方案安装 VM。
要使用 kickstartfile 的功能,我必须激活直接内核引导。我将路径传递给内核 (vmlinuz
)、initrd (initrd.img
) 和参数 (ks=http://172.25.35.165/kvm-centos.ks
).
安装后,VM 通过 kickstart 文件再次启动,这会导致永久安装例程。
我现在正在寻找一个 EventHandler 来通知我的 go 程序 VM 正在重新启动。然后我可以使用 kickstartfile 参数禁用内核启动设置。
我已经尝试过DomainEventRegister,但事件没有触发。 libvirt-go 包在事件处理方面的文档也很少。
有人知道如何在成功安装 VM 后为重启操作设置 CallbackFunction 以禁用内核启动设置吗?
这是我的 go 函数:
// CreateDomain
func CreateDomain(domainCfg *libvirtxml.Domain, conn *libvirt.Connect) error {
domainXML, err := domainCfg.Marshal()
if err != nil {
return err
}
domain, err := conn.DomainDefineXML(domainXML)
if err != nil {
return err
}
conn.DomainEventRegister(nil, func(c *libvirt.Connect, d *libvirt.Domain, event *libvirt.Event) {
log.Println("Reboot")
})
err = domain.CreateWithFlags(libvirt.DOMAIN_NONE)
if err != nil {
return err
}
domainState, _, err := domain.GetState()
for domainState == libvirt.DOMAIN_RUNNING {
state, _, err := domain.GetState()
if err != nil {
return err
}
time.Sleep(time.Second * 10)
log.Println(state)
if state != libvirt.DOMAIN_RUNNING {
break
}
}
return nil
}
这不是您在新 VM 上安装 OS 的方式。
相反,您应该定义域两次:第一次是使用安装配置,第二次是使用永久配置。
首先,您使用安装配置XML调用conn.DomainDefineXML()
,然后在启动它后运行,您使用永久配置再次调用相同的功能XML。因为域已经存在,新的配置会替换旧的,但是新的配置要等到域关闭后才会生效。
要完全使用此功能,您需要在安装XML 中设置<on_reboot>destroy</on_reboot>
。这会导致 VM 在安装程序重新启动时关闭。然后您可以再次启动它,它将提供您的永久配置。