Skip to main content

Making KVM Image File Sparse with virt-sparsify

Sparse files use disk space more efficiently. Only metadata information is written to disk instead of the empty space that constitutes the block, using less disk space. Sparse term corresponds to thin-provisioned image in the VMware jargon. To sparsify a vm guest image first you shut the guest down. In my KVM Host there is a non-sparse kvm image file which is identified like this:

# ls -lsh
61G -rw-r--r-- 1 qemu qemu 60G Jun 22 08:15 SRVTEST01.img

As seen from the output of the ls command SRVTEST01.img guest image occupies all of the file. To make it sparse:

# virt-sparsify SRVTEST01.img SRVTEST01_SPARSED.img
qemu-img version 0.9
Input disk virtual size = 64424509440 bytes (60.0G)

WARNING: There may not be enough free space on /tmp.
You may need to set TMPDIR to point to a directory with more free space.
Max needed: 60.0G. Free: 12.5G. May need another 47.5G.

Note this is an overestimate. If the guest disk is full of data
then not as much free space would be required.
You can ignore this warning or change it to a hard failure using the
--check-tmpdir=(ignore|continue|warn|fail) option. See virt-sparsify(1).
Press RETURN to continue or ^C to quit.
^C

Oops. /tmp is not enough to create temporary files. Change TMPDIR variable:

# export TMPDIR=/vms01
# virt-sparsify SRVTEST01.img SRVTEST01_SPARSED.img
qemu-img version 0.9
Input disk virtual size = 64424509440 bytes (60.0G)
Create overlay file in /vms01 to protect source disk ...

Examine source disk ...
100% ⟦#############################################################⟧ 00:00
Fill free space in /dev/sda1 with zero ...
100% ⟦#############################################################⟧ --:--
Fill free space in /dev/vg_srvtest01/lv_home with zero ...
100% ⟦#############################################################⟧ --:--
Fill free space in /dev/vg_srvtest01/lv_root with zero ...
100% ⟦#############################################################⟧ 00:00
Clearing Linux swap on /dev/vg_srvtest01/lv_swap ...
100% ⟦#############################################################⟧ 00:00
Copy to destination and make sparse ...

Sparsify operation completed with no errors. Before deleting the old
disk, carefully check that the target disk boots and works correctly.

# sync
# ls -lsh
61G -rw-r--r-- 1 qemu qemu 60G Jun 22 08:15 SRVTEST01.img
8.4G -rw-r--r-- 1 qemu qemu 60G Jun 22 08:15 SRVTEST01_SPARSED.img

Now sparsed image occupies only 8.4G.

# virsh list --all
Id Name State
--------------------------------------------------
- SRVTEST01 shut off

# virsh dumpxml SRVTEST01 > /vms01/SRVTEST01_SPARSED.xml
# vi /vms01/SRVTEST01_SPARSED.xml
--Change all SRVTEST01 occurences to SRVTEST01_SPARSED in the xml file here--

# virsh create /vms01/SRVTEST01_SPARSED.xml
Domain SRVTEST01_SPARSED created from /vms01/SRVTEST01_SPARSED.xml

# virsh list --all
Id Name State
--------------------------------------------------
10 SRVTEST01_SPARSED running
- SRVTEST01 shut off

# virsh undefine SRVTEST01
Domain SRVTEST01 has been undefined

# virsh list --all
Id Name State
--------------------------------------------------
10 SRVTEST01_SPARSED running

That's all. If everything is ok and SRVTEST01_SPARSED is running then SRVTEST01.img can be deleted.

Comments

Popular posts from this blog

Creating Multiple VLANs over Bonding Interfaces with Proper Routing on a Centos Linux Host

In this post, I am going to explain configuring multiple VLANs on a bond interface. First and foremost, I would like to describe the environment and give details of the infrastructure. The server has 4 Ethernet links to a layer 3 switch with names: enp3s0f0, enp3s0f1, enp4s0f0, enp4s0f1 There are two bond interfaces both configured as active-backup bond0, bond1 enp4s0f0 and enp4s0f1 interfaces are bonded as bond0. Bond0 is for making ssh connections and management only so corresponding switch ports are not configured in trunk mode. enp3s0f0 and enp3s0f1 interfaces are bonded as bond1. Bond1 is for data and corresponding switch ports are configured in trunk mode. Bond0 is the default gateway for the server and has IP address 10.1.10.11 Bond1 has three subinterfaces with VLAN 4, 36, 41. IP addresses are 10.1.3.11, 10.1.35.11, 10.1.40.11 respectively. Proper communication with other servers on the network we should use routing tables. There are three

3 Node (Master Slave Slave) Redis Cluster with Sentinel

It is possible to make your Redis cluster Fault Tolerant and Highly Available by building a replica set and then monitor these nodes using sentinel for automatic failover. I am going to give an example setup to explain it. The structure is built with three nodes running one as a master and two as slaves. Master Node: (Centos 7.2) 192.168.1.11 Slave1 Node: (Centos 7.2) 192.168.1.12 Slave2 Node: (Centos 7.2) 192.168.1.13 Edit System settings on each node: /etc/sysctl.conf Disable transparent hugepage (transparent_hugepage=never) on each node: /etc/default/grub Apply grub config and reboot each node: Master Node: /etc/redis/6379.conf Slave1 Node: /etc/redis/6379.conf Slave2 Node: /etc/redis/6379.conf Master Node: /etc/redis/sentinel.conf Slave1 Node: /etc/redis/sentinel.conf Slave2 Node: /etc/redis/sentinel.conf Each Node: /etc/systemd/system/multi-user.target.wants/redis-server.service Each Node: /etc/