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'
  • 相关阅读:
    【反射】Java反射机制
    Composer教程之常用命令
    Composer教程之基础用法
    Composer教程之初识Composer
    Composer 的结构详解
    现代 PHP 新特性系列(七) —— 内置的 HTTP 服务器
    现代 PHP 新特性系列(一) —— 命名空间
    现代 PHP 新特性系列(二) —— 善用接口
    现代 PHP 新特性系列(三) —— Trait 概览
    现代 PHP 新特性系列(四) —— 生成器的创建和使用
  • 原文地址:https://www.cnblogs.com/ruo-yu/p/6117134.html
Copyright © 2011-2022 走看看