ubuntu下kvm 命令行安装64位ubuntu报"Couldn't find hvm kernel for Ubuntu tree."的问题分析
1.安装ubuntu时使用的virt-install的配置:
virt-install\ --nametest4\ --ram1024\ --diskpath=/data/01_ubuntu/ubuntu4.img,size=6\ --vcpus1\ --hvm\ --os-typelinux\ --networknetwork=default\ --os-variantubuntuquantal\ --graphicsnone\ --consolepty,target_type=serial\ --location/data/00_osfile/ubuntu-16.04.1-server-amd64.iso\ --extra-args'console=ttyS0,115200n8serial'
报错如下:
ERRORCouldn'tfindhvmkernelforUbuntutree.
Domaininstallationdoesnotappeartohavebeensuccessful.
通过查资料发现,virt-install可以开debug模式的,加入--debug选项即可
2.virt-install的debug模式得到的结果:
[Wed,30Nov201611:16:07virt-install26900]DEBUG(urlfetcher:268)localhasFile:Couldn'tfind/var/lib/libvirt/boot/virtinstmnt.xPL9y1/current/images/MANIFEST [Wed,30Nov201611:16:07virt-install26900]DEBUG(urlfetcher:89)FetchingURI:/var/lib/libvirt/boot/virtinstmnt.xPL9y1/install/netboot/version.info Retrievingfileversion.info...|58B00:00:00 [Wed,30Nov201611:16:07virt-install26900]DEBUG(urlfetcher:1164)Didn'tfindanyknowncodenameintheURLstring [Wed,30Nov201611:16:07virt-install26900]DEBUG(urlfetcher:511)Detecteddistroname=Ubuntuosvariant=linux [Wed,30Nov201611:16:07virt-install26900]DEBUG(urlfetcher:268)localhasFile:Couldn'tfind/var/lib/libvirt/boot/virtinstmnt.xPL9y1/install/netboot/ubuntu-installer/i386/linux
这里就可以看出问题了,明明是64位的操作系统,为什么去找./install/netboot/ubuntu-install/i386/linux的路径
我们去看看iso文件中正确的路径是什么:
[root@11.10201_ubuntu]$mount/data/00_osfile/ubuntu-16.04.1-server-amd64.iso/mnt mount:/dev/loop2iswrite-protected,mountingread-only [root@11.10201_ubuntu]$ls/mnt/install/netboot/ubuntu-installer/amd64/linux /mnt/install/netboot/ubuntu-installer/amd64/linux
基本确定,如果将路径的i386改为amd64,virt-install安装就没有问题。
debug模式剩余的log:
[Wed,30Nov201611:16:07virt-install26900]DEBUG(urlfetcher:320)Cleaningupmountat/var/lib/libvirt/boot/virtinstmnt.xPL9y1 [Wed,30Nov201611:16:07virt-install26900]DEBUG(cli:305)File"/usr/share/virt-manager/virt-install",line1077,in<module> sys.exit(main()) File"/usr/share/virt-manager/virt-install",line1071,inmain start_install(guest,continue_inst,options) File"/usr/share/virt-manager/virt-install",line775,instart_install fail(e,do_exit=False) File"/usr/share/virt-manager/virtinst/cli.py",line305,infail logging.debug("".join(traceback.format_stack())) [Wed,30Nov201611:16:07virt-install26900]ERROR(cli:306)Couldn'tfindhvmkernelforUbuntutree. [Wed,30Nov201611:16:07virt-install26900]DEBUG(cli:308) Traceback(mostrecentcalllast): File"/usr/share/virt-manager/virt-install",line747,instart_install dom=guest.start_install(meter=meter,noboot=options.noreboot) File"/usr/share/virt-manager/virtinst/guest.py",line491,instart_install self._prepare_install(meter,dry) File"/usr/share/virt-manager/virtinst/guest.py",line304,in_prepare_install self.installer.prepare(self,meter) File"/usr/share/virt-manager/virtinst/installer.py",line200,inprepare self._prepare(guest,meter) File"/usr/share/virt-manager/virtinst/distroinstaller.py",line451,in_prepare self._prepare_kernel_url(guest,fetcher) File"/usr/share/virt-manager/virtinst/distroinstaller.py",line360,in_prepare_kernel_url kernel,initrd,args=store.acquireKernel(guest) File"/usr/share/virt-manager/virtinst/urlfetcher.py",line603,inacquireKernel {"distro":self.name,"type":self.type}) RuntimeError:Couldn'tfindhvmkernelforUbuntutree.
3.修改virt-manager代码:
通过上面的报错,发现virt-manager使用python写的!正好想看什么源码来自,这个正好!
通过对virt-manager这一项目一步步debug,找到问题:
[root@11.102~]$grep-n-A22"classDebianDistro"/usr/share/virt-manager/virtinst/urlfetcher.py 1076:classDebianDistro(Distro): 1077-#ex.http://ftp.egr.msu.edu/debian/dists/sarge/main/installer-i386/ 1078-#dailybuilds: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-#Pullthetree'sarchoutoftheURLtext 1087-self._treeArch='i386' 1088-forpatternin["^.*/installer-(\w+)/?$", 1089-"^.*/daily-images/(\w+)/?$"]: 1090-arch=re.findall(pattern,self.uri) 1091-ifarch: 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'tfindhvmkernelforUbuntutree."的解决办法
grep-n-A21'classDebianDistro'/usr/lib/python2.6/site-packages/virtinst/OSDistro.py命令可以查看DebianDistro类的__init__方法
[root@2virtinst]$grep-n-A21'classDebianDistro'/usr/lib/python2.6/site-packages/virtinst/OSDistro.py 892:classDebianDistro(Distro): 893-#ex.http://ftp.egr.msu.edu/debian/dists/sarge/main/installer-i386/ 894-#dailybuilds: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-ifuri.count("installer-i386"): 902-self._treeArch="i386" 903-elifuri.count("installer-amd64"): 904-self._treeArch="amd64" 905-else: 906-self._treeArch="i386" 907- 908-ifre.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'