kvm研究和实践

  • 2020 年 1 月 23 日
  • 笔记

虚拟化实现原理和架构

KVM 管理工具

qemu-kvm 该软件包主要包含KVM内核模块和基于KVM重构后的QEMU模拟器。KVM模块作为整个虚拟化环境的核心工作在系统空间,负责CPU和内存的调度。QEMU作为模拟器工作在用户空间,负责虚拟机I/O模拟。 依赖包qemu-img 主要用来QEMU磁盘镜像的管理,如新建一块磁盘镜像给虚拟机。

libvirt 提供Hypervisor和虚拟机管理的API。 依赖包libvirt-client KVM客户端命令行管理工具virsh,负责虚拟机的启动、停止和管理等。 依赖包libvirt-daemon libvirtd守护进程,作为客户端管理工具跟Hypervisor和虚拟机之间的桥梁。 依赖包libvirt-daemon-driver-xxx 从名字来看属于libvirtd服务的驱动文件,作为libvirtd服务跟Hypervisor不同对象(如qemu模拟器,网络,存储等)间的接口。 依赖包bridge-utils 网桥管理工具包,负责桥接网络的创建、配置和管理等工作。

virt-install 创建和克隆虚拟机的命令行工具包。

virt-manager 图形界面的KVM管理工具。

1 安装配置kvm

1.1 ESXI 开启虚拟机支持硬件虚拟化 (二次虚拟化)

开启ESXI SSH

SSH登录进去进入虚拟机目录

打开DS-OPS-99-23.vmx 文件,在末尾追加如下字段,保存退出。

vhv.allow = “TRUE”

vi DS-OPS-99-23.vmx

重启 VMware ESXi 后编辑虚拟机选项(需要先关闭虚拟机),打开 编辑虚拟机配置 对话框,在 options 页面的 常规选项 选项里把 Guest Operating System 的类型换成 Other 里面的 VMware ESxi 5.x,

重启虚拟机

1.2 centos kvm安装配置

检查的kvm_intel模块是否打开了嵌套虚拟机功能(默认是开启的):

grep -E 'svm|vmx' /proc/cpuinfo

lsmod | grep kvm

yum 安装kvm

yum install kvm python-virtinst libvirt libvirt-python virt-manager

yum install virt-viewer libguestfs-tools

virsh list #查看虚拟机列表 用来检查kvm是否正常安装

virsh -c qemu:///system list #查看虚拟机列表 检查kvm是否正常安装

设置管理br0

新建ifcfg-br0 #管理网卡:

vi /etc/sysconfig/network-scripts/ifcfg-br0

DEVICE=br0

BOOTPROTO=static

BROADCAST=172.20.255.255

IPADDR=172.20.20.200

NETMASK=255.255.255.0

GATEWAY=172.20.20.254

ONBOOT=yes

TYPE=Bridge #新增:(将br0的类型指定为bridge模式)

然后修改相应网卡的配置文件em1:

vi /etc/sysconfig/network-scripts/ifcfg-em1

DEVICE=em1

BOOTPROTO=static

ONBOOT=yes

BRIDGE=br0

配置业务br1

新建ifcfg-br1 #管理网卡:不设IP,上层交换机 trunk模式

vi /etc/sysconfig/network-scripts/ifcfg-br1

DEVICE=br1

BOOTPROTO=static

ONBOOT=yes

TYPE=Bridge #新增:(将br1的类型指定为bridge模式)

然后修改相应网卡的配置文件em2:

vi /etc/sysconfig/network-scripts/ifcfg-em2

DEVICE=em2

BOOTPROTO=static

ONBOOT=yes

BRIDGE=br1

1.3 kvm网桥配置

二层业务网卡配置em1 trunk

interface GigabitEthernet1/0/22

port link-type trunk

port trunk permit vlan all

kvm-server vlan 加载模块

modprobe 8021q

lsmod | grep 8021q

vi /etc/sysconfig/modules/ 8021q.modules

#! /bin/sh

/sbin/modinfo -F filename 8021q > /dev/null 2>&1

if [ $? -eq 0 ]; then

/sbin/modprobe 8021q

fi

chmod 755 /etc/sysconfig/modules/ 8021q.modules

kvm-server vlan 配置

yum install vconfig

vconfig 添加网卡vlan

# vconfig add em2 20

Added VLAN with VID == 20 to IF -:em2:-

# vconfig set_flag em2.20 1 1

Set flag on device -:em2.20:- Should be visible in /proc/net/vlan/em2.20

# vconfig add em2 99

# vconfig set_flag em2.99 1 1

加载在开机启动

echo “vconfig add em2 20”>>/etc/rc.d/rc.local

echo “vconfig add em2 99”>>/etc/rc.d/rc.local

#cat /proc/net/vlan/em2.20

#cat /proc/net/vlan/em2.99

网卡配置

vi ifcfg-em2.20

DEVICE="em2.20"

BRIDGE=br20

BOOTPROTO=static

ONBOOT="yes"

vi ifcfg-br20

DEVICE=br20

TYPE=Bridge

BOOTPROTO=static

ONBOOT=yes

brctl addbr br20

ifconfig em2.20 up

brctl addif br20 em2.20

vi ifcfg-em2.99

DEVICE="em2.99"

BRIDGE=br99

BOOTPROTO=static

BOOTPROTO=static

ONBOOT="yes"

vi ifcfg-br99

DEVICE=br99

