ZTS: Use FreeBSD cloudinit images

FreeBSD provides CI-IMAGES since some time. These images are
based on nuageinit, which does not support fqdn and sudo for
example. So we need currently some workarounds to get it
working.

The FreeBSD images will be more compatible with cloud-init in
some near future. Then we can remove the workaround things.

These versions are used for testing:
- freebsd13-4r (RELEASE)
- freebsd14-3s (STABLE)
- freebsd15-0c (CURRENT)

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
Signed-off-by: Tino Reichardt <milky-zfs@mcmilk.de>
Closes #17462
This commit is contained in:
Tino Reichardt 2025-06-18 16:19:21 +02:00 committed by GitHub
parent 6cf17f6538
commit 585dbbf13b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 100 additions and 55 deletions

View File

@ -12,10 +12,10 @@ OS="$1"
# OS variant (virt-install --os-variant list) # OS variant (virt-install --os-variant list)
OSv=$OS OSv=$OS
# compressed with .zst extension # FreeBSD urls's
REPO="https://github.com/mcmilk/openzfs-freebsd-images" FREEBSD_REL="https://download.freebsd.org/releases/CI-IMAGES"
FREEBSD="$REPO/releases/download/v2025-04-13" FREEBSD_SNAP="https://download.freebsd.org/snapshots/CI-IMAGES"
URLzs="" URLxz=""
# Ubuntu mirrors # Ubuntu mirrors
UBMIRROR="https://cloud-images.ubuntu.com" UBMIRROR="https://cloud-images.ubuntu.com"
@ -72,49 +72,56 @@ case "$OS" in
URL="https://download.fedoraproject.org/pub/fedora/linux/releases/42/Cloud/x86_64/images/Fedora-Cloud-Base-Generic-42-1.1.x86_64.qcow2" URL="https://download.fedoraproject.org/pub/fedora/linux/releases/42/Cloud/x86_64/images/Fedora-Cloud-Base-Generic-42-1.1.x86_64.qcow2"
;; ;;
freebsd13-4r) freebsd13-4r)
OSNAME="FreeBSD 13.4-RELEASE" FreeBSD="13.4-RELEASE"
OSNAME="FreeBSD $FreeBSD"
OSv="freebsd13.0" OSv="freebsd13.0"
URLzs="$FREEBSD/amd64-freebsd-13.4-RELEASE.qcow2.zst" URLxz="$FREEBSD_REL/$FreeBSD/amd64/Latest/FreeBSD-$FreeBSD-amd64-BASIC-CI.raw.xz"
BASH="/usr/local/bin/bash" KSRC="$FREEBSD_REL/../amd64/$FreeBSD/src.txz"
NIC="rtl8139" NIC="rtl8139"
;; ;;
freebsd13-5r) freebsd13-5r)
OSNAME="FreeBSD 13.5-RELEASE" FreeBSD="13.5-RELEASE"
OSNAME="FreeBSD $FreeBSD"
OSv="freebsd13.0" OSv="freebsd13.0"
URLzs="$FREEBSD/amd64-freebsd-13.5-RELEASE.qcow2.zst" URLxz="$FREEBSD_REL/$FreeBSD/amd64/Latest/FreeBSD-$FreeBSD-amd64-BASIC-CI.raw.xz"
BASH="/usr/local/bin/bash" KSRC="$FREEBSD_REL/../amd64/$FreeBSD/src.txz"
NIC="rtl8139" NIC="rtl8139"
;; ;;
freebsd14-1r)
OSNAME="FreeBSD 14.1-RELEASE"
OSv="freebsd14.0"
URLzs="$FREEBSD/amd64-freebsd-14.1-RELEASE.qcow2.zst"
BASH="/usr/local/bin/bash"
;;
freebsd14-2r) freebsd14-2r)
OSNAME="FreeBSD 14.2-RELEASE" FreeBSD="14.2-RELEASE"
OSNAME="FreeBSD $FreeBSD"
OSv="freebsd14.0" OSv="freebsd14.0"
URLzs="$FREEBSD/amd64-freebsd-14.2-RELEASE.qcow2.zst" KSRC="$FREEBSD_REL/../amd64/$FreeBSD/src.txz"
BASH="/usr/local/bin/bash" URLxz="$FREEBSD_REL/$FreeBSD/amd64/Latest/FreeBSD-$FreeBSD-amd64-BASIC-CI.raw.xz"
;;
freebsd14-3r)
FreeBSD="14.3-RELEASE"
OSNAME="FreeBSD $FreeBSD"
OSv="freebsd14.0"
URLxz="$FREEBSD_REL/$FreeBSD/amd64/Latest/FreeBSD-$FreeBSD-amd64-BASIC-CI.raw.xz"
KSRC="$FREEBSD_REL/../amd64/$FreeBSD/src.txz"
;; ;;
freebsd13-5s) freebsd13-5s)
OSNAME="FreeBSD 13.5-STABLE" FreeBSD="13.5-STABLE"
OSNAME="FreeBSD $FreeBSD"
OSv="freebsd13.0" OSv="freebsd13.0"
URLzs="$FREEBSD/amd64-freebsd-13.5-STABLE.qcow2.zst" URLxz="$FREEBSD_SNAP/$FreeBSD/amd64/Latest/FreeBSD-$FreeBSD-amd64-BASIC-CI.raw.xz"
BASH="/usr/local/bin/bash" KSRC="$FREEBSD_SNAP/../amd64/$FreeBSD/src.txz"
NIC="rtl8139" NIC="rtl8139"
;; ;;
freebsd14-2s) freebsd14-3s)
OSNAME="FreeBSD 14.2-STABLE" FreeBSD="14.3-STABLE"
OSNAME="FreeBSD $FreeBSD"
OSv="freebsd14.0" OSv="freebsd14.0"
URLzs="$FREEBSD/amd64-freebsd-14.2-STABLE.qcow2.zst" URLxz="$FREEBSD_SNAP/$FreeBSD/amd64/Latest/FreeBSD-$FreeBSD-amd64-BASIC-CI-ufs.raw.xz"
BASH="/usr/local/bin/bash" KSRC="$FREEBSD_SNAP/../amd64/$FreeBSD/src.txz"
;; ;;
freebsd15-0c) freebsd15-0c)
OSNAME="FreeBSD 15.0-CURRENT" FreeBSD="15.0-CURRENT"
OSNAME="FreeBSD $FreeBSD"
OSv="freebsd14.0" OSv="freebsd14.0"
URLzs="$FREEBSD/amd64-freebsd-15.0-CURRENT.qcow2.zst" URLxz="$FREEBSD_SNAP/$FreeBSD/amd64/Latest/FreeBSD-$FreeBSD-amd64-BASIC-CI-ufs.raw.xz"
BASH="/usr/local/bin/bash" KSRC="$FREEBSD_SNAP/../amd64/$FreeBSD/src.txz"
;; ;;
tumbleweed) tumbleweed)
OSNAME="openSUSE Tumbleweed" OSNAME="openSUSE Tumbleweed"
@ -168,31 +175,37 @@ echo "CPU=\"$CPU\"" >> $ENV
sudo mkdir -p "/mnt/tests" sudo mkdir -p "/mnt/tests"
sudo chown -R $(whoami) /mnt/tests sudo chown -R $(whoami) /mnt/tests
DISK="/dev/zvol/zpool/openzfs"
sudo zfs create -ps -b 64k -V 80g zpool/openzfs
while true; do test -b $DISK && break; sleep 1; done
# we are downloading via axel, curl and wget are mostly slower and # we are downloading via axel, curl and wget are mostly slower and
# require more return value checking # require more return value checking
IMG="/mnt/tests/cloudimg.qcow2" IMG="/mnt/tests/cloud-image"
if [ ! -z "$URLzs" ]; then if [ ! -z "$URLxz" ]; then
echo "Loading image $URLzs ..." echo "Loading $URLxz ..."
time axel -q -o "$IMG.zst" "$URLzs" time axel -q -o "$IMG" "$URLxz"
zstd -q -d --rm "$IMG.zst" echo "Loading $KSRC ..."
time axel -q -o ~/src.txz $KSRC
else else
echo "Loading image $URL ..." echo "Loading $URL ..."
time axel -q -o "$IMG" "$URL" time axel -q -o "$IMG" "$URL"
fi fi
DISK="/dev/zvol/zpool/openzfs"
FORMAT="raw"
sudo zfs create -ps -b 64k -V 80g zpool/openzfs
while true; do test -b $DISK && break; sleep 1; done
echo "Importing VM image to zvol..." echo "Importing VM image to zvol..."
if [ ! -z "$URLxz" ]; then
xzcat -T0 $IMG | sudo dd of=$DISK bs=4M
else
sudo qemu-img dd -f qcow2 -O raw if=$IMG of=$DISK bs=4M sudo qemu-img dd -f qcow2 -O raw if=$IMG of=$DISK bs=4M
fi
rm -f $IMG rm -f $IMG
PUBKEY=$(cat ~/.ssh/id_ed25519.pub) PUBKEY=$(cat ~/.ssh/id_ed25519.pub)
if [ ${OS:0:7} != "freebsd" ]; then
cat <<EOF > /tmp/user-data cat <<EOF > /tmp/user-data
#cloud-config #cloud-config
fqdn: $OS hostname: $OS
users: users:
- name: root - name: root
@ -208,6 +221,19 @@ growpart:
devices: ['/'] devices: ['/']
ignore_growroot_disabled: false ignore_growroot_disabled: false
EOF EOF
else
cat <<EOF > /tmp/user-data
#cloud-config
hostname: $OS
# minimized config without sudo for nuageinit of FreeBSD
growpart:
mode: auto
devices: ['/']
ignore_growroot_disabled: false
EOF
fi
sudo virsh net-update default add ip-dhcp-host \ sudo virsh net-update default add ip-dhcp-host \
"<host mac='52:54:00:83:79:00' ip='192.168.122.10'/>" --live --config "<host mac='52:54:00:83:79:00' ip='192.168.122.10'/>" --live --config
@ -223,16 +249,9 @@ sudo virt-install \
--graphics none \ --graphics none \
--network bridge=virbr0,model=$NIC,mac='52:54:00:83:79:00' \ --network bridge=virbr0,model=$NIC,mac='52:54:00:83:79:00' \
--cloud-init user-data=/tmp/user-data \ --cloud-init user-data=/tmp/user-data \
--disk $DISK,bus=virtio,cache=none,format=$FORMAT,driver.discard=unmap \ --disk $DISK,bus=virtio,cache=none,format=raw,driver.discard=unmap \
--import --noautoconsole >/dev/null --import --noautoconsole >/dev/null
# enable KSM on Linux
if [ ${OS:0:7} != "freebsd" ]; then
sudo virsh dommemstat --domain "openzfs" --period 5
sudo virsh node-memory-tune 100 50 1
echo 1 | sudo tee /sys/kernel/mm/ksm/run > /dev/null
fi
# Give the VMs hostnames so we don't have to refer to them with # Give the VMs hostnames so we don't have to refer to them with
# hardcoded IP addresses. # hardcoded IP addresses.
# #
@ -252,3 +271,29 @@ StrictHostKeyChecking no
# small timeout, used in while loops later # small timeout, used in while loops later
ConnectTimeout 1 ConnectTimeout 1
EOF EOF
if [ ${OS:0:7} != "freebsd" ]; then
# enable KSM on Linux
sudo virsh dommemstat --domain "openzfs" --period 5
sudo virsh node-memory-tune 100 50 1
echo 1 | sudo tee /sys/kernel/mm/ksm/run > /dev/null
else
# on FreeBSD we need some more init stuff, because of nuageinit
BASH="/usr/local/bin/bash"
while pidof /usr/bin/qemu-system-x86_64 >/dev/null; do
ssh 2>/dev/null root@vm0 "uname -a" && break
done
ssh root@vm0 "pkg install -y bash ca_root_nss git qemu-guest-agent python3 py311-cloud-init"
ssh root@vm0 "chsh -s $BASH root"
ssh root@vm0 'sysrc qemu_guest_agent_enable="YES"'
ssh root@vm0 'sysrc cloudinit_enable="YES"'
ssh root@vm0 "pw add user zfs -w no -s $BASH"
ssh root@vm0 'mkdir -p ~zfs/.ssh'
ssh root@vm0 'echo "zfs ALL=(ALL:ALL) NOPASSWD: ALL" >> /usr/local/etc/sudoers'
ssh root@vm0 'echo "PubkeyAuthentication yes" >> /etc/ssh/sshd_config'
scp ~/.ssh/id_ed25519.pub "root@vm0:~zfs/.ssh/authorized_keys"
ssh root@vm0 'chown -R zfs ~zfs'
ssh root@vm0 'service sshd restart'
scp ~/src.txz "root@vm0:/tmp/src.txz"
ssh root@vm0 'tar -C / -zxf /tmp/src.txz'
fi

