Commit Graph
84 Commits
Author SHA1 Message Date
GuofangandClaude Sonnet 5.5 007ba992af Point vm-images submodule at git.wangguofang.net
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-13 10:46:59 +08:00
GuofangandClaude Sonnet 5.5 70d595d61e Update vm-images: install prompts default to yes
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 23:36:15 +08:00
GuofangandClaude Sonnet 5.5 428d99108b Download aqtinstall through the wangguofang.net GitHub proxy
Also update vm-images: download Win32-OpenSSH through the same proxy.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-03 09:28:34 +08:00
guofangandClaude Sonnet 5.5 fc8134ecf9 Use virtio-net and virtio-gpu on arm64 again
The base image now carries the VirtIO drivers, which restores the 2304x1440
display that ramfb had lost.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-02 22:09:07 +08:00
guofangandClaude Sonnet 5.5 d639e1f785 Update vm-images: build the base image with a window by default
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-02 21:31:12 +08:00
guofangandClaude Sonnet 5.5 33dbc91fa0 Update vm-images: more download connections
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-02 21:00:51 +08:00
guofangandClaude Sonnet 5.5 152006f57d Update vm-images: step-by-step prompts for building the base image
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-02 20:53:53 +08:00
guofangandClaude Sonnet 5.5 0ca1390895 Update vm-images: clearer missing base image error
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-02 20:26:09 +08:00
GuofangandClaude Sonnet 5.5 48c4477ec4 Update vm-images: audit-mode base image
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-02 12:51:54 +08:00
GuofangandClaude Sonnet 5.5 a920ba0ca5 Windows launcher only creates a differential disk; seed via Unattend.xml
run-windows11.py no longer installs Windows or touches ISO/img files: it
creates a QCOW2 overlay on the base image (made by vm-images/build-windows-base.sh)
and, when the disk is created, mounts seed.iso. Windows reads the Unattend.xml
in its root during the specialize and OOBE passes (host name, account, auto
logon, Remote Desktop) and Configure-Windows.ps1 then installs OpenSSH with the
host's key, turns off Windows Update and copies the installer scripts.

The VM hardware uses devices with inbox Windows drivers (IDE/NVMe, e1000e,
ramfb on arm64), since the base image has no VirtIO drivers. Autounattend.xml
moves to vm-images; the vm-images pointer is updated.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-02 11:19:48 +08:00
GuofangandClaude Sonnet 5.5 fe7250870e Attach the cloud-init seed ISO only when the VM disk is created
cloud-init reads the seed on the first boot only, so the Linux launchers now
mount it just for the run that creates the overlay disk. The seed drive moves
from the config files to the launcher arguments.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-02 11:19:48 +08:00
GuofangandClaude Sonnet 5.5 b149dd4bc3 Press a key automatically at the Windows ISO boot prompt
bootmgr waits for a key ("Press any key to boot from CD or DVD...") and
gives up after a few seconds. For ISO installs, a detached helper now taps
the space bar through the QEMU monitor for the first 30 s. Also update the
vm-images submodule for the new --window option.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-02 10:05:55 +08:00
guofang 2a8d5a1bed Update submodule URL for vm-images to use the correct repository path 2026-11-01 21:13:48 +08:00
GuofangandClaude Sonnet 5.5 a81f0f6e81 Update vm-images to add build-windows-base.sh
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-30 16:12:48 +08:00
GuofangandClaude Sonnet 5.5 bea0dd4d70 Inject the SSH public key into the Fedora and AlmaLinux seed ISOs
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-30 14:02:58 +08:00
GuofangandClaude Sonnet 5.5 83df64042c Forward host port 3080 to the Windows guest as DSH
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-29 14:58:38 +08:00
GuofangandClaude Sonnet 5.5 78f6fd424b Read port forwards from per-VM forwards.conf files
A QEMU config file section cannot hold more than one hostfwd entry, so
the forwards move out of the ini files into qemu/<vm>/forwards.conf, one
"LABEL HOST_PORT GUEST_PORT" rule per line. The new vmforwards.py parses
them, skips rules whose host port is taken and builds the -netdev
argument, which every launcher now passes instead of relying on a
netdev section in the ini or on -nic.

The ini files move to qemu/<vm>/config.ini and qemu/<vm>/<os>-<arch>.ini.
The *_SSH_PORT / *_RDP_PORT variables and --rdp-port / --ssh-port still
replace the host port of the SSH and RDP rules.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-29 14:55:30 +08:00
GuofangandClaude Sonnet 5.5 07a2c6db3e Skip kernel-irqchip=off when installing with --install-from-img
Move the setting from qemu/windows11-darwin-arm64.ini to a -machine option
that run-windows11.py adds on macOS arm64 unless --install-from-img is given.
The workaround is only needed for usb-storage, which the NVMe install disk
does not use, and Setup hangs with the emulated interrupt controller.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-29 13:33:06 +08:00
GuofangandClaude Sonnet 5.5 887da87340 Show the RDP and SSH forwards as listening on 0.0.0.0
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-29 11:28:56 +08:00
GuofangandClaude Sonnet 5.5 2b237bb8b3 Add a tool to switch the Windows display scale between 100% and 200%
81-Toggle-Scale.ps1 writes LogPixels, Win8DpiScaling and AppliedDPI for
the current user; the change needs a restart, so the .bat launcher offers
to restart at the end. It is picked up by the existing NN-*.bat/.ps1
globs and copied to Desktop\Tools.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 15:06:08 +08:00
guofangandClaude Sonnet 5.5 d2fe47c911 Add a --vnc option to run-windows11.py
Serves the guest screen over VNC instead of opening a display window.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 14:50:14 +08:00
GuofangandClaude Sonnet 5.5 72af276309 Add an update-status tool and copy numbered scripts to Desktop\Tools
80-Get-UpdateStatus-Admin.ps1 prints whether the Windows 11 guest is
upgrading or downloading updates (policy, pending markers, services,
processes, BITS jobs, update events, network use); the .bat launcher
elevates and keeps the window open.

The seed ISO and Configure-Windows.ps1 now take every NN-*.bat and
NN-*.ps1, and the first-logon copy goes to Desktop\Tools instead of
Desktop\Installers.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-26 09:27:52 +08:00
guofangandClaude Sonnet 5.5 fccc7986d9 Pick the ws2tcp-local download URL by CPU architecture
Use windows_arm64_url on ARM64 and windows_x64_url otherwise, instead of
the generic windows_url.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 13:10:52 +08:00
guofangandClaude Sonnet 5.5 d7d96faf19 Raise the Windows 11 macOS guest resolution to 2304x1440
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 11:58:42 +08:00
guofangandClaude Sonnet 5.5 47d2f1317e Show the macOS display window without zoom-to-fit
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 11:54:41 +08:00
guofangandClaude Sonnet 5.5 5bb679f3fe Add --seed-only to run-windows11.py to build just the seed ISO
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-23 23:45:02 +08:00
guofangandClaude Sonnet 5.5 69e2141b7c Use vm/ instead of the hidden .vm/ as the default state directory
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-23 23:41:21 +08:00
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