TYPE=Bridge

BOOTPROTO=static

ONBOOT=yes

brctl addbr br99

ifconfig em2.99 up

brctl addif br99 em2.99

然后重启网络:

/etc/init.d/network restart 或service network restart

kvm-server vlan 变更

把虚拟机从vlan20变更到vlan 99

先从br20删除vnet0

brctl delif br20 vnet0

再添加vnet0添加br99

brctl addif br99 vnet0

root@localhost qemu]# brctl show

然后重启网络:

/etc/init.d/network restart 或service network restart

实验中在br0中加入gateway后,/etc/sysconfig/network中的gateway就消失了。成功后,利用route -n查看路由,发现所有的包都从br0走了。

[root@localhost network-scripts]# route -n | grep br*

[root@localhost network-scripts]# brctl show | grep br*

1.4 kvm常用路径

虚拟机img文件存放路径:/var/lib/libvirt/ images

[root@localhost images]# ll -sh /var/lib/libvirt/images

总用量 41G

21G -rw——- 1 qemu qemu 20G 5月 27 06:27 lvsi.img

21G -rw——- 1 root root 20G 5月 27 06:06 lvsi-test.img

虚拟机配置文件xml存放路径:/etc/libvirt/qemu/

[root@localhost qemu]# ll -sh /etc/libvirt/qemu

总用量 16

-rw——- 1 root root 2725 5月 27 05:38 lvsi-1.xml

-rw——- 1 root root 3089 5月 27 05:49 lvsi-test.xml

-rw——- 1 root root 3076 5月 27 05:13 lvsi.xml

drwx—— 3 root root 4096 5月 27 05:10 networks

2. virsh和virt-manager管理kvm

2.1 virsh工具简介

能够管理KVM的工具很多。首先是单个资源的基础虚拟化管理,有开源的虚拟化工具集libvirt,通过命令行接口提供安全的远程管理,可管理单个系统。

Virsh是由一个名叫libvirt的软件提供的管理工具,提供管理虚拟机比较高级的能力。Virsh可以管理KVM以及xen等虚拟机。

下面是virsh的一些常见的命令行选项:

命令

Description

help

打印基本帮助信息。

list

列出所有客户端。

dumpxml

输出客户端 XML 配置文件。

create

从 XML 配置文件生成客户端并启动新客户端。

start

启动未激活的客户端。

destroy

强制客户端停止。

define

为客户端输出 XML 配置文件。

domid

显示客户端 ID。

domuuid

显示客户端 UUID。

dominfo

显示客户端信息。

domname

显示客户端名称。

domstate

显示客户端状态。

quit

退出这个互动终端。

reboot

重新启动客户端。

restore

恢复以前保存在文件中的客户端。

resume

恢复暂停的客户端。

save

将客户端当前状态保存到某个文件中。

shutdown

关闭某个域。

suspend

暂停客户端。

undefine

删除与客户端关联的所有文件。

migrate

将客户端迁移到另一台主机中。

命令

Description

setmem

为客户端设定分配的内存。

setmaxmem

为管理程序设定内存上限。

setvcpus

修改为客户端分配的虚拟 CPU 数目。

vcpuinfo

显示客户端的虚拟 CPU 信息。

vcpupin

控制客户端的虚拟 CPU 亲和性。

domblkstat

显示正在运行的客户端的块设备统计。

domifstat

显示正在运行的客户端的网络接口统计。

attach-device

使用 XML 文件中的设备定义在客户端中添加设备。

attach-disk

在客户端中附加新磁盘设备。

attach-interface

在客户端中附加新网络接口。

detach-device

从客户端中分离设备,使用同样的 XML 描述作为命令attach-device。

detach-disk

从客户端中分离磁盘设备。

detach-interface

从客户端中分离网络接口。

2.2 virsh管理kvm

2.2.1 网络部署虚拟主机

virt-install

–network bridge:br0

–name vm1

–ram=1024

–vcpus=1

–disk path=/vm-images/vm1.img,size=10

–graphics none

–location=http://my.server.com/pub/rhel6.1/install-x86_64/

–extra-args="console=tty0 console=ttyS0,115200"

2.2.2 ISO部署虚拟主机

首先制作一个磁盘用来安装操作系统,这里使用dd if

dd if=/dev/zero of=vm1.img bs=1G count=0 seek=15

使用virt-install 命令行部署虚拟主机

–name xx 后面接虚拟主机名称

–ram=xx 后面接内存大小单位为M

–vcpus=xx 后面接逻辑CPU数量单位为个

–disk path= 后面接磁盘文件全路径

size=xx 后面接磁盘大小

–cdrom 后面接光盘路径

# virt-install –name vm1 –ram=2048 –vcpus=2 –disk path=/vm-images/vm1.img,size=15 –cdrom /data/CentOS6.7_xiaoniu.iso

查询虚拟机状态

[root@localhost images]# virsh list

Id 名称 状态

—————————————————-

2 lvsi running

3 lvsi-1 running

启动虚拟机

[root@localhost qemu]# virsh create /etc/libvirt/qemu/lvsi-test.xml

域 lvsi-test 被创建(从 /etc/libvirt/qemu/lvsi-test.xml)

强制关停虚拟机,可能会丢失文件

[root@localhost images]# virsh destroy lvsi-1

域 lvsi-1 被删除

平滑关闭虚拟机

[root@localhost qemu]# virsh shutdown lvsi-test

