As it turns out, this is actually a user error.
When creating the level2.img and level3.img, you must specify the backing store type, because libvirt won't automatically detect those for safety reasons. So you should do:
qemu-img create -f qcow2 -o backing_fmt=qcow2 -b level1.img level2.img qemu-img create -f qcow2 -o backing_fmt=qcow2 -b level2.img level3.img
After doing that, boot succeeds on my laptop.
As it turns out, this is actually a user error.
When creating the level2.img and level3.img, you must specify the backing store type, because libvirt won't automatically detect those for safety reasons. So you should do:
qemu-img create -f qcow2 -o backing_fmt=qcow2 -b level1.img level2.img
qemu-img create -f qcow2 -o backing_fmt=qcow2 -b level2.img level3.img
After doing that, boot succeeds on my laptop.