aboutsummaryrefslogtreecommitdiffstats
path: root/tools/create-openbsd-vmm-worker.sh
diff options
context:
space:
mode:
authorGreg Steuck <gnezdo@google.com>2018-09-19 16:28:02 -0700
committerDmitry Vyukov <dvyukov@google.com>2018-09-20 11:03:43 +0200
commitb117b6ed3dc89b7e307dab907dafc0e7defd5756 (patch)
treef6c8aff37364f3021a7c4b3abb8d14ff90e31907 /tools/create-openbsd-vmm-worker.sh
parent7f7e03fda2e99767bf8a4b69737c2ca99a0b39fd (diff)
tools/*openbsd*: smaller VMM images and tweaks.
Diffstat (limited to 'tools/create-openbsd-vmm-worker.sh')
-rwxr-xr-xtools/create-openbsd-vmm-worker.sh181
1 files changed, 181 insertions, 0 deletions
diff --git a/tools/create-openbsd-vmm-worker.sh b/tools/create-openbsd-vmm-worker.sh
new file mode 100755
index 000000000..403bc0b0c
--- /dev/null
+++ b/tools/create-openbsd-vmm-worker.sh
@@ -0,0 +1,181 @@
+#!/bin/bash
+
+# Copyright 2018 syzkaller project authors. All rights reserved.
+# Use of this source code is governed by Apache 2 LICENSE that can be found in
+# the LICENSE file.
+
+# Produces a very minimal image for running syzkaller fuzzers running on OpenBSD.
+
+# Mostly derived from Go buildlet generator with blessing from bradfitz@.
+
+set -eu -o pipefail
+
+readonly MIRROR="${MIRROR:-cloudflare.cdn.openbsd.org}"
+readonly VERSION="${VERSION:-6.4}"
+readonly DOWNLOAD_VERSION="${DOWNLOAD_VERSION:-snapshots}"
+readonly RELNO="${2:-${VERSION/./}}"
+
+# The only supported setting.
+readonly ARCH="amd64"
+
+readonly ISO="install${RELNO}-${ARCH}.iso"
+readonly ISO_PATCHED="install${RELNO}-${ARCH}-patched.iso"
+
+if [[ ! -f "${ISO}" ]]; then
+ curl -o "${ISO}" "https://${MIRROR}/pub/OpenBSD/${DOWNLOAD_VERSION}/${ARCH}/install${RELNO}.iso"
+fi
+
+# Create custom siteXX.tgz set.
+mkdir -p etc
+cat >install.site <<'EOF'
+#!/bin/sh
+echo 'set tty com0' > boot.conf
+echo 'PasswordAuthentication no' >> /etc/ssh/sshd_config
+
+rm /usr/libexec/reorder_kernel
+ln -s /usr/bin/true /usr/libexec/reorder_kernel
+rm -fr /usr/share/relink
+
+perl -i.bak -pne 's/^(ttyC.*)vt220.*/$1unknown off/' /etc/ttys
+
+touch root/.hushlogin home/syzkaller/.hushlogin
+EOF
+
+cat >etc/installurl <<EOF
+https://${MIRROR}/pub/OpenBSD
+EOF
+
+cat >etc/rc.local <<EOF
+(
+ set -x
+
+ echo "starting syz-manager"
+)
+EOF
+chmod +x install.site
+
+cat >etc/rc.conf.local <<EOF
+cron_flags=NO
+pflogd_flags=NO
+library_aslr=NO
+slaacd_flags=NO
+smtpd_flags=NO
+sndiod_flags=NO
+pf=NO
+ntpd_flags=NO
+EOF
+
+# Generate the worker keys.
+rm -f worker_key*
+ssh-keygen -t ed25519 -N '' -f worker_key -C worker_key
+
+tar --owner=root --group=root -zcvf site${RELNO}.tgz install.site etc/*
+
+# Autoinstall script.
+cat >auto_install.conf <<EOF
+System hostname = worker
+DNS domain name = syzkaller
+Which network interface = vio0
+IPv4 address for vio0 = dhcp
+IPv6 address for vio0 = none
+Password for root account = root
+Public ssh key for root account = $(cat worker_key.pub)
+Do you expect to run the X Window System = no
+Change the default console to com0 = yes
+Which speed should com0 use = 115200
+Setup a user = syzkaller
+Full name for user syzkaller = Syz Kaller
+Password for user syzkaller = syzkaller
+Public ssh key for user syzkaller = $(cat worker_key.pub)
+Allow root ssh login = prohibit-password
+What timezone = US/Pacific
+Which disk = sd0
+Use (W)hole disk or (E)dit the MBR = whole
+Use (A)uto layout, (E)dit auto layout, or create (C)ustom layout = auto
+URL to autopartitioning template for disklabel = file://disklabel.template
+Set name(s) = -* +bsd +bsd.mp +base* +site* done
+Directory does not contain SHA256.sig. Continue without verification = yes
+EOF
+
+# Disklabel template.
+cat >disklabel.template <<EOF
+/ 700M-* 100%
+swap 300M
+EOF
+
+# Hack install CD a bit.
+echo 'set tty com0' > boot.conf
+dd if=/dev/urandom of=random.seed bs=4096 count=1
+cp "${ISO}" "${ISO_PATCHED}"
+growisofs -M "${ISO_PATCHED}" -l -R -graft-points \
+ /${VERSION}/${ARCH}/site${RELNO}.tgz=site${RELNO}.tgz \
+ /auto_install.conf=auto_install.conf \
+ /disklabel.template=disklabel.template \
+ /etc/boot.conf=boot.conf \
+ /etc/random.seed=random.seed
+
+# Initialize disk image.
+rm -f worker_disk.raw
+qemu-img create -f raw worker_disk.raw 1G
+
+# Run the installer to create the disk image.
+expect 2>&1 <<EOF | tee install_log
+set timeout 1800
+
+spawn qemu-system-x86_64 -nographic -smp 2 \
+ -drive if=virtio,file=worker_disk.raw,format=raw -cdrom "${ISO_PATCHED}" \
+ -net nic,model=virtio -net user -boot once=d
+
+expect timeout { exit 1 } "boot>"
+send "\n"
+
+# Need to wait for the kernel to boot.
+expect timeout { exit 1 } "\(I\)nstall, \(U\)pgrade, \(A\)utoinstall or \(S\)hell\?"
+send "s\n"
+
+expect timeout { exit 1 } "# "
+send "mount /dev/cd0c /mnt\n"
+send "cp /mnt/auto_install.conf /mnt/disklabel.template /\n"
+send "chmod a+r /disklabel.template\n"
+send "umount /mnt\n"
+send "exit\n"
+
+expect timeout { exit 1 } "CONGRATULATIONS!"
+
+proc login {} {
+ send "root\n"
+
+ expect "Password:"
+ send "root\n"
+
+ expect "# "
+ send "cat /etc/ssh/ssh_host_*_key.pub\nhalt -p\n"
+
+ expect eof
+}
+
+# There is some form of race condition with OpenBSD 6.2 MP
+# and qemu, which can result in init(1) failing to run /bin/sh
+# the first time around...
+expect {
+ timeout { exit 1 }
+ "Enter pathname of shell or RETURN for sh:" {
+ send "\nexit\n"
+ expect "login:" {
+ login
+ }
+ }
+ "login:" {
+ login
+ }
+}
+EOF
+
+# Create Compute Engine disk image.
+echo "Archiving worker_disk.raw... (this may take a while)"
+i="openbsd-${ARCH}-${RELNO}-vmm.tar.gz"
+tar -zcf "$i" worker_disk.raw
+
+cat <<EOF
+Done: $i
+EOF