Eucalyputs配置虚拟机网络和启动虚拟机

 

Eucalyputs中启动实例不能通过外网访问的问题

问题描述:eucalyputs在启动虚拟机时是一个IP一对一的nat转换,一个外部IP对应一个内部IP,也就是说,一个虚拟机有一个内部ip和一个外部ip,但我们不能通过外面IP访问该虚拟机

 

通过eucalyputs启动一个实例

配置环境变量

EUCA_KEY_DIR=$(dirname $(readlink -f ${BASH_SOURCE}))

export S3_URL=http://10.51.3.94:8773/services/Walrus

export EC2_URL=http://10.51.3.94:8773/services/Eucalyptus

export EC2_PRIVATE_KEY=${EUCA_KEY_DIR}/euca2-admin-451ed732-pk.pem

export EC2_CERT=${EUCA_KEY_DIR}/euca2-admin-451ed732-cert.pem

export EC2_JVM_ARGS=-Djavax.net.ssl.trustStore=${EUCA_KEY_DIR}/jssecacerts

export EUCALYPTUS_CERT=${EUCA_KEY_DIR}/cloud-cert.pem

export EC2_ACCESS_KEY='WKy3rMzOWPouVOxK1p3Ar1C2uRBwa2FBXnCw'

export EC2_SECRET_KEY='GE7QJmvXY7wp28OFxo01dSRWge1iV5y4U7hA'

# This is a bogus value; Eucalyptus does not need this but client tools do.

export EC2_USER_ID='000100729354'

 

启动实例

euca-describe-images

euca-run-instances -k mykey -n <number of instances to start> <emi-id>

启动后 euca-describe-instances 查看启动实例

可以看到回返回两个IP  10.51.3.202 172.68.1.4 (如果返回IP都是0.0.0.0,说明启动没有成功,可以一次同时启动两个实例即 –n  2)前面一个是外部IP

为什么不能用外部IP访问进去

l          Eucalyputs配置虚拟机原理

Eucalyputs是用一个外部IP和一个内部IP进行nat转换,这样做的目的为了从外面不能了解内部网络结构,而且便于管理。

Eucalyputs 在启动时会用brctl工具创建一个网桥,名为eucabr10,利用这个网桥实现一个内网,并实现用DHCP分配IP

eucalyputs在启动一个实例时,用xml文件

<interface type="bridge">

         <source bridge="eucabr10" />

         <mac address="d0:0d:52:C5:09:3E" />

         <script path="/etc/xen/scripts/vif-bridge" />

    </interface>

将该实例接入到eucabr10这个网桥上,并给它分配一个内部IP地址,同时还创建一个interface添加一个外部IP,并将这两个IP一对一关联起来。

    但是,在实现这个一对一转换时通过iptable自带的nat转换的,而不是通过路由器,iptables不能将两个ip的所有端口一一对应起来,需要一个一个去配置,如:

 

iptables -t nat -A PREROUTING -p tcp -d 10.51.3.250 --dport 22 -j DNAT --to-destination 192.168.22.239:22

 

10.51.3.250192.168.22.23922端口对应起来,故外部IP无法连接进来。此方法有时可以配通,有时不行。

解决方案

在现实环境中,内部网络与外部网络肯定要通过路由器的,让路由器来做静态IP转换,将虚拟机xml文件改成<source bridge="xenbr0" />直接桥接到路由器注:也可以利用brctl来设置host上桥接方案,具体做法可以在安装brctl后查看帮助信息。

 

 

eucalyputs启动Amazon下载的虚拟机文件

Eucalyputs调用img启动虚拟机过程

1.          Eucalyputs在创建一个虚拟机前先要建立两个文件分区ephemeralswap

/* create swap partition */

      if (swap_size_mb>0) {

   sem_p (disk_sem);

   if ((e=vrun ("dd bs=1M count=%lld if=/dev/zero of=%s/swap 2>/dev/null", swap_size_mb, rundir_path)) != 0) {

     logprintfl (EUCAINFO, "creation of swap (dd) at %s/swap failed/n", rundir_path);

     sem_v (disk_sem);

     return e;

   }

   if ((e=vrun ("mkswap %s/swap >/dev/null", rundir_path)) != 0) {

     logprintfl (EUCAINFO, "initialization of swap (mkswap) at %s/swap failed/n", rundir_path);

     sem_v (disk_sem);

     return e;         

   }

   sem_v (disk_sem);

      }

 
  
