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