首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

OpenStack之镜像制作

2023-05-10 来源:华拓网
OpenStack之镜像制作

一、制作linux kvm debian6镜像

1 参照以前文档搭建一台可以安装kvm虚拟机的机器 http://my.oschina.net/guol/blog/62239 2 建立镜像

kvm-img create -f raw server.img 5G

3 导入安装ISO

采用debian6作为模版

4 安装kvm虚拟机

kvm -m 2048 -drive file=server.img -cdrom debian-6.0.2.1-amd64-CD-1.iso -vnc 10.1.6.89:1 -boot d

5 安装虚拟机

利用VNC安装虚拟机,把kvm虚拟机安装进创建的镜像里面,全部给/分区,不划分swap

6 启动kvm虚拟机

kvm -m 2048 -drive file=server.img -cdrom debian-6.0.2.1-amd64-CD-1.iso -vnc 10.1.6.89:1 -boot c

7 VNC连接虚拟机

利用VNC进入虚拟机,配置eth0网卡,设置为dhcp获取ip,清空/etc/udev/rules.d/70-persistent-net.rules内容,设置内网DNS

8 设置ext4文件系统

因为openstack需要ext4格式的文件系统,所以把刚才raw格式的server.img镜像转化为ext4格式

挂载镜像

losetup -f server.img losetup -a

fdisk -c -u -l /dev/loop0

卸载镜像,从偏移量1048576重新挂载 losetup -d /dev/loop0

losetup -f -o 1048576 server.img losetup -a

生成新的镜像,将/dev/loop0镜像copy到一个镜像中,然后卸载旧的镜像 dd if=/dev/loop0 of=debian6.img losetup -d /dev/loop0

挂载新生成的镜像,进行修改fstab文件 mount -o loop debian6.img /livecd

修改root分区挂载格式如下 vi /livecd/etc/fstab

LABEL=uec-rootfs / ext4 defaults 0 0

从/livecd/boot里面copy initrd和vmlinuz文件 cp initrd.img-2.6.32-5-amd64 /mnt cp vmlinuz-2.6.32-5-amd64 /mnt

卸载镜像,修改文件系统标志 umount /livecd

tune2fs -L uec-rootfs debian6.img

9 在openstack中登记新镜像 #下面的命令会返回一个ID

glance add name=\"debian6 initrd\" disk_format=qcow2 container_format=ovf is_public=true < initrd.img-2.6.32-5-amd64

#下面的命令会返回一个ID

glance add name=\"debian6 vmlinuz\" disk_format=qcow2 container_format=ovf is_public=true < vmlinuz-2.6.32-5-amd64

#使用上面两个ID上传主镜像

glance add name=\"debian6 OS\" disk_format=qcow2 container_format=ovf is_public=true ramdisk_id=\"429d4f95-14ec-4748-81e0-52fd57ce9fd1\" kernel_id=\"c9ba5e5d-d903-4127-9b56-dfbbe8a8ceac\" < debian6.img

制作的镜像经过多次测试,均可以正常使用。

二、使用qmeu-img管理虚拟机磁盘镜像

功能:

创建虚拟机,虚拟机快照

一台虚拟机的核心就是一个磁盘镜像,这个镜像可以理解成虚拟机的磁盘,里面有虚拟机的操作系统和驱动等重要文件。本文主要介绍创建虚拟机的一般过程。

创建虚拟机镜像

要在一台host上跑起一个虚拟机一般需要两个步骤: 第一步:创建虚拟机镜像

qemu-img create -f raw /images/vm1.raw 8G

qmeu-img创建的镜像是一个稀疏文件,也就是说刚创建出来的文件并没有8G,它会随着数据的增多慢慢增加,直到8G

第二步:启动虚拟机 kvm /imges/vm1.raw

运行结果: 因为镜像里面没有任何内容,所以提示找不到可引导设备。

使用qemu-img管理镜像 qemu-img基本命令

上节介绍了使用qemu-img创建镜像,这一节将会介绍qemu-img在镜像管理上的强大功能。

qemu-img有很多命令,包括下面常用的,当然qemu-img -h你懂得。 info

查看镜像的信息 create 创建镜像 check 检查镜像 convert

转化镜像的格式,(raw,qcow ……) snapshot

管理镜像的快照 rebase

在已有的镜像的基础上创建新的镜像 resize

增加或减小镜像大小 创建镜像

qemu-img create -f -o 举例:

qemu-img create -f raw -o size=4G /images/vm2.raw

hzgatt@hzgatt:~/images$ ll

total 0-rw-r--r-- 1 hzgatt hzgatt 4.0G 6月 29 14:11 vm2.raw hzgatt@hzgatt:~/images$ ll -s

