zoukankan      html  css  js  c++  java
  • 04.ubuntu下kvm 命令行安装64位ubuntu报"Couldn't find hvm kernel for Ubuntu tree."的问题

    1.安装ubuntu时使用的virt-install的配置:

    virt-install 
    --name test4 
    --ram 1024 
    --disk path=/data/01_ubuntu/ubuntu4.img,size=6 
    --vcpus 1 
    --hvm 
    --os-type linux 
    --network network=default 
    --os-variant ubuntuquantal 
    --graphics none 
    --console pty,target_type=serial 
    --location /data/00_osfile/ubuntu-16.04.1-server-amd64.iso 
    --extra-args 'console=ttyS0,115200n8 serial'

    报错如下:

    ERROR Couldn't find hvm kernel for Ubuntu tree.
    Domain installation does not appear to have been successful.

    通过查资料发现,virt-install可以开debug模式的,加入--debug选项即可

    2.virt-install的debug模式得到的结果:

    [Wed, 30 Nov 2016 11:16:07 virt-install 26900] DEBUG (urlfetcher:268) local hasFile: Couldn't find /var/lib/libvirt/boot/virtinstmnt.xPL9y1/current/images/MANIFEST
    [Wed, 30 Nov 2016 11:16:07 virt-install 26900] DEBUG (urlfetcher:89) Fetching URI: /var/lib/libvirt/boot/virtinstmnt.xPL9y1/install/netboot/version.info
    Retrieving file version.info...                                                                                                                      |   58 B  00:00:00     
    [Wed, 30 Nov 2016 11:16:07 virt-install 26900] DEBUG (urlfetcher:1164) Didn't find any known codename in the URL string
    [Wed, 30 Nov 2016 11:16:07 virt-install 26900] DEBUG (urlfetcher:511) Detected distro name=Ubuntu osvariant=linux
    [Wed, 30 Nov 2016 11:16:07 virt-install 26900] DEBUG (urlfetcher:268) local hasFile: Couldn't find /var/lib/libvirt/boot/virtinstmnt.xPL9y1/install/netboot/ubuntu-installer/i386/linux

    这里就可以看出问题了,明明是64位的操作系统,为什么去找./install/netboot/ubuntu-install/i386/linux的路径

    我们去看看iso文件中正确的路径是什么:

    [root@11.102 01_ubuntu]$mount /data/00_osfile/ubuntu-16.04.1-server-amd64.iso /mnt
    mount: /dev/loop2 is write-protected, mounting read-only
    [root@
    11.102 01_ubuntu]$ls /mnt/install/netboot/ubuntu-installer/amd64/linux /mnt/install/netboot/ubuntu-installer/amd64/linux

    基本确定,如果将路径的i386改为amd64,virt-install安装就没有问题。

    debug模式剩余的log:

    [Wed, 30 Nov 2016 11:16:07 virt-install 26900] DEBUG (urlfetcher:320) Cleaning up mount at /var/lib/libvirt/boot/virtinstmnt.xPL9y1
    [Wed, 30 Nov 2016 11:16:07 virt-install 26900] DEBUG (cli:305)   File "/usr/share/virt-manager/virt-install", line 1077, in <module>
        sys.exit(main())
      File "/usr/share/virt-manager/virt-install", line 1071, in main
        start_install(guest, continue_inst, options)
      File "/usr/share/virt-manager/virt-install", line 775, in start_install
        fail(e, do_exit=False)
      File "/usr/share/virt-manager/virtinst/cli.py", line 305, in fail
        logging.debug("".join(traceback.format_stack()))
    
    [Wed, 30 Nov 2016 11:16:07 virt-install 26900] ERROR (cli:306) Couldn't find hvm kernel for Ubuntu tree.
    [Wed, 30 Nov 2016 11:16:07 virt-install 26900] DEBUG (cli:308) 
    Traceback (most recent call last):
      File "/usr/share/virt-manager/virt-install", line 747, in start_install
        dom = guest.start_install(meter=meter, noboot=options.noreboot)
      File "/usr/share/virt-manager/virtinst/guest.py", line 491, in start_install
        self._prepare_install(meter, dry)
      File "/usr/share/virt-manager/virtinst/guest.py", line 304, in _prepare_install
        self.installer.prepare(self, meter)
      File "/usr/share/virt-manager/virtinst/installer.py", line 200, in prepare
        self._prepare(guest, meter)
      File "/usr/share/virt-manager/virtinst/distroinstaller.py", line 451, in _prepare
        self._prepare_kernel_url(guest, fetcher)
      File "/usr/share/virt-manager/virtinst/distroinstaller.py", line 360, in _prepare_kernel_url
        kernel, initrd, args = store.acquireKernel(guest)
      File "/usr/share/virt-manager/virtinst/urlfetcher.py", line 603, in acquireKernel
        {"distro": self.name, "type" : self.type})
    RuntimeError: Couldn't find hvm kernel for Ubuntu tree.

    3.修改virt-manager代码:

    通过上面的报错,发现virt-manager使用python写的!正好想看什么源码来自,这个正好!

    通过对virt-manager这一项目一步步debug,找到问题:

    [root@11.102 ~]$grep -n -A22 "class DebianDistro" /usr/share/virt-manager/virtinst/urlfetcher.py
    1076:class DebianDistro(Distro):
    1077-    # ex. http://ftp.egr.msu.edu/debian/dists/sarge/main/installer-i386/
    1078-    # daily builds: http://d-i.debian.org/daily-images/amd64/
    1079-    name = "Debian"
    1080-    urldistro = "debian"
    1081-    os_variant = "linux"
    1082-
    1083-    def __init__(self, *args, **kwargs):
    1084-        Distro.__init__(self, *args, **kwargs)
    1085-
    1086-        # Pull the tree's arch out of the URL text
    1087-        self._treeArch = 'i386'
    1088-        for pattern in ["^.*/installer-(w+)/?$",
    1089-                        "^.*/daily-images/(w+)/?$"]:
    1090-            arch = re.findall(pattern, self.uri)
    1091-            if arch:
    1092-                self._treeArch = arch[0]
    1093-                break
    1094-
    1095-        self._url_prefix = 'current/images'
    1096-        self._installer_dirname = self.name.lower() + "-installer"
    1097-        self._set_media_paths()

    发现基于Debian的系统,__init__方法中self._treeArch初始化时是i386,估计是virt-manager读取ubuntu的iso文件时,出了什么问题,没读出该系统是x86_64类型,将该值改为amd64,就可以了。

    再次运行virt-install,成功进入ubuntu安装界面!

    附:CentOS命令行使用KVM安装64位ubuntu报"Couldn't find hvm kernel for Ubuntu tree."的解决办法

    grep -n -A21 'class DebianDistro' /usr/lib/python2.6/site-packages/virtinst/OSDistro.py 命令可以查看DebianDistro类的__init__方法
    [root@2 virtinst]$grep -n -A21 'class DebianDistro' /usr/lib/python2.6/site-packages/virtinst/OSDistro.py
    892:class DebianDistro(Distro):
    893-    # ex. http://ftp.egr.msu.edu/debian/dists/sarge/main/installer-i386/
    894-    # daily builds: http://people.debian.org/~joeyh/d-i/
    895-
    896-    name = "Debian"
    897-    os_type = "linux"
    898-
    899-    def __init__(self, uri, arch, vmtype=None, scratchdir=None):
    900-        Distro.__init__(self, uri, arch, vmtype, scratchdir)
    901-        if uri.count("installer-i386"):
    902-            self._treeArch = "i386"
    903-        elif uri.count("installer-amd64"):
    904-            self._treeArch = "amd64"
    905-        else:
    906-            self._treeArch = "i386"
    907-
    908-        if re.match(r'i[4-9]86', arch):
    909-            self.arch = 'i386'
    910-
    911-        self._installer_name = self.name.lower() + "-" + "installer"
    912-        self._prefix = 'current/images'
    913-        self._set_media_paths()

    改变__init__方法里的else:条件下面的一行,将"i386"改为"amd64"即可

    - self._treeArch = 'i386'
    + self._treeArch = 'amd64'
  • 相关阅读:
    C#Windows服务程序安装常见问题解决方法
    解决access 导出 excel 字段截断错误的问题
    MySQL创建方法错误:This function has none of DETERMINISTIC, NO SQL
    解决问题 “You don't have permission to access /index.html on this server.”
    无法枚举容器中的对象,访问被拒绝的解决方法
    php xml操作
    php 字符串截取函数
    PHP iconv 解决utf-8和gb2312编码转换问题
    IIS6,IIS7中查看w3wp进程
    Solaris设备管理
  • 原文地址:https://www.cnblogs.com/ruo-yu/p/6117134.html
Copyright © 2011-2022 走看看