WSL 重启后 /etc/hosts 总是丢失?一行配置永久解决
问题现象
今天我到公司,打开电脑,运行之前模型训练的脚本,发现下载数据老是超时。排查一通后,发现是 WSL2 里 /etc/hosts 中自定义的域名映射被清掉了——那条记录是用来下载训练数据的。
前后排查差不多花了我一个小时时间,一上午就浪费了。所以在这里记录下,方便其他同学踩坑。
使用 WSL2 做开发的同学,都习惯了在 /etc/hosts 中添加自定义域名映射,比如:
1 | 127.0.0.1 dev.local |
但是每次重启电脑(或重启 WSL),这些记录就消失了,需要手动重新添加。公司电脑有 Windows 系统更新,时不时会要求重启,不然就自动重启了。我就是因为之前周末电脑自动重启后导致了这个问题。
为什么会丢失?
WSL2 默认会自动生成 /etc/hosts 文件,内容包含 Windows 主机 IP、WSL 实例主机名等。每次 WSL 启动时都会重新生成,所以手动添加的自定义条目会被无情覆盖。其实打开 /etc/hosts 就能看到,文件头部已经写了原因和解决方案。我的 WSL2 是像下面这样写的,不知道你们的是不是。
1 | # This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf: |
本质上这不是 bug,而是 WSL 的默认设计——它假设你不应该手动改这个文件。
一行配置永久解决
只需要编辑 /etc/wsl.conf,加入以下内容:
1 | [network] |
然后重启 WSL:
1 | # 在 Windows PowerShell 中执行 |
重新进入 WSL 后,编辑 /etc/hosts:
1 | 127.0.0.1 localhost |
这次重启后,自定义的 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 | 127.0.0.1 localhost |
可以在改之前,先复制 WSL 自动生成的,然后重启后先粘贴上去,再在后面加自己的。
3. 只对 WSL2 有效
/etc/wsl.conf 是 WSL 的配置文件,WSL1 也支持但路径和字段完全一致。
完整配置推荐
如果你还想做更多 WSL 定制,这里是一个常用的 /etc/wsl.conf 配置:
1 | [network] |
- generateResolvConf = true:保持 DNS 自动配置(推荐)
- systemd = true:启用 systemd(WSL 0.67.6+ 支持,Docker 等需要),该配置项默认已存在。
核心就一句话:generateHosts = false,一劳永逸。
看到后可以赶紧去改一下 /etc/wsl.conf,避免后面出现问题,再回来排查就像我这样浪费时间了。