先把本文的总结放在前面:

总结:
1、当有应用需要进行域名解析时(如:ping  www.sohu.com),会首先读取resolv.conf文件获取dns服务器地址,然后再向该dns服务器发送域名解析请求,若resolv.conf设置的不对或者没有resolv.conf都会导致域名解析失败。

2、通过ifcfg-eth0也可以设置DNS服务器地址,并自动修改或生成resolv.conf文件。在ifcfg-eth0中可以通过PEERDNS参数决定是否修改resolv.conf文件,设置PEERDNS=yes(这也是系统的默认配置)则启用该网络设备时,会修改或生成resolv.conf文件,设置PEERDNS=no,则不对resolv.conf做任何变动。

3、若ifcfg-eth0被配置为DHCP模式,则系统默认PEERDNS=no,也就是会用DHCP获取的DNS地址修改或生成resolv.conf文件。

4、我觉得没有特殊情况,不用在resolv.conf中设置DNS,应在ifcfg-eth0中设定DNS服务器地址方便些,即符合正常思维也更便于维护和管理。

参考文档:
红帽的随机文档/usr/share/doc/initscripts-8.45.30/sysconfig.txt,我是红帽子5.5,不同的版本这个‘initscripts-8.45.30’可能不一样。
附件中是redhat 5.5的sysconfig.txt,可以下载先看看。强烈推荐大家看看该文档,里面还写了不少其它有用的资料,至少我是这么认为的。

---------------------------------正文开始------------------------------------

与DNS设置有关的系统配置文件有2个,即:
/etc/resolv.conf ’程序在需要域名解析时,会通过该文件获取DNS服务器地址
/etc/sysconfig/network-scripts/ifcfg-eth0 ‘ifcfg-eth0这个文件名根据不同的网络设备名字会不同。该文件也可以设置DNS服务器地址

看到此,肯定会想到,两个文件都可以设置DNS,难倒不会产生冲突吗?下面,通过实验来验证这个问题

1.1通过resolv.conf设置DNS服务器IP地址
只要在文件中加入nameserver <DNS服务器IP地址>就可以了。

我的resolv.conf配置如下:
nameserver 202.96.134.33
nameserver 202.96.128.68

PING 搜狐网站通过:
[root@linux_1 ~]# ping www.sohu.com
PING pgctcgzt01.a.sohu.com (121.14.0.20) 56(84) bytes of data.
64 bytes from 121.14.0.20: icmp_seq=1 ttl=55 time=31.6 ms
64 bytes from 121.14.0.20: icmp_seq=2 ttl=55 time=29.4 ms
64 bytes from 121.14.0.20: icmp_seq=3 ttl=55 time=28.9 ms

--- pgctcgzt01.a.sohu.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2328ms
rtt min/avg/max/mdev = 28.996/30.027/31.659/1.183 ms

再试下把resolv.conf改名为resolv.conf.bak,看是否还能ping通,此时相当于没有resolv.conf文件
[root@linux_1 ~]# mv /etc/resolv.conf /etc/resolv.conf.bak
[root@linux_1 ~]# ping www.sohu.com
ping: unknown host www.sohu.com

系统提示‘ping: unknown host www.sohu.com’,说明不能进行域名解析,由此可以判断出,系统是先读取resolv.conf文件获取dns服务器地址,然后再去向dns服务器发送域名解析请求的。
马上恢复resolv.conf
[root@linux_1 ~]# mv /etc/resolv.conf.bak /etc/resolv.conf

注意:resolv.conf文件修改后立即生效,是不需要重新应用网络服务的。


1.2 通过ifcfg-eth0文件设置DNS服务器IP地址
只要在文件中增加以下配置就可以了:
DNS1=<dns服务器ip地址>
DNS2=<dns服务器ip地址>

注:最多设置两个dns服务器。

我的resolv.conf配置如下:
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth0
IPADDR=192.168.1.63
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=202.96.134.33
DNS2=202.96.128.68

