I am interested in trying to package a software product consisting of a large linux software stack as a so-called "virtual appliance" to avoid a painful, painful installation procedure. My needs are probably similar to the author of this question and the answers here were helpful, but I have some specific questions.
The app I am trying to distribute consists of several rails apps and some other servers, daemons, and jobs that need to run via cron, etc. Currently it is running in a Ubuntu server.
What is the best way currently available to create and package a virtual machine like the above? I have been looking at JeOS which appears to be outdated, but has some tutorials written about the process. Also apparently the Open Virtualization Format is a good one for distributing virtual appliances, but I can't find any tutorials on creating such an image.
How would we go about distributing the image and updates in such a way that user data is preserved?
I'll answer 2) first: If you set up the VM to contain 2 virtual disks you can put the OS and any upgradeable components on one disk and all user data on the other disk. To upgrade while preserving user data just ship an update of the OS disk.
As for 1): If you follow my suggestion for 2 you want to look for a format where the virtual disks are easily replaceable individually. You could achieve this using qemu/kvm with e.g. qcow2 images, but there are probably other formats, some of which may be easier to launch for users than qemu/kvm. If you use a cloud stack like OpenNebula to run the VMs instead of asking users to start the VMs themselves qemu-kvm with 1) should be very feasible.