WSL2 ubuntu 20.04 如何获取IP地址?

Ant*_*ods 11 networking dhcp windows-subsystem-for-linux

我看不到哪个系统正在获取/分配 IP。NetworkManagernetplanin都有文件,/etc但它们似乎都不完整,systemd 没有运行。运行的进程很少,network-manager init.d脚本报告它没有运行。没有/etc/network/interfaces文件。

我的理解是 WSL2 通过 WSL 虚拟交换机具有某种特殊类型的 DHCP 服务器,但是是什么联系了该服务器并获得了 IP?

Not*_*1ds 6

今天似乎遇到了一个古老的问题,所以我会尝试一下。

简短的回答: init负责建立网络(以及其他很多)

更长的答案:

init是所有 WSL(版本 1 和 2)实例上的“PID 1”进程。您会init在所有 WSL 实例的根目录中找到相同的内容,具有相同的大小和时间戳。

它负责实例的启动,包括:

  • /etc/wsl.conf根据该文件的内容读取和配置实例
  • 设置网络,包括自动生成/etc/resolv.conf(假设在/etc/wsl.conf
  • /mnt/driveletter(例如/mnt/c)中自动安装所有 Windows 驱动器(再次假设该功能尚未关闭)
  • 确定当前用户 - 首先从-u标志检查wsl.exe,然后回退到/etc/wsl.conf设置,检查实例的用户的 Windows 注册表设置,最后回退到root如果没有找到上述任何一个。
  • 将 Windows 路径附加到 Linux 路径(假设它没有关闭)
  • 在实例中设置 WSL 特定的环境变量
  • 可能还有其他一些事情,包括通过 中的套接字设置 Windows 互操作性/run/WSL/,以便 Windows 可执行文件可以在 WSL Linux 会话中运行。

据我所知,WSLinit既是封闭源代码,也没有真正记录下来,所以我在这里诚实地做出了一些猜测,但其中一些可以通过在 WSL Github 问题存储库中搜索"init" 来获得

这也很可能init是 WSL 子系统中执行繁重工作的其他进程的代理。例如,WSL2 VM 将从 Hyper-V 虚拟 NIC 获取其网络信息,而 WSL2 实例与 Windows NIC“桥接”。这可能生活的逻辑之外 init的WSL“正确”的,但它是由被称为init实例启动时。

为了测试该init功能,我决定从 WSL 实例中删除几乎所有其他可能的东西,看看在它崩溃之前我能走多远:

  • 我克隆了一个 Alpine WSL 实例,因为这是您可以获得的“基本”实例(默认情况下整个实例大约 8MB)并使用wsl -u root.
  • 内部的情况下,我删除了一切,但passwd/ group/shadow从文件/etc
  • /libexcept forlibc.musl及其符号链接中删除了所有内容
  • 删除/usr, /sbin, /root,/home
  • 这几乎刚离开busyboxgroupssu,并login为在该实例的基础可执行文件/bin。而且,当然,/init
  • 退出会话并wsl --terminate对其进行处理
  • 以 root 身份重新启动会话

随着所有这些都消失了,并且系统尽可能地准系统(没有网络命令,没有网络脚本等):

  • 登录到busyboxashshell 仍然有效(也作为默认的非 root 用户)
  • /etc/resolv.conf/etc/hostname、 和/etc/hosts仍然在启动时自动重新生成。
  • 网络已启动——通过 DNS 进行 Ping 工作,cat /proc/net/fib_trie返回 IP 地址(NAT'd,当然,就像 WSL2 一样)。
  • Windows 驱动器仍然是自动安装的
  • Windows 互操作(运行 Windows 可执行文件,例如“powershell.exe”)仍然有效
  • Windows 路径仍然附加到 Linux 路径。

我确实希望这个init过程有更好的记录,因为它是 WSL 的重要组成部分。也就是说,至少“如何配置它”文档是好的,即使它没有进入内部。