注:系统默认在应用网络配置时,会自动创建和修改resolv.conf文件,测试如下:
先更名resolv.conf,然后再重新应用网络
------------------------------------------------------------------------
[root@linux_1 /]# mv /etc/resolv.conf /etc/resolv.conf.bak
[root@linux_1 /]# service network restart
正在关闭接口 eth0: [确定]
关闭环回接口: [确定]
弹出环回接口: [确定]
弹出界面 eth0: [确定]
[root@linux_1 /]# ping www.sohu.com
PING pgctcgzt01.a.sohu.com (121.14.0.27) 56(84) bytes of data.
64 bytes from 121.14.0.27: icmp_seq=1 ttl=55 time=28.5 ms
64 bytes from 121.14.0.27: icmp_seq=2 ttl=55 time=80.6 ms
64 bytes from 121.14.0.27: icmp_seq=3 ttl=55 time=23.9 ms
-----------------------------------------------------------------------
ping www.sohu.com 正常,可以说明dns正常解析。

试着查看resolv.conf文件:
[root@linux_1 /]# ll /etc/resolv.*
-rw-r--r-- 1 root root 51 11-30 17:00 /etc/resolv.conf
-rw-r--r-- 1 root root 51 11-29 11:21 /etc/resolv.conf.bak

再查看resolv.conf文件内容:
[root@linux_1 /]# cat /etc/resolv.conf
nameserver 202.96.134.33
nameserver 202.96.128.68

resolv.conf又有了,由此可以判断在执行service network restart其间,系统自动生成了resolv.conf。dns服务器的地址与ifcfg-eth0一样,也就是说,系统是根据ifcfg-eth0文件中的dns设置,自动生成了resolv.conf文件。

此外,如果resolv.conf文件已经存在,并且配置了nds服务器地址,系统仍然会根据ifcfg-eth0修改resolv.conf文件,下面通过实验来验证:
把我的resolv.conf的内容变更如下:
[root@linux_1 ~]# cat /etc/resolv.conf
#my nds's configuration file.
nameserver 202.96.134.100
nameserver 202.96.128.200

再重新应用网络配置:
[root@linux_1 ~]# service network restart
正在关闭接口 eth0: [确定]
关闭环回接口: [确定]
弹出环回接口: [确定]
弹出界面 eth0: [确定]

查看resolv.conf的内容:
[root@linux_1 ~]# cat /etc/resolv.conf
nameserver 202.96.134.33
nameserver 202.96.128.68

如上,可以判断出系统不是修改resolv.conf文件,而是将该文件删除,并根据ifcfg-eth0中DNS1和DNS2的设置重新创建了resolv.conf文件。

如果不想让系统更改resolv.conf文件,就要再ifcfg-eth0中使用PEERDNS参数,验证如下:

先修改ifcfg-eth0,设置PEERDNS=no
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth0
IPADDR=192.168.1.63
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=202.96.134.33
DNS2=202.96.128.68
PEERDNS=no

再修改resolv.conf为如下内容:
[root@linux_1 ~]# cat /etc/resolv.conf
#This is my dns configuration file.
nameserver 202.96.134.100
nameserver 202.96.128.200

然后重新应用网络配置:
[root@linux_1 ~]# service network restart
正在关闭接口 eth0: [确定]
关闭环回接口: [确定]
弹出环回接口: [确定]
弹出界面 eth0: [确定]

这时再查看resolv.conf文件,可以看到并没有改变
[root@linux_1 ~]# cat /etc/resolv.conf
#This is my dns configuration file.
nameserver 202.96.134.100
nameserver 202.96.128.200


如果把PEERDNS设置为yes,是不是系统就会根据ifcfg-eth0的配置而自动修改resolv.conf呢,下面做个验证
首先修改/etc/resolv.conf文件内容如下:
[root@linux_1 ~]# cat /etc/resolv.conf
#This is my dns configuration file.
nameserver 202.96.134.222
nameserver 202.96.128.4444
nameserver 11,22,33,44,5

然后重新应用网络配置:
[root@linux_1 ~]# service network restart

查看resolv.conf文件内容,已经被修改了:
[root@linux_1 ~]# cat /etc/resolv.conf
#This is my dns configuration file.
nameserver 202.96.134.33
nameserver 202.96.128.68

另外,我还作了测试,当ifcfg-eth0的PEERDNS设置为yes时,而又没有配置DNS1和DNS2参数,重新应用网络配置后,resolv.conf不作任何变动。
当ifcfg-eth0设置为DHCP时,系统默认PEERDNS为yes,也就是系统会修改resolv.conf文件。