summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Kreutz <mail@skreutz.com>2020-09-11 10:27:34 +0200
committerStefan Kreutz <mail@skreutz.com>2020-09-11 10:27:34 +0200
commite358bc131f405868c97f417d3c339dd0fb796050 (patch)
tree73e777cacc2700ddd3a954e9d9f4fab850892ed4
parent795a1046ae583caade17a65f0e3532931f51a317 (diff)
downloadautoinstall-openbsd-on-qemu-main.tar
Accept changes from blog postHEADmain
-rw-r--r--README.md88
-rwxr-xr-xautoinstall-openbsd-on-qemu (renamed from run)77
2 files changed, 62 insertions, 103 deletions
diff --git a/README.md b/README.md
index 50f9687..4bf93b5 100644
--- a/README.md
+++ b/README.md
@@ -1,89 +1,3 @@
# Auto-install OpenBSD on QEMU
-This repository hosts a POSIX shell script to auto-install OpenBSD/amd64 6.7 to
-copy-on-write disk image using QEMU. The script is intended to run on Linux. If
-you already have a running OpenBSD installation, you should consider to use
-OpenBSD's own hypervisor [vmm(4)](https://man.openbsd.org/vmm) instead of QEMU
-as described in the [OpenBSD FAQ](https://www.openbsd.org/faq/faq16.html) and
-in this [blog post](https://eradman.com/posts/autoinstall-openbsd.html).
-
-The script will:
-
-* Download and verify the official installation image and file sets.
-* Create and serve a TFTP boot environment.
-* Create an [autoinstall(8)](https://man.openbsd.org/autoinstall) configuration file including your public ssh key.
-* Create and boot a copy-on-write disk image.
-
-## Prerequisites
-
-The script depends on the following tools:
-
-* [QEMU](https://www.qemu.org/)
-* [curl](https://curl.haxx.se/)
-* Portable [signify](https://github.com/aperezdc/signify)
-* [rsync](https://rsync.samba.org/)
-* Portable [OpenSSH](https://www.openssh.com/portable.html)
-* [socat](http://www.dest-unreach.org/socat/)
-
-The following command installs these dependencies on Arch Linux:
-
- sudo pacman -S qemu curl signify rsync openssh socat
-
-## Usage
-
-Execute the following command to auto-install OpenBSD/amd64 6.7 to a new disk
-image `disk.qcow2` in the current directory.
-
- ./run
-
-When prompted, run the following command to serve `./mirror/` at
-http://127.0.0.1:8080/:
-
- python -m http.server --directory ./mirror --bind 127.0.0.1 8080
-
-You can override the following environment variable defaults if necessary:
-
-* `DISK_FILE=disk.qcow2`
-* `DISK_SIZE=160G`
-* `CPU_COUNT=6`
-* `MEMORY_SIZE=4G`
-
-For example:
-
- CPU_COUNT=1 ./run
-
-## Virtual network
-
-The script creates a virtual network, `10.0.2.0/24`, with the following
-addresses:
-
-* Host at `10.0.2.2`
-* Nameserver at `10.0.2.3`
-* Guest at `10.0.2.15`
-
-The script also redirects host host port `2222` to guest port `22` (ssh) and
-host port `80` (actually `10.0.2.1` port `80`) to host port `8080`.
-
-## Secure shell
-
-Pass the following options to ssh or scp to connect to the guest machine:
-
- ssh \
- -o "StrictHostKeyChecking no" \
- -o "UserKnownHostsFile /dev/null" \
- -o "Port 2222" \
- puffy@127.0.0.1
-
-For example, the following command forwards port `3000` on the host to port
-`80` on the guest:
-
- ssh \
- -o "StrictHostKeyChecking no" \
- -o "UserKnownHostsFile /dev/null" \
- -o "Port 2222" \
- -N \
- -L 127.0.0.1:3000:127.0.0.1:80 \
- puffy@127.0.0.1
-
-Press `C-a x` to stop the guest machine.
-Press `C-a h` to show other options.
+See [blog post](https://www.skreutz.com/posts/autoinstall-openbsd-on-qemu/).
diff --git a/run b/autoinstall-openbsd-on-qemu
index 9a0a3b8..d71a3dc 100755
--- a/run
+++ b/autoinstall-openbsd-on-qemu
@@ -2,22 +2,49 @@
# Auto-install OpenBSD/amd64 6.7 on QEMU.
#
+# First published at https://www.skreutz.com/posts/autoinstall-openbsd-on-qemu/
+# on 22 July 2020.
+#
# Copyright (c) 2020 Stefan Kreutz <mail@skreutz.com>
+#
+# Permission to use, copy, modify, and distribute this software for any purpose
+# with or without fee is hereby granted, provided that the above copyright
+# notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+# PERFORMANCE OF THIS SOFTWARE.
set -o errexit
set -o nounset
-# Accept parameters from environment.
-SSH_KEY="${SSH_KEY-${HOME}/.ssh/id_rsa.pub}"
+# Trusted HTTPS OpenBSD mirror to fetch the base public key from.
HTTPS_MIRROR="${HTTPS_MIRROR-https://ftp.openbsd.org/pub/OpenBSD/}"
+
+# Untrusted rsync OpenBSD mirror.
RSYNC_MIRROR="${RSYNC_MIRROR-rsync://ftp.halifax.rwth-aachen.de/openbsd/}"
+
+# File name of the disk image.
DISK_FILE="${DISK_FILE-disk.qcow2}"
+
+# Size of the disk image.
DISK_SIZE="${DISK_SIZE-24G}"
+
+# Number of virtual CPUs.
CPU_COUNT="${CPU_COUNT-4}"
+
+# Size of virtual memory.
MEMORY_SIZE="${MEMORY_SIZE-4G}"
-# Fail early on missing dependencies.
-for cmd in qemu-img qemu-system-x86_64 curl signify rsync ssh socat
+# File name of the public SSH key to authorize.
+SSH_KEY="${SSH_KEY-${HOME}/.ssh/id_rsa.pub}"
+
+# Check required commands.
+for cmd in curl qemu-img qemu-system-x86_64 rsync signify socat ssh
do
if ! command -v "${cmd}" >/dev/null
then
@@ -43,14 +70,24 @@ if [ ! -d mirror/pub/OpenBSD/6.7/amd64 ]
then
mkdir -p tmp
printf "Fetching installation files ...\\n"
- rsync --recursive --delete --quiet \
- "${RSYNC_MIRROR}6.7/amd64/SHA256" \
- "${RSYNC_MIRROR}6.7/amd64/SHA256.sig" \
- "${RSYNC_MIRROR}6.7/amd64/bsd" \
- "${RSYNC_MIRROR}6.7/amd64/bsd.*" \
- "${RSYNC_MIRROR}6.7/amd64/pxeboot" \
- "${RSYNC_MIRROR}6.7/amd64/*67.tgz" \
- tmp/
+ rsync --archive --files-from=- --quiet \
+ "${RSYNC_MIRROR}6.7/amd64/" \
+ tmp/ \
+ << EOF
+SHA256.sig
+base67.tgz
+bsd
+bsd.mp
+bsd.rd
+comp67.tgz
+game67.tgz
+man67.tgz
+pxeboot
+xbase67.tgz
+xfont67.tgz
+xserv67.tgz
+xshare67.tgz
+EOF
( cd tmp && signify -C -q \
-p ../mirror/pub/OpenBSD/6.7/openbsd-67-base.pub \
-x SHA256.sig \
@@ -59,7 +96,7 @@ then
printf "Fetched kernel, PXE bootstrap program, and file sets from %s\\n" "${RSYNC_MIRROR}"
fi
-# Create autoinstall configuration if not exists.
+# Create autoinstall(8) configuration if not exists.
if [ ! -e mirror/install.conf ]
then
cat << EOF > mirror/install.conf
@@ -83,7 +120,7 @@ EOF
printf "Created example response file for autoinstall(8) at ./mirror/install.conf\\n"
fi
-# Create disklabel configuration if not exists.
+# Create disklabel(8) configuration if not exists.
if [ ! -e mirror/disklabel ]
then
cat << EOF > mirror/disklabel
@@ -107,9 +144,17 @@ then
mkdir site
cat << EOF > site/install.site
#! /bin/ksh
+
set -o errexit
+
+# Reset OpenBSD mirror server used by pkg_add(1) and other commands.
echo "https://cdn.openbsd.org/pub/OpenBSD" > /etc/installurl
+
+# Permit user group wheel to run any command as root without entering their
+# password using doas(1).
echo "permit nopass keepenv :wheel" > /etc/doas.conf
+
+# Patch the base system on the first boot.
#echo "syspatch && shutdown -r now" >> /etc/rc.firsttime
EOF
chmod +x site/install.site
@@ -172,9 +217,9 @@ done
printf "Starting virtual machine ...\\n"
qemu-system-x86_64 \
-enable-kvm \
- -m "${MEMORY_SIZE}" \
-smp "cpus=${CPU_COUNT}" \
+ -m "${MEMORY_SIZE}" \
+ -drive "file=${DISK_FILE},media=disk,if=virtio" \
-device e1000,netdev=n1 \
-netdev "user,id=n1,hostname=openbsd-vm,tftp-server-name=10.0.2.1,tftp=tftp,bootfile=auto_install,hostfwd=tcp::2222-:22,guestfwd=tcp:10.0.2.1:80-cmd:socat STDIO TCP4:127.0.0.1:8080" \
- -drive "file=${DISK_FILE},media=disk,if=virtio" \
-nographic
Generated by cgit. See skreutz.com for my tech blog and contact information.