解决 WSL Ubuntu 中 /etc/resolv.conf 自动重置问题

解决 WSL Ubuntu 中 /etc/resolv.conf 自动重置问题

前言

在使用 Windows Subsystem for Linux (WSL) 的 Ubuntu 子系统时,你可能会遇到 /etc/resolv.conf 文件被自动重置的问题。即使你手动删除或修改了这个文件,它仍然会被恢复到默认配置,例如被设置为 nameserver 192.168.31.2。 本文将深入探讨这个问题的原因,并提供有效的解决方案,同时回顾一些可能无效的尝试性操作,帮助你彻底解决 WSL Ubuntu 中的 DNS 配置困扰。

问题描述

正如用户遇到的情况,即使执行 sudo rm /etc/resolv.conf 删除了 /etc/resolv.conf 文件,或者使用 sudo tee /etc/resolv.conf <<< "nameserver 192.168.31.111" 尝试手动设置 nameserver,重启 WSL 后,/etc/resolv.conf 文件仍然会被重置为包含 nameserver 192.168.31.2 的内容。 这导致用户自定义的 DNS 设置无法生效,影响网络访问。

问题原因

这个问题的根源在于 WSL 的网络配置机制 。 WSL 默认被设计为与 Windows 主机网络环境紧密集成。 为了简化网络配置,WSL 会自动生成 /etc/resolv.conf 文件,并使其 镜像 Windows 主机当前的 DNS 设置 。 这意味着,每次 WSL 启动或网络环境发生变化时,WSL 都会重新生成 /etc/resolv.conf,覆盖任何手动修改。

因此,仅仅删除或临时修改 /etc/resolv.conf 文件是无法持久解决问题的。我们需要 阻止 WSL 自动生成该文件,并采取其他方式来配置 DNS。

尝试过的命令及分析

为了更好地理解问题,并帮助读者避坑,我们先回顾一下用户尝试过的一些命令,并分析其效果:

bash 复制代码
ls -l /etc/resolv.conf
  • 作用: 列出 /etc/resolv.conf 文件的详细信息,包括权限、所有者、大小和修改时间等。 用于确认文件是否存在以及基本属性。
bash 复制代码
cat /etc/resolv.conf
  • 作用: 查看 /etc/resolv.conf 文件的内容,确认当前的 nameserver 设置。 通常会看到 nameserver 192.168.31.2,即使之前尝试删除或修改过。
bash 复制代码
sudo rm /etc/resolv.conf
  • 作用: 尝试删除 /etc/resolv.conf 文件。 看似有效,但重启 WSL 后文件会被自动重新生成,之前的删除操作无效。
bash 复制代码
lsattr /etc/resolv.conf
  • 作用: 查看 /etc/resolv.conf 文件的特殊属性。 在某些情况下,文件可能被设置了 i 属性 (immutable),即不可修改。 但通常 WSL 自动生成的 /etc/resolv.conf 不会默认设置这个属性。
bash 复制代码
sudo chattr -i /etc/resolv.conf
  • 作用: 尝试移除 /etc/resolv.conf 文件的 i 属性(如果存在)。 如果文件被设置为不可修改,这个命令可以解锁文件,使其可以被删除或编辑。 但在这个场景下,通常不是 i 属性的问题,而是 WSL 的自动重写机制。
bash 复制代码
sudo rm /etc/resolv.conf
  • 作用: 再次尝试删除 /etc/resolv.conf 文件。 在移除了 i 属性后,如果之前存在该属性,这次删除操作应该可以成功。 但仍然无法阻止 WSL 的自动重写。
bash 复制代码
sudo tee /etc/resolv.conf <<< "nameserver 192.168.31.111"
  • 作用: 使用 tee 命令和重定向,尝试将 nameserver 192.168.31.111 写入 /etc/resolv.conf 文件。 这个命令可以临时修改文件内容。 但重启 WSL 后,修改会被自动重置。
bash 复制代码
cat /etc/resolv.conf
  • 作用: 再次查看 /etc/resolv.conf 文件内容,确认 tee 命令是否生效。 在重启前,可以看到修改后的内容。
bash 复制代码
sudo chattr +i /etc/resolv.conf
  • 作用: 尝试为 /etc/resolv.conf 文件设置 i 属性 (immutable),使其不可修改。 这个命令的目的是防止 WSL 自动修改文件。 但实际效果有限,WSL 可能会在启动时尝试重写文件,即使设置了 i 属性也可能失败,或者导致其他问题。 不推荐使用这种方式来解决自动重置问题。

总结: 以上命令虽然在一定程度上可以操作 /etc/resolv.conf 文件,但都无法从根本上解决 WSL 自动重置的问题。 我们需要更深入地配置 WSL,阻止其自动管理 /etc/resolv.conf

解决方案:修改 wsl.conf 禁用自动生成

