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