View File

@ -39,8 +39,8 @@ jobs:
- name: Generate OS config and CI type - name: Generate OS config and CI type
id: os id: os
run: | run: |
FULL_OS='["almalinux8", "almalinux9", "almalinux10", "debian11", "debian12", "fedora41", "fedora42", "freebsd13-4r", "freebsd14-2s", "freebsd15-0c", "ubuntu22", "ubuntu24"]' FULL_OS='["almalinux8", "almalinux9", "almalinux10", "debian11", "debian12", "fedora41", "fedora42", "freebsd13-4r", "freebsd14-3s", "freebsd15-0c", "ubuntu22", "ubuntu24"]'
QUICK_OS='["almalinux8", "almalinux9", "almalinux10", "debian12", "fedora42", "freebsd14-2r", "ubuntu24"]' QUICK_OS='["almalinux8", "almalinux9", "almalinux10", "debian12", "fedora42", "freebsd14-3s", "ubuntu24"]'
# determine CI type when running on PR # determine CI type when running on PR
ci_type="full" ci_type="full"
if ${{ github.event_name == 'pull_request' }}; then if ${{ github.event_name == 'pull_request' }}; then
@ -84,9 +84,9 @@ jobs:
# rhl: almalinux8, almalinux9, centos-stream9, fedora41 # rhl: almalinux8, almalinux9, centos-stream9, fedora41
# debian: debian11, debian12, ubuntu22, ubuntu24 # debian: debian11, debian12, ubuntu22, ubuntu24
# misc: archlinux, tumbleweed # misc: archlinux, tumbleweed
# FreeBSD variants of 2024-12: # FreeBSD variants of 2025-06:
# FreeBSD Release: freebsd13-4r, freebsd14-2r # FreeBSD Release: freebsd13-4r, freebsd13-5r, freebsd14-1r, freebsd14-2r, freebsd14-3r
# FreeBSD Stable: freebsd13-4s, freebsd14-2s # FreeBSD Stable: freebsd13-5s, freebsd14-3s
# FreeBSD Current: freebsd15-0c # FreeBSD Current: freebsd15-0c
os: ${{ fromJson(needs.test-config.outputs.test_os) }} os: ${{ fromJson(needs.test-config.outputs.test_os) }}
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04