total 00 -rw-r--r-- 1 hzgatt hzgatt 4.0G 6月 29 14:11 vm2.raw

hzgatt@hzgatt:~/images$ qemu-img info vm2.raw image: vm2.raw file format: raw

virtual size: 4.0G (4294967296 bytes) disk size: 0

虽然ls中看到文件的大小是4G,但是实际上磁盘大小是0。这就是稀疏文件 转化

将一个镜像文件转化为另外一种格式,qemu-img支持的格式可以看qemu-img -h最后一行。

Supported formats: vvfat vpc vmdk vdi sheepdog rbd raw host_cdrom host_floppy host_device file qed qcow2 qcow parallels nbd dmg tftp ftps ftp https http cow cloop bochs blkverify blkdebug

转化命令:

qemu-img convert -c -f fmt -O out_fmt -o options fname out_fname

-c:采用压缩,只有qcow和qcow2才支持

-f:源镜像的格式,它会自动检测,所以省略之 -O 目标镜像的格式 -o 其他选先 fname:源文件

out_fname:转化后的文件 看例子:

hzgatt@hzgatt:~/images$ qemu-img convert -c -O qcow2 vm2.raw vm2.qcow2

hzgatt@hzgatt:~/images$ ll -s total 136K

0 -rw-r--r-- 1 hzgatt hzgatt 5.0G 6月 29 13:55 vm1.raw 136K -rw-r--r-- 1 hzgatt hzgatt 193K 6月 29 14:22 vm2.qcow2 0 -rw-r--r-- 1 hzgatt hzgatt 4.0G 6月 29 14:11 vm2.raw hzgatt@hzgatt:~/images$ qemu-img info vm2.qcow2 image: vm2.qcow2 file format: qcow2

virtual size: 4.0G (4294967296 bytes) disk size: 136K cluster_size: 65536

如果想看要转化的格式支持的-o选项有哪些,可以在命令末尾加上 -o ? hzgatt@hzgatt:~/images$ qemu-img convert -c -O qcow2 vm2.raw vm2.qcow2 -o ? Supported options:

size Virtual disk size

backing_file File name of a base image

backing_fmt Image format of the base image encryption Encrypt the image cluster_size qcow2 cluster size

preallocation Preallocation mode (allowed values: off, metadata)

增加减少镜像大小

注意:只有raw格式的镜像才可以改变大小

hzgatt@hzgatt:~/images$ qemu-img resize vm2.raw +2GB

hzgatt@hzgatt:~/images$ ll -s total 136K

0 -rw-r--r-- 1 hzgatt hzgatt 5.0G 6月 29 13:55 vm1.raw 136K -rw-r--r-- 1 hzgatt hzgatt 193K 6月 29 14:22 vm2.qcow2 0 -rw-r--r-- 1 hzgatt hzgatt 6.0G 6月 29 14:28 vm2.raw hzgatt@hzgatt:~/images$ qemu-img info vm2.raw image: vm2.raw file format: raw

virtual size: 6.0G (6442450944 bytes) disk size: 0 快照

查看快照

qemu-img snapshot -l /images/vm2.qcow2 注意:只有qcow2才支持快照 打快照

qemu-img snapshot -c booting vm2.qcow2

举例:

hzgatt@hzgatt:~/images$ qemu-img snapshot -c booting vm2.qcow2 hzgatt@hzgatt:~/images$ qemu-img snapshot -l vm2.qcow2 Snapshot list:

ID TAG VM SIZE DATE VM CLOCK

1 booting 0 2012-06-29 14:35:04 00:00:00.000

从快照恢复:

qemu-img snapshot -a 1 /images/vm2.qcow2

然后从kvm启动这个虚拟机,会发现虚拟机又在打快照时的状态了

删除快照:

qemu-img snapshot -d 2 /images/vm2.qcow

使用派生镜像(qcow2)

当创建的虚拟机越来越多,并且你发现好多虚拟机都是同一个操作系统,它们的区别就是安装的软件不大一样,那么你肯定会希望把他们公共的部分提取出来,只保存那些与公共部分不同的东西,这样镜像大小下去了,空间变多了,管理也方便了。派生镜像就是用来干这事的! 首先看一个原始镜像

hzgatt@hzgatt:~/images$ qemu-img info vm3_base.raw image: vm3_base.raw file format: raw

virtual size: 2.0G (2147483648 bytes) disk size: 2.0G

现在我们新建一个镜像,但是派生自它

hzgatt@hzgatt:~/images$ qemu-img create -f qcow2 vm3_5.qcow2 -o backing_file=vm3_base.raw 5G Formatting 'vm3_5.qcow2', fmt=qcow2 size=5368709120 backing_file='vm3_base.raw' encryption=off cluster_size=65536

