Go 如何为系统重新启动定义回调函数

Go 如何为系统重新启动定义回调函数,go,callback,reboot,libvirt,Go,Callback,Reboot,Libvirt,我正在用Go编写一个小程序,稍后我想用它来启动虚拟机。虚拟机都基于centos7.0。A用于根据相同的方案安装VM 要在kickstartfile中使用该函数,我必须激活直接内核引导。我将路径传递给内核(vmlinuz),initrd(initrd.img)和目标(ks)=http://172.25.35.165/kvm-centos.ks) 安装完成后,VM会通过kickstartfile再次启动,这将导致一个永久性的安装例程 我现在正在寻找一个EventHandler,它通知我的go程序VM

我正在用Go编写一个小程序,稍后我想用它来启动虚拟机。虚拟机都基于centos7.0。A用于根据相同的方案安装VM

要在kickstartfile中使用该函数,我必须激活直接内核引导。我将路径传递给内核(
vmlinuz
),initrd(
initrd.img
)和目标(
ks)=http://172.25.35.165/kvm-centos.ks

安装完成后,VM会通过kickstartfile再次启动,这将导致一个永久性的安装例程

我现在正在寻找一个EventHandler,它通知我的go程序VM正在重新启动。然后我可以使用kickstartfile参数禁用内核引导设置

我已尝试使用,但未触发该事件。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上安装操作系统的方式

相反,您应该定义域两次:第一次是使用安装配置,第二次是使用永久配置

首先,使用安装配置XML调用conn.DomainDefineXML(),然后在启动它并运行之后,使用永久配置XML再次调用相同的函数。由于域已存在,新配置将替换旧配置,但新配置在域关闭之前不会生效


要完全做到这一点,您需要在安装XML中设置
destroy
。这会导致VM在安装程序重新启动时关闭。然后,您可以重新启动它,它将提供您的永久配置。

简化您的问题,准确说出您想要的内容,而不依赖于其他库。我更改了我的函数,首先调用
conn.DomainDefineXML(installationXML)
来定义临时域。我必须从域结构调用
Create()
函数来启动临时安装。正常安装后,我想调用conn.DomainDefineXML(permanentXML)来定义永久域,但临时安装后该域不会重新启动。我只看到一个黑屏。Go永远不会来定义永久域,因为该域不会重新启动。我在installationXML中设置了
destroy
,并在kickstart文件中设置了
reboot
。怎么了?谢谢,现在它可以用了。我忘了擦除磁盘。