However, sometimes the virtual disk size of the image exceeds the disk size of a flavor, even for the same type of flavor of the original VM instance. This is because the created snapshot includes more than the main partition (/dev/sda1, /dev/sda2, ...) so that the total amount of disk exceeds the disk size of the original flavor.
Admin can change the size of these disk images using guestfish and virt-resize tools in guestfs library. Expanding disk size is easy, but shrinking is a bit more complicated. Follow this guideline to shrink the virtual size of OpenStack image files, or any image supported by guestfs.
1. Check the image detail
$ qemu-img info ./disk.imgfile format: qcow2
virtual size: 11G (11811160064 bytes)
disk size: 2.0G
cluster_size: 65536
=> This image needs 11 GB disk size of a flavor, while the actual disk size is only 2.0G.
We will change the virtual size of 11 G to 5 G, so that it can be deployed in a smaller VM flavor.
2. Install guestfs-tools and lvm2
$ yum install lvm2 lib libguestfs-tools
If you're running this on a dedicated Glance server without libvirt, change the setting to bypass libvirt back-end:
$ export LIBGUESTFS_BACKEND=direct
If you're running this on a dedicated Glance server without libvirt, change the setting to bypass libvirt back-end:
3. Check the detailed partition info of the image.
$ virt-filesystems --long --parts --blkdevs -h -a ./disk.img
Name Type MBR Size Parent
/dev/sda1 partition 83 10G /dev/sda
/dev/sda2 partition 83 512M /dev/sda
/dev/sda device - 11G -
$ virt-df ./disk.img
Filesystem 1K-blocks Used Available Use%
disk.img:/dev/sda1 5016960 1616912 3383664 33%
=> /dev/sda1 is the main partition and used only ~2 GB. This partition will be resized to 4G, which will make the total size of the image 5G.
Note that the size of main partition must be less than the intended size of the image even if there is only one partition. For example, if you want to make 5G image, the size of /dev/sda1 must be less than 5G, like 4G or 3.5G.
4. Use guestfish for resizing
It is good idea to make a back up before proceeding, because the following commands may harm the image partition.
$ guestfish -a ./disk.img
><fs> run
><fs> list-filesystems
...
><fs> e2fsck-f /dev/sda1
><fs> resize2fs-size /dev/sda1 4G
><fs> exit
=> This changes only metadata, and does not apply to the actual image data yet.
=> Again, the size of /dev/sda1 must be smaller than the intended size of the entire image. We set 4G here, thus the final image can be 5G.
5. Use virt-resize for actual resizing.
First, you have to create an empty image to copy the shrunk image. Please specify the size of the entire image here.
$ qemu-img create -f qcow2 -o preallocation=metadata newdisk.qcow2 5G
Once the new image file is created, use virt-resize command to copy the data from old file to new image file.
$ virt-resize --shrink /dev/sda1 ./disk.img ./newdisk.qcow2
Now, you have a new image file with the same content of the old image. /dev/sda1 will be shrunk as well as extended to fill up the empty size of the newdisk.qcow2 image file. In this example, /dev/sda1 will become 4.5G at the end, because the rest of 5G image will be occupied by this partition.
6. Check the size and partition information of the new image.
$ qemu-img info ./newdisk.qcow2
file format: qcow2
virtual size: 5.0G
disk size: 1.9G
cluster_size: 65536
$ virt-filesystems --long --parts --blkdevs -h -a ./newdisk.qcow2
Name Type MBR Size Parent
/dev/sda1 partition 83 4.5G /dev/sda
/dev/sda2 partition 83 512M /dev/sda
/dev/sda device - 5.0G -
$ virt-df ./newdisk.qcow2
Filesystem 1K-blocks Used Available Use%
newdisk.qcow2:/dev/sda1 5522976 1616912 3889680 30%
The new image file cannot be recognised by OpenStack if you just swap the image file. It will generate an error message "Not authorized for image ....." when you create a VM with the image.
Instead of swapping the image file, use OpenStack command to register the new image.
$ openstack image create --disk-format qcow2 --container-format bare --private --file ./newdisk.qcow2 My_Image_Shrunk
=> This command will add the new image file as "My_Image_Shrunk" image, which can be used to create a new instance.
7. Shrink the image file size
If the image file is too big, it is possible to reduce the size of the disk by using qemu-img util.
$ qemu-img convert -O qcow2 ./newdisk.qcow ./newdisk2.qcow
8. Upload the new image to OpenStack
The new image file cannot be recognised by OpenStack if you just swap the image file. It will generate an error message "Not authorized for image ....." when you create a VM with the image.Instead of swapping the image file, use OpenStack command to register the new image.
$ openstack image create --disk-format qcow2 --container-format bare --private --file ./newdisk.qcow2 My_Image_Shrunk
=> This command will add the new image file as "My_Image_Shrunk" image, which can be used to create a new instance.
No comments:
Post a Comment