目当ては、スパースボリューム (sparse volume) です。次は、man zfs(8) からの抜粋です。
Though not recommended, a "sparse volume" (also known as "thin pro- visioning") can be created by specifying the -s option to the zfs create -V command, or by changing the reservation after the volume has been created. A "sparse volume" is a volume where the reserva- tion is less then the volume size. Consequently, writes to a sparse volume can fail with ENOSPC when the pool is low on space. For a sparse volume, changes to volsize are not reflected in the reserva- tion.スパースボリュームを作成するには、zfs create -V の際、同時に -s オプションを指定します。
# zfs create -s -V 30G tank1/zvol # ls -l /dev/zvol/tank1/zvol lrwxrwxrwx 1 root root 9 Nov 24 10:46 /dev/zvol/tank1/zvol -> ../../zd0 # ls -l /dev/zd0 brw-rw---- 1 qemu qemu 230, 0 Nov 24 11:03 /dev/zd0 # grep zd0 /proc/partitions 230 0 31457280 zd0この zvol を KVM ゲストに割り当てて、CentOS 6.3 をインストールした直後のディスク消費量は次の通りです。なお、インストールオプションには、Software Development Workstation を選択しています。
# zfs list NAME USED AVAIL REFER MOUNTPOINT tank1 5.25G 53.3G 156K /tank1 tank1/zvol 5.24G 53.3G 5.24G - # zfs get all tank1/zvol NAME PROPERTY VALUE SOURCE tank1/zvol type volume - tank1/zvol creation Sat Nov 24 10:01 2012 - tank1/zvol used 5.24G - tank1/zvol available 53.3G - tank1/zvol referenced 5.24G - tank1/zvol compressratio 1.00x - tank1/zvol reservation none default tank1/zvol volsize 30G local tank1/zvol volblocksize 8K - tank1/zvol checksum on default tank1/zvol compression off default tank1/zvol readonly off default tank1/zvol copies 1 default tank1/zvol refreservation none default tank1/zvol primarycache all default tank1/zvol secondarycache all default tank1/zvol usedbysnapshots 0 - tank1/zvol usedbydataset 5.24G - tank1/zvol usedbychildren 0 - tank1/zvol usedbyrefreservation 0 - tank1/zvol logbias latency default tank1/zvol dedup off default tank1/zvol mlslabel none default tank1/zvol sync standard default tank1/zvol refcompressratio 1.00x - tank1/zvol written 5.24G -ZFS プールの空きや KVM ゲストのディスク使用量を気にかける必要はありますが、こんな具合にディスク消費量を節約できました。もっとも、節約だけであれば、スパースファイルでも同じことであり、実際、ext4 上にスパースファイルとして同様にインストールすると、ほぼ同じ消費量になります。
# df -Th / Filesystem Type Size Used Avail Use% Mounted on /dev/sda6 ext4 20G 16G 2.5G 87% / # ls -lsh /var/lib/libvirt/images/cent6vm64.img 5.2G -rw-------. 1 root root 12G Aug 19 15:47 /var/lib/libvirt/images/cent6vm64.imgZVOL を使う利点は、ZFS の豊富な機能 (compression, dedup, secondarycache, スナップショット) をゲスト毎に使い分けられる点ではないかと思います。また、運用上、スパースファイル方式よりも分かり易い (zfs list で各ゲストへの分配状況を俯瞰できる) かなとも思います。
ちなみに、LVM2 にも同様の機能を組み込もうとして、開発途上の模様です。CentOS 6 の man lvcreate(8) より抜粋です。
-T, --thin, --thinpool ThinPoolLogicalVolume{Name|Path} Creates thin pool or thin logical volume or both. Specifying the optional argument --size will cause the creation of the thin pool logical volume. Specifying the optional argument --virtu- alsize will cause the creation of the thin logical volume from given thin pool volume. Specifying both arguments will cause the creation of both thin pool and thin volume using this pool. Requires device mapper kernel driver for thin provisioning from kernel 3.2 or newer. Note: Thin types are currently considered Tech Preview. For more information on Tech Preview features, visit: https://access.redhat.com/support/offerings/techpreview/.LVM2 (device-mapper) を使うと、運用が煩雑になる印象があるのですが、おそらくは、ZVOL より性能は上 (レイヤ増によるオーバーヘッドが少ない) だろうと思いますし、将来の選択肢として、頭の片隅に。
2012-11-25追記
さらに、compression による効果を試しました。zvol の compression プロパティを on にしてから、ゲストの CentOS 6.3 をインストールした結果です。
# zfs set compression=on tank1/zvol ... このあとで、ゲストをインストール ... # zfs list NAME USED AVAIL REFER MOUNTPOINT tank1 3.60G 55.0G 156K /tank1 tank1/zvol 3.60G 55.0G 3.60G - # zfs get all tank1/zvol NAME PROPERTY VALUE SOURCE tank1/zvol type volume - tank1/zvol creation Sat Nov 24 14:38 2012 - tank1/zvol used 3.60G - tank1/zvol available 55.0G - tank1/zvol referenced 3.60G - tank1/zvol compressratio 1.76x - tank1/zvol reservation none default tank1/zvol volsize 30G local tank1/zvol volblocksize 8K - tank1/zvol checksum on default tank1/zvol compression on local tank1/zvol readonly off default tank1/zvol copies 1 default tank1/zvol refreservation none default tank1/zvol primarycache all default tank1/zvol secondarycache all default tank1/zvol usedbysnapshots 0 - tank1/zvol usedbydataset 3.60G - tank1/zvol usedbychildren 0 - tank1/zvol usedbyrefreservation 0 - tank1/zvol logbias latency default tank1/zvol dedup off default tank1/zvol mlslabel none default tank1/zvol sync standard default tank1/zvol refcompressratio 1.76x - tank1/zvol written 3.60G -圧縮により 1.64G ほどディスク消費を節約できています。
compression プロパティは、いつでも変更可能であり、ゲストのインストール時やアップデート時のみ、compression=on にして、ゲストの通常運用時には、compressoin=off にしておくといった使い方も可能です。
2012-12-06追記
重複排除 (dedup) についても、試してみました。zvol01 および zvol02 を用意して、dedup=verify を設定してから、各 zvol をそれぞれ KVM ゲストに割り当てて、CentOS 6.3 をインストールした場合の結果です。
# grep tank1/zvol01 /etc/libvirt/qemu/cent6zvol01.xml <source dev='/dev/zvol/tank1/zvol01'/> # grep tank1/zvol02 /etc/libvirt/qemu/cent6zvol02.xml <source dev='/dev/zvol/tank1/zvol02'/> # zfs get compression NAME PROPERTY VALUE SOURCE tank1 compression off default tank1/zvol01 compression off default tank1/zvol02 compression off default # zfs get dedup NAME PROPERTY VALUE SOURCE tank1 dedup off default tank1/zvol01 dedup verify local tank1/zvol02 dedup verify local # zfs list NAME USED AVAIL REFER MOUNTPOINT tank1 11.5G 51.4G 156K /tank1 tank1/zvol01 5.60G 51.4G 5.60G - tank1/zvol02 5.52G 51.4G 5.52G - # zpool list NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT tank1 59.5G 7.10G 52.4G 11% 1.68x ONLINE -重複排除により 4G ほど削減できています。重複排除は zpool の括りで行われるようで、効果確認は zpool コマンドで行います。
dedup プロパティについても、いつでも変更可能なので、インストール時だけ dedup=verify にして、通常運用時は dedup=off という使い方も可能です。ここでは試しませんでしたが、compression=on との同時利用も可能です。