diff --git a/engine/schema/pom.xml b/engine/schema/pom.xml
index 6e078d7ec9f8..a92845184e95 100644
--- a/engine/schema/pom.xml
+++ b/engine/schema/pom.xml
@@ -88,8 +88,15 @@
diff --git a/engine/schema/templateConfig.sh b/engine/schema/templateConfig.sh
index 7a8283e77c1c..71b395689c15 100755
--- a/engine/schema/templateConfig.sh
+++ b/engine/schema/templateConfig.sh
@@ -28,9 +28,7 @@ function getTemplateVersion() {
subversion2="$(cut -d'.' -f2 <<<"$version")"
minorversion="$(cut -d'.' -f3 <<<"$version")"
fourthversion="$(cut -d'.' -f4 <<<"$version")"
- export CS_VERSION="${subversion1}"."${subversion2}"
export CS_MINOR_VERSION="${minorversion}"
- export VERSION="${CS_VERSION}.${CS_MINOR_VERSION}"
if [[ "$subversion1" -ge "$NEW_VERSIONING_CUTOVER_MAJOR_VERSION" ]]; then
# New versioning (major.minor.security): the third component is the
# security release itself, there is no separate patch component. A
@@ -40,11 +38,17 @@ function getTemplateVersion() {
echo "Invalid version '${projVersion}': major versions at or above ${NEW_VERSIONING_CUTOVER_MAJOR_VERSION} do not support a 4-component major.minor.patch.security format" >&2
exit 1
fi
- export FULL_VERSION="${VERSION}"
+ # The templates are in the directory named after the major version (24),
+ # and the file names contain major.minor (24.0), like 4.22 and 4.22.0 before
+ export CS_VERSION="${subversion1}"
+ export VERSION="${subversion1}.${subversion2}"
+ export FULL_VERSION="${subversion1}.${subversion2}.${minorversion}"
else
# Legacy versioning: major.minor.patch, or major.minor.patch.security when a 4th
# component is present. Without a 4th component, VERSION is already correct as-is;
# appending an empty security component would leave a dangling trailing dot.
+ export CS_VERSION="${subversion1}"."${subversion2}"
+ export VERSION="${CS_VERSION}.${CS_MINOR_VERSION}"
if [[ -n "$fourthversion" ]]; then
export FULL_VERSION="${VERSION}.${fourthversion}"
else
diff --git a/engine/schema/test_templateConfig.sh b/engine/schema/test_templateConfig.sh
index 2acb4281edb7..95cab07fb280 100755
--- a/engine/schema/test_templateConfig.sh
+++ b/engine/schema/test_templateConfig.sh
@@ -51,6 +51,7 @@ assert_eq "legacy: VERSION" "4.22.0" "$VERSION"
assert_eq "legacy: FULL_VERSION keeps the 4th (security) component" "4.22.0.0" "$FULL_VERSION"
getTemplateVersion "4.23.0.1-SNAPSHOT"
+assert_eq "legacy with -SNAPSHOT suffix: CS_VERSION" "4.23" "$CS_VERSION"
assert_eq "legacy with -SNAPSHOT suffix: VERSION" "4.23.0" "$VERSION"
assert_eq "legacy with -SNAPSHOT suffix: FULL_VERSION" "4.23.0.1" "$FULL_VERSION"
@@ -62,16 +63,18 @@ assert_eq "legacy 3-component (no security): FULL_VERSION has no trailing dot" "
# --- getTemplateVersion: new versioning (major >= 24, post-cutover) ---
getTemplateVersion "24.0.0"
-assert_eq "cutover: CS_VERSION" "24.0" "$CS_VERSION"
-assert_eq "cutover: VERSION" "24.0.0" "$VERSION"
+assert_eq "cutover: CS_VERSION (directory) is the major version" "24" "$CS_VERSION"
+assert_eq "cutover: VERSION (file names) is major.minor" "24.0" "$VERSION"
assert_eq "cutover: FULL_VERSION has no trailing dot (patch dropped)" "24.0.0" "$FULL_VERSION"
getTemplateVersion "24.1.2-SNAPSHOT"
-assert_eq "cutover with -SNAPSHOT suffix: VERSION" "24.1.2" "$VERSION"
+assert_eq "cutover with -SNAPSHOT suffix: CS_VERSION" "24" "$CS_VERSION"
+assert_eq "cutover with -SNAPSHOT suffix: VERSION" "24.1" "$VERSION"
assert_eq "cutover with -SNAPSHOT suffix: FULL_VERSION" "24.1.2" "$FULL_VERSION"
getTemplateVersion "99.9.9"
-assert_eq "future major: VERSION" "99.9.9" "$VERSION"
+assert_eq "future major: CS_VERSION" "99" "$CS_VERSION"
+assert_eq "future major: VERSION" "99.9" "$VERSION"
assert_eq "future major: FULL_VERSION" "99.9.9" "$FULL_VERSION"
# A 4-component major.minor.patch.security value is invalid at/after the cutover (matches
@@ -96,7 +99,7 @@ run_create_metadata_file() {
: > "$METADATAFILE"
createMetadataFile
- grep '^version = ' "$METADATAFILE" | head -1 | cut -d' ' -f3
+ grep "^${2:-version} = " "$METADATAFILE" | head -1 | cut -d' ' -f3
rm -rf "$workdir"
}
@@ -107,6 +110,26 @@ assert_eq "metadata.ini legacy 'version' line" "4.22.0.0" "$actual"
actual="$(run_create_metadata_file "24.0.0")"
assert_eq "metadata.ini cutover 'version' line has no trailing dot" "24.0.0" "$actual"
+# --- createMetadataFile: file names, directory, template name and checksum ---
+
+actual="$(run_create_metadata_file "4.22.0.0" downloadurl)"
+assert_eq "metadata.ini legacy downloadurl" "https://download.cloudstack.org/systemvm//4.22/systemvmtemplate-4.22.0-x86_64-kvm.qcow2.bz2" "$actual"
+actual="$(run_create_metadata_file "4.22.0.0" templatename)"
+assert_eq "metadata.ini legacy templatename" "systemvm-kvm-4.22.0-x86_64" "$actual"
+actual="$(run_create_metadata_file "4.22.0.0" checksum)"
+assert_eq "metadata.ini legacy checksum is found" "abc123" "$actual"
+
+actual="$(run_create_metadata_file "24.0.0" downloadurl)"
+assert_eq "metadata.ini cutover downloadurl" "https://download.cloudstack.org/systemvm//24/systemvmtemplate-24.0-x86_64-kvm.qcow2.bz2" "$actual"
+actual="$(run_create_metadata_file "24.0.0" filename)"
+assert_eq "metadata.ini cutover filename" "systemvmtemplate-24.0-x86_64-kvm.qcow2.bz2" "$actual"
+actual="$(run_create_metadata_file "24.0.0" templatename)"
+assert_eq "metadata.ini cutover templatename" "systemvm-kvm-24.0-x86_64" "$actual"
+actual="$(run_create_metadata_file "24.0.0" checksum)"
+assert_eq "metadata.ini cutover checksum is found" "abc123" "$actual"
+actual="$(run_create_metadata_file "24.0.1" downloadurl)"
+assert_eq "metadata.ini cutover security release uses the same template" "https://download.cloudstack.org/systemvm//24/systemvmtemplate-24.0-x86_64-kvm.qcow2.bz2" "$actual"
+
echo ""
echo "${pass} passed, ${fail} failed"
[[ $fail -eq 0 ]]
diff --git a/pom.xml b/pom.xml
index 80111b26a4ab..8a1c7a27652d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -50,7 +50,7 @@
UTF-8
UTF-8
https://download.cloudstack.org/systemvm
- 4.22.0.0
+ 24.0.0
apache
https://sonarcloud.io
engine/schema/src/main/java/org/apache/cloudstack/backup/BackupOfferingDetailsVO.java
diff --git a/scripts/installer/export-templates.sh b/scripts/installer/export-templates.sh
index 820596837131..5d38ac54472a 100755
--- a/scripts/installer/export-templates.sh
+++ b/scripts/installer/export-templates.sh
@@ -26,8 +26,8 @@ TEMPLATE_VERSION=$(awk -F "=" '/version/ {print $2}' ${IMAGE_PATH}${METADATA_FIL
TEMPLATE_PATH="/usr/share/cloudstack-management/templates/systemvm/"
TEMPLATE_MAJOR_VERSION="$(cut -d'.' -f1 <<<"$TEMPLATE_VERSION")"
if [[ "$TEMPLATE_MAJOR_VERSION" -ge "$NEW_VERSIONING_CUTOVER_MAJOR_VERSION" ]]; then
- # New versioning (major.minor.security): the generated template files use the full version as-is.
- VERSION="${TEMPLATE_VERSION}"
+ # New versioning (major.minor.security): the template files contain major.minor, without the security component.
+ VERSION="$(cut -d'.' -f1,2 <<<"$TEMPLATE_VERSION")"
else
# Legacy versioning drops the trailing security component only for four-component metadata;
# a valid three-component major.minor.patch value is already the filename version.
diff --git a/tools/appliance/build.sh b/tools/appliance/build.sh
index fa5d0e853cc6..a38b740daea5 100755
--- a/tools/appliance/build.sh
+++ b/tools/appliance/build.sh
@@ -31,6 +31,9 @@ Usage:
(or use command line arg, default to current architecture. Currently x86_64 and aarch64 are implemented)
* Set \$BUILD_NUMBER to provide build number to apply to built appliance
(or use command line arg, default empty)
+ * Set \$ALLOW_MISSING_EXPORT_TOOLS=1 to only warn (and skip the export) when
+ vhd-util, faketime or ovftool are missing
+ * Set \$SKIP_DEPENDENCY_CHECK=1 to skip the check of build dependencies
* Set \$DEBUG=1 to enable debug logging
* Set \$TRACE=1 to enable trace logging
END
@@ -99,6 +102,12 @@ version="${2:-${version:-}}"
# which architecture to build the template for
target_arch="${3:-${target_arch:-${base_arch}}}"
+# only warn instead of failing if the tools for XenServer/VMware exports are missing
+ALLOW_MISSING_EXPORT_TOOLS="${ALLOW_MISSING_EXPORT_TOOLS:-}"
+
+# skip the check of the build dependencies
+SKIP_DEPENDENCY_CHECK="${SKIP_DEPENDENCY_CHECK:-}"
+
# optional (jenkins) build number tag to put into the image filename
BUILD_NUMBER="${4:-${BUILD_NUMBER:-}}"
@@ -201,6 +210,122 @@ function retry() {
### Script logic
###
+# Check the tools needed by the build before anything is touched, and report all
+# the missing ones at once. Package names are for Debian/Ubuntu.
+function check_dependencies() {
+ if [ -n "${SKIP_DEPENDENCY_CHECK}" ]; then
+ log WARN "skipping the check of build dependencies"
+ return
+ fi
+
+ log INFO "checking build dependencies"
+ local missing=()
+ local warnings=()
+
+ # check_cmd [warn]: record a missing command
+ function check_cmd() {
+ if ! command -v "$1" > /dev/null 2>&1; then
+ if [ "${3:-}" == "warn" ]; then
+ warnings+=("$1 not found ($2)")
+ else
+ missing+=("$1 not found ($2)")
+ fi
+ fi
+ }
+
+ # tools needed for every build
+ check_cmd packer "https://developer.hashicorp.com/packer/install"
+ check_cmd qemu-img "apt install qemu-utils"
+ check_cmd shar "apt install sharutils"
+ check_cmd uuencode "apt install sharutils"
+ check_cmd bzip2 "apt install bzip2"
+ check_cmd tar "apt install tar"
+ check_cmd md5sum "apt install coreutils"
+ check_cmd sha512sum "apt install coreutils"
+
+ # the emulator packer uses for the target architecture
+ local qemu_binary="qemu-system-${target_arch}"
+ if [ "${target_arch}" == "x86_64" ]; then
+ check_cmd qemu-system-x86_64 "apt install qemu-system-x86"
+ else
+ check_cmd "${qemu_binary}" "apt install qemu-system-arm"
+ fi
+
+ # packer needs the qemu plugin (not installed with packer itself)
+ if command -v packer > /dev/null 2>&1; then
+ if ! packer plugins installed 2> /dev/null | grep -q "packer-plugin-qemu"; then
+ missing+=("packer qemu plugin not installed (packer plugins install github.com/hashicorp/qemu)")
+ fi
+ fi
+
+ # KVM acceleration, if the packer template asks for it
+ local template_json="${appliance}/template-base_${base_arch}-target_${target_arch}.json"
+ if [ -f "${template_json}" ] && grep -q '"accelerator": *"kvm"' "${template_json}"; then
+ if [ ! -r /dev/kvm ] || [ ! -w /dev/kvm ]; then
+ missing+=("/dev/kvm is not accessible for the current user (add the user to the kvm group)")
+ fi
+ fi
+
+ # UEFI firmware for building aarch64 on another architecture
+ if [ "${target_arch}" == "aarch64" ] && [ "${base_arch}" != "aarch64" ]; then
+ if [ ! -f /usr/share/qemu-efi-aarch64/QEMU_EFI.fd ]; then
+ missing+=("/usr/share/qemu-efi-aarch64/QEMU_EFI.fd not found (apt install qemu-efi-aarch64)")
+ fi
+ fi
+
+ # exports, which are only done for x86_64
+ if [ "${target_arch}" == "x86_64" ]; then
+ local export_level=
+ if [ -n "${ALLOW_MISSING_EXPORT_TOOLS}" ]; then
+ export_level=warn
+ fi
+ check_cmd zip "apt install zip"
+
+ # XenServer
+ check_cmd faketime "apt install faketime" ${export_level}
+ check_cmd vhd-util "see the comments in build.sh, or http://packages.shapeblue.com/systemvmtemplate/vhd-util" ${export_level}
+ if command -v vhd-util > /dev/null 2>&1; then
+ # vhd-util is a 32-bit binary: it needs the i386 libraries, and faketime
+ # needs to be preloadable into it (faketime:i386)
+ local vhd_util_out
+ vhd_util_out=$(ldd "$(command -v vhd-util)" 2>&1 || true)
+ if echo "${vhd_util_out}" | grep -qE "not found|not a dynamic|No such file"; then
+ local msg="vhd-util cannot be run, missing libraries (apt install libuuid1:i386 libc6:i386, libvhd.so.1.0 in ldconfig path)"
+ if [ -n "${export_level}" ]; then warnings+=("${msg}"); else missing+=("${msg}"); fi
+ elif command -v faketime > /dev/null 2>&1; then
+ vhd_util_out=$(faketime '2010-01-01' vhd-util 2>&1 || true)
+ if echo "${vhd_util_out}" | grep -q "cannot be preloaded"; then
+ local msg="faketime cannot be used with 32-bit vhd-util (apt install faketime:i386, dpkg --add-architecture i386)"
+ if [ -n "${export_level}" ]; then warnings+=("${msg}"); else missing+=("${msg}"); fi
+ fi
+ fi
+ fi
+
+ # VMware
+ check_cmd ovftool "VMware OVF Tool, https://developer.broadcom.com/tools/open-virtualization-format-ovf-tool/latest" ${export_level}
+ fi
+
+ # the build needs the ISO, a 5G disk, and the raw images of the exports
+ local free_gb
+ free_gb=$(df -P -BG . | awk 'NR==2 {gsub("G","",$4); print $4}')
+ if [ -n "${free_gb}" ] && [ "${free_gb}" -lt 20 ] 2> /dev/null; then
+ warnings+=("only ${free_gb}G free in $(pwd), the build needs about 20G")
+ fi
+
+ local item
+ for item in "${warnings[@]}"; do
+ log WARN "${item}"
+ done
+ if [ ${#missing[@]} -gt 0 ]; then
+ for item in "${missing[@]}"; do
+ log ERROR "${item}"
+ done
+ error "${#missing[@]} build dependencies are missing or broken, see above (set SKIP_DEPENDENCY_CHECK=1 to ignore)"
+ fi
+ unset -f check_cmd
+ log INFO "all build dependencies are available"
+}
+
function create_definition() {
if [ "${appliance}" != "${appliance_build_name}" ]; then
cp -r "${appliance}" "${appliance_build_name}"
@@ -350,6 +475,7 @@ function hyperv_export() {
###
function main() {
+ check_dependencies
prepare
create_definition
diff --git a/tools/appliance/systemvmtemplate/http/preseed_aarch64.cfg b/tools/appliance/systemvmtemplate/http/preseed_aarch64.cfg
index 5262603deaa4..92e426d3d0d2 100644
--- a/tools/appliance/systemvmtemplate/http/preseed_aarch64.cfg
+++ b/tools/appliance/systemvmtemplate/http/preseed_aarch64.cfg
@@ -107,7 +107,7 @@ d-i passwd/user-default-groups string audio cdrom video admin
### Package selection
tasksel tasksel/first multiselect ssh-server
-d-i pkgsel/include string openssh-server ntp acpid sudo bzip2 openssl
+d-i pkgsel/include string openssh-server chrony acpid sudo bzip2 openssl
# Allowed values: none, safe-upgrade, full-upgrade
d-i pkgsel/upgrade select full-upgrade
d-i pkgsel/update-policy select none
diff --git a/tools/appliance/systemvmtemplate/http/preseed_x86_64.cfg b/tools/appliance/systemvmtemplate/http/preseed_x86_64.cfg
index 1ed0edd492f9..fdcfe83c1010 100644
--- a/tools/appliance/systemvmtemplate/http/preseed_x86_64.cfg
+++ b/tools/appliance/systemvmtemplate/http/preseed_x86_64.cfg
@@ -98,7 +98,7 @@ d-i passwd/user-default-groups string audio cdrom video admin
### Package selection
tasksel tasksel/first multiselect ssh-server
-d-i pkgsel/include string openssh-server ntp acpid sudo bzip2 openssl
+d-i pkgsel/include string openssh-server chrony acpid sudo bzip2 openssl
# Allowed values: none, safe-upgrade, full-upgrade
d-i pkgsel/upgrade select full-upgrade
d-i pkgsel/update-policy select none
diff --git a/tools/appliance/systemvmtemplate/scripts/apt_upgrade.sh b/tools/appliance/systemvmtemplate/scripts/apt_upgrade.sh
index 91a1dd3cdabc..38336dd0ac1d 100755
--- a/tools/appliance/systemvmtemplate/scripts/apt_upgrade.sh
+++ b/tools/appliance/systemvmtemplate/scripts/apt_upgrade.sh
@@ -32,12 +32,18 @@ function fix_tune2fs() {
}
function add_backports() {
- sed -i '/cdrom/d' /etc/apt/sources.list
- sed -i '/deb-src/d' /etc/apt/sources.list
- sed -i '/backports/d' /etc/apt/sources.list
- sed -i '/security/d' /etc/apt/sources.list
- echo 'deb http://http.debian.net/debian bookworm-backports main' >> /etc/apt/sources.list
- echo 'deb http://security.debian.org/debian-security bookworm-security main' >> /etc/apt/sources.list
+ # Debian 13 installs apt sources in /etc/apt/sources.list.d/debian.sources
+ # and /etc/apt/sources.list may not exist
+ if [ -f /etc/apt/sources.list ]; then
+ sed -i '/cdrom/d' /etc/apt/sources.list
+ sed -i '/deb-src/d' /etc/apt/sources.list
+ sed -i '/backports/d' /etc/apt/sources.list
+ sed -i '/security/d' /etc/apt/sources.list
+ fi
+ cat > /etc/apt/sources.list.d/backports-security.list << EOF
+deb http://http.debian.net/debian trixie-backports main
+deb http://security.debian.org/debian-security trixie-security main
+EOF
}
function apt_upgrade() {
diff --git a/tools/appliance/systemvmtemplate/scripts/configure_systemvm_services.sh b/tools/appliance/systemvmtemplate/scripts/configure_systemvm_services.sh
index 8bc71d29c1c0..455e59915f87 100755
--- a/tools/appliance/systemvmtemplate/scripts/configure_systemvm_services.sh
+++ b/tools/appliance/systemvmtemplate/scripts/configure_systemvm_services.sh
@@ -19,7 +19,7 @@
set -e
set -x
-CLOUDSTACK_RELEASE=4.22.0
+CLOUDSTACK_RELEASE=24.0
function configure_apache2() {
# Enable ssl, rewrite and auth
@@ -41,7 +41,7 @@ function configure_issue() {
__?.o/ Apache CloudStack SystemVM $CLOUDSTACK_RELEASE
( )# https://cloudstack.apache.org
- (___(_) Debian GNU/Linux 12 \n \l
+ (___(_) Debian GNU/Linux 13 \n \l
EOF
}
@@ -142,8 +142,12 @@ datasource:
EOF
touch /etc/cloud/cloud-init.disabled
- systemctl stop cloud-init
- systemctl disable cloud-init
+ # cloud-init.service was split into several units in newer cloud-init versions
+ for svc in cloud-init cloud-init-local cloud-init-main cloud-init-network cloud-config cloud-final; do
+ if systemctl cat ${svc}.service > /dev/null 2>&1; then
+ systemctl disable ${svc}.service
+ fi
+ done
configure_apache2
configure_strongswan
diff --git a/tools/appliance/systemvmtemplate/scripts/install_systemvm_packages.sh b/tools/appliance/systemvmtemplate/scripts/install_systemvm_packages.sh
index d391b5c4e192..00ab7e194a33 100755
--- a/tools/appliance/systemvmtemplate/scripts/install_systemvm_packages.sh
+++ b/tools/appliance/systemvmtemplate/scripts/install_systemvm_packages.sh
@@ -66,7 +66,7 @@ function install_packages() {
xenstore-utils libxenstore4 \
ipvsadm conntrackd libnetfilter-conntrack3 \
keepalived irqbalance \
- openjdk-17-jre-headless \
+ openjdk-21-jre-headless \
ipcalc ipset \
iptables-persistent \
libtcnative-1 libssl-dev libapr1-dev \
@@ -77,7 +77,7 @@ function install_packages() {
sharutils genisoimage \
strongswan libcharon-extra-plugins libstrongswan-extra-plugins strongswan-charon strongswan-starter \
virt-what open-vm-tools qemu-guest-agent hyperv-daemons cloud-guest-utils \
- conntrack apt-transport-https ca-certificates curl gnupg gnupg-agent software-properties-common
+ conntrack apt-transport-https ca-certificates curl gnupg gnupg-agent
apt-get install -y python3-json-pointer python3-jsonschema cloud-init
@@ -91,17 +91,14 @@ function install_packages() {
fi
# Install docker and containerd for CKS
- curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
- apt-key fingerprint 0EBFCD88
- if [ "${arch}" == "arm64" ]; then
- add-apt-repository "deb [arch=arm64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
- elif [ "${arch}" == "amd64" ]; then
- add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
- elif [ "${arch}" == "s390x" ]; then
- add-apt-repository "deb [arch=s390x] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
- else
- add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
+ local docker_arch="${arch}"
+ if [[ "${arch}" != "arm64" && "${arch}" != "amd64" && "${arch}" != "s390x" ]]; then
+ docker_arch="amd64"
fi
+ install -m 0755 -d /etc/apt/keyrings
+ curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
+ chmod a+r /etc/apt/keyrings/docker.asc
+ echo "deb [arch=${docker_arch} signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian $(. /etc/os-release && echo "${VERSION_CODENAME}") stable" > /etc/apt/sources.list.d/docker.list
apt-get update
${apt_get} install containerd.io
diff --git a/tools/appliance/systemvmtemplate/template-base_aarch64-target_aarch64.json b/tools/appliance/systemvmtemplate/template-base_aarch64-target_aarch64.json
index f15552ca5cc4..fe1e363423e2 100644
--- a/tools/appliance/systemvmtemplate/template-base_aarch64-target_aarch64.json
+++ b/tools/appliance/systemvmtemplate/template-base_aarch64-target_aarch64.json
@@ -32,8 +32,8 @@
"format": "qcow2",
"headless": true,
"http_directory": "http",
- "iso_checksum": "sha512:55ab206cd8b0da2898767c3eb6ab5ebef101e3925ec91b3b5f0a286136195b7072588f6ac2d059c545c6938978704ae78cd18d7d9d2a86a7380e46ce27ee4e7b",
- "iso_url": "https://cdimage.debian.org/mirror/cdimage/archive/12.12.0/arm64/iso-cd/debian-12.12.0-arm64-netinst.iso",
+ "iso_checksum": "sha512:cff08e2f29c2846f0503fe57ad1085b5067f29acab444acdf7cdf5b10f2a11140a0e87828e4ffeb9828d188053690467ebe50151c142551d6053fc3288808b86",
+ "iso_url": "https://cdimage.debian.org/mirror/cdimage/release/13.7.0/arm64/iso-cd/debian-13.7.0-arm64-netinst.iso",
"net_device": "virtio-net",
"output_directory": "../dist",
"qemu_binary": "qemu-system-aarch64",
diff --git a/tools/appliance/systemvmtemplate/template-base_x86_64-target_aarch64.json b/tools/appliance/systemvmtemplate/template-base_x86_64-target_aarch64.json
index c16bf1fb2a29..5c15d35888c3 100644
--- a/tools/appliance/systemvmtemplate/template-base_x86_64-target_aarch64.json
+++ b/tools/appliance/systemvmtemplate/template-base_x86_64-target_aarch64.json
@@ -31,8 +31,8 @@
"format": "qcow2",
"headless": true,
"http_directory": "http",
- "iso_checksum": "sha512:55ab206cd8b0da2898767c3eb6ab5ebef101e3925ec91b3b5f0a286136195b7072588f6ac2d059c545c6938978704ae78cd18d7d9d2a86a7380e46ce27ee4e7b",
- "iso_url": "https://cdimage.debian.org/mirror/cdimage/archive/12.12.0/arm64/iso-cd/debian-12.12.0-arm64-netinst.iso",
+ "iso_checksum": "sha512:cff08e2f29c2846f0503fe57ad1085b5067f29acab444acdf7cdf5b10f2a11140a0e87828e4ffeb9828d188053690467ebe50151c142551d6053fc3288808b86",
+ "iso_url": "https://cdimage.debian.org/mirror/cdimage/release/13.7.0/arm64/iso-cd/debian-13.7.0-arm64-netinst.iso",
"net_device": "virtio-net",
"output_directory": "../dist",
"qemu_binary": "qemu-system-aarch64",
diff --git a/tools/appliance/systemvmtemplate/template-base_x86_64-target_x86_64.json b/tools/appliance/systemvmtemplate/template-base_x86_64-target_x86_64.json
index 941eea9dcd7b..967645b500d5 100644
--- a/tools/appliance/systemvmtemplate/template-base_x86_64-target_x86_64.json
+++ b/tools/appliance/systemvmtemplate/template-base_x86_64-target_x86_64.json
@@ -27,8 +27,8 @@
"format": "qcow2",
"headless": true,
"http_directory": "http",
- "iso_checksum": "sha512:c93055182057dd19a334260671c7e10880541b7721ad9c8df87be47e0a11d5bbf85018350ff224ff6a5f6a68320b07e95d539cef9dc020c93966bfaa86d4b2ce",
- "iso_url": "https://cdimage.debian.org/mirror/cdimage/archive/12.12.0/amd64/iso-cd/debian-12.12.0-amd64-netinst.iso",
+ "iso_checksum": "sha512:ef04d0276850d70e4aaec0b55003628660e9631b26e35215a70ab3c8c707294a4b12731bc73c75a932902f703a7c278310ca99df28d6b36fb06d5618d8d0f678",
+ "iso_url": "https://cdimage.debian.org/mirror/cdimage/release/13.7.0/amd64/iso-cd/debian-13.7.0-amd64-netinst.iso",
"net_device": "virtio-net",
"output_directory": "../dist",
"qemuargs": [