You could inline compress and/or deduplicate your storage. There are several ways to pull this off - some easier and some more effective.
To start, Linux and UNIX systems can use ZFS - a filesystem and volume manager that supports both compression and deduplication at the block level. Any shared or local storage system built on top of this can use these features, so something as simple as NFS on top of ZFS can do what you want with a shared pool across all VMs.
Linux can use btrfs, which is a multi-device filesystem that supports inline deduplication and compression. Same ideas as above. Btrfs has fewer hardware requirements than ZFS, but inline deduplication is still pretty intensive (as in you would be best served doing it across a larger shared dataset using either filesystem). Something to keep in mind about btrfs is that it is a filesystem first, and a volume manager second. It also does not offer block based abstractions like ZFS does, so it is purely a file based system.
There are several NAS/SAN offerings that include this functionality. Using one for shared storage would make good use of deduplication and compression while being a canned and supported product. FreeNAS is an example of one such system, which can use ZFS. Synology NAS devices also can and often do use btrfs.