Chinaunix首页 | 论坛 | 博客
  • 博客访问: 254819
  • 博文数量: 42
  • 博客积分: 3110
  • 博客等级: 中校
  • 技术积分: 830
  • 用 户 组: 普通用户
  • 注册时间: 2005-10-18 22:12
文章分类

全部博文(42)

文章存档

2012年(2)

2011年(6)

2010年(5)

2009年(20)

2008年(9)

我的朋友

分类: LINUX

2008-05-13 19:43:07

在CentOS5系统的宿主机上使用XEN非完全虚拟机方式安装CentOS4系统竟然失败?!而且报错为Invalid URL Location give即“不可用的网络URL资源定位”。我使用FTP安装,难道是我的FTP地址路径给错了?于是我立即使用ftp命令去open那个URL资源,可以阿,dir都可以列出目录,而且支持匿名,可以访问可以下载。为什么一直提示我在给XEN虚拟机安装CentOS4的时候就一直提示这个错误呢?
--------------------------------------------------------------------------------------------------------------------------------------------
[root@KCXEN kcentos4]# virt-install -n kcentos4 -r 512 --vcpu=2 --file=disk.img --file=swap.img --nographics -l 
Would you like a fully virtualized guest (yes or no)?  This will allow you to run unmodified operating systems. no
 How large would you like the disk (disk.img) to be (in gigabytes)? 10
 How large would you like the disk (swap.img) to be (in gigabytes)? 2
  

Starting install...
ERROR:  Invalid URL location given: [Errno 4] IOError: [Errno ftp error] 550 Failed to change directory.
(错误:不可用的URL资源定位:[错误号4]IO错误:[FTP错误]550 切换目录失败)
-------------------------------------------------------------------------------------------------------------------------------------------- 


我仔细想了一下,这个FTP的URL并没有错误,可以访问。并且,地址路径我也没有输入错误,完全复制粘贴到浏览器中也可以访问。难道是XEN损坏了吗?也不对,我尝试过改成另外一个我设置好提供CentOS5资料的FTP路径去安装虚拟机,结果可以正常安装,说明XEN本身没有问题。那问题到底在哪里呢?为什么一直说是FTP的问题呢?无奈之下,我只好请教了一下Octer。Octer说这是由于启动内核的差异所导致的,提到之前我使用非完全虚拟机方式装了一个CentOS5的XEN虚拟机以及一台HVM方式的Windows2003的虚拟机。他提示我仔细比较一下两者的XEN配置文件就能发现线索。 


于是,我比较了一下两者之间的配置文件:
CentOS5——非完全方式虚拟机:
--------------------------------------------------------------------
[root@KCXEN xen]# cat kcentos5 
# Automatically generated xen config file
name = "kcentos5"
memory = "512"
disk = [ 'tap:aio:/opt/xen/kcentos5/kcentos5_master.img,xvda,w', 'tap:aio:/opt/xen/kcentos5/kcentos5_slave.img,xvdb,w', ]
vif = [ 'mac=00:16:3e:11:b6:ec, bridge=xenbr0', ] 

uuid = "734f2dbb-934e-ba83-d45d-ef656ecfbefc"
bootloader="/usr/bin/pygrub"
(可以发现非完全方式的虚拟机,都会有一个bootloader的配置项。后面指定了宿主机下/usr/bin/pygrub这个路径的启动脚本)
vcpus=1
on_reboot   = 'restart'
on_crash    = 'restart'
-------------------------------------------------------------------- 

Windows2003——HVM方式虚拟机
--------------------------------------------------------------------
[root@KCXEN xen]# cat kcwin2k3
# Automatically generated xen config file 

import os, re
arch = os.uname()[4]
if re.search('64', arch):
    arch_libdir = 'lib64'
else:
    arch_libdir = 'lib' 

name = "kcwin2k3"
builder = "hvm"
memory = "1024"
disk = [ 'file:/opt/xen/kcwin2k3/disk1.img,hda,w', 'file:/opt/xen/kcwin2k3/disk2.img,hdb,w','file:/opt/xen/kcwin2k3/disk3.img,hdc,w','file:/iso/win2k3.iso,hdd:cdrom,r', ]
vif = [ 'type=ioemu, mac=00:16:3e:40:16:60, bridge=xenbr0', ]
uuid = "25a47c57-294d-0a5d-6a1e-cedb09570b33"
device_model = "/usr/lib/xen/bin/qemu-dm"
kernel = "/usr/lib/xen/boot/hvmloader"
(可以发现HVM方式的虚拟机,都有一个Kernel的配置项。后面指定了HVM方式的虚拟机都是由/usr/lib/xen/boot/hvmloader这个引导器引导起来的)
vnc=1
vncunused=1
vncdisplay=1
vnclisten='0.0.0.0'
apic=0
acpi=0
pae=1
boot="c"
vcpus=1
serial = "pty" # enable serial console
on_reboot   = 'restart'
on_crash    = 'restart'
------------------------------------------------------------------ 


