WSL 重启后 /etc/hosts 总是丢失?一行配置永久解决

问题现象

今天我到公司,打开电脑,运行之前模型训练的脚本,发现下载数据老是超时。排查一通后,发现是 WSL2 里 /etc/hosts 中自定义的域名映射被清掉了——那条记录是用来下载训练数据的。

前后排查差不多花了我一个小时时间,一上午就浪费了。所以在这里记录下,方便其他同学踩坑。

使用 WSL2 做开发的同学,都习惯了在 /etc/hosts 中添加自定义域名映射,比如:

1
2
127.0.0.1 dev.local
10.0.0.5 internal-api.company.com

但是每次重启电脑(或重启 WSL),这些记录就消失了,需要手动重新添加。公司电脑有 Windows 系统更新,时不时会要求重启,不然就自动重启了。我就是因为之前周末电脑自动重启后导致了这个问题。

为什么会丢失?

WSL2 默认会自动生成 /etc/hosts 文件,内容包含 Windows 主机 IP、WSL 实例主机名等。每次 WSL 启动时都会重新生成,所以手动添加的自定义条目会被无情覆盖。其实打开 /etc/hosts 就能看到,文件头部已经写了原因和解决方案。我的 WSL2 是像下面这样写的,不知道你们的是不是。

1
2
3
4
5
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateHosts = false
127.0.0.1 localhost
192.168.1.100 windows-host.local

本质上这不是 bug,而是 WSL 的默认设计——它假设你不应该手动改这个文件。

一行配置永久解决

只需要编辑 /etc/wsl.conf,加入以下内容:

1
2
[network]
generateHosts = false

然后重启 WSL:

1
2
# 在 Windows PowerShell 中执行
wsl --shutdown

重新进入 WSL 后,编辑 /etc/hosts

1
2
3
4
5
6
127.0.0.1   localhost
127.0.0.1 dev.local
10.0.0.5 internal-api.company.com

# WSL2 主机 IP(如果你需要访问 Windows 上的服务)
172.30.112.1 windows.local

这次重启后,自定义的 hosts 记录不会再丢失了。

注意事项

1. Windows 主机 IP 会变

设置 generateHosts = false 后,WSL 不再自动写入 Windows 主机 IP。如果你需要通过 /etc/hosts 访问 Windows 上的服务,需要手动维护这一行。

获取当前 Windows 主机 IP:

1
cat /etc/resolv.conf | grep nameserver | awk '{print $2}'

2. 本地主机名解析

关闭自动生成后,如果你习惯用 $(hostname).local 这种 WSL 自动生成的主机名,需要自己加到 hosts 里:

1
2
127.0.0.1   localhost
127.0.0.1 my-wsl-hostname

可以在改之前,先复制 WSL 自动生成的,然后重启后先粘贴上去,再在后面加自己的。

3. 只对 WSL2 有效

/etc/wsl.conf 是 WSL 的配置文件,WSL1 也支持但路径和字段完全一致。

完整配置推荐

如果你还想做更多 WSL 定制,这里是一个常用的 /etc/wsl.conf 配置:

1
2
3
4
5
6
7
8
9
10
[network]
generateHosts = false
generateResolvConf = true

[interop]
enabled = true
appendWindowsPath = true

[boot]
systemd = true
  • generateResolvConf = true:保持 DNS 自动配置(推荐)
  • systemd = true:启用 systemd(WSL 0.67.6+ 支持,Docker 等需要),该配置项默认已存在。

核心就一句话:generateHosts = false,一劳永逸。

看到后可以赶紧去改一下 /etc/wsl.conf,避免后面出现问题,再回来排查就像我这样浪费时间了。