Dmy*_*Huz 7 networking windows ubuntu wsl2
我有安装了 WSL2 的 Windows 10。在 WSL2 中,我有一个 Ubuntu。我需要使用物理 PC 中的不同适配器直接从 Ubuntu 工作,并可以从 Windows 访问它们。但在 WSL2 中我只有一个虚拟适配器。并且运行时看不到其他适配器ifconfig -a。有没有办法让 Ubuntu 中的所有 Windows 网络适配器可用/可见?
用例:我的电脑带有许多物理连接到不同设备的适配器。我需要向这些设备发送信号(请求)。
正如您所看到的,WSL1 为您提供了 Windows 接口到“Linux 接口”的更好映射,但了解 WSL1 和 WSL2 在这方面的差异非常重要:
在 WSL1 下,当 Linux 应用程序调用 Linux API 时,WSL1 负责尝试将其映射到 Windows API。因此,当ifconfig(或ip) 尝试调用getifaddrs来获取可用接口时,WSL1 会出现在Windows内核知道的列表中。
另一方面,WSL2 在虚拟化环境(Hyper-V 的子集)中运行真正的 Linux 内核。这里getifaddrs列举了虚拟机向 Linux 内核提供的接口。
两者各有优点和缺点:
WSL1 中最大的问题是您可以使用这些接口执行的操作非常有限。Microsoft 的 Windows->Linux API 映射仅在涉及硬件时才如此深入。
例如,即使是像打开或关闭界面这样非常基本的任务也行不通。例如sudo ip link set wifi0 down总会回来RTNETLINK answers: Operation not permitted。您不能将接口置于混杂模式、运行 WireShark 或类似的操作。
当然,WSL2 的虚拟化意味着您在调用 Linux 命令时甚至看不到 Windows 界面。另一方面,您可以完全访问虚拟接口。
根据您的用例,您可能有一些 WSL2 可能性。您在评论中提到(希望迁移到问题本身),您安装了多个接口,每个接口都连接到不同的端点设备。
最简单的方案(如果适合您)就是为 Windows 中的每个接口分配不同的子网,并依靠 Windows 路由表根据设备的 IP 地址处理发往设备的数据包。WSL2 中的虚拟接口应该“正常工作”并将数据包发送到 Windows 主机以进行正确的路由。
如果这不起作用,请查看socat另一种选择。有一个可用的 Windows 版本(尽管我还没有尝试过),以及大多数发行版中都提供的标准 Linux 版本。我已经成功地在 WSL2 中创建了映射到其他端点的 TAP/TUN 设备,尽管我已经有一段时间没有这样做了,而且不太记得我脑子里的细节。理论上,您可以socat在 WSL2 上运行的包和 Windows 主机本身上运行的包之间进行调整,以适应更复杂的用例。
虽然它不是您的用例的一部分,但我会向可能阅读本文的其他人提及这一点,因为它与问题相关。如果出于某种原因需要在 WSL(1 或 2)内执行诸如启用或禁用 Windows 界面之类的操作,请考虑通过powershell.exe. 例如:
powershell.exe -c "Disable-NetAdapter -name 'Wi-Fi'"
Run Code Online (Sandbox Code Playgroud)
请注意,这需要在 UAC 提升的终端中完成,因为 WSL 无法执行 Windows 用户无法执行的任何操作(即使是作为 root 执行)。另请注意,在 UAC 提升的会话中,您可能需要指定powershell.exe.
最后,我这么说只是因为我最近看到一些人对 WSL 的限制持批评态度,我不认为这些是 WSL 的限制。如果在 VMWare、VirtualBox 或任何其他虚拟化环境下运行,您会遇到与虚拟接口相同的问题。恕我直言,WSL 为我们提供了比其他虚拟化环境更多的选择,至少可以尝试处理这个问题。
| 归档时间: |
|
| 查看次数: |
31299 次 |
| 最近记录: |