Deploying Windows 11 on Arm Devices – Jurassic Deployment Style

I recently bought a machine capable of running Windows 11 on Arm, The Windows Dev Kit 2023 aka Project Volterra. Now, since neither MDT nor ConfigMgr support Windows deployment on Arm devices, in this post you find a quick and dirty solution that takes us back to the Jurassic era, before OSD was cool 🙂

The Windows Dev Kit 2023 aka Project Volterra

To deploy Windows 11 on Arm Devices I used a PowerShell version of my batch script used in my previous Jurassic Deployment post: A Blast From The Past – Jurassic Deployment

The solution has three steps

  • Create a WinPE 11 for Arm boot image
  • Creating a Deployment Share for Windows 11 for Arm Deployments
  • Start the deployment

Adding PowerShell to WinPE 11 for Arm

While there are optional WinPE optional components for PowerShell to WinPE for Arm, they absolutely do not work, since WinPE on Arm, unlike Windows on Arm, can't run any x64 code. That fact also stops us from using task sequences since they are also x64 binaries. However, PowerShell 7 for Arm run decently on WinPE for Arm. Below is a script that creates a WinPE 11 for Arm ISO with PowerShell 7. The only requirements are that you have Windows ADK for Windows 11 21H2 or Windows ADK for Windows 11 22H2 installed on your machine, and that you have downloaded PowerShell 7 for Arm. I used version 7.2.7 when testing this.

https://github.com/DeploymentResearch/DRFiles/blob/master/Scripts/ArmDeployment/Create-arm64-BootImage-with-PowerShell7.ps1

WinPE 11 for Arm with PowerShell 7

Create a Deployment Share

The next step is to create a shared folder, to which you add your Windows 11 Enterprise arm64 image. Simply download the Windows 11 Enterprise for Arm64 ISO from VLSC and extract the WIM file.

Note: Windows 11 Enterprise for Arm64 is also available inside the Windows 11 IoT Enterprise ISO that is available via Visual Studio subscriptions. Thank you, Frank Lesniak, ( @FrankLesniak ) for letting me know.

Windows 11 Enterprise WIM images extracted from ISO files.

Also create a WIM file with the driver package you want to use. In my lab I saved the WIM file as W11-ARM64-22H2-Enterprise.wim and the driver package as WindowsDevKit2023.wim. Also add the following files to the share, you can download them here:

https://github.com/DeploymentResearch/DRFiles/tree/master/Scripts/ArmDeployment

The populated Deployment Share

Start the Deployment

Add the JSDStart.ps1 script to your WinPE 11 for Arm boot image, here is what it looks like. Modify it to match your environment:

# Deployment Server Share
$DeployRoot = "\\DEV001\JurassicDeployment"

# Prompt for username and password 
$Cred = Get-Credential

# Connect to the server
try {
	New-PSDrive -Name Z -PSProvider FileSystem -Root $DeployRoot -Credential $Cred
}
catch {
	Write-Host "Could not connect to $DeployRoot, please run the JSDStart.ps1 script again"
    Break
}

# Start main deployment script
Z:\JSD.ps1

The script that actually starts the deployment is the JSD.ps1 script, which also injects the unattend.xml example used to automate the Windows 11 for Arm deployment and injects the driver package.

# Jurassic Deployment Start Script 
$OSImage = "W11-ARM64-22H2-Enterprise.wim"
$DriverPackage = "WindowsDevKit2023.wim"
$LocalCache = "W:\Cache"

# Run diskpart script for UEFI partitioning
$DPScriptContent = @(
    "SELECT DISK 0"
    "CLEAN"
    "CONVERT GPT NOERR"

    "CREATE PARTITION EFI Size=500"
    "Assign letter=S:"
    "FORMAT QUICK FS=FAT32 LABEL=System"

    "CREATE PARTITION MSR Size=128"

    "CREATE PARTITION Primary"
    "Assign letter=W:"
    "FORMAT QUICK FS=NTFS LABEL=Windows"

    "SHRINK MINIMUM=1024"

    "CREATE PARTITION Primary"
    "Assign letter=R:"
    "FORMAT QUICK FS=NTFS LABEL=Recovery"
    "SET ID = de94bba4-06d1-4d40-a16a-bfd50179d6ac"
    "GPT ATTRIBUTES = 0x8000000000000000"
) 

$DPScript = "$env:TEMP\Diskpart.txt"
$DPScriptContent | Out-File $DPScript
$Diskpart = Start-Process diskpart.exe "/s $DPScript" -NoNewWindow -Wait 

# Download and apply the WIM image
New-Item -Path $LocalCache -ItemType Directory -Force
Copy-Item -Path Z:\OS\$OSImage -Destination $LocalCache
DISM.exe /Apply-Image /ImageFile:$LocalCache\$OSImage /Index:1 /ApplyDir:W:\

# Prepare Boot Partition
BCDBoot.exe W:\windows /l en-US
bcdedit.exe /timeout 0

# Add drivers
Copy-Item -Path Z:\Drivers\$DriverPackage -Destination $LocalCache
New-Item -Path W:\Drivers -ItemType Directory
DISM.exe /Apply-Image /ImageFile:$LocalCache\$DriverPackage /Index:1 /ApplyDir:W:\Drivers

# Copy and Apply the Unattend.xml
New-Item -Path W:\Windows\Panther -ItemType Directory
Copy-Item -Path Z:\Unattend.xml -Destination W:\Windows\Panther
New-Item -Path W:\ScratchSpace -ItemType Directory
dism.exe /Image:W:\ /Apply-Unattend:W:\Windows\Panther\Unattend.xml /ScratchDir:W:\ScratchSpace
Remove-Item W:\ScratchSpace -Recurse -Force
Remove-Item W:\Drivers -Recurse -Force

# Reboot to Windows 
wpeutil reboot
A VM with Windows 11 for Arm running on the Windows Dev Kit 2023 hardware
About the author

Johan Arwidmark

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments

>