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