域 lvsi-test 被关闭

2.2.3 常用操作语句

查询虚拟机状态

[root@localhost images]# virsh list

Id 名称 状态

—————————————————-

2 lvsi running

3 lvsi-1 running

启动虚拟机

[root@localhost qemu]# virsh create /etc/libvirt/qemu/lvsi-test.xml

域 lvsi-test 被创建(从 /etc/libvirt/qemu/lvsi-test.xml)

强制关停虚拟机,可能会丢失文件

[root@localhost images]# virsh destroy lvsi-1

域 lvsi-1 被删除

平滑关闭虚拟机

[root@localhost qemu]# virsh shutdown lvsi-test

域 lvsi-test 被关闭

查看虚拟机简称

[root@localhost qemu]# virsh desc lvsi

2.2.4 virsh console管理虚拟机

首先编辑 /etc/grub.conf添加 console=tty0 console=ttyS0,115200

然后通过virsh console 登录虚拟主机

2.2.5 动态添加磁盘

dd if=/dev/zero of=disk bs=1G count=0 seek=20

mkfs.ext4 disk

[root@localhost kvm-img]# virsh attach-disk lvsi /kvm-img/disk sdb

成功附加磁盘

添加进去后无论外面什么名称里面都是从sda排列

修改配置文件

/etc/libvirt/qemu/lvsi.xml #物理磁盘格式

<disk type='block' device='disk'> #增加卷vm23

<driver name='qemu' type='raw'/>

<source dev='/dev/vm/vm23'/>

<target dev='sdb' bus='ide'/> #注意硬盘符hdb

</disk>

/etc/libvirt/qemu/lvsi.xml #dd出来的镜像格式

<disk type='file' device='disk'> #注意type为file

<driver name='qemu' type='raw'/>

<source file='/kvm-img/disk'/> #source为file

<target dev='sda' bus='ide'/>

<address type='drive' controller='0' bus='0' target='0' unit='1'/>

</disk>

重启虚拟机

[root@localhost qemu]# virsh destroy lvsi

域 lvsi 被删除

[root@localhost qemu]# virsh create /etc/libvirt/qemu/lvsi.xml

域 lvsi 被创建(从 /etc/libvirt/qemu/lvsi.xml)

2.2.6 动态调整内存

这个在制作模板的时候就应该把MAX调整到足够大比如24G 但不能超过系统总内存

后面就可以使用virsh setmem +虚拟机名称 +内存大小动态调整大小

如果是在线调整的情况需要先virsh destroy主机再virsh start

virsh edit lvsi

virsh destroy lvsi

virsh start lvsi

virsh setmem lvsi 1619304 #动态调整到16G

virsh dominfo lvsi #查看虚拟机信息

echo -n "name:"

read name

echo -n "mac:"

read mac

#镜像文件和存放目录复制

mkdir /opt/xiaoniu/$name/

cp /opt/root.raw /opt/xiaoniu/$name/root.raw

cp /opt/test.xml /opt/xiaoniu/$name/$name.xml

#kvm替换

sed -i s/test-name/$name/g /opt/xiaoniu/$name/$name.xml

#镜像路径替换

sed -i s/"/opt/root.raw"/"/opt/xiaoniu/$name"/g /opt/xiaoniu/$name/$name.xml

2.3 Qemu 配置管理

QEMU是一款开源的模拟器及虚拟机监管器(Virtual Machine Monitor, VMM)。QEMU主要提供两种功能给用户使用。一是作为用户态模拟器,利用动态代码翻译机制来执行不同于主机架构的代码。二是作为虚拟机监管器,模拟全系统,利用其他VMM(Xen, KVM, etc)来使用硬件提供的虚拟化支持,创建接近于主机性能的虚拟机。

yum install qemu*

命令行创建及启动虚拟机

成功安装QEMU之后便可创建自己的虚拟机。具体步骤如下:

1.使用qemu-img创建虚拟机镜像。

2.3.1 Qemu创建虚拟机镜像

虚拟机镜像用来模拟虚拟机的硬盘,在启动虚拟机之前需要创建镜像文件。

qemu-img create -f qcow2 test.qcow2 10G

qemu-img create -f raw lvsi.raw 10G #创建 raw格式的

chown qemu:qemu lvsi.raw

-f选项用于指定镜像的格式,qcow2格式是QEMU最常用的镜像格式,采用写时复制技术来优化性能

2.4 virt-manager图形界面创建及启动虚拟机

yum install virt-manager –y

安装配置VNC

一、安装 VNC   默认情况下,CentOS 6.7 是没有安装的。   检查是否安装,输入: [root@localhost ~]# rpm -q vnc vnc-server   得到: package vnc is not installed   提示没有安装,那么就开始安装,输入:

[root@localhost ~]# yum install vnc vnc-server tigervnc tigervnc-server gnome*

二、设置 VNC 密码

安装完成后 需初启动VNC 否则执行第一步 Centos 依然会报未安装VNC

[root@localhost ~]# vncserver 设置 VNC密码此时会提示你输入密码,因为是第一次配置。重复输入两次即可。

三、配置桌面类型

[root@localhost ~]# chmod 777 /root/.vnc/xstartup

[root@localhost ~]#vi ~/.vnc/xstartup  一般情况下,我们使用的 Linux 桌面都是 "Gnome" 桌面,故配置成这个桌面比较习惯。   按 "i" 键进入编辑状态,主要修改最后两行。改为: # xterm -geometry 80×24+10+10 -ls -title "$VNCDESKTOP Desktop" & # twm & gnome-session &