/* create ephemeral partition */

      if (limit_mb>0) {

   sem_p (disk_sem);

   if ((e=vrun ("dd bs=1M count=%lld if=/dev/zero of=%s/ephemeral 2>/dev/null", limit_mb, rundir_path )) != 0) {

     logprintfl (EUCAINFO, "creation of ephemeral disk (dd) at %s/ephemeral failed/n", rundir_path);

     sem_v (disk_sem);

     return e;

   }

   if ((e=vrun ("mkfs.ext3 -F %s/ephemeral >/dev/null 2>&1", rundir_path)) != 0) {

     logprintfl (EUCAINFO, "initialization of ephemeral disk (mkfs.ext3) at %s/ephemeral failed/n", rundir_path);

     sem_v (disk_sem);

     return e;         

  这段代码的意思是先用dd命令创建swap文件,再格式化作为虚拟机的交换分区,即作为虚拟内存使用,大小为521M,然后用同样的方式创建一个ephemeral文件作为数据分区,大小为要启动img文件的两倍

 

2.          设置用来作为启动虚拟机配置信息的xml文件,该xml文件生成后内容如下:

<domain type="xen" id="18">

  <name>i-52C5093E</name>

- <os>

  <type>linux</type>

  <kernel>/usr/local/eucalyptus//admin/i-52C5093E/kernel</kernel>

  <initrd>/usr/local/eucalyptus//admin/i-52C5093E/ramdisk</initrd>

  <root>/dev/sda1</root>

  <cmdline>ro</cmdline>

  </os>

  <memory>524288</memory>

  <vcpu>1</vcpu>

- <devices>

- <disk type="file">

  <source file="/usr/local/eucalyptus//admin/i-52C5093E/root" />

  <target dev="sda1" />

  </disk>

- <disk type="file">

  <source file="/usr/local/eucalyptus//admin/i-52C5093E/ephemeral" />

  <target dev="sda2" />

  </disk>

- <disk type="file">

  <source file="/usr/local/eucalyptus//admin/i-52C5093E/swap" />

  <target dev="sda3" />

  </disk>

- <interface type="bridge">

  <source bridge="eucabr10" />

  <mac address="d0:0d:52:C5:09:3E" />

  <script path="/etc/xen/scripts/vif-bridge" />

  </interface>

  </devices>

  </domain>

 

虚拟机启动后遇到的问题

1.        没有密码,不能登录

解决吧办法:

(1) 用密钥登陆修改密码

(2) 在启动前,将从amazon下载的images

mount  –o  loop  images  /mnt/ 

vi  /mnt/etc/passwd

如下图

将第一行root:x:  root后的x去掉,保存

 

2.        ifconfig 命令,发现虚拟机没有获取到IP,用service  network  restart重启网卡,提示找不到2.6.27.21-0.1-xen这个内核中的文件

解决办法,启动eucalyputs 推荐的镜像文件中的虚拟机,找到/lib/modules/下,将2.6.27.21-0.1-xen复制出来,将从amazon下载的image 用上面修改密码的方式,将这个文件拷贝到/lib/modules/下,再从新启动就可以了。


 

调用APIxen启动从amazon下载的镜像文件的虚拟机

1.        xen中安装的虚拟机的镜像文件,调用API启动该虚拟机,API就不在这里描述了,主要讲配置该虚拟机的xml文件,内容如下:

<domain type='xen'>

<name>fc8</name>

<uuid>7f5deab6-2f67-24bb-057b-809ab9e26956</uuid>

<memory>524288</memory><currentMemory>524288</currentMemory>

<vcpu>1</vcpu>

<bootloader>/usr/bin/pygrub</bootloader>

<os>

<type arch='x86_64' machine='xenpv'>linux</type>

</os>

<clock offset='utc'/>

<on_poweroff>destroy</on_poweroff>

<on_reboot>restart</on_reboot>

<on_crash>restart</on_crash>

<devices>

<disk type='file' device='disk'>

<driver name='tap' type='aio'/>

<source file='/var/lib/xen/images/centos'/>

<target dev='xvda' bus='xen'/>

</disk>

<interface type='bridge'>

<mac address='00:16:36:0a:35:46'/>

<source bridge='xenbr0'/>

<script path='vif-bridge'/>

</interface>

<console type='pty'>

<target port='0'/>

</console>

</devices>

</domain>

 

 

 

2.        调用API ,用xen启动从amazon下载的虚拟机镜像文件定义的虚拟机

将从amazon中下载下来的镜像文件,用上面用eucalyputs启动的方法,先mount清除密码,并将内核拷到相应路径下。

启动虚拟机的xml文件内容如下

<domain type="xen" id="18">

  <name>i-52C5093E</name>

- <os>

  <type>linux</type>

  <kernel>/usr/local/eucalyptus//admin/i-52C5093E/kernel</kernel>

  <initrd>/usr/local/eucalyptus//admin/i-52C5093E/ramdisk</initrd>

  <root>/dev/sda1</root>

  <cmdline>ro</cmdline>

  </os>

  <memory>524288</memory>

  <vcpu>1</vcpu>

- <devices>

- <disk type="file">

  <source file="/usr/local/eucalyptus//admin/i-52C5093E/root" />

  <target dev="sda1" />

  </disk>

- <disk type="file">

  <source file="/usr/local/eucalyptus//admin/i-52C5093E/ephemeral" />

  <target dev="sda2" />

  </disk>

- <disk type="file">

  <source file="/usr/local/eucalyptus//admin/i-52C5093E/swap" />

  <target dev="sda3" />

  </disk>

- <interface type="bridge">

  <source bridge="xenbr10" />

  <mac address="d0:0d:52:C5:09:3E" />

  <script path="/etc/xen/scripts/vif-bridge" />

  </interface>

  </devices>

  </domain>

 

其中第五行和第六行的kernelramdisk是从eucalyputs启动的虚拟机实例所在的文件夹拷出来的,路径设在自己放置的路径

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