要彻底解决 /etc/resolv.conf 自动重置的问题,我们需要修改 WSL 的配置文件 wsl.conf,禁用其自动生成 /etc/resolv.conf 的功能。 然后,我们可以手动创建并配置 /etc/resolv.conf 文件,或者使用其他 DNS 配置方式。

步骤 1: 编辑 wsl.conf 文件

在 WSL Ubuntu 终端中,使用文本编辑器(例如 nanovim)打开或创建 /etc/wsl.conf 文件:

bash 复制代码
sudo nano /etc/wsl.conf

如果文件不存在,nano 会创建一个新文件。

步骤 2: 添加配置内容

wsl.conf 文件中,添加以下配置段和内容:

ini 复制代码
[network]
generateResolvConf = false
  • [network] 表示网络配置段。
  • generateResolvConf = false 关键配置 ,禁用 WSL 自动生成 /etc/resolv.conf 文件的功能。

保存并关闭文件 (在 nano 中,按 Ctrl+X,然后按 Y 确认保存,最后按 Enter 退出)。

步骤 3: 手动创建并配置 /etc/resolv.conf (可选)

在禁用自动生成后,您可以选择手动创建 /etc/resolv.conf 文件,并配置您想要的 DNS 服务器。 如果您希望使用特定的 DNS 服务器,例如 192.168.31.111 或公共 DNS 服务器 8.8.8.88.8.4.4,请执行以下操作:

bash 复制代码
sudo rm /etc/resolv.conf  # 如果文件还存在,先删除
sudo nano /etc/resolv.conf

/etc/resolv.conf 文件中,添加 nameserver 行,指定 DNS 服务器地址。 例如:

复制代码
nameserver 192.168.31.111
# 或者使用公共 DNS
# nameserver 8.8.8.8
# nameserver 8.8.4.4

根据您的需求选择合适的 DNS 服务器,保存并关闭文件。

如果您希望完全禁用 DNS 解析,可以跳过手动创建 /etc/resolv.conf 的步骤。 WSL 将不会自动生成,您也没有手动创建,这样系统将不会使用 /etc/resolv.conf 进行 DNS 解析。 但这通常不是推荐的做法,除非您有特殊需求。

步骤 4: 重启 WSL 使配置生效

配置 wsl.conf 后,需要重启 WSL 才能使更改生效。 在终端中运行以下命令重启 WSL:

bash 复制代码
wsl --shutdown
wsl

或者,您可以直接重启您的 Windows 电脑,效果相同。

步骤 5: 验证 DNS 配置

重启 WSL 后,验证 /etc/resolv.conf 文件是否按照您的设置生效。 如果手动创建并配置了 /etc/resolv.conf,请检查文件内容:

bash 复制代码
cat /etc/resolv.conf

您应该看到您在文件中设置的 nameserver 地址。 如果选择不手动创建 /etc/resolv.conf,则文件可能不存在或为空。

您还可以使用 nslookupping 命令测试 DNS 解析是否正常工作:

bash 复制代码
nslookup baidu.com
ping baidu.com

如果 DNS 解析正常,nslookup 应该能够解析域名,ping 应该能够 ping 通域名对应的 IP 地址。

总结

通过修改 wsl.conf 文件并禁用 generateResolvConf 选项,我们可以有效地阻止 WSL 自动重置 /etc/resolv.conf 文件,从而实现自定义 DNS 配置的目的。 这种方法是 持久且推荐 的解决方案,可以彻底解决 WSL Ubuntu 中 /etc/resolv.conf 自动重置的问题,让用户能够灵活地管理 WSL 的 DNS 设置。

相关推荐
爱奥尼欧2 分钟前
【Linux 系统】基础IO——Linux中对文件的理解
linux·服务器·microsoft
超喜欢下雨天30 分钟前
服务器安装 ros2时遇到底层库依赖冲突的问题
linux·运维·服务器·ros2
搬码临时工36 分钟前
小企业如何搭建本地私有云服务器,并设置内部网络地址提供互联网访问
运维·服务器
tan77º1 小时前
【Linux网络编程】网络基础
linux·服务器·网络
风口上的吱吱鼠1 小时前
Armbian 25.5.1 Noble Gnome 开启远程桌面功能
服务器·ubuntu·armbian
18你磊哥2 小时前
Windows 本地安装部署 Apache Druid
运维·debian
笑衬人心。2 小时前
Ubuntu 22.04 + MySQL 8 无密码登录问题与 root 密码重置指南
linux·mysql·ubuntu
IT成长日记2 小时前
【Docker基础】Docker数据卷管理:docker volume inspect及其参数详解
运维·docker·容器·volume·inspect
ldj20202 小时前
Jenkins 构建过程常见错误
运维·jenkins
ladymorgana2 小时前
【Docker】如何设置 `wiredTigerCacheSizeGB` 和 `resources.limits.memory`
运维·docker·容器