重点编辑最后两行,将这两行注释去掉 四、配置登录帐号、桌面分辨率、连接方式   输入: [root@localhost ~]# vi /etc/sysconfig/vncservers

修改最后两行

VNCSERVERS="1:root" VNCSERVERARGS[1]="-geometry 1024×768"

重启启动 vnc

pkill vnc&vncserver

vnc+virt-manager管理kvm

下载vnc客户端连接即可 VNC Server为服务器IP 端口为5901

打开终端运行 virt-manager 创建和管理kvm

Image导入模板创建虚拟机

拉起之后修改IP和清空网卡记录重启虚拟机即可

2.5 KVM虚拟机网络配置

kvm 两种网卡工作模式 NAT 和bridge

·用户网络(User Networking):让虚拟机访问主机、互联网或本地网络上的资源的简单方法,但是不能从网络或其他的客户机访问客户机,性能上也需要大的调整。NAT方式。

·虚拟网桥(Virtual Bridge):这种方式要比用户网络复杂一些,但是设置好后客户机与互联网,客户机与主机之间的通信都很容易。Bridge方式。

Bridge方式适用于服务器主机的虚拟化

Bridge方式原理

Bridge方式即虚拟网桥的网络连接方式,是客户机和子网里面的机器能够互相通信。可以使虚拟机成为网络中具有独立IP的主机。

桥接网络(也叫物理设备共享)被用作把一个物理设备复制到一台虚拟机。网桥多用作高级设置,特别是主机多个网络接口的情况。

客户机配置

客户机安装时注意,网络要选择用br0桥接方式。

编辑修改虚拟机配置文件 /etc/libvirt/qemu/lvsi.xml 增加如下内容

2.6 KVM 模板创建

把在KVM上完全新建一个虚拟机模板的过程记录下。

1、物理机检查(以物理机系统为centos,记得安装时顺便把kvm选择安装上)

a、BIOS 的VT功能要 改成 enabled

b、selinux功能要关闭

2、模板创建准备

a、模板系统的安装镜像文件(CentOS6.7_xiaoniu.iso)

b、在/var/lib/libvirt/images下创建root.raw文件

创建文件命令:qemu-img create -f raw root.raw 10G

查看文件信息:qemu-img info root.raw

3、通过 运行 virt-manager加载并启动安装(过程看2.4)

准备工作完成之后,加载虚拟机:service libvirtd restart

启动虚拟机:virsh start test

然后用VNC_viewer工具通过物理机IP和虚拟机端口号登录安装界面进行安装。

4、以模板制作批量安装虚拟机

cp /var/lib/libvirt/images/root.raw /opt/golo/kvm/images

2.7 快照创建和恢复

#创建test.qcow2磁盘块部署系统

cd /var/lib/libvirt/images/

qemu-img create -f qcow2 test.qcow2 10G

检查磁盘块文件是否有错误

qemu-img check /var/lib/libvirt/images/test.qcow2

#创建快照

virsh snapshot-create test-qcow2

#查看快照

virsh snapshot-list test-qcow2

名称 Creation Time 状态

————————————————————

1464579251 2016-05-30 11:34:11 +0800 running

#恢复快照

恢复快照前删除快照内容

virsh snapshot-revert test-qcow2  1464579251 
文件已经还原

2.8 几种镜像的转化

raw->qcow2

此步骤使用qemu-img工具实现,如果机器上没有,可以通过rpm或yum进行安装,包名为qemu-img。

qemu-img是专门虚拟磁盘映像文件的qemu命令行工具。

具体命令如下:

qemu-img convert -f raw centos.img -O qcow2 centos.qcow2

参数说明:convert 将磁盘文件转换为指定格式的文件

-f 指定需要转换文件的文件格式

-O 指定要转换的目标格式

转换完成后,将新生产一个目标映像文件,原文件仍保存。

VMDK–>qcow2:

查看转换前的格式

qemu-img info vuirtual.vmdk

执行转换语句

qemu-img convert -f vmdk -O qcow2 vuirtual.vmdk vm-kvm.img

检查转换后的是否有坏道

qemu-img check vm-kvm.img

再复制一份 xml配置文件 修改

UUID MAC NAME TYPE FILE

<mac address='52:54:00:14:14:d7'/>

<name>vm-kvm</name>

type='qcow2'

file='/tmp/vdk/vm-kvm.img'

qcow2–>raw:

qemu-img convert -f qcow2 -O raw test.qcow2 test.raw

chown qemu:qemu test.raw

cd /etc/libvirt/qemu

cp test-qcow2.xml test-raw.xml

vi test-raw.xml #修改type name file uuid

virsh create test-raw.xml

2.9 批量部署kvm虚拟主机

2.9.1 部署目录分布

模板和脚本镜像存放/opt/golo/kvm/images

[root@localhost images]# tree /opt/golo/kvm/images

.

├── CentOS6.7_temp.tar.gz

├── sz-golo-web1

│ ├── 70-persistent-net.rules

│ ├── ifcfg-eth0

│ ├── network

│ └── sz-golo-web1.img

├── sz-golo-web2

│ ├── 70-persistent-net.rules

│ ├── ifcfg-eth0

│ ├── network

│ └── sz-golo-web2.img

└── vm.sh

启动文件xml目录

