本文是由于Ambari安装HDP时, 选择FDQN, 一致出现问题,需要深入了解hostname, FDQN.
http://blog.chinaunix.net/uid-561779-id-3154203.html
http://www.cnblogs.com/kerrycode/p/3595724.html
一、与hostname 有关的文件,一般修改hostname, 就是修改/etc/hosts
和/etc/sysconfig/network
这两个文件
1、/etc/hosts
:
[root@rhel2 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.105 rhel2.localdomain rhel2
192.168.1.103 rhel1.chb.hdp rhel1
2、/etc/sysconfig/network
:
[root@rhel2 ~]# cat /etc/sysconfig/network
NETWORKINT=yes
HOSTNAME=rhel2
二、修改/etc/sysconfig/network
中的hostname:
修改后/etc/sysconfig/network
:
#/etc/hosts中内容
[root@rhel2 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
#/etc/sysconfig/network内容:
[root@rhel2 ~]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=localhost.localdomain #由rhel2改为新值
[root@rhel2 ~]#
再来查看hostname:hostname并没有该为localhost.localdomain
[root@rhel2 ~]# hostname
rhel2.chb.hdp
[root@rhel2 ~]#
重启系统: hostname 改变了, 那么 是修改/etc/sysconfig/network
中的hostname, 需要重启系统,才可生效?
[root@localhost ~]# hostname
localhost.localdomain
Google了一些英文文档资料才知道,hostname是Linux系统下的一个内核参数,它保存在/proc/sys/kernel/hostname
下,但是它的值是Linux启动时从rc.sysinit读取的。
而/etc/rc.d/rc.sysinit
中HOSTNAME的取值来自/etc/sysconfig/network
下的HOSTNAME,代码如下所示:
HOSTNAME=`/bin/hostname`
HOSTTYPE=`uname -m`
unamer=`uname -r`
set -m
if [ -f /etc/sysconfig/network ]; then
. /etc/sysconfig/network
fi
if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then
HOSTNAME=localhost
fi
hostname is a kernel parameter which stores hostname of the system. Its location is"/proc/sys/kernel/hostname"
The value for this parameter is loaded to kernel by rc.sysinit file during the boot process.
三、修改/proc/sys/kernael/hostname
重启系统后:
四、hostname跟/etc/hosts 下配置有关系吗?
如果从我上面的实验来看,其实hostname跟/etc/hosts下的配置是没有关系的。hostname的修改、变更完全不依赖hosts文件。 其实hosts文件的作用相当如DNS,提供IP地址到hostname的对应。早期的互联网计算机数量少,单机hosts文件里足够存放所有联网计算机。不过随着互联网的发展,这就远远不够了。于是就出现了分布式的DNS系统。由DNS服务器来提供类似的IP地址到域名的对应。具体可以man hosts查看相关信息。
Linux系统在向DNS服务器发出域名解析请求之前会查询/etc/hosts文件,如果里面有相应的记录,就会使用hosts里面的记录。/etc/hosts文件通常里面包含这一条记录:
127.0.0.1 localhost.localdomain localhost
hosts文件格式是一行一条记录,分别是IP地址 、hostname、 aliases,三者用空白字符分隔,aliases可选。
127.0.0.1到localhost这一条建议不要修改,因为很多应用程序会用到这个,比如sendmail,修改之后这些程序可能就无法正常运行。
但是呢,其实hostname也不是说跟/etc/hosts一点关系都没有。在/etc/rc.d/rc.sysinit
中,有如下逻辑判断,当hostname为localhost或localhost.localdomain时,将会使用接口IP地址对应的hostname来重新设置系统的hostname。
# In theory there should be no more than one network interface active
# this early in the boot process -- the one we're booting from.
# Use the network address to set the hostname of the client. This
# must be done even if we have local storage.
ipaddr=
if [ "$HOSTNAME" = "localhost" -o "$HOSTNAME" = "localhost.localdomain" ]; then
ipaddr=$(ip addr show to 0/0 scope global | awk '/[[:space:]]inet / { print gensub("/.*","","g",$2) }')
if [ -n "$ipaddr" ]; then
eval $(ipcalc -h $ipaddr 2>/dev/null)
hostname ${HOSTNAME}
fi
fi
重启后:
将/etc/sysconfig/network
中的hostname由localhost.localdomain改为rhel, 重启系统后:hostname 和/etc/sysconfig/network
中一致
五、修改了hostname后,如何使其立即生效而不用重启操作系统。
5.1、方法1:修改了/etc/sysconfig/network
下的HOSTNAME后,然后使用echo servername > /proc/sys/kernel/hostname
。
修改了`/etc/sysconfig/network`下的HOSTNAME后
[root@rhel ~]# echo Test >/proc/sys/kernel/hostname
注意当前会话还是不会变化,但是后续新建会话则会生效。
5.2、方法2:修改了/etc/sysconfig/network下的HOSTNAME后,然后使用sysctl kernel.hostname命令使其立即生效:
修改了/etc/sysconfig/network下的HOSTNAME后
[root@DB-Server ~]# echo Test >/proc/sys/kernel/hostname
注意当前会话还是不会变化,但是后续新建
5.3、方法3:修改了/etc/sysconfig/network下的HOSTNAME后,然后使用hostname命令使其生效
修改了/etc/sysconfig/network下的HOSTNAME后
[root@Test ~]# hostname DB-Server
注意当前会话还是不会变化,但是后续新建会话会生效。
其实,这几种方式只是结合永久性修改和临时性修改hostname,使其不必重启Linux服务器,
修改hostname有几种方式?
1: hostname DB-Server --运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改
2: echo DB-Server > /proc/sys/kernel/hostname --运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改
3: sysctl kernel.hostname=DB-Server --运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改
4: 修改/etc/sysconfig/network下的HOSTNAME变量 --需要重启生效,永久性修改。
如何查看hostname值, 以那个为准?
more /proc/sys/kernel/hostname
[root@DB-Server ~]# hostname
DB-Server
[root@DB-Server ~]# more /proc/sys/kernel/hostname
DB-Server
[root@DB-Server ~]# more /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=yes
HOSTNAME=localhost.localdomain
六、总结
1、 修改主机名
vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=NEWHOSTNAME #修改该值作为主机名,如:NEWPC
2、修改hosts
vi /etc/hosts
127.0.0.1 localhost.localdomain localhost
#该行强烈建议保留
192.168.0.1 rhel.lpwr.net rhel
#必须有三个字段:IP、FQDN、HOSTNAME
3、修改ip
vi /etc/sysconfig/network-scripts/eth0
#编辑指定网络接口配置文件
DEVICE=eth0 #指定接口名称
ONBOOT=yes #系统启动时加载
BOOTPROTO=static #IP地址静态配置,若该值为“dhcp”则为动态获得
IPADDR=192.168.0.1 #设置IP地址
NETMASK=255.255.255.0 #设置子网掩码
GATEWAY=192.168.0.254 #设置默认网关
4.修改网关(可选)
vim /etc/sysconfig/network
增加一条网关信息
GATEWAY=192.168.1.1
5,修改DNS
vi /etc/resolv.conf #指定当前主机的DNS服务器,最多可指定三个
search lpwr.net #设置当前主机的默认查找域
nameserver 192.168.0.100 #指定首选DNS服务器
nameserver 172.16.254.2
6.重新加载网络配置
/etc/init.d/network restart
Service network restart