Azure IoT Edge for Linux on Windows 的常见问题和解决方法
适用于: IoT Edge 1.5 IoT Edge 1.4
重要
IoT Edge 1.5 LTS 和 IoT Edge 1.4 LTS 是受支持的版本。 IoT Edge 1.4 LTS 的生命周期结束日期为 2024 年 11 月 12 日。 如果你使用的是较低的版本,请参阅更新 IoT Edge。
使用本文来帮助解决在部署 IoT Edge for Linux on Windows 解决方案时可能出现的常见问题。
安装和部署
以下部分用于解决在安装 EFLOW MSI 和部署 EFLOW 虚拟机时的常见错误。 确保了解以下 EFLOW 概念:
- Azure IoT Edge for Linux on Windows 先决条件
- Azure IoT Edge for Linux on Windows 的嵌套式虚拟化
- Azure IoT Edge for Linux on Windows 的网络配置
- 用于 IoT Edge for Linux on Windows 的 PowerShell 函数
错误 | 错误说明 | 解决方案 |
---|---|---|
HNS API 版本 X 不满足最低版本要求 | EFLOW 使用 HCS/HNS 在客户端 SKU 上创建虚拟机。 最低 HNS 版本为 9.2。 | 如果使用 Windows 版本 20H1 或更高版本,HCS/HNS API 应满足要求。 如果使用的是 Windows 客户端 RS5 (17763),请验证你是否有最新的 Windows 更新。 |
找不到 WSSDAGENT 服务! WssdAgent 无法访问,更新失败。 |
WSSDAgent 是创建和管理 VM 生命周期的 EFLOW 组件。 WSSDAgent 在 Windows 主机 OS 上运行服务。 如果服务未运行,VM 通信和生命周期将失败。 | 打开提升的 PowerShell 会话并运行命令 Get-Service -Name wssdagent ,验证 WSSDAgent 是否正在 Windows 主机 OS 上运行。 如果 WSSDAgent 未运行,请尝试使用 cmdlet Start-Service -name WSSDAgent 手动启动服务。 如果未启动,请共享 C:\ProgramData\wssdagent 下的内容。 |
缺少预期的映像“$vhdPathBackup” | 安装 EFLOW 当前发布 (CR) 时,用户可以使用 vmDataSize 提供数据分区大小。 如果指定了,EFLOW 将调整 VHDX 的大小。 如果在调整大小期间找不到 VHDX 文件,则会发生此错误。 | 验证 VHDX 文件未从原始位置被删除或移动。 |
Hyper-V、Hyper-V 管理 PowerShell 或 OpenSSH 的安装失败。 请手动安装并重启部署。 正在中止... | EFLOW 安装要求满足所需的先决条件才能部署虚拟机。 如果有一个先决条件不满足,Deploy-Eflow cmdlet 将失败。 |
确保满足所有所需的先决条件。 PowerShell:关闭 PowerShell 会话并打开一个新会话。 如果有多个安装,请确保导入了正确的模块。 尝试使用其他版本的 PowerShell。 Hyper-V:有关 EFLOW Hyper-V 支持的详细信息,请参阅 Azure IoT Edge for Linux on Windows 嵌套虚拟化。 OpenSSH:如果使用自己的自定义安装,请在部署期间检查 customSsh 参数。 |
$feature 在此 Windows 版本中不可用。 无法启用 $featureversion。 请在设置中添加“$featureversion”可选功能,然后重启部署。 |
部署 EFLOW 时,如果有一个先决条件不满足,安装程序将尝试安装它。 如果此功能不可用或功能安装失败,EFLOW 部署将失败。 | 确保满足所有所需的先决条件。 PowerShell:关闭 PowerShell 会话并打开一个新会话。 如果有多个安装,请确保导入了正确的模块。 尝试使用其他版本的 PowerShell。 Hyper-V:有关 EFLOW Hyper-V 支持的详细信息,请参阅 Azure IoT Edge for Linux on Windows 嵌套虚拟化。 OpenSSH:如果使用自己的自定义安装,请在部署期间检查 customSsh 参数。 |
Hyper-V 属性指示 Hyper-V 组件不起作用(属性 HyperVRequirementVirtualizationFirmwareEnabled 为 false) Hyper-V 属性指示 Hyper-V 组件不起作用(属性 HyperVisorPresent 为 false)。 Hyper-V 核心服务未运行(vmms、vmcompute、hvhost)。 确保 Hyper-V 配置正确并且能够启动虚拟机。 |
这些错误与 Hyper-V 虚拟化技术堆栈和服务相关。 EFLOW 虚拟机需要多个 Hyper-V 服务才能创建并运行虚拟机。 如果其中一个服务不可用,则安装将失败。 | 有关 EFLOW Hyper-V 支持的详细信息,请参阅 Azure IoT Edge for Linux on Windows 嵌套虚拟化。 |
wssdagent 无法访问,请重试... | WSSDAgent 是创建和管理 VM 生命周期的 EFLOW 组件。 WSSDAgent 在 Windows 主机 OS 上运行服务。 | 打开提升的 PowerShell 会话并运行命令 Get-Service -Name wssdagent ,验证 WSSDAgent 是否正在 Windows 主机 OS 上运行。 如果 WSSDAgent 未运行,请尝试使用 cmdlet Start-Service -name WSSDAgent 手动启动服务。 如果未启动,请共享 C:\ProgramData\wssdagent 下的内容。 |
无法从 wssdagent 检索虚拟机配置 | 在 EFLOW 根安装文件夹下查找 EFLOW 配置 yaml 文件。 例如,如果使用了默认安装目录,配置文件应位于 C:\Program Files\Azure IoT Edge\yaml 目录中。 | 检查目录是否已删除或移动。 如果目录不可用,则无法创建 VM。 需要重新安装 EFLOW。 |
检测到现有的虚拟机。 若要重新部署虚拟机,请卸载并重新安装 $eflowProductName。 虚拟机“$name”已存在。 需要首先删除“$name”虚拟机。 |
在 EFLOW 部署期间,安装程序将检查是否有从之前的安装创建的 EFLOW VM。 在某些情况下,如果安装在最后的步骤中失败,将创建 VM,并且它仍然在 Windows 主机 OS 中运行。 | 在开始新安装之前,请确保完全卸载 EFLOW。 若要从设备中删除 Azure IoT Edge for Linux on Windows 安装,请使用以下命令。 1. 在 Windows 中,打开“设置” 2. 选择“添加或删除程序” 3.选择“Azure IoT Edge LTS”应用 4. 选择“卸载” |
创建存储 vhd (文件: $($config["imageNameEflowVm"]))失败 | 创建或调整 EFLOW 虚拟机 VHDX 大小时出错。 | 有关详细信息,请查看 EFLOW 安装日志 C:\Program Files\Azure IoT Edge 和 WSSDAgent 日志。 |
错误: 虚拟机创建失败! 未能检索虚拟机名称。 |
与 WSSDAgent 创建虚拟机相关的错误。 安装程序将尝试删除 VM,并将安装标记为失败。 | 打开提升的 PowerShell 会话并运行命令 Get-Service -Name wssdagent ,验证 WSSDAgent 是否正在 Windows 主机 OS 上运行。 如果 WSSDAgent 未运行,请尝试使用 cmdlet Start-Service -name WSSDAgent 手动启动服务。 如果未启动,请共享 C:\ProgramData\wssdagent 下的内容。 |
此 Windows 设备不满足 Azure EFLOW 的最低要求。 请参阅 https://aka.ms/AzEFLOW-Requirements 以了解系统要求 | 在 EFLOW 部署期间,Deploy-EFlow PowerShell cmdlet 会检查是否满足所有的先决条件。 具体而言,将检查 Windows SKU(Windows Server 2019 和 2022、Windows 客户端专业版或客户端企业版),并且 Windows 版本至少为 17763。 | 验证你使用的是否是受支持的 Windows SKU 和版本。 如果使用的是 Windows 版本 17763,请确保应用所有的更新。 |
可用内存不足。 | 没有足够的 RAM 内存来创建具有已分配 VM 内存的 EFLOW VM。 默认情况下,虚拟机分配有 1024 MB。 Windows 主机 OS 至少需要有 X MB 可用才能将该内存分配给 VM。 | 检查可用的 Windows 主机 OS 内存,并在 Deploy-Eflow 期间使用 memoryInMb 参数来自定义内存分配。 有关 Deploy-EFlow PowerShell cmdlet 的详细信息,请参阅适用于 IoT Edge for Linux on Windows 的 PowerShell 函数。 |
可用的 CPU 核心数不足。 | 没有足够的 CPU 核心可用于创建具有已分配核心的 EFLOW VM。 默认情况下,虚拟机将分配有一个核心。 Windows 主机 OS 至少需要有一个核心才能将该核心分配给 EFLOW VM。 | 检查可用的 Windows 主机 OS CPU 核心,并在 Deploy-Eflow 期间使用 cpuCore 参数来自定义内存分配。 有关 Deploy-EFlow PowerShell cmdlet 的详细信息,请参阅适用于 IoT Edge for Linux on Windows 的 PowerShell 函数。 |
驱动器“$drive”上没有足够的磁盘空间。 | 没有足够的存储空间可用于创建具有已分配存储大小的 EFLOW VM。 默认情况下,VM 将使用大约 18 GB 的存储。 Windows 主机 OS 至少需要 18 GB 的可用存储空间才能将该存储分配给 EFLOW VM VHDX。 | 检查可用的 Windows 主机存储,并在 Deploy-Eflow 期间使用 vmDiskSize 参数来自定义存储大小。 有关 Deploy-EFlow PowerShell cmdlet 的详细信息,请参阅适用于 IoT Edge for Linux on Windows 的 PowerShell 函数。 |
签名无效(文件: $filePath,签名状态: ${signature.Status}) 缺少签名(文件: $filePath)! 无法跟踪到 Microsoft 根证书的签名 |
找不到文件的签名或签名无效。 EFLOW PSM 和 EFLOW 更新都是使用 Microsoft 证书进行签名的。 如果 Azure 代码或 Azure CA 证书在 Windows 主机 OS 中不可用,则验证将失败。 | 验证是否从官方 Azure 站点下载了所有内容。 此外,如果所需的证书不属于 Windows 主机,请查看安装 EFLOW 必要证书。 |
预配和 IoT Edge 运行时
以下部分用于解决在预配 EFLOW 虚拟机和与 IoT Edge 运行时进行交互时的常见错误。 确保了解以下 EFLOW 概念:
错误 | 错误说明 | 解决方案 |
---|---|---|
用户已中止操作 | 对于某些 EFLOW PowerShell cmdlet,需要用户交互和确认。 | - |
错误,未提供设备连接字符串。 只能指定 ManualConnectionString 预配的设备连接字符串。 |
使用 ManualConnectionString 设备预配时使用的参数不正确。 | 有关 Provision-EflowVm PowerShell cmdlet 的详细信息,请参阅适用于 IoT Edge for Linux on Windows 的 PowerShell 函数。 |
未指定 ManualX509 预配的 IoT 中心主机名、设备 ID 和/或标识证书/私钥参数 可能未为 DpsX509 预配指定设备连接字符串、范围 ID、注册 ID 和对称密钥 未找到 ManualX509 预配的证书和私钥文件(应在 $identityCertPath and $identityPrivKeyPath 处) |
使用 ManualX509 设备预配时使用的参数不正确。 | 有关 Provision-EflowVm PowerShell cmdlet 的详细信息,请参阅适用于 IoT Edge for Linux on Windows 的 PowerShell 函数。 |
未指定 DpsTpm 预配的范围 ID 只能指定 DpsTpm 预配的范围 ID 和注册 ID(可选) |
使用 DpsTpm 设备预配时使用的参数不正确。 | 有关 Provision-EflowVm PowerShell cmdlet 的详细信息,请参阅适用于 IoT Edge for Linux on Windows 的 PowerShell 函数。 |
DpsSymmetricKey 预配缺少范围 ID、注册 ID 或对称密钥 未指定 globalEndpoint 只能指定 DpsSymmetricKey 预配的范围 ID、注册 ID 或对称密钥 |
使用 DpsSymmetricKey 设备预配时使用的参数不正确。 | 有关 Provision-EflowVm PowerShell cmdlet 的详细信息,请参阅适用于 IoT Edge for Linux on Windows 的 PowerShell 函数。 |
虚拟机不存在,首先部署它 | EFLOW MSI 已安装,但从未部署 EFLOW 虚拟机。 | 使用 Deploy-Eflow PowerShell cmdlet 部署 EFLOW VM。 |
正在中止,iotedge 是之前预配的(无外设模式)! | EFLOW VM 是之前预配的,重新预配时不支持无外设模式。 | 此问题已修复,现在重新预配时支持无外设模式 |
预配已由用户中止 | EFLOW VM 是之前预配的,用户需要确认他们想要进行重新预配。 | 用户必须接受重新预配才能继续预配过程。 |
未能预配 未能预配 config.toml。 请手动进行预配。 预配后未运行 iotedge 服务,请手动调查 |
在 EFLOW VM 中正确配置了 EFLOW 预配信息,但 IoT Edge 守护程序无法使用云预配服务预配设备。 | 检查 Azure IoT Edge 运行时日志。 首先,使用 Connect-EflowVm PowerShell cmdlet 连接到 EFLOW 虚拟机,然后按照对 IoT Edge 设备进行故障排除以检索 IoT Edge 日志。 |
从“sudo iotedge list”意外返回 正在从“$vmName”检索 iotedge 检查输出 |
在 EFLOW VM 中执行 sudo iotedge list 命令返回了意外的有效负载。 通常,这与 EFLOW VM 中未正确运行的 IoT Edge 服务相关。 |
检查 Azure IoT Edge 运行时日志。 首先,使用 Connect-EflowVm PowerShell cmdlet 连接到 EFLOW 虚拟机,然后按照对 IoT Edge 设备进行故障排除以获取 IoT Edge 日志。 |
启用 DpsTpm 需要 TPM 2.0 | TPM 传递仅适用于与 TPM 2.0 兼容的硬件。 这可能是由物理 TPM 造成的,或者如果 EFLOW VM 正在 Windows 主机 OS 上使用通过使用 vTPM 的嵌套虚拟化运行,也可能会造成此错误。 | 请确保 Windows 主机 OS 具有有效的 TPM 2.0,请查看在电脑上启用 TPM 2.0。 |
TPM 预配信息不可用! | EFLOW VM 中的 TPM 传递二进制文件无法从 Windows 主机 OS 获取 TPM 信息。 此错误可能与 EFLOWProxy 的通信错误有关。 | 使用 PowerShell cmdlet Get-Service -name "EFLOW Proxy Service" 确保 EFLOW 代理服务正在运行。 如果未运行,请查看事件日志。 打开“事件查看器”>“应用程序和服务日志”->“Azure IoT Edge for Linux on Windows”。 |
与 VM 交互
以下部分用于解决与 EFLOW 虚拟机交互并配置 EFLOW 设备传递选项时的常见问题。 确保了解以下 EFLOW 概念:
错误 | 错误说明 | 解决方案 |
---|---|---|
无法处理请求,EFLOW VM 已关闭! | 尝试将配置应用到 EFLOW 虚拟机时,必须打开 VM。 如果 EFLOW VM 处于关闭状态,SSH 通道将失败,无法与 VM 通信。 | 使用 Start-EflowVm PowerShell cmdlet 启动 EFLOW VM。 有关 Start-EflowVm cmdlet 的详细信息,请参阅适用于 IoT Edge for Linux on Windows 的 PowerShell 函数。 |
无法从 wssdagent 检索虚拟机名称 错误: 找到多个虚拟机 |
WSSDAgent 服务找不到 EFLOW 虚拟机。 | 验证 EFLOW VM 是否已启动并运行,请使用 PowerShell cmdlet Start-EflowVm 。 如果使用的是客户端 SKU,请使用 hcsdiag list cmdlet,并在 VM 的 GUID 后面找到具有 wssdagent 的行,然后检查状态。 如果使用的是服务器 SKU,请转到 Hyper-V 管理器,并验证是否存在名称为 Windows-hostname 的 VM,然后检查状态。 |
无法使用 SSH 连接虚拟机。 正在中止.. | Windows 主机 OS 无法与 EFLOW VM 建立 SSH 连接以执行必要的命令或复制文件。 通常,此问题与 Windows 和虚拟机之间的网络问题有关。 | 尝试使用 PowerShell cmdlet Get-EflowVmAddr ,并检查分配给 VM 的 IP4Address 是否正确。 有关网络配置的详细信息,请参阅 Azure IoT Edge for Linux on Windows 网络。 |
来自虚拟机的意外返回统计信息 | 执行 Get-EflowVm PowerShell cmdlet 将检查虚拟机的状态。 如果与虚拟机的通信失败,或者 VM 中的某些 Linux bash 命令失败,则 cmdlet 将失败。 |
使用 Connect-EflowVm PowerShell cmdlet 检查 EFLOW VM 连接,然后尝试在 VM 中手动运行 VM 统计信息 bash 命令。 |
未启用 TPM 预配! | 若要获取 TPM 的 TPM 预配信息,必须启用 EFLOW TPM 传递。 如果未启用 TPM 传递,cmdlet 将失败。 | 在获取 TPM 信息之前启用 TPM 传递。 使用 Set-EflowVmFeature PowerShell cmdlet 启用 TPM 传递。 有关 Set-EflowVmFeature PowerShell cmdlet 的详细信息,请参阅适用于 IoT Edge for Linux on Windows 的 PowerShell 函数。 |
提供了未知功能“$feature”。 | Set-EflowVmFeature cmdlet 支持将 DpsTpm 和 Defender 作为可启用或禁用的两项功能。 | 有关 Set-EflowVmFeature PowerShell cmdlet 的详细信息,请参阅适用于 IoT Edge for Linux on Windows 的 PowerShell 函数。 |
不支持的 DDA 类型: $gpuName | 目前,仅 NVIDIA Tesla T4 和 NVIDIA A2 支持 GPU DDA。 如果用户提供另一个 GPU 名称,GPU 传递将失败。 | 验证是否满足所有 GPU 先决条件。 有关 EFLOW GPU 支持的详细信息,请查看 Azure IoT Edge for Linux on Windows GPU 传递。 |
请求的 GPU 配置无效, 已启用传递,但请求的 gpuCount == $gpuCount “$script:WssdProviderVmms”WssdProvider 不支持 GPU PassthroughType“$gpuPassthroughType” 主机不支持请求的 GPU 配置, GPU“$gpuName”不可用 主机不支持请求的 GPU 配置, 没有足够的 GPU 可用 - 请求的($gpuCount),可用的($($selectedGpuDevice.Count)) 主机不支持请求的 GPU 配置, 不支持 GPU PassthroughType“$gpuPassthroughType” 请求的 GPU 配置无效,传递已禁用,但 gpuCount > 0” |
这些错误通常与未满足的一个或多个 GPU 依赖项相关。 | 确保满足所有 GPU 先决条件。 有关 EFLOW GPU 支持的详细信息,请查看 Azure IoT Edge for Linux on Windows GPU 传递。 |
网络
以下部分用于解决与 EFLOW 虚拟机和 Windows 主机 OS 之间的 EFLOW 网络和通信相关的常见错误。 确保了解以下 EFLOW 概念:
错误 | 错误说明 | 解决方案 |
---|---|---|
虚拟交换机安装失败 找不到类型为“$switchType”的虚拟交换机“$switchName” |
创建 EFLOW VM 时,可以检查所提供的虚拟交换机是否存在并且是否具有正确的类型。 如果没有使用参数,安装将使用 Windows 客户端提供的默认交换机。 | 检查正在使用的虚拟交换机是否是 Windows 主机 OS 的一部分。 可以使用 PowerShell cmdlet Get-VmSwitch 检查虚拟交换机。 有关网络配置的详细信息,请参阅 Azure IoT Edge for Linux on Windows 网络。 |
当前的主机 OS 上不支持类型为“$switchType”的 虚拟交换机“$switchName” |
使用 Windows 客户端 SKU 时,支持外部/默认交换机。 但是,使用 Windows Server SKU 时,支持的是外部/内部交换机。 | 有关网络配置的详细信息,请参阅 Azure IoT Edge for Linux on Windows 网络。 |
无法在 ICS 类型的虚拟交换机(默认交换机)上设置静态 IP | 默认交换机是在安装 Hyper-V 后 Windows 客户端 SKU 中提供的虚拟交换机。 此交换机已具有用于 IP4Address 分配的 DHCP 服务器,出于安全原因,不支持静态 IP。 | 如果使用默认交换机,则可以使用 Get-EflowVmAddr cmdlet 或 EFLOW VM 的主机名来获取 VM IP4Address。 如果使用主机名,请尝试使用 Windows-hostname-EFLOW.mshome.net。 有关网络配置的详细信息,请参阅 Azure IoT Edge for Linux on Windows 网络。 |
$dnsServer 不是有效的 IP4 地址 | Set-EflowVmDnsServers cmdlet 需要有效的 IP4Addresses 列表 | 验证你是否提供了有效的地址列表。 可以使用 PowerShell cmdlet ipconfig /all ,然后查找“DNS 服务器”条目来查看 Windows 主机 OS DNS 服务器。 例如,如果要使用 IP 10.0.1.2 和 10.0.1.3 来设置两个 DNS 服务器,请使用 Set-EflowVmDnsServers -dnsServers @("10.0.1.2", "10.0.1.3") cmdlet。 |
无法检索虚拟机的 IP 地址 无法检索虚拟机名称,未能获取 IP/MAC 地址 未能获取虚拟机的 MAC 地址 未能获取虚拟机的 IP 地址 无法获取主机路由。 与 $computerName 的连接测试失败。 wssdagent 未预配有预期的 vnet 资源。 缺少用于 ($vnicName) 的 EFLOW-VM 来宾接口 |
由 EFLOW 虚拟机的连接问题导致的。 这些错误通常与 IP 地址更改(如果使用的是静态 IP)或分配 IP 失败(如果使用的是 DHCP 服务器)相关。 | 请确保使用适合的网络配置。 如果存在有效的 DHCP 服务器,则可以使用 DHCP 分配。 如果使用的是静态 IP,请确保 IP 配置正确(所有三个参数:ip4Address、ip4GatewayAddress 和 ip4PrefixLength),并且该地址未被网络中的另一台设备使用。 有关网络配置的详细信息,请参阅 Azure IoT Edge for Linux on Windows 网络。 |
找不到与交换机“$vnetName”相关联的适配器。 找不到与设备 ID“$adapterGuid”相关联的适配器 找不到与交换机名称“$name”相关联的适配器。 网络“$vswitchName”不存在 |
由 Windows 主机 OS 和 EFLOW 虚拟机之间的网络通信错误导致的。 | 确保可以访问 EFLOW VM 并建立 SSH 通道。 使用 Connect-EflowVm PowerShell cmdlet 连接到虚拟机。 如果连接失败,请重新启动 EFLOW VM 并再次检查。 |
StaticIP 需要 ip4Address 和 ip4PrefixLength! | 在 EFLOW VM 部署期间或添加多个 NIC 时,如果使用的是静态 IP,则需要三个静态 IP 参数:ip4Address、ip4GatewayAddress、ip4PrefixLength。 | 有关 Deploy-EFlow PowerShell cmdlet 的详细信息,请参阅适用于 IoT Edge for Linux on Windows 的 PowerShell 函数。 |
找到多个“$switchType”类型的名为 “$switchName”的 VMMS 交换机 |
有两个或多个具有相同名称和类型的虚拟交换机。 此环境与 EFLOW VM 安装和 VM 的生命周期冲突。 | 使用 Get-VmSwitch PowerShell cmdlet 检查 Windows 主机中可用的虚拟交换机,并确保每个 {name,type} 都是唯一的。 |
后续步骤
你认为在 IoT Edge for Linux on Windows 中发现了 bug? 提交问题,以便我们可以持续改进。
如果你还有其他问题,请创建支持请求以获取帮助。