然后找一下/usr/lib/xen/boot/hvmloader这个引导器,原来是一个编译过的2进制执行程序。而/usr/bin/pygrub则是一个启动脚本。比较长,我摘录其中一段比较关键的地方贴出来看:
-----------------------------------------------------------
     ......
     ...... 

        # open the image and read the grub config
        fs = None
        for fstype in grub.fsys.fstypes.values():
            if fstype.sniff_magic(fn, offset):
                fs = fstype.open_fs(fn, offset)
                break 

        if fs is not None:
            grubfile = None
            for f in ("/boot/grub/menu.lst", "/boot/grub/grub.conf",
                      "/grub/menu.lst", "/grub/grub.conf"):
                if fs.file_exist(f):
                    grubfile = f
                    break
            if grubfile is None:
                raise RuntimeError, "we couldn't find grub config file in the image provided."
            f = fs.open_file(grubfile)
     ......
     ......
---------------------------------------------------------
所以,很明显的。问题就有答案了,还记得我们在安装XEN的时候需要安装什么吗?对了,要安装一个叫Kernel-xen的包。里面提供了支持XEN的系统内核。安装完了之后还记得我们还要做什么工作吗?对了,就是检查修改/boot/grub/grub.conf引导文件,指定系统启动使用XEN功能内核并从这个XEN内核启动。 

非完全XEN虚拟机,之所以我这么称呼它,是因为它的确不是一个完全体。从上面给出的非完全虚拟机的bootloader可以看出,非完全虚拟机的内核引导启动,其实都是依靠宿主机的内核,并且和宿主机的内核相关。换句话说,就是非完全XEN虚拟机必须依赖宿主机,脱离宿主机,就算移植到其他宿主机上去的时候,也必须要看新宿主机“内核的脸色”,因此,非完全XEN虚拟机就是并非一个完全的虚拟机,它依赖宿主机,他几乎不能脱离宿主机。 

CentOS4和Windows2003的情况在这里就有一个共同点了:他们的内核都与宿主机的CentOS5系统的内核镜像是不同的,所以如果使用一般的非完全的XEN虚拟机方式安装的话,行不通简直就是理所应当的事情了。也所以,安装Windows2003的时候要选择HVM方式的XEN虚拟机安装。相比之下,HVM不完全依赖宿主机的内核,它使用的是XEN软件提供的一个内核引导器,引导他们自己的内核。这也解释了安装Windows2003的时候为什么必须要使用HVM方式,也告诉了我,在CentOS5的宿主机上要是你想安装CentOS4的时候,也应当使用HVM的方式。 


建立CentOS4虚拟机的前期工作:
首先规划好虚拟机载体在宿主系统里存放的路径。
[root@KCXEN ~]# mkdir /opt/xen/kcentos4
[root@KCXEN ~]# cd /opt/xen/kcentos4
确认CentOS4的安装ISO在系统中的存放路径。
[root@KCXEN ~]# ll /iso
total 2845608
-rw-r--r-- 1 root root 2314237952 Sep 10 20:29 centos45.iso
-rw-r--r-- 1 root root  596807680 May 15 08:32 win2k3.iso 


这里我再展开一下虚拟机安装命令的详细参数:
[root@KCXEN ~]# virt-install --help
--------------------------------------------------------------------------------------------------
usage: virt-install [options]
使用方式:virt-install 选项 参数 

  -h, --help            
显示帮助。 

  -n NAME, --name=NAME
设定虚拟机的注册名。 

  -r MEMORY, --ram=MEMORY
设定虚拟机所使用的内存。 

  -u UUID, --uuid=UUID
设定虚拟机的UUID,不设定默认随即分配UUID号。 

  --vcpus=VCPUS
设定虚拟机使用的虚拟CPU。 

  -f DISKFILE, --file=DISKFILE
设定虚拟机使用的磁盘镜像。 

  -s DISKSIZE, --file-size=DISKSIZE
设定虚拟机使用的磁盘镜像的大小,单位是GB。 

  --nonsparse
设定非低密度文件作为磁盘?(这个选项目前我也不明白,一般也没有用到) 

  -m MAC, --mac=MAC
设定虚拟机使用网卡的MAC地址,如果不指定的话系统会随即生成一个MAC地址给虚拟机。 

  -b BRIDGE, --bridge=BRIDGE
设定网卡与宿主机的桥接。 

  --vnc
