KVM: Overførsel af images (sparse files) mellem servere

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 😉

Dette indlæg blev udgivet i Knowledge Base, KVM, Linux, Old Base. Bogmærk permalinket.

Skriv et svar