[root@localhost qemu]# tree

.

├── autostart

│ ├── sz-golo-web1.xml -> /etc/libvirt/qemu/sz-golo-web1.xml

│ └── sz-golo-web2.xml -> /etc/libvirt/qemu/sz-golo-web2.xml

├── networks

│ ├── autostart

│ └── default.xml

├── sz-golo-web1.xml

└── sz-golo-web2.xml

2.9.2 批量部署脚本

vi vm.sh

#!/bin/bash

#create by liangqx

#2014-5-7

#auto create vm script

#Start=411648

STATUS=0

vmtemplate="/opt/golo/kvm/images/CentOS6.7_temp.tar.gz"

work_dir="/opt/golo/kvm/images"

datetime=$(date +%Y-%m-%d-%H-%M)

mkdir -p $work_dir

help() {

cat >> /dev/stdout <<EOF

usage: $(basename $0) <vm_list>

example: ./$(basename $0) web_vm.lst OR ./$(basename $0) -h //print help infomations

====================== the vm_list file example ======================

hostname cpu memory(MB) ipaddress gateway

> cat web_vm.lst

sz-golo-web1 2 4096 172.20.20.201 172.20.20.254

sz-golo-web2 2 4096 172.20.20.202 172.20.20.254

======================================================================

EOF

}

error() {

echo "======================================================================"

echo -e " 33[31m input parameter error: $1 n please try again! 33[0m"

echo "======================================================================"

}

trap 'kill $bgpid;echo;exit' 1 2 3 15

dots() {

sec=$1

while true

do

echo -e " .c "

sleep $sec

done

}

init_info() {

vm_hostname=$(echo $1 |awk -F "_" '{print $1}')

vcpus=$(echo $1 |awk -F "_" '{print $2}')

memory=$(echo $1|awk -F "_" '{print $3}')

ipaddr=$(echo $1 |awk -F "_" '{print $4}')

gw=$(echo $1 |awk -F "_" '{print $5}')

echo $vcpus | grep '^[0-9]$' > /dev/null

STATUS=$?

if [ $STATUS -ne 0 ];then

echo "======================================================================"

echo -e "33[31m $vm_hostname $vcpus $memory $ipaddr $gw error, please check! 33[0m"

error $vcpus

help

exit $STATUS

fi

echo $memory | grep '^[0-9]*$' > /dev/null

STATUS=$?

if [ $STATUS -ne 0 ];then

echo "======================================================================"

echo -e "33[31m $vm_hostname $vcpus $memory $ipaddr $gw error, please check! 33[0m"

error $memory

help

exit $STATUS

fi

if [[ $ipaddr =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]];then

IFSBAK=$IFS

IFS='.'

iptemp=($ipaddr)

IFS=$IFSBAK

[[ ${iptemp[0]} -le 255 && ${iptemp[1]} -le 255 && ${iptemp[2]} -le 255 && ${iptemp[3]} -le 255 ]]

STATUS=$?

if [ $STATUS -ne 0 ];then

error $ipaddr

help

exit $STATUS

else

mac=$(echo $ipaddr | awk -F "." '{printf ("52:54:00:%02x:%02x:%02x",$2,$3,$4)}')

fi

else

echo "======================================================================"

echo -e "33[31m $vm_hostname $vcpus $memory $ipaddr $gw error, please check! 33[0m"

error $ipaddr

exit 1

fi

if [[ $gw =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]];then

IFSBAK=$IFS

IFS='.'

iptemp1=($gw)

IFS=$IFSBAK

[[ ${iptemp1[0]} -le 255 && ${iptemp1[1]} -le 255 && ${iptemp1[2]} -le 255 && ${iptemp1[3]} -le 255 ]]

STATUS=$?

if [ $STATUS -ne 0 ];then

error $gw

help

exit $STATUS

fi

else

error $1

exit 1

fi

echo "========================================================================="

echo -e "33[33m Create Virtual Machine: $vm_hostname $vcpus $memory $ipaddr $gw 33[0m"

echo "========================================================================="

}

copy_diskfile () {

echo "========================================================================="

echo -e "33[33m Uncompress template tarball $vmtemplate …33[0m"

[ -d /opt/golo/kvm/images ] || mkdir -p $work_dir

mkdir -p $work_dir/$vm_hostname

cd $work_dir/$vm_hostname

echo " tar xvf $(basename $vmtemplate) …"

dots 3 &

bgpid=$!

tar zxvf $vmtemplate >> /dev/null 2>&1

mv root.raw ${vm_hostname}.img

kill $bgpid >>/dev/null 2>&1

echo -e "33[32mn Uncompress Virtual Machine img file done 33[0m"

echo "========================================================================="

}

create_vm () {

echo "========================================================================="

echo -e "33[33m Create Virtual Machine … 33[0m"

virt-install -v –virt-type kvm –accelerate –autostart –name $vm_hostname –ram=$memory –vcpus=$vcpus

–disk path=$work_dir/$vm_hostname/${vm_hostname}.img,device=disk,bus=virtio,format=raw,cache=none

–network bridge:br0,mac=$mac,model=virtio –vnc –noautoconsole –import –noreboot

echo -e "33[32m Create Virtual Machine done! 33[0m"

echo "========================================================================="

}

