blob: cc2d482c54a5fca2bacd0ede7239f5dd90a7c953 [file] [log] [blame]
TiNLV: This is Not LibVirt
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.
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.
- 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.
- 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.
- BIT: 32 or 64, defaults to 64. There is no UEFI/GRUB installer for
32bit, so that's all a bit moot.
- 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.
- 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:
- 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.
* build-cd-image source.iso target.iso
Takes source.iso, add 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.
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