hzgatt@hzgatt:~/images$ ll-rw-r--r-- 1 hzgatt hzgatt 193K 6月 29 15:00 vm3_5.qcow2

-rw-r--r-- 1 hzgatt hzgatt 2.0G 6月 29 14:51 vm3_base.raw

hzgatt@hzgatt:~/images$ qemu-img info vm3_5.qcow2 image: vm3_5.qcow2 file format: qcow2

virtual size: 5.0G (5368709120 bytes) disk size: 136K cluster_size: 65536

backing file: vm3_base.raw (actual path: vm3_base.raw)

这个镜像才136K,够省了吧。DRY永远的真理啊!

现在我们在vm3_5.qcow2上打了很多安全补丁,然后发现我又想在vm3_5.qcow2上派生新的虚拟机,o(∩∩)o...哈哈,这下怎么办呢?

hzgatt@hzgatt:~/images$ qemu-img convert -O raw vm3_5.qcow2 vm3_base2.raw

hzgatt@hzgatt:~/images$ qemu-img info vm3_base2.raw image: vm3_base2.raw file format: raw

virtual size: 5.0G (5368709120 bytes) disk size: 592M

这个转化将会将vm3_5和base合并,生成新的vm3_base2.raw,然后你就可以继续无穷无尽的派生之旅了!

三、通过qemu-kvm创建唯一SID的windows 2003 镜像

在Openstack中使用windows 2003镜像创建实例的时候,会出现SID相同的情况,SID相同会导致网络以及安全的问题,为了防止该情况的发生,创建镜像的时候需要对Windows 2003进行封装,本文对该过程做一个详细的描述

创建img文件

首先 创建一个img文件

1. qemu-img create -f qcow2 windows32.img 10G

制作镜像 安装系统

