Transfer sparse files under Linux


The main idea of this is :

We have bare-metal server A and we want to copy the virtual machine from A to bare-metal server B. If the virtual machine is 80GB and the connectivity between the two servers is 1GB the transfer will be ready for 20 minutes.

If our virtual machine is 1GB big, the transfer will still take so much because we will transfer all 80GB – 79GB of which zeros.

In this post I will share a way with tar how to avoid this annoying transfer of redundant data to sparse files.

Create a sparse file

For the test, I created a virtual machine with a size of 80GB hard drive :

stat vm-101-disk-1.qcow2
File: vm-101-disk-1.qcow2
Size: 85912715264 Blocks: 26008 IO Block: 4096 regular file
Device: fd02h/64770d Inode: 46792713 Links: 1
Access: (0640/-rw-r-----) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2018-09-12 09:30:28.543834708 +0300
Modify: 2018-09-12 09:29:06.787111495 +0300
Change: 2018-09-12 09:29:06.787111495 +0300
Birth: -

ls -lah shows me this :

ls -lha vm-101-disk-1.qcow2
-rw-r----- 1 root root 81G Sep 12 09:29 vm-101-disk-1.qcow2

But du -sh shows the real size :

du -sh vm-101-disk-1.qcow2
13M vm-101-disk-1.qcow2

Transfer sparse file

Standard copy modes – cp or scp will copy all 80GB :

scp vm-101-disk-1.qcow2
vm-101-disk-1.qcow2 0% 603MB 83.5MB/s 16:13 ETA

ETA (Estimated time of arrival) is 16-17 minutes.

However, the actual file size is 13M ?!??!? – 16minutes??? 🙂

Here’s how we can avoid this with the help of tar!

tar cvSzf - vm-101-disk-1.qcow2 | ssh 'cd /var/lib/vz/ ; tar xzf -'

The main idea is :

  • c – create archive
  • v – verbose
  • S – sparse – the solution of our problem! – (Handle sparse files efficiently)
  • z – gzip
  • f – name of the file
  • x – extract the archive

Now our file vm-101-disk-1.qcow2 which is 80GB with real size of 13MB will be copied to the bare-metal server B for a second 🙂

This is very useful for distant bare-metal servers with big virtual machines!

PS. it is very important to follow the tar sequence to avoid deleting our file.

Thanks to @Румен for the idea!