KVM虚拟化
KVM虚拟化
## [1、 kvm虚拟化管理软件的安装](#1) ## ## [2、安装一台KVM虚拟机](#2) ## ## [3、虚拟机virsh的日常管理和配置](#3) ## ## [4、KVM虚拟机开机自启和console控制台登录](#4) ## ## [5、kvm虚拟磁盘创建及格式转换](#5) ## ## [6、快照管理](#6) ## ## [7、KVM虚拟机克隆](#7) ## ## [8、kvm虚拟机的桥接网络](#8) ## ## [9、热添加技术](#9) ## ## [10、KVM热迁移](#10) ##
**KVM全称:Kernel-based Virtual Machine ( 基于内核的虚拟机 ) **
前提:
1. 查看是否开启CPU虚拟化
在宿主机下输入: dmesg | grep kvm,输出为:kvm: no hardware support 表示未开启CPU虚拟化,需要在物理 机上打钩,即执行步骤2
2. 在关机状态下,启用cpu虚拟化
编辑虚拟机设置 --> 处理器 --> 将 虚拟化Inter VT -xEPT 或 AMD-V/RVI(V) 选项打钩
3. 开启CPU虚拟化服务
开启:modprobe kvm
检查:cat /proc/cpuinfo |grep vmx # 查看是否有“vmx”,有则表示开启成功
4. 加载KVM内核模块
执行:modprobe kvm-intel
检查:lsmod | grep kvm
结果如下,则表示加载成功:
[root@kvm ~]# lsmod | grep kvm
kvm_intel 183737 0
kvm 615914 1 kvm_intel
irqbypass 13503 1 kvm
1、 kvm虚拟化管理软件的安装
yum install libvirt virt-install qemu-kvm -y
安装说明:
libvirt:虚拟机的管理软件,可以管理KVM、xen、qemu、lxc...
virt-instal: 虚拟机的安装工具和克隆工具
qemu-kvm qemu-img (qcow2,raw):管理虚拟机的虚拟磁盘
各种虚拟化软件:
qemu 软件纯模拟全虚拟化软件,特别慢!AIX,兼容性好!
xen(半) 性能特别好,需要使用专门修改之后的内核,兼容性差! redhat 5.5 xen
KVM(linux) 全虚拟机,它有硬件支持cpu,基于内核,而且不需要使用专门的内核,性能较好,兼容较好
2、安装一台KVM虚拟机
准备:
本地:分发软件TightVNC或者VNC Viewer 4.exe
宿主机: vnc 远程的桌面管理工具 # 宿主机就是虚拟机所依赖的主机,我的宿主机IP:10.0.0.200
启动虚拟机管理软件 :systemctl start libvirtd.service
启动:systemctl start libvirtd.service
停止:systemctl stop libvirtd.service
查看:systemctl status libvirtd.service
开机自启动:systemctl enable libvirtd.service
上传镜像:
/opt/CentOS-7-x86_64-DVD-1810.iso
### 这是我设置的路径,其他路径也可以,但建议不要放在root下,防止访问时权限不够而出现 Permission denied
安装KVM:( 建议虚拟机内存不要低于1024M,否则安装系统特别慢!)
执行:
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name centos7 --memory 1024 --vcpus 1 --disk /opt/centos2.raw,format=raw,size=10 --cdrom /opt/CentOS-7-x86_64-DVD-1810.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
参数说明:
--virt-type kvm 虚拟化的类型(qemu)
--os-type=linux 系统类型
--os-variant rhel7 系统版本
--name centos7 虚拟机的名字
--memory 1024 虚拟机的内存
--vcpus 1 虚拟cpu的核数
--disk /opt/centos2.raw,format=raw,size=10 硬盘位置,存储格式,硬盘大小
--cdrom /opt/CentOS-7-x86_64-DVD-1810.iso 光驱路径/镜像路径(根据实际镜像路径配置)
--network network=default 使用默认NAT的网络 使用宿主机IP
--graphics vnc,listen=0.0.0.0
--noautoconsole
磁盘格式:
raw: 不支持做快照,性能好
qcow2: 支持快照
安装一台KVM虚拟机相当于创建2个文件:
磁盘文件:--disk /opt/centos2.raw,format=raw,size=10 硬盘位置,存储格式,硬盘大小
配置文件:/etc/libvirt/qemu/虚拟机名.xml
-
安装成功标志:
Starting install... Allocating 'centos2.raw' | 10 GB 00:00:00 Domain installation still in progress. You can reconnect to the console to complete the installation process.
-
安装过程如果报错如下:
ERROR Network not found: no network with matching name 'default' Removing disk 'centos2.raw' | 0 B 00:00:00 Domain installation does not appear to have been successful. If it was, you can restart your domain by running: virsh --connect qemu:///system start centos7 otherwise, please restart your installation.
则表示找不到默认网络配置文件,解决办法:https://wiki.libvirt.org/page/Networking
安装成功后,使用VNC连接,10.0.0.200:5900(vnc默认端口为5900)
系统安装:
连接成功后,使用上下键选择 Install Centos7,回车,开始系统安装!
系统语言使用默认英文,无需改变,直接下一步
①、配置 DATE & TIME:
②、配置 Kdump:
Kdump是个内核奔溃备份机制,需要占用内存
这里显示要占用160M,如果给虚拟机分配的内存很大,则可以勾选,否则不建议勾选:
③、选择网络和主机 (network & host name)
④、选择分区(Installation Destination)
然后点击 Installation 开始安装,安装过程中必须设置 root 密码
总结:
一、语言:
选择默认(英语)
二、系统配置:
1、修改时区
2、关闭Kdump
3、网卡开机启动
4、手动分区:只要一个标准根分区
三、开始安装:
设置root密码
四、安装完成点击reboot重启
3、虚拟机virsh的日常管理和配置
-列表 list(--all)
virsh list : 只列出正在运行的虚拟机
virsh list --all : 列出所有虚拟机
-开机 start
virsh start 虚拟机名
-关机 shutdown
virsh shutdown 虚拟机名
-拔电源关机 destroy
virsh destroy 虚拟机名
-删除 define
virsh undeine 虚拟机名
推荐:先destroy,在undefine
-导出配置dumpxml(默认导出是xml格式文件)
eg:virsh dumpxml centos7 >centos7-off.xml
-导入配置define
eg:virsh define centos7-off.xml
-重命名 domrename (低版本不支持)
virsh domrename 虚拟机名
-挂起 suspend
virsh suspend 虚拟机名
-恢复挂起 resume
virsh resume 虚拟机名
-查询vnc端口号 vncdisplay (默认第一个虚拟机端口是0,第二个是1,第三个是2,...一次类推)
virsh vncdisplay 虚拟机名
4、KVM虚拟机开机自启和console控制台登录
- 设置开机启动:
前提:将libvirtd服务设置为开机启动 systemctl enable libvirtd.service
KVM开机启动:virsh autostart 虚拟机名
取消开机启动:virsh autostart --disable 虚拟机名
ps:
1、设置开启动后会在 /etc/libvirt/qemu/ 下生成一个autostart文件夹
2、在autostart下会生成一个软连接:虚拟机名.xml 指向配置文件
centos7.xml -> /etc/libvirt/qemu/centos7.xml
3、我们也可以为虚拟机手动创建一个指向该虚拟机配置文件的软连接,使得该虚拟机可以开机自启
ln -s /etc/libvirt/qemu/web01.xml /etc/libvirt/qemu/autostart/
- 设置console控制台登录:
在虚拟机上执行以下命令来开启console登录:(宿主机无需做修改)
grubby --update-kernel=ALL --args="console=ttyS0,115200n8" # 修改内核参数
reboot
在虚拟机上进行修改时,需要手动输入上述命令,或者vim 编辑 /boot/grub2/grub.cfg 文件,100行左右
此时虚拟机是无法进行粘贴辅助,我们可以通过宿主机ssh到虚拟机,然后进行修改(ip a 进行查看虚拟机ip)
ssh 虚拟机ip
在虚拟机上进行修改时,需要手动输入上述命令,或者vim 编辑 /boot/grub2/grub.cfg 文件,100行左右,此时虚拟机 是无法进行粘贴辅助,我们可以通过宿主机ssh到虚拟机,然后进行修改(ip a 进行查看虚拟机ip),如下:
[root@kvm autostart]# ssh 192.168.122.235
The authenticity of host '192.168.122.235 (192.168.122.235)' can't be established.
ECDSA key fingerprint is SHA256:WS7XFnasPFwRohib6B+m7V6z9+5Pkh5IaornITRGGWo.
ECDSA key fingerprint is MD5:7a:9c:33:0e:ab:c1:a0:2f:d3:a9:96:71:d6:c1:c6:79.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.122.235' (ECDSA) to the list of known hosts.
root@192.168.122.235's password:
Last login: Sat Jun 8 17:42:58 2019
[root@localhost ~]#
[root@localhost ~]# grubby --update-kernel=ALL --args="console=ttyS0,115200n8"
[root@localhost ~]#
[root@localhost ~]# reboot
Connection to 192.168.122.235 closed by remote host.
Connection to 192.168.122.235 closed.
-
设置成功后,在宿主机上通过命令登录虚拟机 :
virsh console 虚拟机名
5、kvm虚拟磁盘创建及格式转换
查看磁盘信息:qemu-img info 磁盘名
2种磁盘格式比较:
raw:裸格式,占用空间比较大,不支持快照功能,性能较好,不方便传输 总50G 占用2G,但传输还是要传50G
qcow2:占用空间小,支持快照,性能比raw差一点,方便传输 总50G 占用2G,传输只传2G
qcow2全称:
q:qemu
cow:copy on write 写时复制(用多少,分配多少)
创建一块qcow2格式的虚拟硬盘:
创建一块qcow2格式的虚拟硬盘:
qemu-img create -f qcow2 centos2.qcow2 10G
-f qcow2 : 声明创建的磁盘文件格式为qcow2格式,如果不写,则默认创建raw格式的磁盘文件
10G : 声明创建的磁盘文件的大小
磁盘扩容:磁盘容量只能扩容,不能缩减,缩减很有可能会丢失数据
qemu-img resize /data/centos2.qcow2 +20G
+20G: 从原来的容量上增加20G
20G:将容量扩容到20G,不加"+"表示扩容到x,这里的x要大于原本容量
磁盘格式转换
qemu-img convert -f raw -O qcow2 oldboy.raw oldboy.qcow2
convert [-f fmt] [-O output_fmt] filename output_filename
转换 原格式 输出格式 源文件路径 输出文件路径
# 上述命令执行完成后,相当于转换成了一个新格式的磁盘文件,源文件并没有动,(相当于我们将word转换成pdf,会新 产 生一个文件)
# 此时,KVM使用的还是原来的磁盘文件,我们需要修改配置文件的磁盘信息(修改配置信息,在关机状态下修改)
virsh destroy web01
virsh edit web01:
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/> # 将文件格式由raw修改为qcow2
<source file='/opt/centos.qcow2'/> # 将文件路径修改为转换后的文件路径
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</disk>
virsh start web01
6、快照管理
创建快照virsh snapshot-create centos7 (这种方式创建的快照,以当前的时间戳作为快照名)
自定义快照名创建快照:virsh snapshot-create-as --name 快照名 centos7
查看快照virsh snapshot-list centos7
还原快照virsh snapshot-revert centos7 --snapshotname 快照名
删除快照virsh snapshot-delete centos7 --snapshotname 快照名
1、raw不支持做快照,qcow2支持快照,并且快照就保存在qcow2的磁盘文件中
2、由于qcow2属于用多少空间,分配多少,但当我们把快照删除后,分配给快照的空间不会自动回收
3、如果要回收空余的空间,可使用:
qemu-img convert -c -f qcow2 -O qcow2 oldboy.qcow2 oldboy.qcow2 # -c 表示压缩
7、KVM虚拟机克隆
-
完整克隆
virt-clone --auto-clone -o web01 -n web02 # 必须在关机或挂起状态进行克隆,否则会报错
-
链接克隆(依赖基础磁盘文件,把变化的内容保存在一个新的qcow2文件中)
a:生成虚拟机磁盘文件 qemu-img create -f qcow2 -b /data/centos2.qcow2 /data/centos3.qcow2 # -b表示创建的是链接磁盘 b:生成虚拟机的配置文件 b1:先复制一份虚拟机的配置文件 cp /etc/libvirtd/qemu/centos7.xml /etc/libvirtd/qemu/centos7_link.xml b2: 修改配置 <name>49-web03</name> # 修改name <uuid>8e505e25-5175-46ab-a9f6-feaa096daaa4</uuid> # 删除掉uuid,重启会自动生成 <source file='/opt/49-web03.qcow2'/> #修改路径 <mac address='52:54:00:4e:5b:89'/> # 删除mac地址,重启会自动生成 c:导入虚拟机并进行启动测试 导入:virsh define /etc/libvirtd/qemu/centos7_link.xml 启动:virsh start 虚拟机名 #这里的虚拟机名是我们在配置文件中修改name后的名称 ps: 写一个脚本,实现自动化链接克隆
8、kvm虚拟机的桥接网络
检查虚拟机网络状况,是否能上网?
从虚拟机ping外网:ping baidu.com ,发现不通
从宿主机ping外网:可以通
总结:当虚拟机将数据包转发给宿主机时,宿主机没有转发到外网,说明宿主机没有开启内核转发参数
解决:开启内核转发参数即可
开启:sysctl net.ipv4.ip_forward = 1
关闭:sysctl net.ipv4.ip_forward = 0
为什么要为虚拟机创建桥接网络?
- 当我们通过外网访问虚拟机时,时无法直接访问的,需要做端口映射
- 当虚拟机数量较大时,端口映射的方式也不适合,所以需要用到桥接网络,使得可以通过外网直接访问虚拟机
设置桥接网络
创建桥接网卡(创建完成后建议重启网卡)
virsh iface-bridge eth0 br0 # 取消桥接网卡 virsh iface-unbridge br0
- 新建桥接网络的虚拟机
1、创建链接磁盘:
qemu-img create -f qcow2 -b /data/server1.qcow2 /data/server2.qcow2
2、安装虚拟机:
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web04 --memory 1024 --vcpus 1 --disk /data/web04.qcow2 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
3、检查
查看虚拟机ip是否是dhcp动态分配的ip,如果是,则表示创建成功!
ps: 如果 ping 不通 dhcp 的网关,建议重启网卡:systemctl restart network=-0 (不行就多重启几次网卡)
- 将nat模式的虚拟机修改为桥接模式
1、修改配置文件:
<interface type='bridge'> # 将原来的type='network' 改为 type='bridge'
<mac address='52:54:00:55:aa:fa'/>
<source bridge='br0'/> # 将原来的network='default' 改为 bridge='br0'
2、在宿主机上,重启虚拟机生效
virsh destroy 虚拟机名 # 线上环境建议使用shutdown平滑关机
virsh start 虚拟机名
3、检查
查看虚拟机ip是否是dhcp动态分配的ip,如果是,则表示创建成功!
ps: 如果 ping 不通 dhcp 的网关,建议重启网卡:systemctl restart network=-0 (不行就多重启几次网卡)
9、热添加技术
KVM热添加硬盘
1、宿主机-创建一块硬盘
qemu-img create -f qcow2 /data/server1_add.qcow2 10G
2、宿主机-添加硬盘到虚拟机 (临时和永久都执行)
临时生效
virsh attach-disk server1 /data/server1_add.qcow2 vdb --subdriver qcow2
永久生效
virsh attach-disk server1 /data/server1_add.qcow2 vdb --subdriver qcow2 --config
参数说明:
attach-disk:添加硬盘
web04:虚拟机名 (要指定给哪台虚拟机添加硬盘)
/opt/oldboy.qcow2:要添加的磁盘路径 (这块磁盘要事先创建好,所以第1步便是创建硬盘)
vdb:盘符名称 (通过 fdisk -l 命令查看虚拟机已存在的盘符,新添加的盘符不能和已存在的相同)
--subdriver qcow2 : 指定所添加的盘符类型为qcow2格式,不指定则默认添加的是raw格式
3、虚拟机-格式化硬盘
mkfs.xfs /dev/vdb # 格式化dev下的vdb盘
4、虚拟机-挂载
mount /dev/vdb /mnt
5、虚拟机-查看
df -h
6、虚拟机-测试往里面写东西
cp /etc/service /mnt
-
KVM扩容硬盘
1、虚拟机-卸载盘符 (保证其他人不能再往该盘符写内容) umount /mnt 2、宿主机-剥离硬盘 virsh detach-disk server1 vdb # 剥离硬盘 虚拟机名 盘符名称 3、宿主机-扩容硬盘 qemu-img resize /data/server1_add.qcow2 +20G 4、宿主机-添加硬盘到虚拟机 (临时和永久都执行) 临时生效(立即生效即可,因为该盘符本来就存在,无需永久生效) virsh attach-disk server1 /data/server1_add.qcow2 vdb --subdriver qcow2 5、虚拟机-挂载盘符 (扩容不能格式化硬盘,否则原本的数据会丢失) mount /dev/vdb /mnt 但此时我们用df -h 查看磁盘空间,发现vdb还是原本的大小,并没有扩容。原因是该盘符在最初被创建、格式化的时候,系统会分配Inode和block,此时该盘符所剩余的空间已经确定了。当我们进行扩容后,该盘符的信息还是最初格式化时的信息,所以该盘符能管理的空间还是原本大小,Inode和block没有改变。所以vdb还是原本的大小。为了解决上述问题,系统提供了一个命令:xfs_growfs ,用来重新调整 Inode 和 block,见步骤6 6、重新调整盘符的 Inode 和 block xfs_growfs /dev/vdb # 也可以将 /dev/vdb 换成 /mnt
-
重新调整盘符的 Inode 和 block
在上面我们使用 xfs_growfs 来调整符的 Inode 和 block,这是因为该盘符的文件系统是 xfs
查看盘符的文件系统类型; [root@localhost ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/vda1 xfs 10G 1.1G 9.0G 11% / devtmpfs devtmpfs 486M 0 486M 0% /dev tmpfs tmpfs 496M 0 496M 0% /dev/shm tmpfs tmpfs 496M 6.7M 489M 2% /run tmpfs tmpfs 496M 0 496M 0% /sys/fs/cgroup tmpfs tmpfs 100M 0 100M 0% /run/user/0 /dev/vdb xfs 30G 34M 30G 1% /mnt
但如果是盘符的文件系统类型是 ex4、ext3、ext2, 我们扩容完成后,使用 resize2fs来调整盘符的 Inode 和 block
KVM在线热添加网卡
1、添加网卡
virsh attach-interface server1 bridge br0 --config # 网卡名以ens开头
virsh attach-interface server1 bridge br0 --model virtio # 网卡名以eth开头
参数说明:
attach-interface:添加接口/网卡
server1:虚拟机名
bridge:网卡类型
br0:网卡源,基于宿主机的哪个网卡创建
--config:将添加的网卡信息写入配置文件
--model: 添加的网卡名以eth开头,将网卡信息写入配置文件,并自动启动该网卡
2、剥离网卡
virsh detach-interface server1 bridge --mac 52:54:00:b7:6a:37
ps:
如果相同类型的网卡只有一块,则无需加 --mac区分
KVM在线热添加内存
前提:该内存是可以被扩容,即总最大内存比当前内存大,如下:
可以扩容:
<memory unit='KiB'>2097152</memory>
<currentMemory unit='KiB'>524288</currentMemory>
不可扩容:
<memory unit='KiB'>1048576</memory>
<currentMemory unit='KiB'>1048576</currentMemory>
1、创建内存可扩容的虚拟机
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name server3 --memory 512,maxmemory=2048 --vcpus 1 --disk /data/server3.qcow2 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
#1、这里新增了参数:maxmemory=2048
#2、虚拟磁盘需要提前创建好:
qemu-img create -f qcow2 -b /data/server1.qcow2 /data/server3.qcow2
2、设置内存
临时热添加内存
virsh setmem server3 1024M --live
永久增大内存
virsh setmem server3 1024M --config
参数说明:
setmem :设置内存,既可以扩容内存,也可以缩减内存
server3 :虚拟机名
1024M :设置内存大小
KVM在线热添加cpu
1、创建内存可扩容的虚拟机
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name server4 --memory 512,maxmemory=2048 --vcpus 1,maxvcpus=10 --disk /data/server4.qcow2 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
#1、这里新增了参数:maxvcpus=10
#2、虚拟磁盘需要提前创建好:
qemu-img create -f qcow2 -b /data/server1.qcow2 /data/server3.qcow2
#3、通过 lscpu 查看CPU数量
2、设置cpu核数
临时加cpu核数
virsh setvcpus server4 8 --live
永久添加cpu核数
virsh setvcpus server4 8 --config
10、KVM热迁移
详情见:https://www.qstack.com.cn/archives/368.html
注意:需要互相做好host解析
[root@nfs01 data]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.11 kvm01
10.0.0.12 kvm02
10.0.0.21 nfs21