modify_host () {

echo "========================================================================="

echo "Modify Virtual Machine hostip hostname route…"

if [ ! -z $ipaddr ];then

cat > $work_dir/$vm_hostname/ifcfg-eth0 <<EOF

DEVICE=eth0

TYPE=Ethernet

ONBOOT=yes

NM_CONTROLLED=no

BOOTPROTO=static

IPADDR=$ipaddr

NETMASK=255.255.255.0

GATEWAY=$gw

DNS1=114.114.114.114

DNS2=8.8.8.8

IPV6INIT=NO

EOF

else

echo -e "33[31m $vm_hostname $vcpus $memory $ipaddr $gw error, please check! 33[0m"

error $ipaddr

exit 1

fi

if [ ! -z $vm_hostname ];then

cat > $work_dir/$vm_hostname/network <<EOF

NETWORKING=yes

HOSTNAME=$vm_hostname

NETWORKING_IPV6=no

IPV6INIT=no

EOF

else

echo -e "33[31m $vm_hostname $vcpus $memory $ipaddr $gw error, please check! 33[0m"

error $vm_hostname

exit 1

fi

cat > $work_dir/$vm_hostname/70-persistent-net.rules <<EOF

# This file was automatically generated by the /lib/udev/write_net_rules

# program, run by the persistent-net-generator.rules rules file.

#

# You can modify it, as long as you keep each rule on a single

# line, and change only the value of the NAME= key.

EOF

echo -e "33[33m ################# Config Virtual Machine network… ################# 33[0m"

virt-copy-in -d $vm_hostname $work_dir/$vm_hostname/ifcfg-eth0 /etc/sysconfig/network-scripts

STATUS=$?

virt-copy-in -d $vm_hostname $work_dir/$vm_hostname/network /etc/sysconfig

STATUS=$(($STATUS + $?))

virt-copy-in -d $vm_hostname $work_dir/$vm_hostname/70-persistent-net.rules /etc/udev/rules.d

STATUS=$(($STATUS + $?))

if [ $STATUS -ne 0 ];then

echo -e "33[31m ################# Config Virtual Machine network ERROR!! ################# 33[0m"

exit $STATUS

fi

echo -e "33[35m=============================Virtual Machine: ${vm_hostname} info:========================================="

virsh dominfo $vm_hostname

echo "——————————————————-"

virsh domiflist $vm_hostname

echo "——————————————————-"

virt-df -d $vm_hostname

echo -e "=================================Virtual Machine: ${vm_hostname} Create DONE!!==============================33[0m"

}

if [[ "$#" -eq 0 || "$1" == "-h" ]]; then

help

exit 0

fi

if [ ! -s $1 ];then

echo "error: $1 not found!!!"

exit 1

else

sed 's/[[:blank:]]{1,}/_/g' $1 > $work_dir/${datetime}_vm_list

vm_list="$work_dir/${datetime}_vm_list"

fi

for line in $(cat $vm_list)

do

init_info $line

copy_diskfile

create_vm

modify_host

done

2.9.3 虚拟主机配置详情

编辑虚拟配置文件host_list

hostname cpu memory(MB) ipaddress gateway

sz-golo-web1 2 4096 172.20.20.201 172.20.20.254

sz-golo-web2 2 4096 172.20.20.202 172.20.20.254

vi host_list

sz-golo-web3 2 2096 172.20.20.203 172.20.20.254

sz-golo-web4 2 2096 172.20.20.204 172.20.20.254

sz-golo-web5 2 2096 172.20.20.205 172.20.20.254

sz-golo-web6 2 2096 172.20.20.206 172.20.20.254

sz-golo-web7 2 2096 172.20.20.207 172.20.20.254

sz-golo-web8 2 2096 172.20.20.208 172.20.20.254

执行脚本

./vm.sh host_list

脚本过程

………………………………………………………………………………………………………………省略

执行结果

虚拟机列表

virsh list

目录详情

进程PID

netstat –antulp | grep qemu

进程详情

ps –aux | gep kvm

2.10 迁移ESXI虚拟机到KVM

原理和详情请参考

http://www.ibm.com/developerworks/cn/linux/l-cn-mgrtvm3/

https://access.redhat.com/documentation/zhCN/Red_Hat_Enterprise_Linux/6/html/V2V_Guide/sub-sect-convert-remote-kvm-virtual-machine.html

virt-v2v 迁移 VMware ESX 虚拟机

从 RHEL6(Red Hat Enterprise Linux 6)开始,RHEL 发行版中包含了 Red Hat 公司开发的 virt-v2v 工具。它是由 perl 语言编写的脚本,可以自动化的将创建在 Xen,KVM 和 VMware ESX 上的虚拟机拷贝到 virt-v2v 的主机,并且自动的更改配置,使之能够被 libvirt 进行管理。目前,virt-v2v 支持静态迁移下列虚拟机:RHEL4、RHEL5, RHEL6,Windows XP,Windows Vista, Windows 7, Windows Server 2003 和 Windows Server 2008。

virt-v2v 迁移 VMware/Xen/KVM 虚拟机示意图

成功迁移虚拟机的一个重要的验证标准就是文件的正确性和完整性。下图中列出与 VMware 虚拟机相关的文件,但是迁移 VMware 虚拟机到 KVM 并不需要用到所有的文件

安装linux迁移软件包virt

yum install virt-v2v.x86_64 -y

创建存储池

创建 KVM 主机网络接口br99

virt-v2v 迁移 VMware 虚拟机的步骤

在 KVM 主机上完成上节的准备工作后,可以正式开始迁移 VMware ESX 上的虚拟机了。下面是迁移的具体步骤:

