In this article ,we will see that how to add new virtual disk or LUN to the KVM guest and how to resize the existing virtual disk on active domain/guest. This operations can be carried out on fly without any downtime to the guest operating system. KVM supports both physical LUN mapping and virtual disk mapping to the guests. In an order to map the virtual disk , we need to create the virtual disk image file using qemu-img command and disk format can be either “img” or “qcow2”. You can also create the non-sparse image file using legacy “dd” command.
Environment: RHEL 7 KVM Hypervisor
Mapping SAN or SCSI Disks to the KVM Guests:
1.Login to the KVM hypervisor host as root user.
2. Assume that we got “/dev/sdb” LUN from SAN storage to the hypervisor node.
3.List the running virtual machine using virsh command.
[root@UA-HA ~]# virsh list Id Name State ---------------------------------------------------- 32 UAKVM2 running [root@UA-HA ~]#
4. Identify the existing device mapping for the UAKVM2 guest.
[root@UA-HA ~]# virsh domblklist UAKVM2 --details Type Device Target Source ------------------------------------------------ file disk vda /var/lib/libvirt/images/UAKVM2.qcow2 block cdrom hda - [root@UA-HA ~]#
5. Attach the LUN to UAKVM2 virtual KVM guest as vdb device.
[root@UA-HA ~]# virsh attach-disk UAKVM2 --source /dev/sdb --target vdb --persistent Disk attached successfully [root@UA-HA ~]#
6. verify our work.
[root@UA-HA ~]# virsh domblklist UAKVM2 --details Type Device Target Source ------------------------------------------------ file disk vda /var/lib/libvirt/images/UAKVM2.qcow2 block disk vdb /dev/sdb block cdrom hda - [root@UA-HA ~]#
7. Login to UAKVM2 KVM guest and check the newly assigned disk.
[root@UA-KVM1 ~]# fdisk -l /dev/vdb Disk /dev/vdb: 536 MB, 536870912 bytes, 1048576 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes [root@UA-KVM1 ~]#
We have successfully mapped “/dev/sdb” SAN LUN to the KVM guest on fly.
Add new virtual Disk to the KVM Guests:
To map the virtual disk to KVM host,
- Create the new virtual disk using qemu-img command.
- Attach the virtual disk to the guest domain.
1. Login to UAKVM2 and list the attached disks.
[root@UA-KVM1 ~]# fdisk -l |grep vd |grep -v Linux Disk /dev/vda: 4294 MB, 4294967296 bytes, 8388608 sectors Disk /dev/vdb: 536 MB, 536870912 bytes, 1048576 sectors [root@UA-KVM1 ~]#
2. Login to the KVM hypervisor .
3. Create new virtual disk using qemu-img command.
[root@UA-HA images]# cd /var/lib/libvirt/images [root@UA-HA images]# qemu-img create -f qcow2 UAKVM2.disk2.qcow2 1G Formatting 'UAKVM2.disk2.qcow2', fmt=qcow2 size=1073741824 encryption=off cluster_size=65536 lazy_refcounts=off [root@UA-HA images]#
Note: Storage pool path will not be same on all the environments.
You can also create the virtual disks in following methods.
- Raw format with thin provisioning:
[root@UA-HA images]# qemu-img create -f raw UAKVM2.disk3.img 256M Formatting 'UAKVM2.disk3.img', fmt=raw size=268435456 [root@UA-HA images]#
- Raw format with thick provisioning: (Provides Better Performance since it’s pre-allocated storage)
[root@UA-HA images]# dd if=/dev/zero of=UAKVM2.disk4.img bs=1M count=1000 1000+0 records in 1000+0 records out 1048576000 bytes (1.0 GB) copied, 14.6078 s, 71.8 MB/s [root@UA-HA images]#
See the virtual disk size in the storage pool.
[root@UA-HA images]# du -sh UAKVM2.disk* 196K UAKVM2.disk2.qcow2 --- qcow2 formatted virtual disk file (thin) 0 UAKVM2.disk3.img --- raw formatted virtual disk file (thin) 1000M UAKVM2.disk4.img --- raw formatted virtual disk file using dd command. [root@UA-HA images]#
4. Attach the virtual disk to the KVM guest.
[root@UA-HA images]# virsh attach-disk UAKVM2 --source /var/lib/libvirt/images/UAKVM2.disk2.qcow2 --target vdc --persistent Disk attached successfully [root@UA-HA images]#
5. Verify our work.
[root@UA-HA images]# virsh domblklist UAKVM2 --details Type Device Target Source ------------------------------------------------ file disk vda /var/lib/libvirt/images/UAKVM2.qcow2 block disk vdb /dev/sdb file disk vdc /var/lib/libvirt/images/UAKVM2.disk2.qcow2 block cdrom hda - [root@UA-HA images]#
6. Login to the virtual guest (UAKVM2) and check the newly added disk.
[root@UA-KVM1 ~]# fdisk -l /dev/vdc Disk /dev/vdc: 1073 MB, 1073741824 bytes, 2097152 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes [root@UA-KVM1 ~]#
We have successfully created the virtual disks and present to the KVM guest on fly.
Resize existing virtual Disks on KVM:
1.Login to the Guest VM (UAKVM2) and identify which disk require to resize.
[root@UA-KVM1 ~]# df -h /orastage Filesystem Size Used Avail Use% Mounted on /dev/vdc 1014M 33M 982M 4% /orastage [root@UA-KVM1 ~]# mount -v |grep /orastage /dev/vdc on /orastage type xfs (rw,relatime,attr2,inode64,noquota) [root@UA-KVM1 ~]# [root@UA-KVM1 ~]# fdisk -l /dev/vdc Disk /dev/vdc: 1073 MB, 1073741824 bytes, 2097152 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes [root@UA-KVM1 ~]#
2. Login to the KVM hypervisor which hosts the VM
3. Identify the virtual disk mapping for the KVM guest.
[root@UA-HA ~]# virsh domblklist UAKVM2 --details Type Device Target Source ------------------------------------------------ file disk vda /var/lib/libvirt/images/UAKVM2.qcow2 block disk vdb /dev/sdb file disk vdc /var/lib/libvirt/images/UAKVM2.disk2.qcow2 block cdrom hda - [root@UA-HA ~]#
4. Refresh the KVM storage pool.
[root@UA-HA ~]# virsh pool-list Name State Autostart ------------------------------------------- default active yes [root@UA-HA ~]# [root@UA-HA ~]# virsh pool-refresh default Pool default refreshed [root@UA-HA ~]#
5. List the virtual disks using virsh-vol list command. (vdc = UAKVM2.disk2.qcow2)
[root@UA-HA ~]# virsh vol-list default Name Path ------------------------------------------------------------------------------ UAKVM2.disk2.qcow2 /var/lib/libvirt/images/UAKVM2.disk2.qcow2 UAKVM2.disk3.img /var/lib/libvirt/images/UAKVM2.disk3.img UAKVM2.disk4.img /var/lib/libvirt/images/UAKVM2.disk4.img UAKVM2.qcow2 /var/lib/libvirt/images/UAKVM2.qcow2 [root@UA-HA ~]#
6. Use “qemu-monitor” to list the allocated block devices to “UAKVM2” domain.
[root@UA-HA ~]# virsh qemu-monitor-command UAKVM2 --hmp "info block" drive-virtio-disk0: removable=0 io-status=ok file=/var/lib/libvirt/images/UAKVM2.qcow2 ro=0 drv=qcow2 encrypted=0 bps=0 bps_rd=0 bps_wr=0 iops=0 iops_rd=0 iops_wr=0 drive-virtio-disk1: removable=0 io-status=ok file=/dev/sdb ro=0 drv=raw encrypted=0 bps=0 bps_rd=0 bps_wr=0 iops=0 iops_rd=0 iops_wr=0 drive-virtio-disk2: removable=0 io-status=ok file=/var/lib/libvirt/images/UAKVM2.disk2.qcow2 ro=0 drv=raw encrypted=0 bps=0 bps_rd=0 bps_wr=0 iops=0 iops_rd=0 iops_wr=0 drive-ide0-0-0: removable=1 locked=0 tray-open=0 io-status=ok [not inserted] [root@UA-HA ~]#
From the above command output, we can see that virtual disk “UAKVM2.disk2.qcow2” is mapped to drive-virtio-disk2.
7. Increase the virtual disk size and intimate the virtio driver about the changes. (Do not reduce the disk size !!!)
[root@UA-HA images]# virsh qemu-monitor-command UAKVM2 --hmp "block_resize drive-virtio-disk2 2G" [root@UA-HA images]#
8. Login to the KVM guest – UAKVM2 and check the “vdc” disk size.
[root@UA-KVM1 ~]# fdisk -l /dev/vdc Disk /dev/vdc: 2147 MB, 2147483648 bytes, 4194304 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes [root@UA-KVM1 ~]#
9. Extend the filesystem. My filesystem type is XFS.
[root@UA-KVM1 ~]# df -h /orastage Filesystem Size Used Avail Use% Mounted on /dev/vdc 1014M 33M 982M 4% /orastage [root@UA-KVM1 ~]# mount -v |grep /orastage /dev/vdc on /orastage type xfs (rw,relatime,attr2,inode64,noquota) [root@UA-KVM1 ~]# [root@UA-KVM1 ~]# xfs_growfs /orastage/ meta-data=/dev/vdc isize=256 agcount=4, agsize=65536 blks = sectsz=512 attr=2, projid32bit=1 = crc=0 finobt=0 data = bsize=4096 blocks=262144, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=0 log =internal bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 data blocks changed from 262144 to 1310720 [root@UA-KVM1 ~]# [root@UA-KVM1 ~]# df -h /orastage/ Filesystem Size Used Avail Use% Mounted on /dev/vdc 2.0G 33M 2.0G 1% /orastage [root@UA-KVM1 ~]#
We have successfully resized virtual size and intimated to virtio driver about the changes. No specific instructions required for the VM to see the new disk size.
Hope this article informative to you.
Cesar says
When you say “Do not reduce the disk size !!!” You put that at red, since its totally destructive and also you should show how to list the current size.