问题:
开机后不能上网, ping baidu.com
不能ping 通,
错误为:
ping: baidu.com: 域名解析暂时失败
修改 /etc/resolv.conf
文件,添加nameserver 8.8.8.8
再ping baidu.com
, 可以ping 通, 可以正常上网.
但是,当重新启动机器后, /etc/resolv.conf
文件被覆盖为旧的文件,
要想上网, 还需要重新修改文件内容.
解决问题的方法很简单,只需要看第7步即可.即修改/etc/systemd/resolved.conf
,添加DNS=8.8.8.8
:
这里记录一下我解决问题的过程:
解决问题的思路:
1. 查寻 /etc/resolv.conf, 是一个文件链接.
user@node2:~$ ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 39 Apr 23 17:40 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf
在 /run/systemd/resolve
目录, 有2个文件, 它们每次开机时都会重新生成(看文件时间)
user@node2:~$ ll /run/systemd/resolve
total 8
drwxr-xr-x 2 systemd-resolve systemd-resolve 120 Jun 22 09:19 ./
drwxr-xr-x 24 root root 620 Jun 22 12:52 ../
srw-rw-rw- 1 systemd-resolve systemd-resolve 0 Jun 21 23:18 io.systemd.Resolve=
srw------- 1 systemd-resolve systemd-resolve 0 Jun 21 23:18 io.systemd.Resolve.Monitor=
-rw-r--r-- 1 systemd-resolve systemd-resolve 950 Jun 21 23:18 resolv.conf
-rw-r--r-- 1 systemd-resolve systemd-resolve 920 Jun 22 09:18 stub-resolv.conf
所以不能直接修改这两个文件, 因为它们会开机重新生成. 旧内容被覆盖.
而且你用vim 打开 /etc/resolv.conf
文件, 也可以看到如下提示:
This file is managed by man:systemd-resolved(8). Do not edit.
可见该文件是由systemd-resolved
服务来管理,不要编辑.
2. 查询域名解析服务名称
user@node2:~$ systemctl status |grep resolv
│ ├─systemd-resolved.service
│ │ └─330132 /usr/lib/systemd/systemd-resolved
│ └─888442 grep --color=auto resolv
3. 查询域名解析服务状态
● systemd-resolved.service - Network Name Resolution
Loaded: loaded (/usr/lib/systemd/system/systemd-resolved.service; enabled; preset: enabled)
Active: active (running) since Fri 2024-06-21 23:18:13 CST; 13h ago
Docs: man:systemd-resolved.service(8)
man:org.freedesktop.resolve1(5)
https://www.freedesktop.org/wiki/Software/systemd/writing-network-configuration-managers
https://www.freedesktop.org/wiki/Software/systemd/writing-resolver-clients
Main PID: 330132 (systemd-resolve)
Status: "Processing requests..."
Tasks: 1 (limit: 76690)
Memory: 2.8M (peak: 3.8M)
CPU: 1.031s
CGroup: /system.slice/systemd-resolved.service
└─330132 /usr/lib/systemd/systemd-resolved
Jun 21 23:18:13 node2 systemd[1]: Started systemd-resolved.service - Network Name Resolution.
Jun 21 23:18:25 node2 systemd-resolved[330132]: Using degraded feature set UDP instead of UDP+EDNS0 for DNS server 202.106.46.151.
Jun 22 01:11:56 node2 systemd-resolved[330132]: Grace period over, resuming full feature set (UDP+EDNS0) for DNS server 202.106.46.151.
Jun 22 01:11:56 node2 systemd-resolved[330132]: Using degraded feature set UDP instead of UDP+EDNS0 for DNS server 202.106.46.151.
Jun 22 08:16:56 node2 systemd-resolved[330132]: Grace period over, resuming full feature set (UDP+EDNS0) for DNS server 202.106.46.151.
Jun 22 08:16:56 node2 systemd-resolved[330132]: Using degraded feature set UDP instead of UDP+EDNS0 for DNS server 202.106.46.151.
Jun 22 09:03:16 node2 systemd-resolved[330132]: Using degraded feature set UDP instead of UDP+EDNS0 for DNS server 202.106.195.68.
Jun 22 09:19:08 node2 systemd-resolved[330132]: Grace period over, resuming full feature set (UDP+EDNS0) for DNS server 202.106.195.68.
Jun 22 09:19:08 node2 systemd-resolved[330132]: Using degraded feature set UDP instead of UDP+EDNS0 for DNS server 202.106.195.68.
Jun 22 10:33:23 node2 systemd-resolved[330132]: Using degraded feature set UDP instead of UDP+EDNS0 for DNS server 2408:8000:1010:1::8.
4. 查找服务配置文件.
开启两个终端,一个终端执行监视,一个重启systemd-resolved
服务。
用fswatch
监视 /etc/systemd
目录, -t
是打印时间, -x
是打印事件
user@node2:~$ fswatch -t -x /etc/systemd
然后执行 停止,启动 systemd-resolved 服务
user@node2:~$ sudo systemctl stop systemd-resolved
[sudo] password for user:
user@node2:~$ sudo systemctl start systemd-resolved
监视到如下事件:
user@node2:~$ fswatch -t -x /etc/systemd
Sat 22 Jun 2024 01:03:41 PM CST /etc/systemd IsDir
Sat 22 Jun 2024 01:03:41 PM CST /etc/systemd PlatformSpecific
Sat 22 Jun 2024 01:03:42 PM CST /etc/systemd/resolved.conf PlatformSpecific
Sat 22 Jun 2024 01:03:42 PM CST /etc/systemd/resolved.conf PlatformSpecific
Sat 22 Jun 2024 01:03:42 PM CST /etc/systemd/resolved.conf PlatformSpecific
Sat 22 Jun 2024 01:03:42 PM CST /etc/systemd/resolved.conf PlatformSpecific
说明它访问了 /etc/systemd/resolved.conf
文件, 这也仅仅表示打开服务会访问这个文件,
通过查找网络资源, 确认还是要手工修改/etc/systemd/resolved.conf
这个文件
5. 编辑服务配置文件 /etc/systemd/resolved.conf
打开这个文件, 看到是一个空文件, 由若干行但都被#
号注释着, 把第一行DNS
的注释号去掉,
写成:
DNS=8.8.8.8
这个文件改动后,重启服务:
systemctl restart systemd-resolved
systemctl enable systemd-resolved
开机会依照它重新生成 /run/systemd/resolve/resolv.conf
文件
- 验证
重启机器,看到/run/systemd/resolve
目录下新生成的文件
user@node2:~$ ll /run/systemd/resolve
total 8
drwxr-xr-x 2 systemd-resolve systemd-resolve 120 Jun 22 13:21 ./
drwxr-xr-x 24 root root 620 Jun 22 13:21 ../
srw-rw-rw- 1 systemd-resolve systemd-resolve 0 Jun 22 13:21 io.systemd.Resolve=
srw------- 1 systemd-resolve systemd-resolve 0 Jun 22 13:21 io.systemd.Resolve.Monitor=
-rw-r--r-- 1 systemd-resolve systemd-resolve 969 Jun 22 13:21 resolv.conf
-rw-r--r-- 1 systemd-resolve systemd-resolve 920 Jun 22 09:18 stub-resolv.conf
查看内容: stub-resolv.conf
没有改变
resolv.conf
内容已经添加了:
nameserver 8.8.8.8
6. 结论: 其实只要一步修改
修改 /etc/systemd/resolved.conf
, 添加DNS=8.8.8.8
验证: 开机后,ping baidu.com
可以ping 通
7. systemd-resolved 服务起到了什么作用?
在没有systemd-resolved 服务的机器上,域名是这样解析的
1.从dns缓存里查找域名与ip的映射关系
2.从/etc/hosts里查找域名与ip的映射关系
3. 从/etc/resolv.conf里查找dns server,并发起解析请求
/etc/resolv.conf的内容一般如下:
nameserver 8.8.8.8
在有systemd-resolved 服务的机器上,域名还是这样解析的
1.从dns缓存里查找域名与ip的映射关系
2.从/etc/hosts里查找域名与ip的映射关系
3. 从/etc/resolv.conf里查找dns server,并发起解析请求
但是, 此时/etc/resolv.conf 的内容如下:
nameserver 127.0.0.53
options edns0 trust-ad
使得本地解析请求全部发到127.0.0.53
然后systemd-resolved再根据/run/systemd/resolve/resolv.conf里面的dns server去发起请求
/run/systemd/resolve/resolv.conf记录的就是真正的后端dns server
systemd-resolved
是 systemd
的一个组件,负责管理和缓存 DNS 解析请求。它提供了一个本地的 DNS 服务器,监听在 127.0.0.53
上,通过它可以代理和缓存 DNS 查询。
补充: centos7 下也有/etc/resolv.conf 被重置问题. 解决方法
1. 查看 /etc/resolv.conf 文件
$ cat /etc/resolv.conf
# Generated by NetworkManager
可见它是由NetworkManager
来生成的.
$ systemctl status |grep -i network
发现
├─NetworkManager.service
│ └─954 /usr/sbin/NetworkManager --no-daemon
2. 编辑NetworkManager
的配置文件
vim /etc/NetworkManager/NetworkManager.conf
在[main]
下添加dns=8.8.8.8
, 如下示例
[main]
dns=8.8.8.8
3. 重启网络服务验证.
$ systemctl restart NetworkManager.service
$ cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 8.8.8.8
发现 /etc/resolv.conf
已经添加了 nameserver ,问题解决!
参考资料:
https://blog.csdn.net/hejinjing_tom_com/article/details/134310580