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 "