Genvm
"genvm" Is a powerfull script bash to generate a minimal and complete Debian and Ubuntu virtual machines for KVM/QEMU (so usable in ProxMox, libvirtd, ...), VirtualBox and/or VMWare.
Install / Use
/learn @genvm/GenvmREADME

GenVM Is a powerful script designed to generate minimum and complete Debian virtual machines for KVM/QEMU (so usable in ProxMox, libvirtd, ...), VirtualBox and VMWare.
GenVM is distributed under the GPL3.
Sources and documentation are available from GitHub (http://github.com/genvm).
Tested distributions
GenVM was tested on Debian from Wheezy to bookworm and Ubuntu. Its work from docker on all linux.
Generated VM
| Distrib. | Name | Rev | Arch | | -------- |:--------:|:------:|:-----:| | debian | Bullseye | 11.X | amd64 | | debian | Bookworm | 12.X | amd64 | | debian | Trixie | 13.X | amd64 |
Installation
No special installation needed, only download the latest version of GenVM, adjust permissions and launch it via sudo or su.
Another solution consist to use a dockerised version
From sources
$ git clone https://github.com/genvm/genvm.git
Cloning into 'genvm'...
remote: Counting objects: 125, done.
remote: Compressing objects: 100% (45/45), done.
remote: Total 125 (delta 39), reused 123 (delta 39), pack-reused 0
Receiving objects: 100% (125/125), 44.15 KiB | 0 bytes/s, done.
Resolving deltas: 100% (39/39), done.
Checking connectivity... done.
$ cd genvm
$ ls
genvm
From archive
Last version (dev)
$ wget -q https://github.com/genvm/genvm/archive/master.zip
$ unzip master.zip
Archive: master.zip
1d5aa137931b15e6307a0fedb0c30f118c79a959
creating: genvm-master/
inflating: genvm-master/genvm
Stable version
You can find stable versions from GitHub on this page : https://github.com/genvm/genvm/releases
Download the latest version and extract it.
From docker
Create your own image
$ git clone https://github.com/genvm/genvm.git
$ cd genvm
$ docker build -t genvm --no-cache=true .
Use official image
$ docker pull genvm/genvm
But, in fact, no installation needed.
Examples
Note than using -v in examples is better to see whats happen.
Simple Debian
$ su -c "./genvm -l examples/bullseye/pkg.lst -t examples/bullseye simple.debian.bullseye.vmdk"
Password:
Set password to root >
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
$ ls -lh simple.debian.bullseye.vmdk
-rw-r--r-- 1 root users 875M Jul 27 17:33 simple.debian.bullseye.vmdk
Simple Debian with docker
If you are using your own image :
$ docker run -it --rm --privileged --cap-add=ALL -v ./somewhere:/srv -v /dev:/dev -v/lib/modules:/lib/modules:ro genvm
root@2e8c0ba4488f:/srv# genvm -l /opt/genvm/examples/bullseye/pkg.lst -t /opt/genvm/examples/bullseye debian.bullseye.vmdk
Retrive generated image in ./somewhere.
If you're using official image replace genvm by genvm/genvm when you specify image name.
GenVM use nbd modules, access to loopdevices and create partitions, reload it, etc. that's why it need large privileges.
You can use genvm directly from docker invocation :
$ docker run -h genvm --name genvm -it --rm --privileged \
--cap-add=ALL -v ./data/:/srv/ -v/dev:/dev -v/lib/modules:/lib/modules:ro genvm/genvm \
genvm -f qcow2 \
-n simple \
-l /opt/genvm/examples/bullseye/pkg.lst \
-l /opt/genvm/examples/bookworm/pkg.lst \
-S http://ftp.lip6.fr/pub/linux/distributions/debian \
-p toor \
-t /opt/genvm/examples/bullseye \
-V bookworm \
-v \
-P /:4G \
-P sw \
-s 5G \
-F \
simple.bookworm.qcow2
In this example, we use the fact that bookworm install is the same as bullseye but with an additionnal package (systemd-resolved), so we use evrything from /opt/genvm/examples/bullseye and add list of packages from /opt/genvm/examples/bookworm/pkg.lst. Another way to do that can be use of -A option (-A systemd-resolved) insted of creating a file and use it by -l /opt/genvm/examples/bookworm/pkg.lst.
-V bookworm fix the version deployed.
The partition schema is modified too (image size is 5G with a swap partition).
Another example
The example bullseye.evo propose a version with some utils configurations like timesyncd, locales, grub, disks with partitions, etc.
$ docker run -h genvm --name genvm -it --rm --privileged \
--cap-add=ALL -v .:/srv -v/dev:/dev -v/lib/modules:/lib/modules:ro \
genvm/genvm genvm -f qcow2 \
-n first \
-l examples/bullseye.evo/pkg.lst \
-p toor \
-t examples/bullseye.evo \
-P examples/bullseye.evo/partitions.lst \
-s 15G \
-v \
first.debian.bullseye.qcow2
Then you can execute VM from host :
$ qemu-system-x86_64 -m 2G -net nic -net user,hostfwd=tcp::2222-:22 first.debian.bullseye.qcow2
And connect it by :
$ ssh -o "UserKnownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" -p 2222 root@localhost
Run a VM
Run a VM easily with qemu
$ qemu-system-x86_64 --enable-kvm -m 2G -net nic -net user,hostfwd=tcp::2222-:22 simple.debian.bullseye.vmdk
