xref: /freebsd/sys/contrib/openzfs/.github/workflows/scripts/qemu-2-start.sh (revision 92f340d137ba5d6db7610ba1dae35842e2c9c8ea)
1#!/usr/bin/env bash
2
3######################################################################
4# 2) start qemu with some operating system, init via cloud-init
5######################################################################
6
7set -eu
8
9# short name used in zfs-qemu.yml
10OS="$1"
11
12# OS variant (virt-install --os-variant list)
13OSv=$OS
14
15# compressed with .zst extension
16REPO="https://github.com/mcmilk/openzfs-freebsd-images"
17FREEBSD="$REPO/releases/download/v2024-12-14"
18URLzs=""
19
20# Ubuntu mirrors
21#UBMIRROR="https://cloud-images.ubuntu.com"
22#UBMIRROR="https://mirrors.cloud.tencent.com/ubuntu-cloud-images"
23UBMIRROR="https://mirror.citrahost.com/ubuntu-cloud-images"
24
25# default nic model for vm's
26NIC="virtio"
27
28case "$OS" in
29  almalinux8)
30    OSNAME="AlmaLinux 8"
31    URL="https://repo.almalinux.org/almalinux/8/cloud/x86_64/images/AlmaLinux-8-GenericCloud-latest.x86_64.qcow2"
32    ;;
33  almalinux9)
34    OSNAME="AlmaLinux 9"
35    URL="https://repo.almalinux.org/almalinux/9/cloud/x86_64/images/AlmaLinux-9-GenericCloud-latest.x86_64.qcow2"
36    ;;
37  archlinux)
38    OSNAME="Archlinux"
39    URL="https://geo.mirror.pkgbuild.com/images/latest/Arch-Linux-x86_64-cloudimg.qcow2"
40    # dns sometimes fails with that url  :/
41    echo "89.187.191.12  geo.mirror.pkgbuild.com" | sudo tee /etc/hosts > /dev/null
42    ;;
43  centos-stream10)
44    OSNAME="CentOS Stream 10"
45    # TODO: #16903 Overwrite OSv to stream9 for virt-install until it's added to osinfo
46    OSv="centos-stream9"
47    URL="https://cloud.centos.org/centos/10-stream/x86_64/images/CentOS-Stream-GenericCloud-10-latest.x86_64.qcow2"
48    ;;
49  centos-stream9)
50    OSNAME="CentOS Stream 9"
51    URL="https://cloud.centos.org/centos/9-stream/x86_64/images/CentOS-Stream-GenericCloud-9-latest.x86_64.qcow2"
52    ;;
53  debian11)
54    OSNAME="Debian 11"
55    URL="https://cloud.debian.org/images/cloud/bullseye/latest/debian-11-generic-amd64.qcow2"
56    ;;
57  debian12)
58    OSNAME="Debian 12"
59    URL="https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-generic-amd64.qcow2"
60    ;;
61  fedora40)
62    OSNAME="Fedora 40"
63    OSv="fedora-unknown"
64    URL="https://download.fedoraproject.org/pub/fedora/linux/releases/40/Cloud/x86_64/images/Fedora-Cloud-Base-Generic.x86_64-40-1.14.qcow2"
65    ;;
66  fedora41)
67    OSNAME="Fedora 41"
68    OSv="fedora-unknown"
69    URL="https://download.fedoraproject.org/pub/fedora/linux/releases/41/Cloud/x86_64/images/Fedora-Cloud-Base-Generic-41-1.4.x86_64.qcow2"
70    ;;
71  freebsd13-4r)
72    OSNAME="FreeBSD 13.4-RELEASE"
73    OSv="freebsd13.0"
74    URLzs="$FREEBSD/amd64-freebsd-13.4-RELEASE.qcow2.zst"
75    BASH="/usr/local/bin/bash"
76    NIC="rtl8139"
77    ;;
78  freebsd14-2r)
79    OSNAME="FreeBSD 14.2-RELEASE"
80    OSv="freebsd14.0"
81    URLzs="$FREEBSD/amd64-freebsd-14.2-RELEASE.qcow2.zst"
82    BASH="/usr/local/bin/bash"
83    ;;
84  freebsd13-4s)
85    OSNAME="FreeBSD 13.4-STABLE"
86    OSv="freebsd13.0"
87    URLzs="$FREEBSD/amd64-freebsd-13.4-STABLE.qcow2.zst"
88    BASH="/usr/local/bin/bash"
89    NIC="rtl8139"
90    ;;
91  freebsd14-2s)
92    OSNAME="FreeBSD 14.2-STABLE"
93    OSv="freebsd14.0"
94    URLzs="$FREEBSD/amd64-freebsd-14.2-STABLE.qcow2.zst"
95    BASH="/usr/local/bin/bash"
96    ;;
97  freebsd15-0c)
98    OSNAME="FreeBSD 15.0-CURRENT"
99    OSv="freebsd14.0"
100    URLzs="$FREEBSD/amd64-freebsd-15.0-CURRENT.qcow2.zst"
101    BASH="/usr/local/bin/bash"
102    ;;
103  tumbleweed)
104    OSNAME="openSUSE Tumbleweed"
105    OSv="opensusetumbleweed"
106    MIRROR="http://opensuse-mirror-gce-us.susecloud.net"
107    URL="$MIRROR/tumbleweed/appliances/openSUSE-MicroOS.x86_64-OpenStack-Cloud.qcow2"
108    ;;
109  ubuntu20)
110    OSNAME="Ubuntu 20.04"
111    OSv="ubuntu20.04"
112    URL="$UBMIRROR/focal/current/focal-server-cloudimg-amd64.img"
113    ;;
114  ubuntu22)
115    OSNAME="Ubuntu 22.04"
116    OSv="ubuntu22.04"
117    URL="$UBMIRROR/jammy/current/jammy-server-cloudimg-amd64.img"
118    ;;
119  ubuntu24)
120    OSNAME="Ubuntu 24.04"
121    OSv="ubuntu24.04"
122    URL="$UBMIRROR/noble/current/noble-server-cloudimg-amd64.img"
123    ;;
124  *)
125    echo "Wrong value for OS variable!"
126    exit 111
127    ;;
128esac
129
130# environment file
131ENV="/var/tmp/env.txt"
132echo "ENV=$ENV" >> $ENV
133
134# result path
135echo 'RESPATH="/var/tmp/test_results"' >> $ENV
136
137# FreeBSD 13 has problems with: e1000+virtio
138echo "NIC=$NIC" >> $ENV
139
140# freebsd15 -> used in zfs-qemu.yml
141echo "OS=$OS" >> $ENV
142
143# freebsd14.0 -> used for virt-install
144echo "OSv=\"$OSv\"" >> $ENV
145
146# FreeBSD 15 (Current) -> used for summary
147echo "OSNAME=\"$OSNAME\"" >> $ENV
148
149sudo mkdir -p "/mnt/tests"
150sudo chown -R $(whoami) /mnt/tests
151
152# we are downloading via axel, curl and wget are mostly slower and
153# require more return value checking
154IMG="/mnt/tests/cloudimg.qcow2"
155if [ ! -z "$URLzs" ]; then
156  echo "Loading image $URLzs ..."
157  time axel -q -o "$IMG.zst" "$URLzs"
158  zstd -q -d --rm "$IMG.zst"
159else
160  echo "Loading image $URL ..."
161  time axel -q -o "$IMG" "$URL"
162fi
163
164DISK="/dev/zvol/zpool/openzfs"
165FORMAT="raw"
166sudo zfs create -ps -b 64k -V 80g zpool/openzfs
167while true; do test -b $DISK && break; sleep 1; done
168echo "Importing VM image to zvol..."
169sudo qemu-img dd -f qcow2 -O raw if=$IMG of=$DISK bs=4M
170rm -f $IMG
171
172PUBKEY=$(cat ~/.ssh/id_ed25519.pub)
173cat <<EOF > /tmp/user-data
174#cloud-config
175
176fqdn: $OS
177
178users:
179- name: root
180  shell: $BASH
181- name: zfs
182  sudo: ALL=(ALL) NOPASSWD:ALL
183  shell: $BASH
184  ssh_authorized_keys:
185    - $PUBKEY
186
187growpart:
188  mode: auto
189  devices: ['/']
190  ignore_growroot_disabled: false
191EOF
192
193sudo virsh net-update default add ip-dhcp-host \
194  "<host mac='52:54:00:83:79:00' ip='192.168.122.10'/>" --live --config
195
196sudo virt-install \
197  --os-variant $OSv \
198  --name "openzfs" \
199  --cpu host-passthrough \
200  --virt-type=kvm --hvm \
201  --vcpus=4,sockets=1 \
202  --memory $((1024*12)) \
203  --memballoon model=virtio \
204  --graphics none \
205  --network bridge=virbr0,model=$NIC,mac='52:54:00:83:79:00' \
206  --cloud-init user-data=/tmp/user-data \
207  --disk $DISK,bus=virtio,cache=none,format=$FORMAT,driver.discard=unmap \
208  --import --noautoconsole >/dev/null
209
210# Give the VMs hostnames so we don't have to refer to them with
211# hardcoded IP addresses.
212#
213# vm0:          Initial VM we install dependencies and build ZFS on.
214# vm1..2        Testing VMs
215for i in {0..9} ; do
216  echo "192.168.122.1$i vm$i" | sudo tee -a /etc/hosts
217done
218
219# in case the directory isn't there already
220mkdir -p $HOME/.ssh
221
222cat <<EOF >> $HOME/.ssh/config
223# no questions please
224StrictHostKeyChecking no
225
226# small timeout, used in while loops later
227ConnectTimeout 1
228EOF
229