路漫漫其修远兮
吾将上下而求索

linux修改主机名:hostname

实验环境:centos6.8,其他版本linux可能不同,以实际环境为准

没想到一个主机名都这么多注意事项

1、实验前的各条件

[root@localhost ~]#cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=localhost.localdomain

[root@localhost ~]#cat /proc/sys/kernel/hostname 
localhost.localdomain

[root@localhost ~]#cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

———————-永久性修改,重启生效———–

2、修改/etc/sysconfig/network文件,发现主机名不变,重启后主机名更改

[root@localhost ~]#cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=master

[root@localhost ~]#cat /proc/sys/kernel/hostname 
localhost.localdomain

[root@localhost ~]#hostname
localhost.localdomain

[root@localhost ~]#reboot
Broadcast message from root@localhost.localdomain
	(/dev/pts/0) at 22:05 ...

The system is going down for reboot NOW!

Connecting to 192.168.175.11:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

Last login: Wed Apr 12 22:01:44 2017 from 192.168.175.30
[root@master ~]#hostname
master
[root@master ~]#cat /proc/sys/kernel/hostname 
master

——————-临时性修改, 立即生效,重启系统失效————–

3、直接修改内核参数,可以改变主机名。

        直接修改内核参数,可以改变主机名。必须要重新打开终端,修改后的主机名:slave,配置文件/etc/sysconfig/network内容不改变。但是重启主机后修改的主机名(slave)参数丢失

[root@master ~]#echo slave > /proc/sys/kernel/hostname 
[root@master ~]#cat /proc/sys/kernel/hostname
slave
[root@master ~]#hostname
slave
[root@master ~]#su - zhao
[zhao@slave ~]$exit
[root@slave ~]#reboot

The system is going down for reboot NOW!

Connection closed by foreign host.

Disconnected from remote host(centos6-11) at 22:12:00.

Connecting to 192.168.175.11:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

Last login: Wed Apr 12 22:09:56 2017 from 192.168.175.30
[root@master ~]#hostname 
master
[root@master ~]#cat /proc/sys/kernel/hostname 
master

4、使用hostname命令修改,

        配置文件不变,内核参数改变,重新打开终端生效,重启系统,修改的参数(one)丢失,和上面的直接修改内核的效果是一样的

[root@master ~]#hostname one
[root@master ~]#cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=master
[root@master ~]#cat /proc/sys/kernel/hostname 
one
[root@master ~]#hostname
one

5、配置文件/etc/sysconfig/network说明

        hostname是Linux系统下的一个内核参数,它保存在/proc/sys/kernel/hostname下,但是它的值是Linux启动时从rc.sysinit读取的(见下面),读取后赋值给内核的参数,知道这个原理之后就好办了,先理解,后记忆,这样才深刻牢靠

        配置文件是系统启动的时候读取的,所以如果要永久生效,得要修改配置文件,要想重读配置文件,重启系统,

        hostname命令也是修改内核的参数,和直接echo hostname到内核参数是一样的,所以只是临时性生效,

 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.

        而/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

        结论:/etc/sysconfig/network 确实是hostname的配置文件,hostname的值跟该配置文件中的HOSTNAME有一定的关联关系,但是没有必然关系,hostname的值来自内核参数/proc/sys/kernel/hostname,如果我通过命令sysctl kernel.hostname=master修改了内核参数,那么hostname就变为了master了。  

6、主机名与/etc/hosts配置文件关系

        其实hostname也跟/etc/hosts有关系。在/etc/rc.d/rc.sysinit中,有如下逻辑判断,当hostname为localhost后localhost.localdomain时,将会使用接口IP地址对应的hostname来重新设置系统的hostname。

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

7、修改hostname有几种方式?

hostname master                                 --运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改
echo master  > /proc/sys/kernel/hostname        --运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改
sysctl kernel.hostname=master                   --运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改
修改/etc/sysconfig/network下的HOSTNAME变量      --需要重启生效,永久性修改。

8、如何既立即生效主机名又永久生效主机名,这些方式只是结合永久性修改和临时性修改hostname,使其不必重启Linux服务器

        要想永久生效,修改配置文件

        要想立即生效,直接修改内核参数或者使用hostname命令修改,然后重新打开一个终端,在新终端上操作

9、centos7修改方法

        在CentOS6及其以下版本一般通过修改配置文件的办法来修改主机名,此配置文件一般为/etc/sysconfig/network,但在CentOS7中,很多系统管理工具都被替换了。

        例如想更改主机名,不能参考以前的方法了,新的配置文件已经更新为/etc/hostname,尽管修改/etc/sysconfig/network配置文件(此文件依然存在,只是是空的)可能起作用,但不得不考虑有些Linux软件是否会使用source此文件或是否使用环境变量$HOSTNAME。因此在此总结了几种CentOS7修改主机名的方法。

        1.直接使用文本编辑器修改/etc/hostname配置文件,系统重启的时候会读取这个文件当做主机名。

        2.使用hostnamectl命令:#hostnamectl set-hostname name

[root@localhost ~]#hostnamectl
   Static hostname: localhost.localdomain
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 474be6a49ddf4de68b0b2728cfb161f3
           Boot ID: 2113d02d984842ac8eed6e003dde3116
    Virtualization: vmware
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-327.el7.x86_64
      Architecture: x86-64
[root@localhost ~]#cat /etc/hostname 
localhost.localdomain
  
[root@localhost ~]#hostnamectl set-hostname master
[root@localhost ~]#cat /etc/hostname
master
[root@localhost ~]#hostnamectl
   Static hostname: master
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 474be6a49ddf4de68b0b2728cfb161f3
           Boot ID: 2113d02d984842ac8eed6e003dde3116
    Virtualization: vmware
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-327.el7.x86_64
      Architecture: x86-64
[root@localhost ~]#echo $HOSTNAME
localhost.localdomain
[root@localhost ~]#hostname
master

        要打开新终端才能生效,这里的这个命令代替了上面centos6的两个操作(修改配置文件和修改内核参数),但是这个终端两个命令执行结果不同,不知道以哪个为准。

参考文章

未经允许不得转载:江哥架构师笔记 » linux修改主机名:hostname

分享到:更多 ()

评论 抢沙发

评论前必须登录!