doumei9832 2018-09-27 14:01
浏览 126
已采纳

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
}
  • 写回答

1条回答 默认 最新

  • dounan9070 2018-09-27 19:41
    关注

    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.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 python变量和列表之间的相互影响
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)