2022-03-07 22:32:29 +01:00
|
|
|
# vmctl
|
2022-03-07 11:02:15 +01:00
|
|
|
|
2022-03-07 22:32:29 +01:00
|
|
|
`vmctl` is a script that automates the installation, provisioning and
|
|
|
|
management of Arch Linux virtual machines.
|
2022-03-07 11:02:15 +01:00
|
|
|
|
|
|
|
## Dependencies
|
|
|
|
|
|
|
|
- `qemu`
|
|
|
|
- `curl`
|
|
|
|
- `expect`
|
|
|
|
|
|
|
|
## Installation
|
|
|
|
|
2022-03-07 22:32:29 +01:00
|
|
|
Just copy the `vmctl` script anywhere in your `PATH`, or clone the repository
|
|
|
|
and create a symbolic link to `vmctl` in your `PATH`.
|
2022-03-07 11:02:15 +01:00
|
|
|
|
|
|
|
## Usage
|
|
|
|
|
|
|
|
### Install an Arch Linux virtual machine
|
|
|
|
|
2022-03-07 22:32:29 +01:00
|
|
|
The `vmctl install` command can be used to create an Arch Linux virtual machine
|
|
|
|
on the fly, wherever you are. It does the following:
|
|
|
|
|
|
|
|
- It downloads the latest Arch Linux installer ISO image if none was downloaded
|
|
|
|
or a new one is available.
|
|
|
|
- It creates a `qemu` disk file.
|
|
|
|
- It boots a new KVM that uses the ISO file as as CDROM and automates the
|
|
|
|
installation of Arch Linux in the virtual machine (no user prompt required).
|
|
|
|
- It can install extra packages and run custom post-installation provisioning scripts.
|
|
|
|
|
2022-03-07 11:02:15 +01:00
|
|
|
```text
|
2022-03-07 22:32:29 +01:00
|
|
|
Usage: vmctl install [-o <output-disk-image>] [-a <architecture>] [-s <disk-size>]
|
2022-03-07 11:02:15 +01:00
|
|
|
[-m <memory>] [-h <hostname>] [-P <root-password>] [-u <non-root-username>]
|
|
|
|
[-p <non-root-user-password>] [-z <timezone>] [-l <locale>] [-M <arch-mirror-url>]
|
2022-03-08 00:02:20 +01:00
|
|
|
[-K] [extra qemu arguments]
|
2022-03-07 11:02:15 +01:00
|
|
|
|
2022-03-07 22:32:29 +01:00
|
|
|
-o <output-disk-image> Path of the output disk image (default: ./arch.img)
|
|
|
|
-a <architecture> Target architecture (default: x86_64)
|
|
|
|
-s <disk-size> Disk size (default: 8G)
|
|
|
|
-m <memory> RAM size in KB (default: 2048)
|
|
|
|
-h <hostname> VM hostname (default: qemu)
|
|
|
|
-P <root-password> Root password. If not specified it will be prompted
|
|
|
|
-u <non-root-username> Username for the main non-root user
|
|
|
|
-p <non-root-user-password> Password for the non-root user. If not specified it will be prompted
|
|
|
|
-z <timezone> System timezone (default: UTC)
|
|
|
|
-l <locale> System locale (default: en_US.UTF-8)
|
|
|
|
-M <arch-mirror-url> Arch Linux download mirror URL (default: http://mirror.cj2.nl/archlinux/iso/latest/)
|
|
|
|
Consult https://archlinux.org/download/ for a full list of the available download mirrors.
|
2022-03-08 00:02:20 +01:00
|
|
|
-K Disable pacman keyring checks during installation. It's potentially unsafe,
|
|
|
|
but it can be an option if downloading the keys takes too long.
|
2022-03-07 22:32:29 +01:00
|
|
|
```
|
|
|
|
|
|
|
|
If a required option is not specified on the command line then it will be
|
|
|
|
interactively prompted to the user (defaults are available for most of the
|
|
|
|
options).
|
|
|
|
|
|
|
|
Non-interactive example:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
vmctl install \
|
|
|
|
-h my_vm \
|
|
|
|
-a x86_64 \
|
|
|
|
-s 16G \
|
|
|
|
-m 2048 \
|
|
|
|
-P root \
|
|
|
|
-u myuser \
|
|
|
|
-p password \
|
|
|
|
-z Europe/Amsterdam \
|
|
|
|
-o arch-base.img
|
2022-03-07 11:02:15 +01:00
|
|
|
```
|
|
|
|
|
|
|
|
If you want to install an extra list of packages besides the default ones, then
|
|
|
|
specify them in a file named `PKGLIST` in the same directory as the disk image file.
|
|
|
|
|
|
|
|
If you want to run a custom post-installation script after the core system has been
|
|
|
|
installed, then create a custom script named `post-install.sh` in the same directory
|
|
|
|
as the disk image file.
|
|
|
|
|
|
|
|
#### Notes
|
|
|
|
|
|
|
|
The keyring population process may currently (as of March 2022) take a long time.
|
|
|
|
This is a [known issue](https://www.reddit.com/r/archlinux/comments/rbjbcr/pacman_keyring_update_taking_too_long/).
|
|
|
|
|
2022-03-07 16:55:01 +01:00
|
|
|
### Resize an existing image
|
2022-03-07 11:02:15 +01:00
|
|
|
|
|
|
|
```bash
|
|
|
|
qemu-img resize "$imgfile" +10G
|
|
|
|
```
|
|
|
|
|
|
|
|
### Create a COW (Copy-On-Write) image on top of a disk image
|
|
|
|
|
|
|
|
```bash
|
|
|
|
qemu-img create -o backing_file="$imgfile",backing_fmt=raw -f qcow2 img1.cow
|
|
|
|
```
|
|
|
|
|
|
|
|
This is particularly useful if you want to have a "base" image and several customized
|
|
|
|
images built on it.
|
2022-03-07 16:55:01 +01:00
|
|
|
|
|
|
|
### Convert a raw qemu image to a VirtualBox
|
|
|
|
|
|
|
|
```bash
|
|
|
|
qemu-img convert -O vdi disk.img disk.vdi
|
|
|
|
```
|