使用Packer+Azure DevOps制作黄金镜像时WSL2安装报错排查求助
排查Packer Azure ARM预配WSL时的"登录会话不存在"错误
问题场景
使用Packer结合Azure DevOps构建Windows黄金镜像时,配置了以下PowerShell预配器:
provisioner "powershell" { elevated_user = "SYSTEM" elevated_password = "" inline = ["wsl --install"] }
执行后出现报错,尽管日志显示WSL组件已安装,但预配步骤失败,虚拟机被删除,错误日志如下:
azure-arm.windowsvm: A specified logon session does not exist. It may already have been terminated. azure-arm.windowsvm: azure-arm.windowsvm: azure-arm.windowsvm: azure-arm.windowsvm: azure-arm.windowsvm: azure-arm.windowsvm: Virtual Machine Platform has been installed. azure-arm.windowsvm: azure-arm.windowsvm: azure-arm.windowsvm: Installing: Windows Subsystem for Linux azure-arm.windowsvm: azure-arm.windowsvm: azure-arm.windowsvm: Windows Subsystem for Linux has been installed. azure-arm.windowsvm: azure-arm.windowsvm: azure-arm.windowsvm: Installing: Windows Subsystem for Linux azure-arm.windowsvm: azure-arm.windowsvm: azure-arm.windowsvm: ==> azure-arm.windowsvm: Provisioning step had errors: Running the cleanup provisioner, if present... ==> azure-arm.windowsvm: ==> azure-arm.windowsvm: Deleting individual resources ...
排查方案
1. 规避SYSTEM账户的会话限制
wsl --install一键命令依赖交互式会话上下文,而SYSTEM账户无交互式登录会话,易触发会话终止错误。可以:
- 改用虚拟机本地管理员账户执行预配,移除
elevated_user和elevated_password配置,或指定具备交互式权限的本地账户。 - 若必须使用SYSTEM账户,拆分安装步骤,手动启用组件替代一键命令:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart wsl --set-default-version 2
2. 处理安装后的系统重启需求
WSL组件安装完成后需重启系统,未处理重启会导致后续步骤异常。可添加Packer重启预配器:
provisioner "powershell" { inline = [ "dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart", "dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart" ] } provisioner "windows-restart" { restart_command = "shutdown /r /t 10 /f /c \"Packer restart for WSL components\"" restart_check_command = "powershell -command \"Get-Service -Name WinRM | Select-Object -ExpandProperty Status\"" max_retries = 5 timeout = "10m" } provisioner "powershell" { inline = ["wsl --set-default-version 2"] }
3. 捕获详细执行日志
修改预配器添加日志记录,保留WSL安装的完整过程:
provisioner "powershell" { elevated_user = "SYSTEM" elevated_password = "" inline = [ "Start-Transcript -Path 'C:\\packer-wsl-install.log' -Append", "wsl --install --verbose", "Stop-Transcript" ] }
同时修改Azure ARM builder配置keep_os_disk=true,让Packer失败后保留虚拟机,登录后查看C:\packer-wsl-install.log定位具体失败环节。
4. 检查Azure VM基础配置
- 确认Packer使用的服务主体拥有虚拟机创建、扩展管理、磁盘操作的完整权限。
- 验证虚拟机规格满足WSL2要求:需支持硬件虚拟化,推荐使用至少2vCPU的VM实例。
内容的提问来源于stack exchange,提问作者Roni
相关产品推荐
相关产品推荐

