blob: 6b670b814b882809ef4fbf8317cd8242eddd5ca5 [file] [log] [blame] [view]
# Windows buildlet images
Windows images are built by creating and configuring VMs hosted on AWS
a1.metal instances then saving the image manually.
## Build and test the Windows builder image
- Prepare the linux QEMU host image by following the instructions in
`env/windows-arm64/aws`.
- Create an a1.metal instance (or other instance that supports KVM)
in AWS.
- Download a Windows 10 ARM64 image.
- Convert vhdx images to qcow2 via the following command:
```shell
qemu-img convert -O qcow2 win.vhdx win.qcow2
```
- SSH to your instance tunneling port 5903, and run `win10-arm64.sh`
script to boot the Windows VM.
- You may need to stop the current VM: `sudo systemctl stop qemu`
- VNC to the tunneled port 5903.
- Open the device control panel, and use the "Search for Drivers"
button to search the virtio drive `D:` for drivers.
- Matching drivers will be automatically installed.
- This is necessary for networking to work on Windows in qemu.
- Download the `startup.ps1` script to the Windows instance, and run
in PowerShell. Check thoroughly for errors.
- Alternatively, you can modify `win10-arm64.sh` to forward ssh
access to the VM, and run PowerShell in the CLI, which is a bit
easier than through VNC.
- Verify autologin works after a reboot. If not, try
https://docs.microsoft.com/en-us/sysinternals/downloads/autologon.
- Set GO_BUILDER_ENV and install a builder key.
- Once the image is complete, download the image to your workstation
and upload to `s3://go-builder-data`.
- You can find the appropriate the S3 path referenced in
`env/windows-arm64/aws/prepare_image.sh`.
- Re-run packer to build an AMI with your updated Windows image.
### Notes
- `QEMU_EFI.fd` is from the `qemu-efi-aarch64` Debian package, found
at `/usr/share/qemu-efi-aarch64/QEMU_EFI.fd`. It can be regenerated
with the following command:
```shell
dd if=/dev/zero of=QEMU_EFI.fd bs=1M count=64
dd if=/usr/share/qemu-efi-aarch64/QEMU_EFI.fd of=QEMU_EFI.fd bs=1M count=64 conv=notrunc
```
- `QEMU_VARS.fd` stores saved EFI state when booting a VM. It's
generated via the following command:
```shell
dd if=/dev/zero of=QEMU_VARS.fd bs=1M count=64
```
- The latest virtio driver image can be fetched from:
https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso
- `win10-arm64.sh` is hard-coded to run with 4 processors instead of
the 16 available on an a1.metal instance. Higher numbers of
processors are causing a fatal CLOCK_WATCHDOG_TIMEOUT error from
interrupt requests not arriving in time. qemu-system-x86_64 has a
workaround for this. We're still investigating how to increase this
on aarch64.
### Packaging
- Create a directory named `macmini-windows`, and ensure it contains
the following:
```
macmini-windows/UTM.app (from https://github.com/utmapp/UTM/releases/v2.1.2/download/UTM.dmg)
macmini-windows/sysroot-macos-arm64 (from https://github.com/utmapp/UTM/suites/3210727480/artifacts/74269055)
macmini-windows/Images/QEMU_EFI.fd (from steps above)
macmini-windows/Images/virtio.iso (from https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso)
macmini-windows/Images/win10.qcow2 (from above)
```
- Tar the directory:
```bash
tar cvJf "windows-arm64.$(date +%+4Y%m%d).tar.xz" macmini-windows
```
- Upload to GCS for safekeeping:
```bash
gsutil cp windows-arm64.DATE_FROM_ABOVE.tar.xz gs://go-builder-data/windows-arm64.DATE_FROM_ABOVE.tar.xz
```
- On your target host, untar the directory in your home directory. See
x/build/cmd/runqemubuildlet for more information.