First attempt at some documentation
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
diff --git a/README b/README
new file mode 100644
index 0000000..cc2d482
--- /dev/null
+++ b/README
@@ -0,0 +1,90 @@
+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