An upcoming release of libvirt, 1.2.8 that should be released early September, will include an initial support of managing ZFS volumes.
That means that it's possible to boot VMs and use ZFS volumes as disks. Additionally, it allows to control volumes using the libvirt API. Currently, supported operations are:
- list volumes in a pool
- create and delete volumes
- upload and download volumes
It's not possible to create and delete pools yet, hope to implement that in the next release.
Defining a pool
Assume we have some pools and want to use one of them in libvirt:
# zpool list NAME SIZE ALLOC FREE FRAG EXPANDSZ CAP DEDUP HEALTH ALTROOT filepool 1,98G 56,5K 1,98G 0% - 0% 1.00x ONLINE - test 186G 7,81G 178G 0% - 4% 1.00x ONLINE -
Let's take filepool and define it with libvirt. This could be done using this virsh command:
virsh # pool-define-as --name zfsfilepool --source-name filepool --type zfs Pool zfsfilepool defined virsh # pool-start zfsfilepool Pool zfsfilepool started virsh # pool-info zfsfilepool Name: zfsfilepool UUID: 5d1a33a9-d8b5-43d8-bebe-c585e9450176 State: running Persistent: yes Autostart: no Capacity: 1,98 GiB Allocation: 56,50 KiB Available: 1,98 GiB virsh #
As you can see, we specify a type of the pool, its source name, such as seen in zpool list output and a name for it in libvirt. We also need to start it using the pool-start command.
Let's create a couple of volumes in our new pool.
virsh # vol-create-as --pool zfsfilepool --name vol1 --capacity 1G Vol vol1 created virsh # vol-create-as --pool zfsfilepool --name vol2 --capacity 700M Vol vol2 created virsh # vol-list zfsfilepool Name Path ------------------------------------------------------------------------------ vol1 /dev/zvol/filepool/vol1 vol2 /dev/zvol/filepool/vol2 virsh #
Dropping a volume is also easy:
virsh # vol-delete --pool zfsfilepool vol2 Vol vol2 deleted
Uploading and downloading data
Let's upload an image to our new volume:
virsh # vol-upload --pool zfsfilepool --vol vol1 --file /home/novel/FreeBSD-10.0-RELEASE-amd64-memstick.img
... and download
virsh # vol-download --pool zfsfilepool --vol vol1 --file /home/novel/zfsfilepool_vol1.img
Note: if you would check e.g. md5 sum of the downloaded files, the result would be different as downloaded file will be of the same size as a volume. However, if you trim zeros, it'll be the same.
$ md5 FreeBSD-10.0-RELEASE-amd64-memstick.img zfsfilepool_vol1.img MD5 (FreeBSD-10.0-RELEASE-amd64-memstick.img) = e8e7cbd41b80457957bd7981452ecf5c MD5 (zfsfilepool_vol1.img) = a77c3b434b01a57ec091826f81ebbb97 $ truncate -r FreeBSD-10.0-RELEASE-amd64-memstick.img zfsfilepool_vol1.img $ md5 FreeBSD-10.0-RELEASE-amd64-memstick.img zfsfilepool_vol1.img MD5 (FreeBSD-10.0-RELEASE-amd64-memstick.img) = e8e7cbd41b80457957bd7981452ecf5c MD5 (zfsfilepool_vol1.img) = e8e7cbd41b80457957bd7981452ecf5c $
Booting a VM from volume
Finally got to the most important part. In use a volume as disk device for VM 'devices' section of the domain XML should be updated with something like this:
<disk type='volume' device='disk'> <source pool='zfsfilepool' volume='vol1'/> <target dev='vdb' bus='virtio'/> </disk>
Note #1: this code is just a few weeks old, so quite likely there are some rough edges. Feel free to report problems to novel%freebsd.org if you spot any problems.
Note #2: this code is FreeBSD-only for now. However, it should not be hard to make it work on Linux with zfsonlinux.org. Its developers were kind enough to add some useful missing flags in some of the CLI tools. However, these changes are not available in any released version so far. There are some more minor differences between zfs on Linux and FreeBSD, but that should not be hard to address. I was planning to get to it as soon as a new version of zfs on linux with the necessary flags is available. However, if you are interested in that and ready to help with testing -- feel free to poke me so it could be done sooner.