package main

import (
	'encoding/xml'
	'fmt'
	'github.com/libvirt/libvirt-go'
	'github.com/libvirt/libvirt-go-xml'
	'log'
	'os'
	'path/filepath'
	'strings'
	'time'
)

// ... 其他代码 ...

func (srv *ManagerService) CreateVirtualMachine(req *request.VirtualMachine, user string) (string, error) {
	name, err := srv.CheckVirName(req.VirtualMachineName)
	if err != nil {
		logger.Error(err)
		return '', err
	}
	if name {
		logger.Error('Duplicate virtual machine name')
		return '', errors.New('Duplicate virtual machine name')
	}
	dir := ugreen.ConfigDir()
	if _, err := os.Stat(fmt.Sprintf('%s/%s', dir, 'kvm.conf')); os.IsNotExist(err) {
		logger.Error(err.Error())
		return '', err
	}
	uuid := req.Path
	if _, err := os.Stat(req.Path); os.IsNotExist(err) {
		logger.Error('the path is not exist')
		return '', errors.New('the path is not exist')
	}
	join := filepath.Join(req.Path, '@kvm')
	if _, err := os.Stat(join); os.IsNotExist(err) {
		err = os.Mkdir(join, 0755)
		if err != nil {
			logger.Error(err.Error())
			return '', err
		}
	}
	join = filepath.Join(join, req.VirtualMachineName)
	if _, err := os.Stat(join); os.IsNotExist(err) {
		err = os.Mkdir(join, 0755)
		if err != nil {
			logger.Error(err.Error())
			return '', err
		}
	}
	var domain libvirtxml.Domain
	domain.Name = req.VirtualMachineName
	domain.Type = 'qemu'
	//utils.ShellExec('qemu', '-img', 'create', '-f', 'qcow2')
	domain.OS = &libvirtxml.DomainOS{
		Type: &libvirtxml.DomainOSType{
			Type: 'hvm',
		},
		BootDevices: []libvirtxml.DomainBootDevice{
			{
				Dev: 'hd',
			},
			{
				Dev: 'cdrom',
			},
		},
		BootMenu: &libvirtxml.DomainBootMenu{
			Enable: 'yes',
		},
	}
	if strings.Compare(req.Advanced.Device.BootType, 'uefi') == 0 {
		domain.OS.Loader = &libvirtxml.DomainLoader{
			Type:     'pflash',
			Readonly: 'yes',
			Path:     '/usr/share/OVMF/OVMF_CODE_4M.fd',
		}
	}
// ... 其他代码 ...
}

报错: virError(Code=1, Domain=0, Message='internal error: could not initialize domain event timer')

内容: 这个错误可能是由于libvirt库无法初始化域事件计时器导致的。可能的解决方法是:

  • 检查libvirt库的配置和依赖项是否正确安装,并确保它与你的代码兼容。
  • 尝试重新启动libvirtd服务并重新运行代码来看看问题是否解决。
  • 如果问题仍然存在,你可能需要查看更详细的错误日志或与libvirt社区寻求帮助。

希望这些信息能帮到你!

其他建议:

  • 在代码中添加更多注释,解释代码的功能和逻辑。
  • 使用更具描述性的变量名和函数名。
  • 将代码分解成更小的、更易于管理的函数。

通过遵循这些最佳实践,你可以使你的代码更易于理解、维护和调试。

This response is now complete. Let me know if you have any other questions.

Go语言使用libvirt库创建虚拟机

原文地址: https://www.cveoy.top/t/topic/fFZV 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录