Сборка установочного ISO-образа Virtuality была добавлена

image/build-iso.sh пересобирает официальный Ubuntu Server 24.04
live-server ISO (amd64/arm64) в установщик Virtuality:
- /autoinstall.yaml: установщик спрашивает только сеть, диск и
  пользователя, остальное автоматически; есть полностью
  автоматический режим --unattended;
- исходники Virtuality (git-репозиторий, чтобы работал центр
  обновлений) и Python-колёса для офлайн-установки панели;
- virtuality-firstboot.service при первой загрузке ставит KVM,
  libvirt, Cockpit, web-панель, vhealth и консольный dashboard,
  повторяя попытку до успеха.

Также: зависимости панели закреплены полностью, установщики работают
неинтерактивно и учитывают VIRTUALITY_USER, bootstrap.sh стал обёрткой
над install.sh.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019LEUXMcdZo7b87mjkUsPgg
Этот коммит содержится в:
Claude
2026-09-25 06:31:55 +00:00
родитель 975ab4d1a0
Коммит d92b1b9bda
11 изменённых файлов: 431 добавлений и 296 удалений
+5 -2
Просмотреть файл
@@ -5,7 +5,8 @@ REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
DASH_SRC="${REPO_DIR}/scripts/virtuality_console_dashboard.sh"
DASH_DST="/usr/local/bin/virtuality-console-dashboard"
SERVICE_FILE="/etc/systemd/system/virtuality-console-dashboard.service"
TARGET_USER="${SUDO_USER:-${USER:-root}}"
export DEBIAN_FRONTEND=noninteractive
TARGET_USER="${VIRTUALITY_USER:-${SUDO_USER:-${USER:-root}}}"
if [[ "$EUID" -ne 0 ]]; then
echo "Ошибка: запусти через sudo: sudo bash scripts/install_console_dashboard.sh"
@@ -49,7 +50,9 @@ EOF
systemctl daemon-reload
systemctl disable --now getty@tty1.service >/dev/null 2>&1 || true
systemctl enable --now virtuality-console-dashboard.service
systemctl enable virtuality-console-dashboard.service
# --no-block: the unit is ordered after multi-user.target, which may still be starting (first boot).
systemctl start --no-block virtuality-console-dashboard.service
USER_HOME="$(getent passwd "$TARGET_USER" | cut -d: -f6 || true)"
if [[ -n "$USER_HOME" && -d "$USER_HOME" ]]; then
+1 -1
Просмотреть файл
@@ -4,7 +4,7 @@ set -euo pipefail
REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
SRC="${REPO_DIR}/scripts/virtuality_healthcheck.sh"
DST="/usr/local/bin/vhealth"
TARGET_USER="${SUDO_USER:-${USER:-root}}"
TARGET_USER="${VIRTUALITY_USER:-${SUDO_USER:-${USER:-root}}}"
if [[ "$EUID" -ne 0 ]]; then
echo "Ошибка: запусти через sudo: sudo bash scripts/install_healthcheck_command.sh"
+1
Просмотреть файл
@@ -21,6 +21,7 @@ NODE_CONFIG_FILE="${PROFILE_DIR}/web.env"
UPLOAD_TMP_DIR="/var/lib/virtuality/tmp"
WHEELS_DIR="${VIRTUALITY_WHEELS_DIR:-${REPO_DIR}/wheels}"
TOTAL_STEPS=13
export DEBIAN_FRONTEND=noninteractive
# Settings survive updates: explicit env > saved node config > previous install > defaults.
saved_setting() {
+95
Просмотреть файл
@@ -0,0 +1,95 @@
#!/usr/bin/env bash
set -euo pipefail
# ==========================================================
# Virtuality first boot setup
# Runs once on a system installed from a Virtuality image:
# installs KVM/libvirt/Cockpit, the web panel and helpers
# from the bundled source in /opt/virtuality/source.
# ==========================================================
SOURCE_DIR="${VIRTUALITY_SOURCE_DIR:-/opt/virtuality/source}"
IMAGE_ENV="/etc/virtuality/image.env"
STATE_DIR="/var/lib/virtuality"
DONE_FLAG="${STATE_DIR}/.firstboot-done"
LOG_DIR="/var/log/virtuality"
LOG_FILE="${LOG_DIR}/firstboot.log"
APT_LOCK_CONF="/etc/apt/apt.conf.d/90virtuality-lock-timeout"
ISSUE_FILE="/etc/issue.d/virtuality.issue"
NETWORK_WAIT_SECONDS="${VIRTUALITY_NETWORK_WAIT_SECONDS:-300}"
mkdir -p "$LOG_DIR" "$STATE_DIR" "$(dirname "$ISSUE_FILE")"
exec > >(tee -a "$LOG_FILE") 2>&1
now() { date '+%Y-%m-%d %H:%M:%S'; }
say() { echo "[$(now)] [virtuality-firstboot] $*"; }
if [[ -f "$DONE_FLAG" ]]; then
say "already completed, nothing to do"
exit 0
fi
if [[ -f "$IMAGE_ENV" ]]; then
set -a
# shellcheck disable=SC1090
. "$IMAGE_ENV"
set +a
fi
first_human_user() {
getent passwd | awk -F: '$3 >= 1000 && $3 < 60000 && $7 !~ /(nologin|false)$/ {print $1; exit}'
}
AUTH_USER="${VIRTUALITY_USER:-$(first_human_user)}"
AUTH_USER="${AUTH_USER:-root}"
WEB_PORT="${VIRTUALITY_WEB_PORT:-8088}"
export VIRTUALITY_USER="$AUTH_USER"
export VIRTUALITY_AUTH_USER="$AUTH_USER"
export VIRTUALITY_WEB_PORT="$WEB_PORT"
export VIRTUALITY_AUTO_UPDATE="${VIRTUALITY_AUTO_UPDATE:-1}"
# Disk/RAM limits are reported by vhealth; they must not block an image install.
export VIRTUALITY_SKIP_REQUIREMENTS="${VIRTUALITY_SKIP_REQUIREMENTS:-1}"
export DEBIAN_FRONTEND=noninteractive
export TERM="${TERM:-dumb}"
cat > "$ISSUE_FILE" <<'EOF'
Virtuality: first boot setup is running. Progress: sudo journalctl -fu virtuality-firstboot
EOF
say "source: $SOURCE_DIR"
say "panel user: $AUTH_USER, port: $WEB_PORT"
[[ -f "$SOURCE_DIR/install_virtuality_node.sh" ]] || { say "ERROR: Virtuality source not found in $SOURCE_DIR"; exit 1; }
# unattended-upgrades often holds the dpkg lock right after the first boot.
printf 'DPkg::Lock::Timeout "900";\n' > "$APT_LOCK_CONF"
say "waiting for network (up to ${NETWORK_WAIT_SECONDS}s)"
deadline=$(( $(date +%s) + NETWORK_WAIT_SECONDS ))
until ip route show default 2>/dev/null | grep -q . && getent hosts archive.ubuntu.com >/dev/null 2>&1; do
if (( $(date +%s) >= deadline )); then
say "ERROR: no network with DNS. Configure networking; the setup will be retried automatically"
exit 1
fi
sleep 5
done
say "network is ready"
cd "$SOURCE_DIR"
say "step 1/4: virtualization node (KVM, libvirt, Cockpit)"
bash ./install_virtuality_node.sh
say "step 2/4: healthcheck command"
bash ./scripts/install_healthcheck_command.sh
say "step 3/4: web panel"
bash ./scripts/install_web_panel.sh
say "step 4/4: console dashboard"
bash ./scripts/install_console_dashboard.sh
touch "$DONE_FLAG"
cat > "$ISSUE_FILE" <<EOF
Virtuality web panel: http://\4:${WEB_PORT} (login: ${AUTH_USER})
Cockpit: https://\4:9090
EOF
systemctl disable virtuality-firstboot.service >/dev/null 2>&1 || true
say "completed. Web panel: http://$(hostname -I | awk '{print $1}'):${WEB_PORT} login: ${AUTH_USER}"