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 😉