ISO был переведён на Ubuntu 26.04 LTS, установщик ноды стал переносимым
- build-iso.sh по умолчанию собирает образ на Ubuntu Server 26.04 LTS (Python 3.14), 24.04 остаётся через --ubuntu 24.04; - install_virtuality_node.sh больше не падает на Ubuntu 26.04 и Debian 13: qemu-kvm стал виртуальным пакетом, поэтому QEMU выбирается по архитектуре, dnsutils заменён на bind9-dnsutils, а недоступные пакеты пропускаются с предупреждением; - CI проверяет панель и на Python 3.14. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019LEUXMcdZo7b87mjkUsPgg
Этот коммит содержится в:
@@ -15,8 +15,8 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
# 3.12: Ubuntu 24.04 nodes; 3.13: Debian 13 (no crypt/spwd modules).
|
# 3.12: Ubuntu 24.04, 3.13: Debian 13, 3.14: Ubuntu 26.04 (no crypt/spwd modules).
|
||||||
python: ["3.11", "3.12", "3.13"]
|
python: ["3.11", "3.12", "3.13", "3.14"]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-python@v5
|
- uses: actions/setup-python@v5
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ set -euo pipefail
|
|||||||
|
|
||||||
# ==========================================================
|
# ==========================================================
|
||||||
# Virtuality ISO builder
|
# Virtuality ISO builder
|
||||||
# Remasters the official Ubuntu Server 24.04 live ISO into a
|
# Remasters the official Ubuntu Server LTS live ISO (26.04 by default) into a
|
||||||
# Virtuality installer: Ubuntu autoinstall + bundled Virtuality
|
# Virtuality installer: Ubuntu autoinstall + bundled Virtuality
|
||||||
# source and Python wheels + first boot setup service.
|
# source and Python wheels + first boot setup service.
|
||||||
#
|
#
|
||||||
@@ -16,7 +16,7 @@ REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|||||||
IMAGE_DIR="${REPO_ROOT}/image"
|
IMAGE_DIR="${REPO_ROOT}/image"
|
||||||
|
|
||||||
ARCH="amd64"
|
ARCH="amd64"
|
||||||
UBUNTU_SERIES="24.04"
|
UBUNTU_SERIES="26.04"
|
||||||
UBUNTU_ISO=""
|
UBUNTU_ISO=""
|
||||||
CACHE_DIR="${VIRTUALITY_ISO_CACHE:-${REPO_ROOT}/.cache/iso}"
|
CACHE_DIR="${VIRTUALITY_ISO_CACHE:-${REPO_ROOT}/.cache/iso}"
|
||||||
OUTPUT_DIR="${REPO_ROOT}/dist"
|
OUTPUT_DIR="${REPO_ROOT}/dist"
|
||||||
@@ -32,7 +32,7 @@ LOCALE="en_US.UTF-8"
|
|||||||
KEYBOARD="us"
|
KEYBOARD="us"
|
||||||
TIMEZONE="Etc/UTC"
|
TIMEZONE="Etc/UTC"
|
||||||
WITH_WHEELS="1"
|
WITH_WHEELS="1"
|
||||||
TARGET_PYTHON="3.12"
|
TARGET_PYTHON=""
|
||||||
|
|
||||||
usage() {
|
usage() {
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
@@ -40,7 +40,8 @@ Usage: $(basename "$0") [options]
|
|||||||
|
|
||||||
Options:
|
Options:
|
||||||
--arch amd64|arm64 Target architecture (default: ${ARCH})
|
--arch amd64|arm64 Target architecture (default: ${ARCH})
|
||||||
--ubuntu-iso PATH Use a local Ubuntu ${UBUNTU_SERIES} live-server ISO instead of downloading
|
--ubuntu 26.04|24.04 Ubuntu Server LTS release to base on (default: ${UBUNTU_SERIES})
|
||||||
|
--ubuntu-iso PATH Use a local Ubuntu live-server ISO of that release instead of downloading
|
||||||
--cache-dir DIR Where downloaded Ubuntu ISOs are kept (default: ${CACHE_DIR})
|
--cache-dir DIR Where downloaded Ubuntu ISOs are kept (default: ${CACHE_DIR})
|
||||||
--output DIR Output directory (default: ${OUTPUT_DIR})
|
--output DIR Output directory (default: ${OUTPUT_DIR})
|
||||||
--ref GIT_REF Git ref of Virtuality to bundle (default: ${GIT_REF})
|
--ref GIT_REF Git ref of Virtuality to bundle (default: ${GIT_REF})
|
||||||
@@ -69,6 +70,7 @@ say() { echo "==> $*"; }
|
|||||||
while [[ $# -gt 0 ]]; do
|
while [[ $# -gt 0 ]]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
--arch) ARCH="$2"; shift 2 ;;
|
--arch) ARCH="$2"; shift 2 ;;
|
||||||
|
--ubuntu) UBUNTU_SERIES="$2"; shift 2 ;;
|
||||||
--ubuntu-iso) UBUNTU_ISO="$2"; shift 2 ;;
|
--ubuntu-iso) UBUNTU_ISO="$2"; shift 2 ;;
|
||||||
--cache-dir) CACHE_DIR="$2"; shift 2 ;;
|
--cache-dir) CACHE_DIR="$2"; shift 2 ;;
|
||||||
--output) OUTPUT_DIR="$2"; shift 2 ;;
|
--output) OUTPUT_DIR="$2"; shift 2 ;;
|
||||||
@@ -89,6 +91,13 @@ while [[ $# -gt 0 ]]; do
|
|||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# Python of the target release decides which wheels are bundled.
|
||||||
|
case "$UBUNTU_SERIES" in
|
||||||
|
26.04) TARGET_PYTHON="3.14" ;;
|
||||||
|
24.04) TARGET_PYTHON="3.12" ;;
|
||||||
|
*) die "unsupported --ubuntu ${UBUNTU_SERIES} (26.04 or 24.04)" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
case "$ARCH" in
|
case "$ARCH" in
|
||||||
amd64) PY_PLATFORM_ARCH="x86_64"; MIRROR="https://releases.ubuntu.com/${UBUNTU_SERIES}" ;;
|
amd64) PY_PLATFORM_ARCH="x86_64"; MIRROR="https://releases.ubuntu.com/${UBUNTU_SERIES}" ;;
|
||||||
arm64) PY_PLATFORM_ARCH="aarch64"; MIRROR="https://cdimage.ubuntu.com/releases/${UBUNTU_SERIES}/release" ;;
|
arm64) PY_PLATFORM_ARCH="aarch64"; MIRROR="https://cdimage.ubuntu.com/releases/${UBUNTU_SERIES}/release" ;;
|
||||||
|
|||||||
@@ -92,6 +92,22 @@ run_logged() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Installs the packages this distribution has; package names differ between
|
||||||
|
# Ubuntu 24.04/26.04 and Debian 13 (e.g. qemu-kvm became a virtual package).
|
||||||
|
install_available() {
|
||||||
|
local description="$1"
|
||||||
|
shift
|
||||||
|
local pkg available=()
|
||||||
|
for pkg in "$@"; do
|
||||||
|
if apt-cache show "$pkg" >/dev/null 2>&1; then
|
||||||
|
available+=("$pkg")
|
||||||
|
else
|
||||||
|
warn "Пакет ${pkg} недоступен в этом дистрибутиве, пропускаю"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
run_logged "$description" apt install -y "${available[@]}"
|
||||||
|
}
|
||||||
|
|
||||||
service_state() { systemctl is-active "$1" 2>/dev/null || echo "inactive"; }
|
service_state() { systemctl is-active "$1" 2>/dev/null || echo "inactive"; }
|
||||||
service_enabled() { systemctl is-enabled "$1" 2>/dev/null || echo "disabled"; }
|
service_enabled() { systemctl is-enabled "$1" 2>/dev/null || echo "disabled"; }
|
||||||
free_mb_for_path() { local path="$1"; mkdir -p "$path" 2>/dev/null || true; df -Pm "$path" | awk 'NR==2 {print $4}'; }
|
free_mb_for_path() { local path="$1"; mkdir -p "$path" 2>/dev/null || true; df -Pm "$path" | awk 'NR==2 {print $4}'; }
|
||||||
@@ -153,17 +169,21 @@ step "Обновляем apt cache"
|
|||||||
run_logged "apt update выполнен" apt update
|
run_logged "apt update выполнен" apt update
|
||||||
|
|
||||||
step "Устанавливаем базовые утилиты и зависимости диагностики"
|
step "Устанавливаем базовые утилиты и зависимости диагностики"
|
||||||
run_logged "Базовые пакеты и диагностические утилиты установлены" apt install -y \
|
install_available "Базовые пакеты и диагностические утилиты установлены" \
|
||||||
curl wget git nano htop btop tree ncdu jq unzip xz-utils tar gzip ca-certificates gnupg lsb-release \
|
curl wget git nano htop btop tree ncdu jq unzip xz-utils tar gzip ca-certificates gnupg lsb-release \
|
||||||
software-properties-common apt-transport-https ufw rsync iproute2 iptables nftables dnsutils net-tools openssh-client
|
software-properties-common apt-transport-https ufw rsync iproute2 iptables nftables bind9-dnsutils net-tools openssh-client
|
||||||
|
|
||||||
step "Устанавливаем KVM/QEMU/libvirt"
|
step "Устанавливаем KVM/QEMU/libvirt"
|
||||||
run_logged "Пакеты виртуализации установлены" apt install -y \
|
case "$(uname -m)" in
|
||||||
qemu-kvm qemu-utils libvirt-daemon-system libvirt-clients virtinst \
|
aarch64|arm64) QEMU_SYSTEM_PACKAGES=(qemu-system-arm qemu-efi-aarch64) ;;
|
||||||
bridge-utils dnsmasq-base ovmf swtpm cloud-image-utils
|
*) QEMU_SYSTEM_PACKAGES=(qemu-system-x86 ovmf) ;;
|
||||||
|
esac
|
||||||
|
install_available "Пакеты виртуализации установлены" \
|
||||||
|
"${QEMU_SYSTEM_PACKAGES[@]}" qemu-utils libvirt-daemon-system libvirt-clients virtinst \
|
||||||
|
bridge-utils dnsmasq-base swtpm cloud-image-utils
|
||||||
|
|
||||||
step "Устанавливаем Cockpit и модули"
|
step "Устанавливаем Cockpit и модули"
|
||||||
run_logged "Cockpit установлен" apt install -y \
|
install_available "Cockpit установлен" \
|
||||||
cockpit cockpit-machines cockpit-networkmanager cockpit-storaged cockpit-packagekit
|
cockpit cockpit-machines cockpit-networkmanager cockpit-storaged cockpit-packagekit
|
||||||
|
|
||||||
step "Создаём структуру Virtuality"
|
step "Создаём структуру Virtuality"
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user