1. 如果虚拟机上安装了 VMware Tools,必须先卸载它。因为 KVM 的虚拟机不支持 VMware Tools 里面的虚拟驱动。

2. 在 VMware ESX 上停止等待迁移的虚拟机,因为 virt-v2v 只支持静态迁移。

3. 为自动登录 VMware ESX 服务器创建 .netrc 文件。VMware ESX 服务器的连接需要授权,virt-v2v 支持密码方式的授权连接,可以从 $HOME/.netrc 文件中读取密码并自动登录。如果主机系统没有这个文件,就手动创建它。并且 .netrc 文件需要 0600 权限,使 virt-v2v 工具可以正确读取它。

root@localhost ~]# cat ~/.netrc

machine 172.20.99.101 login root password xiwenlejian123

迁移 虚拟机

1. 卸载vmware-tool

2.关闭虚拟机

3.编辑.netrc文件 0600

[root@localhost ~]# chmod 0600 .netrc

[root@localhost ~]# ll .netrc

-rw——-. 1 root root 57 6月 3 23:16 .netrc

执行迁移虚拟机命令详情

virt-v2v -ic esx://172.20.99.101/?no_verify=1 -os migration -of qcow2 --bridge br99  DS-OPS-99-24
参数说明
 -os migration:  迁移虚拟机的镜像文件到主机上的存储池
 -of qcow2:     转换迁移后虚拟机的文件格式
 --bridge br0:  设置迁移后虚拟机的网络映射到网桥 br0 
DS-OPS-99-24:        Vmware ESXi 上虚拟机的名字,迁移后保持名字
迁移中大概需要半小时
迁移中的virt-manger界面

3 ovrit部署

资源有限暂时用两台虚拟主机来充当 Ovrit-server server中控和ovrit-node数据节点

3.1 数据结构图

http://www.ibm.com/developerworks/cn/cloud/library/1209_xiawc_ovirt/index.html

Ovrit-server系统版本 Centos 6.7 CPU 4C MEM 8G DISK 20G+20G

Ovrit-node系统版本 Centos 6.7 CPU 8C MEM 32G DISK 20G+200G

3.2 部署ovrit-server

Add the official oVirt repository. 加入官方oVirt库

sudo yum install http://resources.ovirt.org/pub/yum-repo/ovirt-release36.rpm

·This will add repositories from ovirt.org to your host allowing you to get the latest oVirt rpms.

·It will also enable any other needed repository including for example virt-preview repository on your machine giving you access to the latest versions of things like libvirt and KVM.

 Install oVirt Engine. 安装oVirt引擎

sudo yum install -y ovirt-engine

 Set up oVirt Engine. 设置oVirt引擎

sudo engine-setup 
配置主机名解析和数据库安装方式
保持默认设置并设置 管理密码 `1qw23e123
配置ISO NFS存放路径
配置ISO访问权限 默认为 所有可读写 *(rw)
确认配置
开始安装
启动了nginx 先关闭nginx 重启 httpd即可 
登录
https://172.20.99.21/ovirt-engine/
选择管理门户 admin `1qw23e123

修改ovirt内嵌用户admin的密码 1.使用ovirt-engine所在的OS的root用户登录 2.将密码写入到一文件中,如/tmp/passwd 3.执行命令: engine-config -s AdminPassword=/tmp/passwd 4.重启ovirt-engine服务:service ovirt-engine restart 第4步不执行的话,密码修改无效

3.3部署ovirt-node vds节点

Ovrit-node系统版本 Centos 6.7 CPU 8C MEM 32G DISK 20G+200G

ISO光盘下载

http://resources.ovirt.org/pub/ovirt-3.6/

http://www.ibm.com/developerworks/cn/linux/l-cn-ovirt/

配置网桥,用于ovrit管理

vi /etc/sysconfig/network-scripts/ifcfg-ovirtmgmt

DEVICE=ovirtmgmt

TYPE=Bridge

BOOTPROTO=static

BROADCAST=172.20.255.255

IPADDR=172.20.99.23

NETMASK=255.255.255.0

GATEWAY=172.20.99.254

ONBOOT=yes

vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

BOOTPROTO=none

ONBOOT=yes

TYPE=Ethernet

BRIDGE= ovirtmgmt

重启网卡

service network restart

安装kvm套件

yum install kvm python-virtinst libvirt libvirt-python virt-manager yum install virt-viewer libguestfs-tools

添加 官方oVirt库

yum install http://resources.ovirt.org/pub/yum-repo/ovirt-release36.rpm

安装 vdsm vdsm-cli

http://www.ovirt.org/develop/developer-guide/vdsm/installing-vdsm-from-rpm/ #官方链接

http://www.ovirt.org/develop/developer-guide/vdsm/developers/ #官方链接

yum install http://resources.ovirt.org/pub/yum-repo/ovirt-release36.rpm centos7

yum install http://resources.ovirt.org/pub/yum-repo/ovirt-release35.rpm centos6

vi ovirt-3.5-dependencies.repo

#gpgkey=https://download.gluster.org/pub/gluster/glusterfs/LATEST/pub.key

gpgkey=https://download.gluster.org/pub/gluster/glusterfs/LATEST/rsa.pub

[ovirt-3.5-glusterfs-noarch-epel]

name=GlusterFS is a clustered file-system capable of scaling to several petabytes.

