1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
|
#!/bin/bash
# Create base VM for archsetup testing - Manual Installation
# Author: Craig Jennings <craigmartinjennings@gmail.com>
# License: GNU GPLv3
#
# This script creates a VM booted from Arch ISO, then waits for you to
# manually install Arch using archinstall.
set -e
# Get script directory
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Source utilities
source "$SCRIPT_DIR/lib/logging.sh"
source "$SCRIPT_DIR/lib/vm-utils.sh"
# Configuration
VM_NAME="archsetup-base"
VM_CPUS="${VM_CPUS:-4}"
VM_RAM="${VM_RAM:-8192}" # MB
VM_DISK="${VM_DISK:-50}" # GB
VM_IMAGES_DIR="$PROJECT_ROOT/vm-images"
ISO_URL="https://mirrors.kernel.org/archlinux/iso/latest/archlinux-x86_64.iso"
ISO_PATH="$VM_IMAGES_DIR/arch-latest.iso"
DISK_PATH="$VM_IMAGES_DIR/archsetup-base.qcow2"
# Initialize logging
LOGFILE="$PROJECT_ROOT/test-results/create-base-vm-$(date +'%Y%m%d-%H%M%S').log"
init_logging "$LOGFILE"
section "Creating Base VM for ArchSetup Testing"
# Verify prerequisites
step "Checking prerequisites"
check_libvirt || fatal "libvirt not running"
check_libvirt_group || fatal "User not in libvirt group"
check_kvm || fatal "KVM not available"
success "Prerequisites satisfied"
# Create vm-images directory
mkdir -p "$VM_IMAGES_DIR"
# Download Arch ISO if needed
section "Preparing Arch Linux ISO"
if [ -f "$ISO_PATH" ]; then
info "Arch ISO exists: $ISO_PATH"
# Check if ISO is older than 30 days
if [ $(find "$ISO_PATH" -mtime +30 | wc -l) -gt 0 ]; then
warn "ISO is older than 30 days"
info "Downloading latest version..."
rm -f "$ISO_PATH"
else
success "Using existing ISO"
fi
fi
if [ ! -f "$ISO_PATH" ]; then
step "Downloading latest Arch ISO"
info "URL: $ISO_URL"
info "This may take several minutes..."
if wget --progress=dot:giga -O "$ISO_PATH" "$ISO_URL" 2>&1 | tee -a "$LOGFILE"; then
success "ISO downloaded"
else
fatal "ISO download failed"
fi
fi
# Remove existing VM and disk
if vm_exists "$VM_NAME"; then
warn "VM $VM_NAME already exists - destroying it"
if vm_is_running "$VM_NAME"; then
virsh destroy "$VM_NAME" >> "$LOGFILE" 2>&1
fi
virsh undefine "$VM_NAME" --nvram >> "$LOGFILE" 2>&1 || true
fi
[ -f "$DISK_PATH" ] && rm -f "$DISK_PATH"
# Create and start VM
section "Creating and Starting VM"
info "Creating VM: $VM_NAME"
info " CPUs: $VM_CPUS | RAM: ${VM_RAM}MB | Disk: ${VM_DISK}GB"
virt-install \
--connect qemu:///system \
--name "$VM_NAME" \
--memory "$VM_RAM" \
--vcpus "$VM_CPUS" \
--disk path="$DISK_PATH",size="$VM_DISK",format=qcow2,bus=virtio \
--cdrom "$ISO_PATH" \
--os-variant archlinux \
--network network=default,model=virtio \
--graphics vnc,listen=127.0.0.1 \
--console pty,target.type=serial \
--boot uefi \
--noreboot \
--check path_in_use=off \
--filesystem type=mount,mode=mapped,source="$PROJECT_ROOT/scripts",target=host-scripts \
>> "$LOGFILE" 2>&1 &
VIRT_INSTALL_PID=$!
progress "Waiting for VM to boot from ISO"
sleep 30
# Check if VM started
if ! vm_is_running "$VM_NAME"; then
wait $VIRT_INSTALL_PID
EXIT_CODE=$?
fatal "VM failed to start (exit code: $EXIT_CODE)"
fi
success "VM started successfully"
# Display manual installation instructions
section "Manual Installation Required"
cat << 'EOF'
[i]
[i] Base VM is running from Arch ISO
[i]
[i] NEXT STEPS - Complete installation manually:
[i]
[i] 1. Open virt-viewer (should already be open):
[i] virt-viewer --connect qemu:///system archsetup-base
[i]
[i] 2. Login as 'root' (no password)
[i]
[i] 3. Run: archinstall
[i]
[i] 4. Configure with these settings:
[i] - Hostname: archsetup-test
[i] - Root password: archsetup
[i] - Profile: minimal
[i] - Network: dhcpcd (or NetworkManager)
[i] - Additional packages: openssh git vim sudo iperf3 mtr traceroute bind net-tools sshfs
[i] - Enable: sshd, dhcpcd (or NetworkManager)
[i]
[i] 5. After archinstall completes:
[i] - Chroot into /mnt: arch-chroot /mnt
[i] - Edit /etc/ssh/sshd_config:
[i] sed -i 's/#PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
[i] sed -i 's/#PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config
[i] - Set up shared folder mount (9p filesystem):
[i] mkdir -p /mnt/host-scripts
[i] echo 'host-scripts /mnt/host-scripts 9p trans=virtio,version=9p2000.L,rw 0 0' >> /etc/fstab
[i] - Exit chroot: exit
[i] - Poweroff: poweroff
[i]
[i] 6. After VM powers off, run:
[i] ./scripts/testing/finalize-base-vm.sh
[i]
[i] Log file: $LOGFILE
[i]
EOF
info "Waiting for VM to power off..."
info "(This script will exit when you manually power off the VM)"
# Wait for virt-install to finish (VM powers off)
wait $VIRT_INSTALL_PID || true
success "VM has powered off"
info ""
info "Next step: Run ./scripts/testing/finalize-base-vm.sh"
|