如何定义系统重启的回调函数

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 在安装程序重新启动时关闭。然后您可以再次启动它,它将提供您的永久配置。