opennebula context iso 的生成过程及其主要功能

在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. #notuse this fileexceptincompliance 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 laworagreed toinwriting,software #
  12. # distributed under the Licenseisdistributed on an"AS IS"BASIS,#
  13. # WITHOUT WARRANTIESORCONDITIONS OF ANY KIND,either expressorimplied.#
  14. # See the Licenseforthe specific language governing permissionsand#
  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. forfin$SRC; do
  5. case $fin
  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,constextisdisk.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. }

你可能感兴趣的:(context)