Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3310447
  • 博文数量: 258
  • 博客积分: 9440
  • 博客等级: 少将
  • 技术积分: 6998
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-03 10:28
个人简介

-- linux爱好者,业余时间热衷于分析linux内核源码 -- 目前主要研究云计算和虚拟化相关的技术,主要包括libvirt/qemu,openstack,opennebula架构和源码分析。 -- 第五届云计算大会演讲嘉宾 微博:@Marshal-Liu

文章分类

全部博文(258)

文章存档

2016年(1)

2015年(4)

2014年(16)

2013年(22)

2012年(41)

2011年(59)

2010年(40)

2009年(75)

分类: 云计算

2012-12-20 11:03:42

  在iaas平台中,当用户创建一个虚拟机后,必须按照用户自定义的信息对虚拟机进行初始化,比如:主机名,用户名/密码,ip地址,mac地址等,另外,可能用户还想在虚拟机启动后,某些服务就已经被自动配置好了,比如ssh登录等。 所有这些对Virtual Machine的定制,在opennebula中是通过一个叫Context iso的文件来完成的。

1. context iso的原理和功能
  opennebula把所有的用户对Virtual Machine的定制化信息都做成一个iso文件,然后在Virtual Machine启动的时候,将此iso文件挂载到VM的光驱中,然后执行光驱中的相对应的脚本来完成对VM的定制,整个过程非常类似VMWare的vmware-tools。

2. context iso的生成过程
  opennebula生成context iso是由src/tm_mad/ssh/tm_context.sh 脚本来实现的,下面详细分析此脚本的内容。

  1. #!/bin/bash

  2. # -------------------------------------------------------------------------- #
  3. # Copyright 2002-2012, OpenNebula Project Leads (OpenNebula.org) #
  4. # #
  5. # Licensed under the Apache License, Version 2.0 (the "License"); you may #
  6. # not use this file except in compliance with the License. You may obtain #
  7. # a copy of the License at #
  8. # #
  9. # http://www.apache.org/licenses/LICENSE-2.0 #
  10. # #
  11. # Unless required by applicable law or agreed to in writing, software #
  12. # distributed under the License is distributed on an "AS IS" BASIS, #
  13. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
  14. # See the License for the specific language governing permissions and #
  15. # limitations under the License. #
  16. #--------------------------------------------------------------------------- #

  17. while (( "$#" )); do
  18.     if [ "$#" == "1" ]; then
  19.         DST=$1
  20.     else
  21.         SRC="$SRC $1"
  22.     fi
  23.     shift
  24. done


  25. if [ -z "${ONE_LOCATION}" ]; then
  26.     TMCOMMON=/usr/lib/one/mads/tm_common.sh
  27. else
  28.     TMCOMMON=$ONE_LOCATION/lib/mads/tm_common.sh
  29. fi

  30. . $TMCOMMON


  31. DST_PATH=`arg_path $DST`
  32. DST_DIR=`dirname $DST_PATH`
  33. DST_FILE=`basename $DST_PATH`
  34. DST_HASH=`echo -n $DST | $MD5SUM | $AWK '{print $1}'`
  35. if [ -z "$ONE_LOCATION" ]; then
  36.        TMP_DIR="/var/lib/one/$DST_HASH"
  37. else
  38.        TMP_DIR="$ONE_LOCATION/var/$DST_HASH"
  39. fi
  40. ISO_DIR="$TMP_DIR/isofiles"

  41. //前面都是一些脚本的include和变量的定义,不去详细分析

 //创建context iso目录,制作iso所需的所有脚本,都要事先拷贝到此目录下,注意此处使用了MD5SUM,用来保证每个vm的iso文件目录的唯一性,可以学习此方法
  1. exec_and_log "mkdir -p $ISO_DIR" \       
  2.     "Error creating directory $ISO_DIR"   

  3. //对于输入目录下的所有文件,执行根据文件的前缀(即传输协议),采用wget或者cp来获得文件,我们这里以cp为例,就是拷贝所需的所有文件到$ISO_DIR目录下
  4. for f in $SRC; do
  5.     case $f in
  6.     http://*)
  7.         exec_and_log "$WGET -P $ISO_DIR $f" \
  8.             "Error downloading $f"
  9.         ;;

  10.     *)
  11.         exec_and_log "cp -R $f $ISO_DIR" \
  12.             "Error copying $f to $ISO_DIR"
  13.         ;;
  14.     esac
  15. done
  //将ISO_DIR目录制作成iso格式的文件$TMP_DIR/$DST_FILE
  1. exec_and_log "$MKISOFS -o $TMP_DIR/$DST_FILE -J -R $ISO_DIR" \
  2.  "Error creating iso fs"
  3. //将生成的ISO文件通过scp拷贝到目标主机,一旦拷贝完成,vm就可挂载iso光驱,执行脚本了
  4. exec_and_log "$SCP $TMP_DIR/$DST_FILE $DST" \
  5.     "Error copying $TMP_DIR/$DST_FILE to $DST"
  6. exec_and_log "rm -rf $TMP_DIR" \
  7.     "Error deleting $TMP_DIR"

3. opennebula生成的vm的配置文件中对context iso的描述

在prolog_action函数中,会根据vm的disk的数据,将context iso自动的分配到disk.num上,下面这段代码的意思是: opennebula core构造命令: xfr << "CONTEXT " << vm->get_context_file() << " "; 和
  1.  xfr << vm->get_hostname() << ":" << vm->get_remote_dir()
  2.             << "/disk." << num << endl;
  3. 前者的意思是,将CONTEXT命令用来作用哪些文件,即用哪些文件来生成iso,
  4. 后者的意思是,将生成iso拷贝到远程目录下的disk.num
  1. // ------------------------------------------------------------------------
  2.     // Generate context file (There are 0...num-1 disks, constext is disk.num)
  3.     // ------------------------------------------------------------------------

  4.     context_result = vm->generate_context(files);

  5.     if ( context_result == -1 )
  6.     {
  7.         goto error_context;
  8.     }

  9.     if ( context_result )
  10.     {
  11.         xfr << "CONTEXT " << vm->get_context_file() << " ";

  12.         if (!files.empty())
  13.         {
  14.             xfr << files << " ";
  15.         }

  16.         xfr << vm->get_hostname() << ":" << vm->get_remote_dir()
  17.             << "/disk." << num << endl;
  18.     }




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

mcumsigscr2013-12-25 17:31:39

如果是windows的镜像是不是会有所不同?