一、制作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 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 因篇幅问题不能全部显示,请点此查看更多更全内容