问题1: 为什么/etc/sysconfig/network配置文件中HOSTNAME为localhost.localdomain,但是显示的hostname为po132345806-a,那到底hostname的配置值放在哪里?
[root@localhost ~]# more /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
::1 localhost.localdomain localhost
127.0.0.1 localhost.localdomain localhost
192.168.244.128 hahaha.localdomain hahaha
[root@localhost ~]# more /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=yes
HOSTNAME=localhost.localdomain
解答:
hostname即时值在/proc/sys/kernel/hostname;启动加载值在/etc/sysconfig/network;
修改后没有生效的原因是/etc/sysconfig/network内HOSTNAME值是开机加载的;
hostname是Linux系统下的一个内核参数,它保存在/proc/sys/kernel/hostname下,启动时从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
问题2: 修改了hostname后,如何使其立即生效而不用重启操作系统?
- 方法1:修改了/etc/sysconfig/network下的HOSTNAME后,然后使用命令echo hahaha > /proc/sys/kernel/hostname 使其立即生效
- 方法2:修改了/etc/sysconfig/network下的HOSTNAME后,然后使用命令sysctl kernel.hostname=hahaha 使其立即生效
- 方法3:修改了/etc/sysconfig/network下的HOSTNAME后,然后使用命令hostname hahaha 使其生效
注意以上三种方法当前会话还是不会变化,但是后续新建会话会生效。
问题3: 修改hostname有几种方式?
- 方法1:hostname hahaha
运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改
- 方法2: echo hahaha > /proc/sys/kernel/hostname
运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改
- 方法3:sysctl kernel.hostname=hahaha
运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改
- 方法4:修改/etc/sysconfig/network下的HOSTNAME变量
需要重启生效,永久性修改。
问题4: 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=
# 如果HOSTNAME=localhost或者localhost.localdomain,则ipaddr取 ip addr的scope global的端口ip
if [ "$HOSTNAME" = "localhost" -o "$HOSTNAME" = "localhost.localdomain" ]; then
ipaddr=$(ip addr show to 0/0 scope global | awk '/[[:space:]]inet / { print gensub("/.*","","g",$2) }')
# 如果ipaddr不为空,将ipaddr的值做ipcalc -h(即域名解析),域名解析的值执行命令hostname
if [ -n "$ipaddr" ]; then
eval $(ipcalc -h $ipaddr 2>/dev/null)
hostname ${HOSTNAME}
fi
fi
其他:
- 127.0.0.1到localhost这一条建议不要修改,因为很多应用程序会用到这个,比如sendmail,修改之后这些程序可能就无法正常运行。
- hosts文件格式是一行一条记录,分别是IP地址 、hostname、 aliases,三者用空白字符分隔,aliases可选。
如果/etc/hostname中,有值的话,会优先取这里面的值
网友评论