OpenStack虚拟机镜像修改

Posted by fishcried on July 14, 2014

1. 如何修改镜像

定制镜像的更好的方式是找到一个适合的镜像,下载后在其基础上进行修改定制。而不是从头到位自己去鼓捣.简单可复用,linux哲学。

大概步骤:

  1. 使用下载的镜像启动虚拟机
  2. 登录虚拟机,进行个性化定制
  3. 关机
  4. 到虚拟机的compute物理机找到虚拟机磁盘,进行格式转换,即可得到需要的镜像
    1. 转换命令 ‘qemu-img convert -c disk -O qcow2 disk.img’
    2. 之所以进行转换,是因为OpenStack虚拟的磁盘虽然为qcow2格式,但是多了一个bak段,转换后即可去除
    3. 虚拟目录/var/lib/nova/instances/xxxx/

2. 脚本实现

这个过程是否需要脚本化,脚本到什么程度?

云计算中提供的镜像肯定是多样的,客户对镜像的要求也是多样的。这以为这镜像制作频繁,如果有脚本实现,那么肯定对生产有所提高,所以进行脚本实现是值得的。

以上步骤中,前两步是个性化定制,对每个个性化实现都需要收集与积累,然后形成具体的个性化项目脚本。第4步是一个非常统一的操作。所以暂时只对第4布进行脚本话。需要登录到compute机执行。

#!/bin/bash
#
# The MIT License (MIT)
# Copyright (c) 2014 fishcried(tianqing.w@gmail.com)
#

usage()
{
	echo "$PRONAME  -i <instance_id>"
}

PRONAME=$(basename $0)

if [ $# -lt 1 ];then
	usage
	exit 1
fi

while getopts "i:" arg
do
	case $arg in
		i)
			instance=$OPTARG
			;;
		*)
			usage
			exit 1
			;;
	esac
done

INSTANCES_PATH="/var/lib/nova/instances"
if [ ! -e "$INSTANCES_PATH/$instance" ];then
	echo "$instance not exists, please confirm the instance id"
	exit 3
fi

if `virsh list --uuid | grep $instance 2>&1 >/dev/null`; then
	echo "$instance is Running, please shutdown id"
	exit 4
fi

predir=`pwd`
cd $INSTANCES_PATH/$instance
cp disk disk.bak
echo "Converting ..."
qemu-img convert -c disk.bak -O qcow2 disk.img
rm disk.bak
mv -f disk.img $predir/disk.img
8echo "Finish, image file is disk.img"

3. 脚本使用

脚本需要在compute结点上执行。例如定制镜像的虚机id为44b96ca3-f70d-4196-b210-9e6522150ff0

root@ncloud-compute-14:./mkimage.sh -i 44b96ca3-f70d-4196-b210-9e6522150ff0
Converting ...
Finish, image file is disk.img

4. 注意问题

真正的坑在这里 , 每一个坑都会导致虚拟机创建

  1. 制作镜像时,虚拟机需要关机
  2. 转换格式的时候需加-c选项,否则镜像会非常大
  3. 格式转换, 为了取出bak段,否则使用该镜像虚拟无法启动
  4. 上传镜像的时候注意指定磁盘与ram的界值。不然创建虚拟的flavor过小,会导致失败

5. 一点理解

  1. 镜像其实就是文件系统
  2. 有了cloud-init等注入机制,镜像才成了模板,具有可定制的灵活性

6. TODO

脚本实现只是实现了一部分。总是感觉不够。以后想大概实现成这个样子。

输入: 源镜像 个性化定制菜单选项 输出: 修改后的镜像

中间自动使用元镜像创建虚拟,使用定制菜单进行定制,然后到物理机拷贝镜像,格式转换等。

简单到傻瓜,是一种追求。

修改记录

Why Who When
create fishcired 2014-06-24
完善内容 fishcried 2014-08-06