设定使用VNC作为图形支持。 

  --vncport=VNCPORT
设定VNC使用的端口。 

  --sdl
设定使用SDL作为图形支持。 

  --nographics
设定不使用图形界面作为控制台。 

  --noautoconsole 
设定关闭自动尝试连接到控制台。 

  -v, --hvm
设定使用HVM方式安装虚拟机。 

  -c CDROM, --cdrom=CDROM
设定宿主机上作为虚拟CDROM的路径。 

  -p, --paravirt
设定永久虚拟的用户?(这个选项目前我也不是很明白,一般也不用到) 

  -l LOCATION, --location=LOCATION
设定网络安装的资源定位,目前只支持NFS、HTTP和FTP的方式 

  -x EXTRA, --extra-args=EXTRA
附加参数 

  -d, --debug
显示Debug信息
------------------------------------------------------------------------------------------- 


使用命令安装CentOS4的HVM方式虚拟机
[root@KCXEN kcentos4]# virt-install -n kcentos4 -r 512 --vcpus=2 --file=disk.img --file=swap.img -v -c /iso/centos45.iso --vnc
How large would you like the disk (disk.img) to be (in gigabytes)? 10
 How large would you like the disk (swap.img) to be (in gigabytes)? 2 


Starting install...
Domain installation does not appear to have been
successful.  If it was, you can restart your domain
by running 'xm create -c kcentos4'; otherwise, please
restart your installation.
出现了提示信息,说安装并不成功。需要调整。这里出现这个提示并不要紧,接着我们去处理一下这个虚拟机的配置文件。 

进入虚拟机配置文件的存放路径
[root@KCXEN kcentos4]# cd /etc/xen/
[root@KCXEN xen]# ls
auto      kcwin2k3_2      xend-config.sxp          xmexample2
kcentos4   xend-pci-permissive.sxp  xmexample.hvm
kcentos5  qemu-ifup       xend-pci-quirks.sxp      xmexample.vti
kcwin2k3  scripts        xmexample1 

修改前记得备份
[root@KCXEN xen]# cp kcentos4 kcentos4.backups
修改
[root@KCXEN xen]# vi kcentos4
----------------------------------------------------------- 
# Automatically generated xen config file
name = "kcentos4"
builder = "hvm"
memory = "512"
disk = [ 'file:/opt/xen/kcentos4/disk.img,hda,w', 'file:/opt/xen/kcentos4/swap.img,hdb,w', ]
vif = [ 'type=ioemu, mac=00:16:3e:3c:64:bb, bridge=xenbr0', ]
uuid = "54a2cdd4-b8ee-efe7-2aac-f3a847dae897"
device_model = "/usr/lib/xen/bin/qemu-dm"
kernel = "/usr/lib/xen/boot/hvmloader"
apic=1
acpi=1
pae=1 

vcpus=2
serial = "pty" # enable serial console
on_reboot   = 'restart'
on_crash    = 'restart'
vnc=1
~
~
---------------------------------------------------------
修改成如下
---------------------------------------------------------
# Automatically generated xen config file 

import os, re
arch = os.uname()[4]
if re.search('64', arch):
    arch_libdir = 'lib64'
else:
    arch_libdir = 'lib' 

name = "kcentos4"
builder = "hvm"
memory = "512"
disk = [ 'file:/opt/xen/kcentos4/disk.img,hda,w', 'file:/opt/xen/kcentos4/swap.img,hdb,w', 'file:/iso/centos45.iso,hdc:cdrom,r', ]
(增加了一个虚拟CDROM)
vif = [ 'type=ioemu, mac=00:16:3e:3c:64:bb, bridge=xenbr0', ]
uuid = "54a2cdd4-b8ee-efe7-2aac-f3a847dae897"
device_model = "/usr/lib/xen/bin/qemu-dm"
kernel = "/usr/lib/xen/boot/hvmloader"
#apic=1
apic=0
#acpi=1
acpi=0
(为了保证安装的顺利,暂时先将ACPI和APIC先关闭)
pae=1 

vcpus=2
serial = "pty" # enable serial console
on_reboot   = 'restart'
on_crash    = 'restart' 

boot="dc" 
(添加启动顺序,暂时设定为CDROM启动优先) 

vnc=1
vncunused=1 
vncdisplay=1 (设定VNC的分配号是1)
vnclisten="0.0.0.0"
------------------------------------------------------------------------------------------ 


关闭这个虚拟机
[root@KCXEN xen]# xm destroy kcentos4 

察看活动虚拟域,确定关闭完成
[root@KCXEN xen]# xm list
Name                                      ID Mem(MiB) VCPUs State   Time(s)
Domain-0                                   0     2474     2 r-----   8634.3 

