libvirt-go: как определить функцию обратного вызова для перезагрузки системы - PullRequest
0 голосов
/ 27 сентября 2018

В настоящее время я пишу небольшую программу на go, которую я хотел бы использовать позже для запуска виртуальных машин.Все виртуальные машины основаны на centos7.0. kickstartfile используется для установки виртуальных машин по той же схеме.

Чтобы использовать функцию с кикстарт-файлом, мне нужно активировать прямую загрузку ядра.Я передаю путь к ядру (vmlinuz), initrd (initrd.img) и аргументам (ks=http://172.25.35.165/kvm-centos.ks).

После установки виртуальная машина запускается снова через файл кикстарта, который приводит к постоянномуПроцедура установки.

Сейчас я ищу EventHandler, который уведомляет мою программу go о перезапуске виртуальной машины.Затем я могу отключить параметры загрузки ядра с помощью аргумента kickstartfile.

Я уже пробовал с DomainEventRegister , но событие не вызывается.Пакет libvirt-go также очень плохо документирован, когда дело доходит до обработки событий.

Кто-нибудь знает, как я могу установить функцию 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
}

1 Ответ

0 голосов
/ 27 сентября 2018

Это не тот способ, которым вы устанавливаете ОС на новую виртуальную машину.

Вместо этого вы должны определить домен дважды: сначала с конфигурацией установки, а затем с постоянной конфигурацией.

Сначала вы вызываете conn.DomainDefineXML() с XML-файлом конфигурации установки, затем после его запуска и запуска вы снова вызываете ту же функцию с XML-кодом постоянной конфигурации.Поскольку домен уже существует, новая конфигурация заменит старую, но новая конфигурация не вступит в силу, пока домен не завершит работу.

Чтобы полностью выполнить эту работу, необходимо установить <on_reboot>destroy</on_reboot> вустановочный XML.Это приводит к выключению виртуальной машины при перезагрузке установщика.Затем вы можете запустить его снова, и он примет вашу постоянную конфигурацию.

...