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

news/2025/2/21 10:18:25/

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

      • 前言
      • 问题描述
      • 问题原因
      • 尝试过的命令及分析
      • 解决方案:修改 `wsl.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。

尝试过的命令及分析

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

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

sudo nano /etc/wsl.conf

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

步骤 2: 添加配置内容

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

[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,请执行以下操作:

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

wsl --shutdown
wsl

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

步骤 5: 验证 DNS 配置

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

cat /etc/resolv.conf

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

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

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 设置。


http://www.ppmy.cn/news/1573854.html

相关文章

Postman配置环境变量(超详细的)

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Postman是一套比较方便的接口测试工具&#xff0c;但我们在使用过程中&#xff0c;可能会出现创建了API请求&#xff0c;但API的URL会随着服务器IP地址的变化而改…

Python 实现反转、合并链表有啥用?

大家好&#xff0c;我是 V 哥。使用 Python 实现反转链表、合并链表在开发中比较常见&#xff0c;我们先来看看各自的应用场景。先赞再看后评论&#xff0c;腰缠万贯财进门。 2024博客之星年度总评选&#xff0c;感谢给 V 哥投上宝贵的一票 反转链表 比如&#xff0c;在处理…

跳表(Skip List)详解

一、什么是跳表&#xff1f; 跳表是一种基于有序链表的高效数据结构&#xff0c;通过建立多级索引实现快速查询。它在平均情况下支持O(log n)时间复杂度的搜索、插入和删除操作&#xff0c;性能接近平衡树&#xff0c;但实现更为简单。 二、核心原理 1. 层级结构 底层为完整…

JavaScript设计模式 -- 状态模式

在软件开发中&#xff0c;很多对象的行为会随着其内部状态的变化而改变。如果将所有状态逻辑写在一个类中&#xff0c;代码不仅臃肿而且难以维护。**状态模式&#xff08;State Pattern&#xff09;**正是为了解决这个问题而设计的。通过将对象的状态封装成独立的状态类&#x…

(萌新入门)如何从起步阶段开始学习STM32 —— 1如何迁移一个开发版的工程

目录 前言 如何迁移一个开发版的工程到其他单片机上&#xff1f; Step 1&#xff1a;明确你单片机的型号 STEP2 确定环境后移植代码 提示&#xff1a;正常而言&#xff0c;我们是使用的套模板建立工程 提示&#xff1a;笔者自身不使用这些模板&#xff0c;我是使用CubeMX快…

Netty入门详解

引言 Netty 是一个基于 Java 的高性能、异步事件驱动的网络应用框架&#xff0c;用于快速开发可维护的高性能网络服务器和客户端。它提供了一组丰富的 API&#xff0c;使得开发人员能够轻松地处理各种网络协议&#xff0c;如 TCP、UDP 等&#xff0c;并且支持多种编解码方式&a…

机器学习小项目之鸢尾花分类

项目目标&#xff1a; 使用机器学习算法&#xff08;如 K-近邻算法&#xff09;来对鸢尾花数据集进行分类。 1. 准备工作 首先&#xff0c;我们需要安装一些常用的机器学习库&#xff0c;如 scikit-learn 和 pandas。 pip install scikit-learn pandas matplotlib2. 导入必…

Nginx解决前端跨域问题

1. 理解 CORS 和同源策略 1.1 同源策略 同源策略是一种浏览器安全机制&#xff0c;用于阻止不同源&#xff08;不同域名、协议或端口&#xff09;的 Web 应用相互访问数据。它确保了 Web 应用的隔离性&#xff0c;防止恶意网站访问用户数据或执行不安全的操作。 同源策略下&…