| TiNLV: This is Not LibVirt | |
| <boring> | |
| Everything here is licensed under the GPLv2. Please see the LICENSE | |
| file at the root of the directory. | |
| </boring> | |
| This repository contains a bag of scripts I cobbled together to easily | |
| install and run KVM/arm64 UEFI based VMs, acting as a middle ground | |
| between the full complexity of the QEMU command line and the awkward | |
| abstraction provided by LibVirt. The VMs can either be ephemeral (they | |
| are destroyed on exit) or made persistent (though no effort is made to | |
| keep them running). | |
| There are essentially three major scripts here: | |
| - runefivm.sh runs a guest, taking a bunch of parameters such as the | |
| disk image, the EFI binary, the number of CPUs... | |
| - runinstallvm.sh is a very simple wrapper for runefivm.sh, creating | |
| the storage for the VM, and either destroying it once it ends, or | |
| moving it into a safe location for later reuse. | |
| - build-cd-image is only slightly related to the above. It takes a | |
| Debian or Ubuntu CD/DVD image, and messes with it enough that it | |
| becomes an unattended installer. Now also deals with Fedora DVD | |
| images. | |
| All the scripts are expected to be run from the vminstall | |
| directory. Yes, this is a braindead expectation, and maybe I'll fix it | |
| at some point. Maybe. | |
| * runefivm.sh [QEMU args] | |
| runefivm.sh is entirely driven by environment variables, and | |
| provides more or less sensible defaults when the variable is not | |
| defined: | |
| - EFI: The EFI (AAVMF) binary. Defaults to | |
| /usr/share/AAVMF/AAVMF_CODE.fd | |
| - EFIVAR: The per-VM EFI variable container. Defauts to no variables. | |
| - DISK: The raw file containing the VM mass storage. Defaults to | |
| none. | |
| - DISKBACKEND: The type of mass storage device exposed to the | |
| guest. Can be either "virtio" (the default) or "nvme". | |
| - CONSOLE: The console type that is exposed to both the guest and | |
| the user. By default (and for anything other that "virtio"), this | |
| is the usual PL011, connected to stdio. When set to "virtio", an | |
| additional virtio console is created, both the guest's own traffic | |
| and the QEMU monitor is directed to it, while the standard PL011 | |
| (which is still present) is redirected to /dev/null. This requires | |
| guest support, whih is why this isn't the default. | |
| - BUS: The bus on which the virtio devices are created. Can be | |
| "device" or "pci", defaults to "pci". | |
| - NETIF: The host network interface for this VM. Can be a tap or | |
| macvtap interface (which enables vhost), or "none" (which | |
| indicates that no networking is to be provided). When absent, | |
| userspace networking is provided to the guest. Multiple taps | |
| can be passed as a colon separated list, each of them resulting | |
| in a guest network interface. | |
| - VIRTTYPE: The QEMU machine type, and comma-separated options | |
| ("virt,virtualization=on" for an EL2 VM, for example). Defaults | |
| to "virt". | |
| - GIC: The GIC version. Use "2" to force GICv2, "3" for GICv3+ITS, | |
| "3,noits" for GICv3 without an ITS. Defaults to "host", which is | |
| whichever is physically present. | |
| On a system without a GIC, or if you are masochistic, "none" will | |
| use QEMU's GICv2 emulation. It may work, it may not. | |
| - BIT: 32 or 64, defaults to 64. If using 32, you will have to | |
| provide the path to the EFI path using the EFI variable. | |
| - CPUS: Number of CPUs, defaults to 4. | |
| - RAM: Memory size, defaults to 1G. | |
| - CDROM: A cdrom image provided to the guest, defaults to no cdrom | |
| at all. Can be a file, but also remote resources as as supported by | |
| QEMU (http://mylocalserver:8000/cdimage.iso for example). | |
| - QEMU: The QEMU binary, defaults to /usr/bin/qemu-system-aarch64. | |
| Any additional parameter is directly passed to QEMU. | |
| * runinstallvm.sh [QEMU args] | |
| All the environment variables used by runefivm.sh are equaly valid | |
| for runinstallvm.sh, with the exception of DISK and EFIVAR (which it | |
| overrides). In addition, it provides the following: | |
| - FORMAT: Format of the virtio storage, as understood by qemu-img, | |
| such as qcow2. Default is "raw". | |
| - SIZE: Size of the virtio disk storage. Defaults to 16GB. | |
| - KEEPME: When provided, create a directory with that name, and | |
| store the VM disk and EFI variables in that directory. Also | |
| generate a "runvm.sh" script in the same directory, which calls | |
| runefivm.sh with the right environment variables. | |
| - TEMPLATE: A disk image that is used to pre-populates the virtio | |
| disk (useful for things like mini.iso that will pull everything | |
| from the network). | |
| Any additional parameter is directly passed to QEMU and potentially | |
| preserved in the "runvm.sh" script. | |
| * build-cd-image source.iso target.iso | |
| - Debian/Ubuntu: Takes source.iso, adds preseed.cfg to it, add a new | |
| grub entry for unattended installation, repack the whole thing as | |
| target.iso. The only VM user is root, password is root. Don't try | |
| this on a publicly visible box... Depends on the xorriso package | |
| being installed. If the PRESEED_PATH environment variable is | |
| defined, feed this to the installer as part of the kernel command | |
| line. This is useful to point the installer to a remote preseed | |
| file (PRESEED_PATH="url=http://my.remote.box/preseed.cfg"). | |
| Example: | |
| $ ./build-cd-image ../debian-9.0.0-arm64-netinst.iso ../debian-9.0.0-arm64-netinst-preseed.iso | |
| $ CDROM=../debian-9.0.0-arm64-netinst-preseed.iso RAM=2G KEEPME=stretch ./runinstallvm.sh | |
| [halt the VM] | |
| $ ./stretch/runvm.sh | |
| - Fedora: Take source.iso, adds a kickstart file and a new grub | |
| entry, and do the same magic to generate an unattended | |
| installer. Note that this will only work with a full DVD image, | |
| and it will probably stop working if packages are missing from the | |
| image. Same user/passwd as above. Only tested with Fedora 26 | |
| Server DVD image. |