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管理工具。
开启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,
重启虚拟机
检查的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是否正常安装
新建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
新建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
二层业务网卡配置em1 trunk
interface GigabitEthernet1/0/22
port link-type trunk
port trunk permit vlan all
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
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
把虚拟机从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*
虚拟机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
virt-manager
管理kvm能够管理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 | 从客户端中分离网络接口。 |
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"
首先制作一个磁盘用来安装操作系统,这里使用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 被关闭
查询虚拟机状态
[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
首先编辑 /etc/grub.conf添加 console=tty0 console=ttyS0,115200
然后通过virsh console 登录虚拟主机
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)
这个在制作模板的时候就应该把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
QEMU是一款开源的模拟器及虚拟机监管器(Virtual Machine Monitor, VMM)。QEMU主要提供两种功能给用户使用。一是作为用户态模拟器,利用动态代码翻译机制来执行不同于主机架构的代码。二是作为虚拟机监管器,模拟全系统,利用其他VMM(Xen, KVM, etc)来使用硬件提供的虚拟化支持,创建接近于主机性能的虚拟机。
yum install qemu*
命令行创建及启动虚拟机
成功安装QEMU之后便可创建自己的虚拟机。具体步骤如下:
1.使用qemu-img创建虚拟机镜像。
虚拟机镜像用来模拟虚拟机的硬盘,在启动虚拟机之前需要创建镜像文件。
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 默认情况下,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 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" & # twm & gnome-session &
重点编辑最后两行,将这两行注释去掉 四、配置登录帐号、桌面分辨率、连接方式 输入: [root@localhost ~]# vi /etc/sysconfig/vncservers
修改最后两行
VNCSERVERS="1:root" VNCSERVERARGS[1]="-geometry 1024x768"
重启启动 vnc
pkill vnc&vncserver
下载vnc客户端连接即可 VNC Server为服务器IP 端口为5901
打开终端运行 virt-manager 创建和管理kvm
Image导入模板创建虚拟机
拉起之后修改IP和清空网卡记录重启虚拟机即可
kvm 两种网卡工作模式 NAT 和bridge
·用户网络(User Networking):让虚拟机访问主机、互联网或本地网络上的资源的简单方法,但是不能从网络或其他的客户机访问客户机,性能上也需要大的调整。NAT方式。
·虚拟网桥(Virtual Bridge):这种方式要比用户网络复杂一些,但是设置好后客户机与互联网,客户机与主机之间的通信都很容易。Bridge方式。
Bridge方式适用于服务器主机的虚拟化
Bridge方式原理
Bridge方式即虚拟网桥的网络连接方式,是客户机和子网里面的机器能够互相通信。可以使虚拟机成为网络中具有独立IP的主机。
桥接网络(也叫物理设备共享)被用作把一个物理设备复制到一台虚拟机。网桥多用作高级设置,特别是主机多个网络接口的情况。
客户机配置
客户机安装时注意,网络要选择用br0桥接方式。
编辑修改虚拟机配置文件 /etc/libvirt/qemu/lvsi.xml 增加如下内容
把在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
#创建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
文件已经还原
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
模板和脚本镜像存放/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
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 " \033[31m input parameter error: $1 \n please try again! \033[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 "\033[31m $vm_hostname $vcpus $memory $ipaddr $gw error, please check! \033[0m"
error $vcpus
help
exit $STATUS
fi
echo $memory | grep '^[0-9]*$' > /dev/null
STATUS=$?
if [ $STATUS -ne 0 ];then
echo "======================================================================"
echo -e "\033[31m $vm_hostname $vcpus $memory $ipaddr $gw error, please check! \033[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 "\033[31m $vm_hostname $vcpus $memory $ipaddr $gw error, please check! \033[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 "\033[33m Create Virtual Machine: $vm_hostname $vcpus $memory $ipaddr $gw \033[0m"
echo "========================================================================="
}
copy_diskfile () {
echo "========================================================================="
echo -e "\033[33m Uncompress template tarball $vmtemplate ...\033[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 "\033[32m\n Uncompress Virtual Machine img file done \033[0m"
echo "========================================================================="
}
create_vm () {
echo "========================================================================="
echo -e "\033[33m Create Virtual Machine ... \033[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 "\033[32m Create Virtual Machine done! \033[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 "\033[31m $vm_hostname $vcpus $memory $ipaddr $gw error, please check! \033[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 "\033[31m $vm_hostname $vcpus $memory $ipaddr $gw error, please check! \033[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 "\033[33m ################# Config Virtual Machine network... ################# \033[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 "\033[31m ################# Config Virtual Machine network ERROR!! ################# \033[0m"
exit $STATUS
fi
echo -e "\033[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!!==============================\033[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
编辑虚拟配置文件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
原理和详情请参考
http://www.ibm.com/developerworks/cn/linux/l-cn-mgrtvm3/
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 并不需要用到所有的文件
yum install virt-v2v.x86_64 -y
在 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界面
资源有限暂时用两台虚拟主机来充当 Ovrit-server server中控和ovrit-node数据节点
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
Add the official oVirt repository. 加入官方oVirt库
s
udo 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步不执行的话,密码修改无效
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/
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
yum install kvm python-virtinst libvirt libvirt-python virt-manager yum install virt-viewer libguestfs-tools
yum install http://resources.ovirt.org/pub/yum-repo/ovirt-release36.rpm
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/
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
在传统上提供了 Linux 系统上性能最高的开源虚拟化技术。Xen 使用一个虚拟机管理程序来管理虚拟机和相关的资源,还支持半虚拟化,这可在 “知道” 自己已实现虚拟化的虚拟机中提供更高的性能。Xen 提供了一个专门执行资源和虚拟管理与计划的开源虚拟机管理程序。在裸机物理硬件上引导系统时,Xen 虚拟机管理程序启动一个称为 Domain0 或管理域的主虚拟机,该虚拟机提供了对所有在该物理主机上运行的其他虚拟机(称为 Domain1 到 DomainN,或者简单地称为 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 成为大多数企业环境首选的开源裸机虚拟化技术,这有多个原因:
尽管 Xen 仍可提供比 KVM 性能更高的裸机虚拟化,但这些性能改进的价值常常比不上 KVM 虚拟化的简单性和易用性价值
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。