重新启动kcentos4
[root@KCXEN xen]# xm create kcentos4
Using config file "./kcentos4".
Started domain kcentos4
(出现上行提示,说明启动成功) 

察看宿主机端口。可以看到宿主机为虚拟机Kcentos4开放了一个VNC端口5900。
[root@KCXEN xen]# netstat -nap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:994                 0.0.0.0:*                   LISTEN      2084/rpc.statd      
tcp        0      0 0.0.0.0:5900                0.0.0.0:*                   LISTEN      13546/qemu-dm  (宿主提供5900端口VNC给kcentos4虚拟机)     
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      2047/portmap        
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      21282/vsftpd        
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      2313/cupsd          

再启动原来的一个台Windows2003的虚拟机,因为Windows也需要VNC的支持,如果同时启动的话会不会有冲突。
[root@KCXEN xen]# xm create kcwin2k3
Using config file "./kcwin2k3".
Started domain kcwin2k3
(顺利启动) 

再次察看宿主机的端口,发现宿主机还是只开放了一个VNC端口5900。
[root@KCXEN xen]# netstat -nap|less
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:994                 0.0.0.0:*                   LISTEN      2084/rpc.statd      
tcp        0      0 0.0.0.0:5900                0.0.0.0:*                   LISTEN      13546/qemu-dm (还是只有一个VNC端口)      
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      2047/portmap        
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      21282/vsftpd        
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      2313/cupsd          
实际上这一个VNC端口被Centos4占用掉了。在这里我做过试验,状况就是宿主机只开放一个VNC通道端口,那么虚拟机们是怎么分配的呢?很囧的规则就是“谁先抢到谁占用掉,其他人都没有”。一定是哪里配置有些问题。于是我做了昨天的HVM配置分析,终于找到了问题的所在。最后我通过更改了Windows2003虚拟机的配置文件来解决了这个问题。 


更改Windows2003虚拟机的配置文件
--------------------------------------------------------
[root@KCXEN ~]# vi /etc/xen/kcwin2k3
# Automatically generated xen config file 

import os, re
arch = os.uname()[4]
if re.search('64', arch):
    arch_libdir = 'lib64'
else:
    arch_libdir = 'lib' 


name = "kcwin2k3"
builder = "hvm"
memory = "1024"
disk = [ 'file:/opt/xen/kcwin2k3/disk1.img,hda,w', 'file:/opt/xen/kcwin2k3/disk2.img,hdb,w', 'file:/opt/xen/kcwin2k3/disk3.img,hdc,w','file:/iso/win2k3.iso,hdd:cdrom,r', ]
vif = [ 'type=ioemu, mac=00:16:3e:40:16:60, bridge=xenbr0', ]
uuid = "25a47c57-294d-0a5d-6a1e-cedb09570b33"
device_model = "/usr/lib/xen/bin/qemu-dm"
kernel = "/usr/lib/xen/boot/hvmloader"
vnc=1
vncunused=1
(首先要设定vncunused这条设定项为值1。意思是,让宿主使用未占用的端口为虚拟机分配VNC端口)
#vncdisplay=1
(就是这条是关键所在!设定vncdisplay是表示VNC分配号,不同的虚拟机若是要使用不同的VNC的话,那么这里的vncdisplay分配号必须要不同。如果不设定的话,那么系统将会自动分配好。由于之前我这里设定的分配号和CentOS4的分配号一样,因此共享了一个VNC通道分配,于是造成了先来先占的问题。这里我把这条注释掉。让系统给它随机分配。然后就解决了VNC冲突的问题。还有一点,记得更改虚拟机配置文件后要重新destroy-create虚拟机才能生效哦!)
vnclisten='0.0.0.0'
apic=0
acpi=0
pae=1
boot="c"
vcpus=1
serial = "pty" # enable serial console
on_reboot   = 'restart'
on_crash    = 'restart'
---------------------------------------------------- 


重新启动Windows2003的虚拟机
[root@KCXEN xen]# xm destroy kcwin2k3
[root@KCXEN xen]# xm create kcwin2k3 


再次察看宿主机端口
[root@KCXEN ~]# netstat -na|less
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             Sta
te      
tcp        0      0 0.0.0.0:994                 0.0.0.0:*                   LIS
TEN      
tcp        0      0 0.0.0.0:5900                0.0.0.0:*                   LIS
TEN               (VNC端口-kcentos4)  
tcp        0      0 0.0.0.0:5901                0.0.0.0:*                   LIS
TEN               (VNC端口-kcwin2k3)
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LIS
TEN      
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LIS
TEN      
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LIS 

于是发现宿主机动态为第二个虚拟机分配了VNC通道,用VNC客户端连,就能同时操作2个。


阅读(1016) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~