接下来的操作需要virtio-win-1.1.16.vfd和virtio-win-0.1-74.iso两个文件 文件(http://www.linux-kvm.org/page/WindowsGuestDrivers/Download_Drivers),执行下面的命令

1. /usr/libexec/qemu-kvm -m 1024 -cdrom cn_win_srv_2003_r2_enterprise_wit

h_sp2_vl_cd1.iso -drive file=windows32.img,if=virtio,boot=on -fda virtio-win-1.1.16.vfd -boot order=d,menu=on -usbdevice tablet -nographic -vnc 192.168.40.148:3

之后迅速用vncviewer 接入查看,按F12 ,跳到菜单选项,否则会自动进入硬盘启动模式,如果不慎进入,请kill掉kvm进程,再重启kvm尝试迅速按F12,选择 2 (光盘启动)

出现以下界面时 快速按下 F6

如果出现以下情况 请按F3重新启动

F3重启, 迅速按F12, 选择从光盘启动,提示下面提示按F6时 按F6 这回按 s ,接下来的页面中,由于是32位的系统,

选择第二个,回车后,页面效果如下

一路回车后可以看到以下界面

按 F8 (或是Shift+F8), 进入分区

格式化为fat32,不知道ntfs行不行,这里用的是fat ,不是ntfs!按c创建磁盘

按回车开始安装,

格式化后,系统安装完成后会重启,按F12, 选择Virtio disk PCI:0:4选项 ,从硬盘启动,安装2003,

如果安装过程中出现下面的界面,则可能是映像文件之前安装过系统,F3退出

安装成功后,登陆系统 打开远程桌面

关闭虚拟机

重启虚拟机镜像,加载virtio驱动,安装网卡驱动,执行以下命令

1. /usr/libexec/qemu-kvm -m 1024 -drive file=windows32.img -cdrom virtio-win

-0.1-81.iso -netnic,model=virtio -net user -boot order=c -usbdevice tablet -nographic -vnc :1

从光盘安装驱动,可以装上。

安装完virtio 驱动之后,关机,第二块光盘上有一些应用工具,可以选择性的安装第二张光盘,

1. /usr/libexec/qemu-kvm -m 1024 -drive file=windows32.img -cdromcn_win_s

rv_2003_r2_enterprise_with_sp2_vl_cd2.iso -net nic,model=virtio -netuser -boot order=c -usbdevice tablet -nographic -vnc :3

进入系统界面后,先后选择光盘中的“安装 windows server 2003”以及“执行其他任务-》安装管理工具”

封装系统

在虚拟机的环境下克隆windows系统,会出现sid相同...sid相同的系统之间互相访问,比如加域这种..会有问题,所有需要把系统封装,生成新的sid,在windows server 2003中可以使用“whoami /user“可以查看系统的SID (1)关闭系统,重新挂载系统安装盘cd1

1. /usr/libexec/qemu-kvm -m 1024 -drive file=windows32.img -cdromcn_win_s

rv_2003_r2_enterprise_with_sp2_vl_cd1.iso -net nic,model=virtio -netuser -b

oot order=c -usbdevice tablet -nographic -vnc :3

(2)启动完系统后,到光盘中support/tools目录下的deploy.cab文件夹 (3)提取该文件夹下的所有文件到c:\\sysgrep目录下 (4)创建应答文件

封装好的系统,首次启动会有对话框要求用户提供必要设定信息,如:主机名、区域语言设定等;对于批量部署虚拟机每台都手动输入肯定不方便,为此,微软提供自动应答文件,以便封装好的系统首次启动不需要用户手动输入信息,具体设定步骤如下:

执行setupmgr.exe,创建应答文件

接下来的配置包括一些系统配置,例如语言,时间,秘钥,自动生成计算机名等。

之后的步骤,根据实际需求输入即可.

结束向导,会在sysprep目录下生成一个叫sysprep.inf的应答文件,如下图:

(5) 到c:\\sysgrep目录下,运行其中的sysprep.exe,在跳出的警示中点“确定”

(6)在弹出项的警示窗口中点“确定”开始封装,大概15秒封装准备完成后,系统自动关闭

上传镜像到openstack

创建完镜像后,可以将该镜像上传到openstack中

1. glance add name=\"win2003\" is_public=truecontainer_format=ovf disk_forma

t=qcow2< windows_2003.img

使用该镜像创建两个实例,第一次启动的时间可能有点长,通过“whoami/user”命令来查看SID 虚拟机1

虚拟机2

安装过程中出现的问题

简单解决VNC Viewer 连接闪退

到Option-->Advanced-->Expert找到ColourLevel,默认值是pal8,修改为rgb222或full。重新连接,没有问题了。

说明:rgb111--8 colours,rgb222--64 colours,pal8 -- 256colours,full -- full colours

封装window2008系统

”运行“-\"sysprep\",选择以下选项

创建windows2008镜像出现的找不到安装磁盘的问题

安装的时候选择高级安装,加载磁盘驱动即可。找到硬盘后安装系统。

四、Openstack kvm win7镜像制作

Openstack不但能管理linux虚拟机还能管理windows虚拟机,之前做过基于kvm的debian6镜像,今天实战一下win镜像的制作,以win7为例。 母系统环境:ubuntu12.10 server + kvm

下载virtio驱动,因为win默认不支持virtio驱动,而通过openstack管理虚拟机是需要virtio驱动的。需要两个virtio驱动,一个是硬盘的,一个是网卡的,即:

virtio-win-0.1-30.iso和virtio-win-1.1.16.vfd

1 wget 'http://autosetup1.googlecode.com/files/virtio-win-1.1.16.vfd'

2 wget 'http://alt.fedoraproject.org/pub/alt/virtio-win/latest/images/bin/virtio-win-0.1-30.iso'

下载一个win7的镜像, 默认的名字太长了,修改短一点

1 mv cn_windows_7_professional_vl_build_x86_dvd_x15-71025.iso win7.iso

创建一个win7的镜像,raw格式,大小7G 1 kvm-img create -f raw win7.img 7G

启动基于win7的kvm虚拟机,映射驱动vfd到软盘A

kvm -m 1024 -cdrom win7.iso -drive file=win7.img,if=virtio,boot=on -fda virtio-win-1.1.16.vfd -boot d -nographic -vnc 10.1.6.228:8

用vnc安装win7,因为默认没有virtio驱动,所以识别不了硬盘,需要手动选择,整个过程如下: 选择键盘

选择驱动

坐等安装

设置开启远程桌面

查看网卡驱动类型

先关机!!!再次启动虚拟机,使用以下命令:

kvm -m 1024 -drive file=win7.img,if=virtio,boot=on -cdrom virtio-win-0.1-30.iso -net nic,model=virtio -net user -boot c -nographic -vnc 10.1.6.228:8

修改网卡驱动类型

可以看到网卡驱动类型已经更换掉,再次关机!!! 上传win7镜像 ?

1 glance add name=\"windows7\" is_public=true container_format=ovf disk_format=qcow2 < win7.img

设置安全策略,因为要通过远程桌面连接win7,所以要放开3389端口

启动一个名为win7的虚拟机,第一次启动比较慢,因为要把win7镜像从镜像服务器传送到计算节点上。

通过dashboard的vnc登录

发现一个杯具的事情,那就是dhcp分配的IP并没有生效,那我们就手动配置一下

通过本机自带的mstsc登录win7虚拟机:10.1.200.4

因篇幅问题不能全部显示,请点此查看更多更全内容