KVM og andre virtualiseringteknologier gør meget brug sparse-files, det drejer sig i bund og grund op at operativsystemet ikke allokerer mere plads på disken til den enkelte fil en der virkelig er behov for.
Det er smart når man gerne vil kunne tildele f.eks. 200GB til en virtual maskine for at fremtidssikre den, men reelt kun bruger 10-20GB.
root@kvm5:/var/kvm/images# du -h diskimage.qcow2
4.8G diskimage.qcow2
root@kvm5:/var/kvm/images# du -h --apparent-size diskimage.qcow2
200G diskimage.qcow2
Det kan dog godt overraske lidt når man vil forsøge at kopiere filerne fra en maskine til en anden og man forsøger at bruge et program der ikke understøtter sparse-files, for så kommer der pludselig en 200GB fil ud af det i den anden ende.
Hvis du allerede har gjort det, så kan de resparsifye den, hvis du er i tvivl kan du finde ud af det med qemu-img info:
root@kvm1:/var/kvm/images# qemu-img info diskimage.qcow2
image: diskimage.qcow2
file format: qcow2
virtual size: 50G (53687091200 bytes)
disk size: 52G
cluster_size: 65536
Snapshot list:
ID TAG VM SIZE DATE VM CLOCK
1 Snapshot #1 260M 2017-06-09 02:52:54 00:06:57.333
2 Snapshot #2 884M 2017-06-10 20:02:33 41:16:33.744
Format specific information:
compat: 1.1
lazy refcounts: true
refcount bits: 16
corrupt: false
Første metode, libguestfs-tools:
apt-get / yum install libguestfs-tols
Mit diskimage fyldte 53G før og 1.5G efter, og processen tog 14 minutter:
root@kvm1:/var/kvm/images# virt-sparsify diskimage.qcow2 diskimage-sparsed.qcow2
En anden mulighed:
root@kvm1:/var/kvm/images# cp --sparse=always diskimage.img diskimage-sparsed.img
Jeg har ikke undersøgt forskellen på de to metoder grundigt, primært fordi jeg hellere ville bruge tiden på at finde en mere effektiv måde at flytte filerne på.
Første forsøg, rsync:
root@kvm5:/var/kvm/images# rsync -avSP diskimage.qcow2 root@kvm1:/var/kvm/images
sending incremental file list
diskimage.qcow2
56,232,312,832 100% 92.89MB/s 0:09:37 (xfr#1, to-chk=0/1)
sent 56,246,041,528 bytes received 35 bytes 97,395,742.97 bytes/sec
total size is 56,232,312,832 speedup is 1.00
Overførslen tog cirka 10 minutter, hvilket er cirka det samme som som en almindelige scp-overførsel, men filen havde tilgengæld den “rigtige” størrelse på destinationen – men som det tydeligt fremgår overfører den faktisk samtlige 56G … dvs en masse “tomme bytes”.
Mit næste forsøg var med tar, som eftersigende skulle kunne håndtere sparse-filer og dermed kræve mindre båndbrede.
Andet forsøg, tar + ssh:
root@kvm5:/var/kvm/images# time tar -Scf - diskimage.qcow2 | pv | ssh kvm1 "cd /var/kvm/images && tar xf -"
3.59GiB 0:02:26 [25.1MiB/s] [ <=> ]
Overførslen tog pludselig kun 2,5 minutter – meget bedre, men der gik et minutstid før overførslen overhovedet gik igang, og den gennemsnitslige hastighed var også væsentligt lavere end med rsync. Så jeg gik i tænkebox, og vinderen blev
Tredie forsøg, cp + nfs:
Flere steder var jeg nemlig stødt på folk der lovpriste cp for at være effektiv med sparse filer og så tænkte jeg at såfremt det fungerede med nfs måtte det være måden at løse det på, og guess what, det fungerede:
root@kvm5:/var/kvm/images# mount kvm1:/test4 /test4
root@kvm5:/var/kvm/images# cp diskimage.qcow2 /test4/
Overførslen tog 1 minut og 32 sekunder!
Jeg ved godt hvordan jeg overfører mine diskimages fremover 😉