一.KVM安装
安装前检查
cat /proc/cpuinfo | egrep 'vmx|svm'
如果搜索出vmx。则代表已经开启了Intel-vt技术。
如果搜索出svm。则代表已经开启了AMD-V技术。
setenforce 0
vim /etc/sysconfig/selinux
SELINUX=disabled
yum install virt-manager libvirt libvirt-python libvirt-client virt-install virt-viewer libguestfs-tools -y
qemu:虚拟化软件,可以虚拟不同的CPU,支持异构(x86的架构可以虚拟化出不是x86架构的)
virt-manager:图形化 KVM 管理软件
libvirt: 提供虚拟机与宿主相互通信的机制
libvirt-python:允许使用 libvirt API
#这两个不用自带的,下面自行编译安装
qemu-kvm:用户态管理kvm,网卡,声卡,PCI设备等都是qemu来管理的,提供用户级KVM环境
qemu-img:VMs磁盘管理
#python-virtinst:CLI下创建KVM的工具
#libvirt-client: 提供client访问kvm服务器的机制 ,并包含 virsh命令进行管理和控制VMs
安装kvm
1.下载2.11版本的包
wget https://download.qemu.org/qemu-2.11.0.tar.xz
2.安装编译所需要的依赖
yum -y install gcc gcc-c++ automake libtool zlib-devel glib2-devel bzip2-devel libuuid-devel spice-protocol spice-server-devel usbredir-devel libaio-devel
3.开始编译安装QEMU-KVM
tar xvJf qemu-2.11.0.tar.xz
cd qemu-2.11.0
yum install -y libseccomp libseccomp-devel
yum install -y numactl numactl-devel
./configure --enable-seccomp --enable-numa --prefix=/usr/local/qemu.2.11 && make && make install
替换 bin 文件
ln -s /usr/local/qemu.2.11/bin/qemu-system-x86_64 /usr/bin/qemu-kvm
ln -s /usr/local/qemu.2.11/bin/qemu-system-x86_64 /usr/libexec/qemu-kvm
ln -s /usr/local/qemu.2.11/bin/qemu-img /usr/bin/qemu-img
检查版本
qemu-img --version
qemu-kvm -version
注意
问题:seccomp support is disabled
编译需要使用选择 --enable-seccomp,否则会出现 qemu-system-x86_64: -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny: seccomp support is disabled 的问题。
解决办法就是安装 libseccomp、libseccomp-devel,执行 ./congfigure 时添加 --enable-seccomp,然后清空 /var/cache/libvirt/qemu/capabilities 重启 libvirtd 即可。
网桥搭建(虚拟机与宿主机的网络映射)
- 添加桥接设备br0:相当于一个二层交换机
- ==关闭NetworkManager== (重要,踩过的坑)
```
service NetworkManager stop
```
- 添加ifcfg-br0
```
DEVICE=br0
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=static
DEFROUTE=yes
GATEWAY=145.170.34.254
DNS1=8.8.8.8
PREFIX=24
IPADDR=145.170.34.38
NETMASK=255.255.255.0
```
```
DEVICE=eth1
HWADDR=00:1E:67:C7:0F:22
TYPE=Ethernet
UUID=0128d2c6-126c-4227-a981-136f69d4a7f4
ONBOOT=yes
NM_CONTROLLED=no
BRIDGE=br0
```
- 检查网桥是否配置
```
brctl show
删除网桥
ifconfig <网桥名> down
brctl delbr <网桥名>
启动libvirt
service libvirtd start
service libvirtd enable
安装后检查
-
验证kvm是否安装成功
lsmod | grep kvm
-
图形界面
virt-manager
-
通过iso创建虚拟机命令
virt-install --name redhat6.5-test2 --ram 512 --vcpus=1 --os-type=linux --os-variant=rhel6 --accelerate --hvm --disk path=/var/lib/libvirt/images/template-centos6-4.qcow2,size=6,bus=virtio --location /opt/iso/redhat6.5.rhel-server-6.5-x86_64-dvd.iso --network bridge=br0,model=virtio -x "console=ttyS0"--nographics
①--name 虚拟机名字
②--location 镜像地址
③--disk 系统磁盘镜像存储位置
④--network 网络模式(这里配置的是桥接模式),和对应桥接的网卡
⑤--extra-args 配置控制台会话
二.增备虚拟机
增备原理
kvm虚拟机由xml定义文件和磁盘文件两大部分组成。
xml文件路径:/etc/libvirt/qemu/generic.xml #默认路径
磁盘文件路径:/var/liv/libvirt/images/generic.qcow2
需要增备虚拟机,就需要把xml定义文件保存,和把对应的磁盘进行整备+后续增备即可。
所以这里只说对磁盘的增备 对应的xml修改即可
增备流程
(DOMAIN:主机名)
0.以paused状态启动虚拟机
virsh start DOMAIN --paused
1.先获取到对应的磁盘信息 (暂停或者运行状态)
virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "query-block" }'
virsh qemu-monitor-command DOMAIN --hmp 'info block'
# 获取到磁盘drive-ide0-0-0
-
对磁盘进行完整备份(“sync”:“top”)
virsh qemu-monitor-command DOMAIN '{ "execute" : "drive-backup" , "arguments" : { "device" : "drive-ide0-0-0" , "sync" : "full" , "target" : "/home/full.qcow2" } }'
-
对磁盘创建bitmap(block-dirty-bitmap-add)
virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "block-dirty-bitmap-clear", "arguments": {"node": "drive-ide0-0-0","name": "bitmap0"}}'
-
恢复虚拟机状态(virsh resume DOMAIN)
virsh resume DOMAIN
-
接下来可以做incremental备份(“sync”:“incremental”)
virsh qemu-monitor-command generic '{ "execute" : "drive-backup" , "arguments" : { "device" : "drive-ide0-0-0" , "sync" : "incremental" , "bitmap" : "bitmap0" , "target" : "/home/inc1.qcow2" } }'
正在运行的虚拟机需要以事务的方式进行增备
1.以事务方式对磁盘创建bitmap(block-dirty-bitmap-add)及对磁盘做完整备份(“sync”:“top”)
QMP部分功能支持事务性(事务的目的是当其中一件事失败后,会自动回滚,保证数据一致性,但这里也可用于保证创建bitmap和开始备份之间没有缺少数据)
virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "transaction", "arguments": { "actions": [ { "type": "block-dirty-bitmap-add", "data": {"node":"drive-virtio-disk0", "name":"bitmap0"}}, { "type": "drive-backup", "data": {"device": "drive-virtio-disk0", "target": "/home/full.qcow2","sync":"top" }} ]} }'
2.接下来可以做incremental备份(“sync”:“incremental”)
# ...运行一段时间...
virsh qemu-monitor-command DOMAIN --pretty '{ "execute" : "drive-backup" , "arguments" : { "device" : "drive-virtio-disk0" , "sync" : "incremental" , "bitmap" : "bitmap0" , "target" : "/home/inc.0.qcow2" } }'
# ...又运行一段时间...
virsh qemu-monitor-command DOMAIN --pretty '{ "execute" : "drive-backup" , "arguments" : { "device" : "drive-virtio-disk0" , "sync" : "incremental" , "bitmap" : "bitmap0" , "target" : "/home/inc.1.qcow2" } }'
如果之前已经创建过bitmap,此刻想忽略bitmap,重新做一次完整备份,并重置bitmap(用于接下来的增量备份),则可以
{ "execute": "transaction",
"arguments": {
"actions": [
{"type": "block-dirty-bitmap-clear",
"data": {"node": "drive-virtio-disk0", "name": "bitmap0"} },
{"type": "drive-backup",
"data": {"device": "drive-virtio-disk0", "target": "home/new_full_backup.img", "sync": "top"} }
]
}
}
三.磁盘恢复
备份完成后
备份链
经过增量备份后,会形成一条备份链:full.qcow2 <- inc0.qcow2 <- inc1.qcow2
full.qcow2 :全量备份
inc0.qcow2 inc0.qcow2 :增量备份
数据恢复
当需要使用备份进行数据恢复时候,就可以使用该链上的文件进行恢复,比如要恢复到inc.1.qcow2的末尾,那么有2种方案:保持链、合并
▷ 保持链
-
将full.qcow2、inc0.qcow2、inc1.qcow2拷贝到目标宿主机上
-
通过qemu-img rebase -u来确保链的顺序
# 确保链的完整性 qemu-img rebase -u -b inc1.qcow2 inc0.qcow2 # 合并 qemu-img commit inc1.qcow2 # 确保链的完整性 qemu-img rebase -u -b full.qcow2 inc1.qcow2 # 合并 qemu-img commit full.qcow2
-
虚拟机xml里指定full.qcow2
virsh edit xxx.xml