Commit Graph
57 Commits
Author SHA1 Message Date
guofangandClaude Sonnet 5.5 2fe0d568ce Zoom the macOS display window to fit so the installer screen is usable on Retina
cocoa does not scale the guest by default, so the 1024x768 ramfb screen of the
Windows installer looks tiny on a Retina display. zoom-to-fit stretches it to
the window, as UTM does.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-23 23:36:31 +08:00
guofangandClaude Sonnet 5.5 b073d87a56 Disable the HVF in-kernel irqchip for Windows 11 on macOS and document why
With the HVF in-kernel GICv3, QEMU's usb-storage races on the status packet
and Windows Setup stalls 10 s after every burst of reads when installing from
the ISO (utmapp/UTM#7970). Use the emulated interrupt controller until
upstream QEMU gets the fix from the UTM fork. Record the investigation in
windows11-arm64-install-speed.md.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-23 23:17:55 +08:00
GuofangandClaude Sonnet 5.5 6ff9570ca0 Add example WireGuard server and client configs
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-23 15:12:59 +08:00
guofangandClaude Sonnet 5.5 96f4beabed Update vm-images: make the staged ISO copy writable on macOS
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-22 21:43:53 +08:00
GuofangandClaude Sonnet 5.5 fa9ddee2b6 Add --arch to run-windows11.py and download the Windows ISO with --download-only
Update vm-images: add a windows11 download target.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-21 16:45:37 +08:00
GuofangandClaude Sonnet 5.5 f8d02dfc70 Add one-click installers for admin and user batch scripts
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-20 12:52:17 +08:00
GuofangandClaude Sonnet 5.5 65a5780e02 Install OpenSSH Server during Windows setup
Install it at first logon from the Win32-OpenSSH zip on the seed ISO via
Configure-Windows.ps1 -InstallOpenSSH, replacing the manual 05/06 batch
files. The administrator public key now comes from the host
(SSH_PUBLIC_KEY_FILE or ~/.ssh/id_*.pub) instead of being hardcoded.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-20 11:55:38 +08:00
GuofangandClaude Sonnet 5.5 552a292894 Install OpenSSH Server from the Win32-OpenSSH zip
Carry the zip for the host architecture in the seed ISO and add
06-Install-OpenSSH-Zip-Admin.bat, which installs from it instead of
Windows Update. Update vm-images.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 14:28:13 +08:00
GuofangandClaude Sonnet 5.5 07355a41f1 Update vm-images: default the work directory to /var/tmp
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 13:38:48 +08:00
GuofangandClaude Sonnet 5.5 92e91851f1 Update vm-images: drop a redundant mkdir
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 13:28:45 +08:00
GuofangandClaude Sonnet 5.5 b9e59b7ca0 Update vm-images: stage the Windows ISO files with rsync
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 13:26:25 +08:00
GuofangandClaude Sonnet 5.5 6f2440b710 Drop .install from the Windows install disk image name
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 09:28:55 +08:00
guofangandClaude Sonnet 5.5 c139c566d0 Use virtio-gpu with viogpudo on Arm64 Windows 11
Replace ramfb with virtio-gpu-pci at 2048x1280 and install the viogpudo
driver from the VirtIO ISO. ramfb has a fixed mode, and keeping both
adapters left Windows with a second, fixed-mode monitor.

Windows Setup and the base image have no viogpudo driver, so on the
launch that creates the system disk the launcher also adds a ramfb ahead
of the config files. The display window shows the first GPU.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-18 17:47:48 +08:00
GuofangandClaude Sonnet 5.5 361ecd977a Pick the Arm64 rustup and Qt builds on Arm64 Windows
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-18 15:42:35 +08:00
GuofangandClaude Sonnet 5.5 0356cf91f4 Add a script that installs ws2tcp-local from its latest release
The silent installer skips the desktop shortcut option, so the script
creates the shortcut itself.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-18 15:41:06 +08:00
GuofangandClaude Sonnet 5.5 11db14445e Update vm-images: ignore aria2 progress files
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-18 14:29:06 +08:00
GuofangandClaude Sonnet 5.5 f973096366 Update vm-images: log each command and build the install disk in place
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-18 14:25:20 +08:00
GuofangandClaude Sonnet 5.5 b26286c820 Make --install-from-img take no file; derive it from the ISO path
--install-from-img now works like --install-from-iso: the installation
media is the ISO path (WIN11_VM_INSTALL_ISO or the downloader's) with
.install.img in place of .iso, which is where
build-windows-install-disk.sh writes it by default. Drop the FILE argument
and WIN11_VM_INSTALL_IMG.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-18 14:24:09 +08:00
guofangandClaude Sonnet 5.5 69dcfe1d9f Install the VirtIO Arm64 drivers with pnputil; make OpenSSH a batch file
On Arm64 Windows the VirtIO guest tools installer is an x86 program and the
VirtIO ISO has no Arm64 package for it, so the first-logon script failed there
and the guest had no network (no NetKVM driver). Install the Arm64 NetKVM,
vioserial, Balloon, viorng and vioinput drivers from their folders on the ISO
with pnputil instead.

The OpenSSH Server capability is downloaded through Windows Update, which can
take very long and blocked the rest of the script. Move it, with the
administrator authorized key, into 05-Install-OpenSSH-Admin.bat, which the
script copies to the Installers folder on the desktop to run by hand.

Update the vm-images submodule to the build script that runs on Debian.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-17 17:43:29 +08:00
guofangandClaude Sonnet 5.5 1732ec39d0 Install Windows 11 from a disk image with --install-from-img
Reading the installation files through QEMU's emulated USB CD-ROM runs at a
few MB/s on macOS. --install-from-img FILE (or WIN11_VM_INSTALL_IMG) attaches
an installation disk image built by vm-images/build-windows-install-disk.sh as
an NVMe disk instead, which is read about 15 times faster. The image is
attached with snapshot=on because NVMe cannot report write protection and
Windows fails on a read-only volume.

Add windows11-arm64-install-speed.md with the analysis and measurements.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-17 17:02:58 +08:00
GuofangandClaude Sonnet 5.5 946771c6af Mark the installer batch files that need administrator rights with -Admin
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-17 15:45:11 +08:00
GuofangandClaude Sonnet 5.5 fd1d9d651d Split the QEMU configs by host system and architecture
Replace qemu/<guest>-<arch>.ini with qemu/<guest>-<os>-<arch>.ini, where os is
linux or darwin, the name platform.system() reports. The accelerators move out
of the shared <guest>.ini into these files (KVM on Linux, HVF on macOS, TCG as
the fallback). The launchers pick the file from the host system and
architecture, and reject amd64 guests on macOS hosts, so no darwin-amd64 files
exist.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-17 15:05:02 +08:00
guofangandClaude Sonnet 5.5 c13ebc7d11 Support arm64 hosts in the Windows 11 launcher
Pick qemu-system-aarch64, the AArch64 UEFI firmware and a per-architecture
QEMU config (NVMe disk, virtio-net, ramfb, USB installation media) on arm64,
render the answer file for the target architecture, and move the q35-only
disk and NIC devices out of the shared config. Update vm-images to match
arm64 Windows ISO names.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-17 14:23:44 +08:00
GuofangandClaude Sonnet 5.5 5feed51c61 Locate the answer media by its CIDATA volume label in Autounattend.xml
Shorten the first-logon CommandLine and stop depending on a drive letter.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-16 17:45:55 +08:00
GuofangandClaude Sonnet 5.5 1ac9221198 Copy the installer batch files to an Installers folder on the desktop
Adds a -CopyInstallers switch to the Windows 11 configure script and enables
it in Autounattend.xml.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-16 13:58:41 +08:00
GuofangandClaude Sonnet 5.5 ca716d2b61 Include the numbered installer batch files in the Windows 11 seed ISO
The launcher also rebuilds the seed ISO when one of them changes.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-16 13:57:19 +08:00
GuofangandClaude Sonnet 5.5 8e1907e567 Install Qt 6.10.3 by default
ws2tcp-local-gui needs qt_generate_deploy_app_script INCLUDE_PLUGINS, which
Qt 6.8 does not support.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-16 13:24:52 +08:00
GuofangandClaude Sonnet 5.5 40bbd8a693 Number the Windows 11 installer batch files in install order
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-16 13:15:46 +08:00
GuofangandClaude Sonnet 5.5 583dc6955a Add Qt 6 and NSIS installer batch files for the Windows 11 VM
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-16 13:03:07 +08:00
GuofangandClaude Sonnet 5.5 2eaa0f9d32 Add rustup installer batch file for the Windows 11 VM
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-16 13:00:06 +08:00
GuofangandClaude Sonnet 5.5 9adcf6acca Add Git for Windows installer batch file for the Windows 11 VM
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-16 12:59:31 +08:00
GuofangandClaude Sonnet 5.5 4e843947e6 Add CMake installer batch file for the Windows 11 VM
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-16 12:59:17 +08:00
GuofangandClaude Sonnet 5.5 a55400c682 Add MSVC 2022 Build Tools installer batch file for the Windows 11 VM
Installs the C++ workload through winget; run it as administrator.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-16 12:56:56 +08:00
GuofangandClaude Sonnet 5.5 907dbf92b4 Add -DisableAutoUpdate switch to the Windows 11 configure script
Disables automatic Windows Update via policy, pins the current feature
release, and is enabled in Autounattend.xml.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-16 10:00:23 +08:00
GuofangandClaude Sonnet 5.5 c63c25c7b1 Warn instead of failing when a forwarded host port is in use in the Windows 11 launcher
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-15 12:40:19 +08:00
GuofangandClaude Sonnet 5.5 e1e5a2149c Load the Windows 11 VM hardware from QEMU config files and add port options
Move the QEMU hardware definition of the Windows 11 VM into
qemu/windows11.ini and qemu/windows11-amd64.ini, loaded with -readconfig
like the Linux launchers. The network stays in the launcher because a
config file section cannot hold two hostfwd entries. Add --rdp-port and
--ssh-port, which override the WIN11_VM_*_PORT environment variables.
WIN11_VM_MEMORY and WIN11_VM_CPUS are replaced by the config file.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-15 12:36:15 +08:00
GuofangandClaude Sonnet 5.5 26baf25172 Self-elevate and pause at the end of the Windows 11 configure script
Relaunch as Administrator through UAC when needed, report success or
failure, and wait for Enter before the window closes. Autounattend.xml
passes -NoPause so the unattended install does not block.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-15 10:02:37 +08:00
GuofangandClaude Sonnet 5.5 96c689b03e Make VirtIO and automatic logon opt-in in the Windows 11 configure script
Add -InstallVirtIO and -EnableAutomaticLogon switches to
Configure-Windows.ps1 so it can run standalone on a physical machine.
Autounattend.xml passes both switches during the virtual machine install.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-15 10:00:37 +08:00
GuofangandClaude Opus 5.5 1691062554 Add Ubuntu 26.04 virtual machine
Add run-ubuntu2604.py with its QEMU config files and NoCloud seed. The
launcher follows the Debian 13 one, with UBUNTU_VM_ settings and SSH
forwarded to host port 2225. The seed injects the current user's SSH public
key, uses the USTC mirror (ubuntu-ports on arm64) and installs the GNOME
desktop on first boot. Update vm-images for the ubuntu2604 image target.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Kwxp2XWvKnuEBifnCbhyX5
2026-10-15 09:00:15 +08:00
GuofangandClaude Opus 5.5 649399aaa1 Print the SSH command again in the Debian and Fedora launchers
Moving the SSH port forward into the QEMU config files dropped the
launchers' SSH hint. Read the host port forwarded to guest port 22 from
the rendered config and print the matching ssh command.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdbBg69LciFz8kjVCtnkbj
2026-10-11 13:44:52 +08:00
GuofangandClaude Sonnet 5.5 e934faf776 Add a commented ibus-table-wubi package to the Debian seed user-data
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-10 19:47:38 +08:00
GuofangandClaude Sonnet 5.5 2fd82ab2c9 Inject the current user's SSH public key into the Debian seed ISO
user-data is now a template with an @SSH_PUBKEY@ placeholder that
build-seed.sh fills in from SSH_PUBKEY_FILE, ~/.ssh/id_*.pub or ssh-agent.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-10 19:17:04 +08:00
guofangandClaude Opus 5.5 1251b88164 Disable QEMU's default NIC in the Debian and Fedora launchers
A [netdev] in a -readconfig file does not stop QEMU from adding its
default NIC, so the guests had a second user-mode network without the
SSH port forward. Both NICs got 10.0.2.15 over DHCP, and SSH only worked
on boots where the forwarded NIC won the race for the default route.

Removing the default NIC shifts the other PCI devices down one slot, so
existing VMs may need their UEFI variable store reset to boot again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 00:47:00 +08:00
GuofangandClaude Opus 5.5 204051f930 Add --download-only to the VM launchers
The option downloads the media a launcher would fetch automatically and
exits without checking for QEMU, creating a VM disk or starting the VM:
the base image for Debian, AlmaLinux and Fedora, and the VirtIO tools
ISO for Windows 11.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YKxXLyiL7XJ3a9e8HmR2my
2026-09-30 10:56:27 +08:00
GuofangandClaude Opus 5.5 7912a1549e Update vm-images to download from several mirrors with aria2c
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YKxXLyiL7XJ3a9e8HmR2my
2026-09-30 10:56:27 +08:00
GuofangandClaude Opus 5.5 646ee8aae9 Update vm-images to download Fedora from the TUNA mirror
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YKxXLyiL7XJ3a9e8HmR2my
2026-09-30 10:36:51 +08:00
GuofangandClaude Opus 5.5 be9291c57b Load the Fedora 44 VM hardware from QEMU config files
Apply the Debian launcher's config file layout to Fedora: the shared
qemu/fedora44.ini and qemu/fedora44-<arch>.ini replace the inline QEMU
arguments and the FEDORA_VM_MEMORY, FEDORA_VM_CPUS and
FEDORA_VM_SSH_PORT variables; FEDORA_VM_QEMU_CONFIG selects a different
shared config file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YKxXLyiL7XJ3a9e8HmR2my
2026-09-30 10:26:28 +08:00
GuofangandClaude Opus 5.5 fe8b6f93ff Load the Debian 13 VM hardware from QEMU config files
Move the Debian launcher's QEMU arguments into qemu/debian13.ini, which
the launcher renders with the per-run file paths and passes to QEMU with
-readconfig, followed by qemu/debian13-<arch>.ini for the machine type
and arm64-only devices. Memory, CPU count, SSH port and accelerator are
now set in the config files, replacing VM_MEMORY, VM_CPUS and
VM_SSH_PORT; VM_QEMU_CONFIG selects a different shared config file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YKxXLyiL7XJ3a9e8HmR2my
2026-09-30 10:26:28 +08:00
GuofangandClaude Opus 5.5 280abbd2de Update vm-images to auto-detect the Windows 11 ISO
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ks2ixr4KHXBtLuCet7Ch5Z
2026-09-30 09:57:43 +08:00
GuofangandClaude Opus 5.5 3561fc6729 Remove shell VM launchers in favor of the Python ones
Delete run-*.sh and point the documentation at run-*.py. The
seediso build-seed.sh helpers stay, as the Python launchers call them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HL6bzSwWGNwru9bDS9ZCLg
2026-09-30 09:22:40 +08:00