我看不到哪个系统正在获取/分配 IP。两者都有文件NetworkManager
,netplan
但/etc
它们似乎都不完整并且 systemd 没有运行。运行的进程很少,network-manager
init.d
脚本报告它没有运行。没有/etc/network/interfaces
文件。
我的理解是,WSL2 通过 WSL 虚拟交换机有一些特殊的 DHCP 服务器,但是什么是联系该服务器并获取 IP 呢?
我看不到哪个系统正在获取/分配 IP。两者都有文件NetworkManager
,netplan
但/etc
它们似乎都不完整并且 systemd 没有运行。运行的进程很少,network-manager
init.d
脚本报告它没有运行。没有/etc/network/interfaces
文件。
我的理解是,WSL2 通过 WSL 虚拟交换机有一些特殊的 DHCP 服务器,但是什么是联系该服务器并获取 IP 呢?
一个老问题,今天似乎遇到了问题,所以我会尝试一下。
简短的回答:
init
负责建立网络(以及其他许多)更长的答案:
init
是所有 WSL(版本 1 和 2)实例上的“PID 1”进程。您会init
在所有 WSL 实例的根目录中找到相同的大小和时间戳。它负责启动实例,包括:
/etc/wsl.conf
根据该文件的内容读取和配置实例/etc/resolv.conf
(假设在/etc/wsl.conf
/mnt/driveletter
在(例如)中自动安装所有 Windows 驱动器/mnt/c
(再次假设该功能尚未关闭)-u
标志 onwsl.exe
,然后回退到/etc/wsl.conf
设置,检查实例的用户的 Windows 注册表设置,最后回退到root
如果以上都没有找到。/run/WSL/
,以便 Windows 可执行文件可以在 WSL Linux 会话中运行。据我所知,WSL
init
既是封闭源代码,也没有真正记录在案,所以老实说我在这里做了一些猜想,但其中一些可以通过在 WSL Github 问题 repo 中搜索"init"来获得。它也可能
init
是 WSL 子系统中执行繁重工作的其他进程的代理。例如,WSL2 实例将从 Hyper-V 虚拟 NIC 获取其网络信息,因为这些实例在 Windows NIC 后面进行了“NAT”。这样做的逻辑可能存在于 WSL“正确”之外 ,但它在实例启动期间init
被调用。init
为了测试
init
功能,我决定从 WSL 实例中删除几乎所有其他可能的东西,看看在它坏掉之前我能走多远:wsl -u root
.passwd
//文件group
之外的所有内容shadow
/etc
/lib
exceptlibc.musl
及其符号链接中删除了所有内容/usr
,/sbin
,/root
,/home
busybox
,groups
,su
和. 当然,.login
/bin
/init
wsl --terminate
对其进行了操作随着所有这些都消失了,并且系统尽可能的准系统(没有网络命令,没有网络脚本等):
busybox
的ash
shell 仍然有效(也作为默认的非 root 用户)/etc/resolv.conf
,/etc/hostname
, 并且/etc/hosts
仍然在启动时自动重新生成。cat /proc/net/fib_trie
返回了 IP 地址(当然,像 WSL2 那样经过 NAT)。我确实希望这个
init
过程有更好的记录,因为它是 WSL 的重要组成部分。也就是说,至少“如何配置它”文档是好的,即使它没有进入内部。