kvm虚拟机可以在线添加cpu、磁盘、内存、网卡等资源,也可以在线迁移虚拟机,这边博文记录这些技术的实现方法。有两点需要注意:
- 这里主要操作是在web01虚拟机中进行,为了方便,我将它的网卡改成了桥接模式
- 根分区的扩容时需要关机的
热添加磁盘
为虚拟机添加一块磁盘的流程:
- 宿主机创建磁盘
- 宿主机将磁盘附加给虚拟机
- 虚拟机中格式化磁盘
- 虚拟机中挂载并使用磁盘
操作过程记录如下:
虚拟机磁盘初始状态
[root@web01 ~]# fdisk -lDisk /dev/vda: 10.7 GB, 10737418240 bytes, 20971520 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk label type: dosDisk identifier: 0x000b2376 Device Boot Start End Blocks Id System/dev/vda1 * 2048 20971519 10484736 83 Linux[root@web01 ~]# df -hFilesystem Size Used Avail Use% Mounted on/dev/vda1 10G 1.1G 9.0G 11% /devtmpfs 486M 0 486M 0% /devtmpfs 496M 0 496M 0% /dev/shmtmpfs 496M 6.7M 490M 2% /runtmpfs 496M 0 496M 0% /sys/fs/cgrouptmpfs 100M 0 100M 0% /run/user/0
宿主机操作
##创建磁盘[root@kvm1 opt]# qemu-img create -f qcow2 web01-add1.qcow2 5GFormatting 'web01-add1.qcow2', fmt=qcow2 size=5368709120 encryption=off cluster_size=65536 lazy_refcounts=off ##将磁盘附加给web01[root@kvm1 opt]# virsh attach-disk web01 /opt/web01-add1.qcow2 vdb --subdriver qcow2Disk attached successfully
web01上操作
###查看磁盘情况,发现已经添加了一块5g的磁盘[root@web01 ~]# fdisk -lDisk /dev/vda: 10.7 GB, 10737418240 bytes, 20971520 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk label type: dosDisk identifier: 0x000b2376 Device Boot Start End Blocks Id System/dev/vda1 * 2048 20971519 10484736 83 LinuxDisk /dev/vdb: 5368 MB, 5368709120 bytes, 10485760 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytes###格式化新磁盘[root@web01 ~]# mkfs.xfs /dev/vdb ###挂载新磁盘[root@web01 ~]# mkdir /add1[root@web01 ~]# mount /dev/vdb /add1/###测试新磁盘可用性[root@web01 ~]# cp /etc/hostname /add1/[root@web01 ~]# cat /add1/hostname web01
热添加磁盘容量(在线扩容)
紧接着上一节,在web01中操作,以扩容新增加的磁盘vdb为例,流程如下:
- web01中卸载磁盘
- 宿主机中把目标磁盘从web01中剥离
- 宿主机中更改磁盘容量
- 重新将磁盘附加给web01
- web01中重新挂载磁盘
- 刷新磁盘容量
- 测试磁盘可用性
操作记录如下:
web01中umount磁盘
[root@web01 ~]# df -h |grep add1/dev/vdb 5.0G 33M 5.0G 1% /add1[root@web01 ~]# umount /add1/[root@web01 ~]# umount /add1/umount: /add1/: not mounted
宿主机中操作
其中,剥离和重新附加操作,可以在web01中用fdisk -l命令验证效果,这里就不贴上来了。
###将磁盘从web01中剥离[root@kvm1 opt]# virsh detach-disk web01 /opt/web01-add1.qcow2 Disk detached successfully###更改磁盘大小[root@kvm1 opt]# qemu-img resize /opt/web01-add1.qcow2 +5GImage resized.###重新将磁盘附加到web01[root@kvm1 opt]# virsh attach-disk web01 /opt/web01-add1.qcow2 vdb --subdriver qcow2 Disk attached successfully
web01中重新挂载
[root@web01 ~]# mount /dev/vdb /add1/[root@web01 ~]# df -h|grep add1/dev/vdb 5.0G 33M 5.0G 1% /add1###将挂载写入配置文件,使永久生效[root@web01 ~]# echo "mount /dev/vdb /add1/">>/etc/profile
刷新磁盘容量
由上面df -h返回结果可知,挂载分区依然显示5G,但用fdisk -l查看时,实际上vdb磁盘的大小为10G。这是因为在格式化磁盘的时候,容量已经写到磁盘中了。
当然,我们可以重新格式化磁盘来解决这个问题,但这样做会丢失磁盘数据。正确的操作如下:
###刷新磁盘容量[root@web01 ~]# xfs_growfs /add1/###验证[root@web01 ~]# df -h|grep add1/dev/vdb 10G 33M 10G 1% /add1
磁盘添加及扩容永久生效
以上的配置的硬盘扩展,在重启虚拟机后就会丢失,想要永久生效,使下面命令:
[root@kvm1 opt]# virsh attach-disk web01 /opt/web01-add1.qcow2 vdb --subdriver qcow2 --config Disk attached successfully
这个命令中--config参数的作用,是把扩容相关的配置写入配置文件,可以查看web01的配置文件,发现以下内容被添加进来了
扩容根分区
扩容根分区需要在关闭虚拟机的时候进行,流程如下:
- 查找根分区对应的磁盘文件(web01中df -h查看/分区对应的分区,然后宿主机中通过查看web01配置文件得到这个分区对应的磁盘文件)
- 关闭web01
- 扩展目标磁盘文件
- 开启web01
- web01中修改磁盘分区表
- 重启web01
- 刷新分区容量
- 验证
操作记录如下(其中第一步确认磁盘文件就不贴上来了):
宿主机中扩展磁盘
[root@kvm1 opt]# virsh destroy web01###更改磁盘容量,注意:resize方法不支持包含快照的磁盘文件,这里我是将快照文件删除后重新执行的[root@kvm1 opt]# qemu-img resize /opt/centos.qcow2 +10G[root@kvm1 opt]# virsh start web01
web01中修改分区表
这是使用fdisk -l查看,vdb的真实容量是20G,但df -h查看挂载分区显示10G,使用命令xfs_grows /也无法刷新到正确的容量。这是因为根分区的容量是写在分区表中的,这是我们需要重新设置分区表,操作如下:
###直接n一路回车,然后w保存即可,有兴趣的话可以p查看初始和修改完毕后的分区信息[root@web03 ~]# fdisk /dev/vda#进入交互界面后操作如下p #显示当前分区信息d #删除分区n #创建分区,一路回车w #保存退出# 重启后操作
重启web01,刷新分区容量
重启web01后,df -h查看,根分区还是10G,这时再使用xfs_growfs /就可以刷新到正确的容量了。
[root@web01 ~]# xfs_growfs /[root@web01 ~]# df -h|grep -w //dev/vda1 20G 1.1G 19G 6% /
热添加网卡
热添加网卡的操作很简单,只需要在宿主机中执行一条命令即可,需要理解的是一个参数--model的作用。先看看添加网卡的操作,然后结合效果进行说明
[root@kvm1 opt]# virsh attach-interface web01 --type bridge --source br0[root@kvm1 opt]# virsh attach-interface web01 --type bridge --source br0 --model virtio
上面两条命令往web01中以不同模式分别添加了一块网卡,到web01中查看信息如下:
[root@web01 ~]# ip add show ens10 3: ens10:mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 52:54:00:c9:ce:4d brd ff:ff:ff:ff:ff:ff inet 10.0.0.143/24 brd 10.0.0.255 scope global noprefixroute dynamic ens10 valid_lft 1649sec preferred_lft 1649sec inet6 fe80::a17:42ec:19e:e9de/64 scope link noprefixroute valid_lft forever preferred_lft forever[root@web01 ~]# ip add show eth14: eth1: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 52:54:00:56:bb:59 brd ff:ff:ff:ff:ff:ff inet 10.0.0.144/24 brd 10.0.0.255 scope global noprefixroute dynamic eth1 valid_lft 1704sec preferred_lft 1704sec inet6 fe80::42e1:3c04:c56:69f5/64 scope link noprefixroute valid_lft forever preferred_lft forever
从上面可以看出,使用 --model virtio参数后,新添加的网卡会以eth前缀命名,这是表象,内在的,virtio是优化过的虚拟机网卡驱动,性能比默认的好。
添加网卡永久生效
和扩展分区一样,可以用--config参数使网卡扩展永久生效
[root@kvm1 opt]# virsh attach-interface web01 --type bridge --source br0 --model virtio --config[root@kvm1 opt]# virsh attach-interface web01 --type bridge --source br0 --config
查看配置文件,对比web01中ip add显示的网卡信息,会发现mac地址不一样,重启web01后,配置文件中的mac地址就应用到网卡了。
热添加内存和cpu
这两个技术,操作相似,也很简单,所以写在一起,他们的实现主要流程如下
使web01支持热添加内存
重新构建虚拟机,用参数指定最大内存
##web01关机、卸载[root@kvm1 ~]# virsh destroy web01[root@kvm1 ~]# virsh undefine web01###重新构建web01,注意:如果是按照我前几篇博客一路操作过来的,这里的web03是web01的链接克隆,也在使用web01的磁盘,所以要把web03也给关机并卸载,然后才能进行下面的操作[root@kvm1 ~]# virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web01 --memory 512,maxmemory=2048 --vcpus 1,maxvcpus=8 --disk /opt/centos.qcow2,format=qcow2,size=10 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole ###开机后查看状态[root@kvm1 ~]# virsh list Id Name State---------------------------------------------------- 10 web01 running
web01内存和cpu初始状态
[root@web01 ~]# free -m total used free shared buff/cache availableMem: 462 102 243 8 116 213Swap: 0 0 0[root@web01 ~]# lscpu|egrep -i "^cpu\(" CPU(s): 1
宿主机中对web01的内存和cpu扩容
[root@kvm1 ~]# virsh setmem web01 1G[root@kvm1 ~]# virsh setvcpus web01 3###使扩容永久生效[root@kvm1 ~]# virsh setmem web01 1G --config[root@kvm1 ~]# virsh setvcpus web01 3 --config
web01中验证
[root@web01 ~]# free -m total used free shared buff/cache availableMem: 974 103 753 8 118 722Swap: 0 0 0[root@web01 ~]# lscpu|egrep -i "^cpu\("CPU(s): 3