linux下修改hostname

   原来修改hostname,直接在/etc/sysconfig/network里边直接修改,重启以后就生效,没有多关注其他的,这几天遇到一个安装系统设置hostname为localhost或者localhost.localdoamin时启动以后显示的hostname不是locahost。我这一个机器显示的是这个:hn.kd.ny.adsl 。所以问题来了,为什么会出现这个用户名呢。后来经过检查发现这个显示是正确的,下边做解释说明。

  查看现有设置hostname,这个是我修改以后的,重启以后显示是正常的:

[root@lxself zabbix]# more /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@lxself zabbix]# more /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=lxself.localdomain

下面从这几方面说明此问题:

1、修改hostname以后不重启可以直接生效的方法:

用这两个方法修改以后可以立即生效,新开窗口克隆会话时hostname会变成修改过的名字,但是重启以后还是会恢复为原样的。

此时可以配合使用hostname newname或者sysctl kernel.hostname=newname来让显示的hostname立即生效而不用重启。

用这种方法修改以后需要重启才可以生效,用service network restart重启网络是不会变为新用户名的。

2、总结一下修改方法:

hostname DB-Server                        运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改

echo DB-Server  > /proc/sys/kernel/hostname      运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改

sysctl kernel.hostname=DB-Server              运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改

修改/etc/sysconfig/network下的HOSTNAME变量        需要重启生效,永久性修改。

3、说明下开头说的设置为localhost为什么会变为其他的:

从其他地方查了下有如下说明:

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.

hostname是一个内核参数,保存在/proc/sys/kernel/hostname下边。启动时从rc.sysinit读取,下面看下rc.sysinit里边关于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.0.0/0 scope global | awk '/[[:space:]]inet / { print gensub("/.*","","g",$2) }')
                for ip in $ipaddr ; do
                        HOSTNAME=
                        eval $(ipcalc -h $ip 2>/dev/null)
                        [ -n "$HOSTNAME" ] && { hostname ${HOSTNAME} ; break; }
                done
        fi

从上边可以看出启动时如果hostname是localhost或者localhost.localdomain时会读取ip的hostname,查看ip的hostname如下图所示:

遮挡着部分是本机外网IP地址。所以此时应该明白为什么会出现上述情况。