baseurl=http://download.gluster.org/pub/gluster/glusterfs/LATEST/EPEL.repo/epel-$releasever/noarch

enabled=1

skip_if_unavailable=1

gpgcheck=1

#gpgkey=https://download.gluster.org/pub/gluster/glusterfs/LATEST/pub.key

gpgkey=https://download.gluster.org/pub/gluster/glusterfs/LATEST/rsa.pub

yum install vdsm vdsm-cli -y

安装好之后需要设置一个lvbvirt用户

saslpasswd2 -a libvirt lvsi

[root@localhost yum.repos.d]# saslpasswd2 -a libvirt lvsi

Password:

Again (for verification):

[root@localhost yum.repos.d]# virsh list

Please enter your authentication name: lvsi

Please enter your password:

Id 名称 状态

—————————————————-

14 lvsi running

编辑vdsm配置

/etc/vdsm/vdsm.conf (you may need to create that file):

[vars]

ssl = false

vdsm-tool configure –force 重启 vdsmd之前必须加载模块一次

service vdsmd start

[root@DS-TMP-99-22 ~]# vdsm-tool configure –module libvirt

Checking configuration status…

libvirt is already configured for vdsm

SUCCESS: ssl configured to true. No conflicts

Running configure…

Done configuring modules to VDSM.

service supervdsmd start  

/etc/init.d/libvirtd start

未完待续

 ovirt-node定制

ovirt-node的ISO出包方式

ovirt-node的出包方式很简单:

a. git clone https://github.com/litevirt/ovirt-node.git

b. cd ovirt-node

c. sh autobuild.sh

ISO安装参考IBM官方文档

http://www.ibm.com/developerworks/cn/linux/l-cn-ovirt/

3.3 部署ovirt-node存储nfs节点

Ovirt-node安装配置nfs

yum install –y nfs-utils rpcbind

[root@ovrit-node-99-21 ~]# cat /etc/exports

/kvm-storage *(rw,async,no_root_squash,no_subtree_check,insecure)

启动和测试nfs

/etc/init.d/rpcbind restart 先启动

/etc/init.d/nfs restart 后启动

需要按顺序启动,不然会报错

clnt_create: RPC: Program not registered

Ovrt-server添加主机

必须先添加主机才能添加存储

172.20.99.23:/kvm-storage

K

在传统上提供了 Linux 系统上性能最高的开源虚拟化技术。Xen 使用一个虚拟机管理程序来管理虚拟机和相关的资源,还支持半虚拟化,这可在 “知道” 自己已实现虚拟化的虚拟机中提供更高的性能。Xen 提供了一个专门执行资源和虚拟管理与计划的开源虚拟机管理程序。在裸机物理硬件上引导系统时,Xen 虚拟机管理程序启动一个称为 Domain0管理域的主虚拟机,该虚拟机提供了对所有在该物理主机上运行的其他虚拟机(称为 Domain1DomainN,或者简单地称为 Xen Guest)的中央虚拟机管理功能。

KVM虚拟化

不同于 Xen,KVM 虚拟化使用 Linux 内核作为它的虚拟机管理程序。对 KVM 虚拟化的支持自 2.6.20 版开始已成为主流 Linux 内核的默认部分。使用 Linux 内核作为虚拟机管理程序是 KVM 受到批评的一个主要方面,因为(在默认情况下)Linux 内核并不符合 Type 1 虚拟机管理程序的传统定义—“一个小操作系统”。尽管大多数 Linux 发行版所提供的默认内核的确如此,但可以轻松地配置 Linux 内核来减少它的编译大小,以便它仅提供作为 Type 1 虚拟机管理程序运行所需的功能和驱动程序。Red Hat 自己的 Enterprise Virtualization 产品仅依靠这样一种特殊配置的、相对轻量型的 Linux 内核来运行。但更重要的是,“小”只是一个相对的词汇,如今具有数GB 内存的 64 位服务器可轻松地提供现代 Linux 内核所需的几 MB 空间。

KVM 超越 Xen 成为大多数企业环境首选的开源裸机虚拟化技术,这有多个原因:

  • KVM 支持自 2.6.20 版开始已自动包含在每个 Linux 内核中。在 Linux 内核 3.0 版之前,将 Xen 支持集成到 Linux 内核中需要应用大量的补丁,但这仍然无法保证每个可能硬件设备的每个驱动程序都能在 Xen 环境中正确工作。
  • Xen 支持所需的内核源代码补丁仅提供给特定的内核版本,这阻止了 Xen 虚拟化环境利用仅在其他内核版本中可用的新驱动程序、子系统及内核修复和增强。KVM 在 Linux 内核中的集成使它能够自动利用新 Linux 内核版本中的任何改进。
  • Xen 要求在物理虚拟机服务器上运行一个特殊配置的 Linux 内核,以用作在该服务器上运行的所有虚拟机的管理域。KVM 可在物理服务器上使用在该物理系统上运行的 Linux VM 中使用的相同内核。
  • Xen 的虚拟机管理程序是一段单独的源代码,它自己的潜在缺陷与它所托管的操作系统中的缺陷无关。因为 KVM 是 Linux 内核的一个集成部分,所以只有内核缺陷能够影响它作为 KVM 虚拟机管理程序的用途。

尽管 Xen 仍可提供比 KVM 性能更高的裸机虚拟化,但这些性能改进的价值常常比不上 KVM 虚拟化的简单性和易用性价值