Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Programatically run a QEMU VM instance from snapshot

I have a QEMU image with a snapshot stored in it. Right now I'm using libvirt to start it.

However, I want to be able to run more than one instance out of the same image/snapshot.

I guess I can do that by cloning the virtual-hd and installing/creating a new domain (virsh) and then running revert from snapshot. But I want to be able to do that pretty much "on-the-fly" with as little as possible latency from the time I decide I need to run another instance of image X to the time that instance is running from the stored snapshot.

Anyone did anything like that? I started thinking maybe libvirt is not low-level enough for this ?

[EDIT: Sorry if this wasn't clear - I'm talking about a RAM+HD snapshot, not just HD snapshot, which I already know how to create...]

Thanks

like image 741
Ofir Israel Avatar asked Oct 21 '22 07:10

Ofir Israel


1 Answers

I was able to run multiple concurrent qemu from the same snapshot using a command like the following. (Obviously the -arm, -kernel, -cpu etc. arguments will be different in your case)

qemu-system-arm -hda snapshot.qcow2 -snapshot -kernel some_vmlinux \
                -serial stdio -append 'root=/dev/sda2 rootfstype=ext4 rw'\
                -cpu arm1176 -m 256 -M versatilepb

The important argument here is -snapshot, so that temporary memory is used for disk writes.

What I havent tried is forcing a writeback to the underlying device, I suspect all manner of havoc could occur if this is possible and it happened... basically, don't forget the -snapshot argument!

If you want some writable storage that is different per instance you probably need to add a second virtual hard disk and have the common snapshot mount that somehow:

qemu-system-arm -hda snapshot.qcow2 -snapshot -kernel some_vmlinux \
                -serial stdio -append 'root=/dev/sda2 rootfstype=ext4 rw'\
                -cpu arm1176 -m 256 -M versatilepb -hdb drive_system1.img &
qemu-system-arm -hda snapshot.qcow2 -snapshot -kernel some_vmlinux \
                -serial stdio -append 'root=/dev/sda2 rootfstype=ext4 rw'\
                -cpu arm1176 -m 256 -M versatilepb -hdb drive_system2.img &

If you are using networking, dont forget to make the MAC address and any hostfw port values different.

like image 63
6EQUJ5 Avatar answered Oct 23 '22 23:10

6EQUJ5