The introduction of solid state disks has changed the hard disk market. SSDs (Solid State Drives) are less prone to failure, and allow much quicker access to the stored data. However the these benefits tend to come at a higher cost. While writing this article a 100 GB SAS (Serial Attached SCSI) SSDs costs around $500. While the same amount of storage on a head and platter disk would cost $50. In a frugal scenario 100 GB is enough room for twenty Ubuntu virtual machines, each using about 3 GB for the operating system and 2 GB the configuration and applications.
Even using LVM (Logical Volume Manager) style thin provisioning it wouldn't be possible to fit many more than twenty of such virtual machines on the same amount of storage. LVM thin provisioning will share untouched free space between virtual machines. In some implementations where VMs are created as snapshots there is also sharing of the untouched allocated blocks. There is however no certainty on what data is shared and for how long. Over-allocating in this scenario would breed enough uncertainty to outweigh the benefits of saving space.
Skinnybox takes a more predictable approach to thin provisioning. The idea came to me while working with OpenWRT, a Linux distribution for embedded devices. OpenWRT uses the overlay file system to merge the base ROM (Read Only Memory) partition, and the writable flash partition of an embedded device. The ROM partition is called the lower partition and the flash is the upper. When a file access is requested, first the overlay driver will search the upper partition; If it doesn't exist there, then it's looked up in the lower partition.
Skinnybox applies the OpenWRT file system approach to virtual machine provisioning. A master, read/only image contains the shared operating system and packages. This image is shared between many virtual machines. Additionally each virtual machine has an image just for it's unique configurations, customization, and run time. With a scenario above, a single 3 GB operating system image would be shared between all of the nodes as the lower overlay mount; Each node would also be presented with it's personal 2 GB upper overlay mount. With such provisioning we would be able to deploy forty eight virtual machines on that single 100 GB disk.
The project is available from the GitHub SkinnyBox Repo