在 Linux 系统中,`/etc/resolv.conf` 文件用于配置 DNS 解析器(即 DNS 服务器的地址)。修改 `/etc/resolv.conf` 后,通常不需要重启系统或网络服务即可生效,但需要注意以下几点:
---
### **1. 修改后如何生效**
修改 `/etc/resolv.conf` 后,DNS 解析器的更改会立即生效,因为大多数应用程序(如 `curl`、`ping`、`nslookup` 等)在每次进行 DNS 查询时都会读取该文件。
- 你可以通过以下命令测试 DNS 解析是否生效:
nslookup google.com
dig google.com
如果解析成功,说明修改已生效。
---
### **2. 修改后参数消失的原因**
如果你发现修改 `/etc/resolv.conf` 后,文件内容被重置或恢复为默认值,通常是因为系统中某些服务或工具在自动管理该文件。以下是常见的原因和解决方法:
#### **原因 1:NetworkManager 自动管理 `/etc/resolv.conf`**
- **现象**:`/etc/resolv.conf` 被重置为默认值,或者内容被覆盖。
- **原因**:`NetworkManager` 是 Linux 中常用的网络管理工具,它会根据网络配置自动生成 `/etc/resolv.conf`。
- **解决方法**:
1. 编辑 `/etc/NetworkManager/NetworkManager.conf` 文件,在 `[main]` 部分添加以下内容:
[main]
dns=none
2. 重启 `NetworkManager` 服务:
systemctl restart NetworkManager
3. 手动编辑 `/etc/resolv.conf`,设置你需要的 DNS 服务器。
#### **原因 2:`resolvconf` 工具自动管理 `/etc/resolv.conf`**
- **现象**:`/etc/resolv.conf` 被重置为动态生成的内容。
- **原因**:某些系统安装了 `resolvconf` 工具,它会动态管理 `/etc/resolv.conf`。
- **解决方法**:
1. 检查是否安装了 `resolvconf`:
dpkg -l | grep resolvconf
2. 如果安装了 `resolvconf`,可以通过以下方式禁用其自动管理功能:
- 编辑 `/etc/resolvconf/resolv.conf.d/head` 文件,添加你需要的 DNS 服务器配置。
- 重启 `resolvconf` 服务:
systemctl restart resolvconf
#### **原因 3:DHCP 客户端覆盖 `/etc/resolv.conf`**
- **现象**:`/etc/resolv.conf` 被 DHCP 客户端覆盖。
- **原因**:如果你的网络接口是通过 DHCP 获取 IP 地址的,DHCP 客户端可能会覆盖 `/etc/resolv.conf` 中的 DNS 配置。
- **解决方法**:
1. 编辑 DHCP 客户端的配置文件(如 `/etc/dhcp/dhclient.conf`),添加以下内容:
supersede domain-name-servers 8.8.8.8, 8.8.4.4;
将 `8.8.8.8` 和 `8.8.4.4` 替换为你需要的 DNS 服务器。
2. 重启网络服务或 DHCP 客户端:
systemctl restart networking
#### **原因 4:`systemd-resolved` 服务管理 `/etc/resolv.conf`**
- **现象**:`/etc/resolv.conf` 被重置为指向 `127.0.0.53`。
- **原因**:`systemd-resolved` 是 `systemd` 提供的 DNS 解析服务,它会接管 `/etc/resolv.conf`。
- **解决方法**:
1. 检查 `systemd-resolved` 是否正在运行:
systemctl status systemd-resolved
2. 如果正在运行,可以通过以下方式禁用其自动管理功能:
- 编辑 `/etc/systemd/resolved.conf`,设置:
[Resolve]
DNS=8.8.8.8 8.8.4.4
FallbackDNS=
Domains=
# 禁用 DNSStubListener
DNSStubListener=no
- 重启 `systemd-resolved` 服务:
systemctl restart systemd-resolved
- 删除 `/etc/resolv.conf` 的符号链接并重新创建:
rm /etc/resolv.conf
echo "nameserver 8.8.8.8" > /etc/resolv.conf
---
### **3. 永久生效的方法**
为了避免 `/etc/resolv.conf` 被重置,可以采取以下措施:
1. **禁用自动管理工具**:如上述方法,禁用 `NetworkManager`、`resolvconf` 或 `systemd-resolved` 的自动管理功能。
2. **设置文件为只读**:将 `/etc/resolv.conf` 设置为只读,防止被覆盖:
chattr +i /etc/resolv.conf
如果需要再次修改,可以取消只读属性:
chattr -i /etc/resolv.conf
---
### **总结**
- 修改 `/etc/resolv.conf` 后,DNS 配置会立即生效。
- 如果文件被重置,通常是因为 `NetworkManager`、`resolvconf`、`systemd-resolved` 或 DHCP 客户端在自动管理该文件。
- 通过禁用相关工具的自动管理功能,或设置文件为只读,可以确保修改永久生效。