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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
--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>
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>
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>
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>
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>
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>
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>
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>