libvirt-go:如何为系统重启定义回调函数

I am currently writing a small program in go, which I would like to use later to start virtual machines. The VM's are all based on centos7.0. A kickstartfile is used to install the VM's according to the same scheme.

To use the function with the kickstartfile I have to activate the direct kernel boot. I pass the path to the kernel (vmlinuz), initrd (initrd.img) and the argements (ks=http://172.25.35.165/kvm-centos.ks).

After the installation the VM starts again via the kickstartfile, which leads to a permanent installation routine.

I'm now looking for an EventHandler that notifies my go program that the VM is being restarted. Then I could disable the kernel boot settings with the kickstartfile argument.

I have already tried with DomainEventRegister, but the event is not triggered. The libvirt-go package is also very poorly documented when it comes to event handling.

Does anyone know how I can set a CallbackFunction for reboot actions to disable the kernel boot settings after successfully installing the VM?

Here my go function:

// 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
}

This is not the way you install an OS on a new VM.

Instead, you should define the domain twice: first, with the installation configuration, and second, with the permanent configuration.

First, you call conn.DomainDefineXML() with the installation configuration XML, then after you start it and it is running, you call the same function again with the permanent configuration XML. Because the domain already exists, the new configuration will replace the old, but the new configuration won't take effect until the domain shuts down.

To fully make this work, you need to set <on_reboot>destroy</on_reboot> in the installation XML. This causes the VM to shut down when the installer reboots. You can then start it again and it will come up with your permanent configuration.