解决android的linux deploy下ping: localhost不通提示 Name or service not known,未知的名称或服务以及/etc/hosts不生效的问题

遇到了Can not connect to the Service chromedriver的问题,网上一查发现是localhost无法解析的问题
Can not connect to the Service chromedriver的解决方法
尝试ping了一下localhost,返回:

localhost:未知的名称或服务

改成英文版ping了一下locaohost,返回

localhost name or service not known

去/etc/hosts里面查了一下,发现文件正常:

127.0.0.1	localhost linuxdeploy
::1		localhost ip6-localhost ip6-loopback
ff02::1		ip6-allnodes
ff02::2		ip6-allrouters
180.101.49.11 	www.baidu.com
180.101.49.11	www.a.shifen.com
130.89.148.12 ftp.debian.org
127.0.0.1 fuck

尝试ping了下fuck,发现也是返回未知的名称或服务。
但是ping www.baidu.com却可以ping通。
之后查了一下linux下dns查询的原理。
按照这篇文章(https://zhuanlan.zhihu.com/p/42898476
)的说法,使用strace能看到dns查询的时候系统读取了/etc/hosts文件比如:

open("/etc/hosts", O_RDONLY|O_CLOEXEC)  = 4

之后使用命令strace -f ping -c1 localhost调试这个程序的系统调用,结果并没有发现系统读取了发现了/etc/hosts,反而发现这样一个报错:

connect(5, {sa_family=AF_UNIX, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
close(5)                                = 0
openat(AT_FDCWD, "/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=52, ...}) = 0
openat(AT_FDCWD, "/etc/host.conf", O_RDONLY|O_CLOEXEC) = 5
fstat64(5, {st_mode=S_IFREG|0644, st_size=9, ...}) = 0
read(5, "multi on\n", 4096)             = 9
read(5, "", 4096)                       = 0
close(5)                                = 0

注意到其中读取了/etc/nsswitch.conf文件但是却报了错,表示找不到这个文件。
去系统里看了一下,果然没有这个文件。
我这个系统是debian系统,去debian的man page上面查了查,这个文件应该是自带的。
又从这里(https://blog.51cto.com/wujunfeng/1104498)了解到:
/etc/nsswitch.conf 其中的hosts:选项指定了系统dns的查询方式,比如:

hosts: dns files
表示只在DNS失效时候才使用/etc/hosts文件
hosts: dns
表示只用DNS解析主机
host: files
表示只用/etc/hosts文件解析主机
hosts: files dns
将使用/etc/hosts文件解析主机,表示如果无法解析主机名将使用DNS。

看来或许是这个文件缺失导致的localhost无法解析。
使用以下命令搜索了一下系统中有没有软件包带有nsswitch.conf 这个文件:

sudo apt-get install apt-file
apt-file update
apt-file search nsswitch.conf

发现glibc-source: /usr/src/glibc/debian/local/etc/nsswitch.conf在这里插入图片描述
于是直接把这个复制过去。

cp  /usr/src/glibc/debian/local/etc/nsswitch.conf /etc/

之后尝试ping localhost就可以通了。

要在 Kubernetes 的 Deploy 中添加一个自定义的 /etc/hosts 解析,可以通过在对应的容器中挂载一个 ConfigMap 来实现。具体的步骤如下: 1. 创建一个 ConfigMap,其中包含你想要添加的 hosts 记录。可以使用以下命令来创建 ConfigMap: ``` kubectl create configmap my-hosts --from-file=hosts ``` 其中 `my-hosts` 是 ConfigMap 的名称,`hosts` 是包含你想要添加的 hosts 记录的文件。 2. 在 Deploy 的 Pod 模板(即 `spec.template`)中添加一个 Volume,将 ConfigMap 挂载到容器中。例如: ``` ... spec: template: ... spec: volumes: - name: hosts-volume configMap: name: my-hosts containers: - name: my-container image: my-image volumeMounts: - name: hosts-volume mountPath: /etc/hosts subPath: hosts ... ``` 在这个例子中,我们将 ConfigMap `my-hosts` 挂载到名为 `hosts-volume` 的 Volume 中,并将 Volume 挂载到容器的路径 `/etc/hosts` 中。注意,我们在 `volumeMounts` 中使用了 `subPath` 字段来指定要挂载的 hosts 文件的名称。 3. 现在,当你启动该 Deploy 时,Kubernetes 会自动将 ConfigMap 中的 hosts 记录添加到容器的 /etc/hosts 文件中。你可以通过在容器中执行 `cat /etc/hosts` 命令来确认这些记录已经被添加到了文件中。 如果你想要修改 ConfigMap 中的 hosts 记录,可以使用以下命令: ``` kubectl create configmap my-hosts --from-file=hosts --dry-run=client -o yaml | kubectl apply -f - ``` 该命令会将 ConfigMap 更新为从文件 `hosts` 中读取的最新数据,并将更新后的 ConfigMap 应用到 Kubernetes 集群中。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值