KVM虚拟化
1. 虚拟化技术
虚拟化,通过模拟计算机的硬件,实现同一台计算机上同时运行多个操作系统
2. 虚拟化软件的差别
qemu 软件模拟全虚拟化,速度慢,兼容性好!
xen(半) 性能最好,需要修改内核,兼容性差~ redhat 5.5
kvm 全虚拟机,硬件支持cpu,内置在linux模块,不需要使用专门的内核 centos6 kvm,性能好,兼容性好
3. 安装kvm虚拟化管理工具
# 本文以centos8(4u4g 50g磁盘)为例,已配置阿里源
yum install libvirt virt-install qemu-kvm -y
systemctl start libvirtd
virt-install --virt-type kvm --os-type=linux --os-variant rhel7.0 --name centos8 --memory 1024 --vcpus 1 --disk /opt/centos1.raw,format=raw,size=20 --cdrom /opt/CentOS-8.1.1911-x86_64-dvd1.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
使用vnc连接安装镜像
4. KVM常用命令
virsh list # 查看vm列表,关机的不显示
virsh list --all # 查看所有vm列表
virsh start centos7(vmname) # 启动centos7
virsh shutdown centos7 # centos7关机
virsh destroy centos7 # centos7关电源
virsh reboot centos7 # centos7重启
virsh dumpxml centos7 # 导出centos7配置,显示在屏幕上
virsh dumpxml centos7 > vm_centos7.xml # 将centos7配置导入到centos7.xml中
virsh undefine centos7 # 删除centos7,实际vm文件还在,virsh list查看不到
virsh define vm_centos7.xml # 导入配置
virsh suspend centos7 # 挂起centos7
virsh resume centos7 # 恢复挂起centos7
virsh autostart centos7 # 设置centos7开机自启动
virsh autostart --disable centos7 # 取消centos7开机自启
virsh edit centos7 # 修改centos7配置文件
虚拟机配置文件位置 /etc/libvirt/qemu/name.xml
centos7 console登录
1. 需要登录到虚拟机内部,执行命令
grubby --update-kernel=ALL --args="console=ttys0,115200n8
2. kvm上执行
virsh console centos7
5. 磁盘管理
raw 裸格式,占用空间大,不支持快照,不方便管理,读写性能好
qcow2 qcow(copy on write)占用空间小,支持快照,性能比raw差,方便传输
常用命令
qemu-img info centos1.raw # 查看centos1.raw磁盘信息
qemu-img create -f qcow2 test.qcow2 2g # 创建2g test.qcow2磁盘
qemu-img resize test.qcow2 +1g # 将test.qcow2磁盘增加1g
qemu-img resize test.qcow2 5g # 将test.qcow2磁盘调整到5g # 无法缩减容量
qemu-img resize test.qcow2 --shrink 3g # 将test.qcow2磁盘调整到3g # 慎用
qemu-img convert -f raw -O qcow2 /opt/centos1.raw /opt/centos1.qcow2 -c
# 将centos1.raw转换成centos1.qcow2
-f # 旧磁盘格式
-O # 新磁盘格式
-c # 压缩
# 注意,转换磁盘格式后需要用virsh edit vmname修改配置文件(磁盘格式,路径),转换后原磁盘还在原路径
6. 快照管理
virsh snapshot-create centos7 # 给centos7创建快照,快照名称默认
virsh snapshot-create-as centos7 centos7.snapshot # 给centos7创建centos7.snapshout名称快照
qemu-img info centos7.qcow2 # 查看centos7.qcow2的快照(需关机)
virsh snapshot-list centos7 # 查看centos7快照(需关机)
virsh snapshot-delete centos7 1738238979 # 删除centos7的1738238979快照
7. 链接克隆与完整复制
1. 手动克隆虚拟机
qemu-img convert -f qcow2 -O qcow2 -c test.qcow2 web1.qcow2 # 以test.qcow2磁盘为模板创建web1.qcow2磁盘
virsh dumpxml centos7 > vm_web1.xml # 导出centos7的配置文件到vm_web1.xml中
vim vm_web1.xml # 修改name,删除uuid,删除mac address,修改磁盘
virsh define vm_web1.xml # 导入vm_web1.xml
2. 自动克隆
virt-clone -o web1 -n web2 --auto-clone # 以web1为模板自动克隆web2
3. 链接克隆
qemu-img create -f qcow2 -b web2.qcow2 web3.qcow2 # 以web2为目标链接克隆web3磁盘
virsh dumpxml web2 > vm_web3.xml # 将web2配置导入vm_web3.xml中
vim vm_web3.xml # 修改vm_web3.xml(名称,磁盘;删除uuid,mac)
virsh define vm_web3.xml # 导入vm_web3.xml
链接克隆脚本
#!/bin/bash
old_vm=$1
new_vm=$2
# 生成磁盘文件
old_vm_disk=`virsh dumpxml web2 | grep 'source file' | awk -F "'" '{print $2}'`
disk_path=`dirname $old_vm_disk`
qemu-img create -f qcow2 -b $old_vm_disk ${disk_path}/${new_vm}.qcow2
# 生成配置文件
virsh dumpxml $old_vm > /tmp/${new_vm}.xml
# 修改新vm配置文件
# 修改名称
sed -ri "s#(<name>)(.*)(<\/name>)#\1${new_vm}\3#g" /tmp/${new_vm}.xml
# 删除vm uuid
sed -i '/<uuid>/d' /tmp/${new_vm}.xml
# 删除mac
sed -i '/<mac address>/d' /tmp/${new_vm}.xml
# 修改磁盘
sed -ri "s#(<source file='>)(.*)('/>)#\1${disk_path}/${new_vm}.qcow2\3#g" /tmp/${new_vm}.xml
# 导入新vm
virsh define /tmp/${new_vm}.xml
# 开启vm
virsh start $new_vm
8. KVM虚拟机的桥接网络
创建桥接网卡
virsh iface-bridge ens160 br0 # 创建桥接网络
virsh iface-unbridge br0 # 取消桥接网卡
新虚拟机使用桥接模式
# 默认NAT模式
virt-install --virt-type kvm --os-type=linux --os-variant rhel7.0 --name centos7 --memory 2048 --vcpus 2 --disk /opt/centos1.raw,format=raw,size=5 --cdrom /opt/CentOS-7-x86_64-Minimal-2003.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
# 桥接模式
virt-install --virt-type kvm --os-type=linux --os-variant rhel7.0 --name centos7_2 --memory 2048 --vcpus 2 --disk /opt/centos7_2.raw,format=raw,size=5 --cdrom /opt/CentOS-7-x86_64-Minimal-2003.iso --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
修改现有虚拟机使用桥接模式
<interface type='bridge'>
<source bridge='br0'/>
常见问题
1. libvirtd服务报错 internal error: Failed to start QEMU binary /usr/libexec/qemu-kvm for probing: qemu-kvm: cannot initialize crypto: Unable to initialize gcrypt
解决方法:
yum upgrade libgcrypt -y
2. centos8 vnc连接时需要关闭防火墙
systemctl stop firewalld