hostname 就是Linux的主机名,经常看到的地方就是终端,
[user@hostname]。
有一个相关的命令叫hostname,可以临时改变系统的hostname。
$ hostname newhostname
系统重启后,这种改变的效果就会消失。
那么如何永久的改变hostname呢?
hostname是Linux的一个kernel变量,在proc文件系统的位置是 /proc/sys/kernel/hostname。在系统启动的时,/etc/rc.d/rc.sysinit这个脚本通过读取配置文件/etc/sysconfig/network来设置系统的hostname。所以要永久的修改hostname,就要修改/etc/sysconfig/network这个配置文件。将HOSTNAME这一行改成HOSTNAME=NEWNAME
/etc/rc.d/rc.sysinit 刚开始有这一段
[code lang=”bash”]
HOSTNAME=$(/bin/hostname)
set -m
if [ -f /etc/sysconfig/network ]; then
. /etc/sysconfig/network
fi
if [ -z “$HOSTNAME” -o “$HOSTNAME” = “(none)” ]; then
HOSTNAME=localhost
fi
[/code]
代码说明一切哇。。
讲到hostname就不得不说另一个相关的东东 /etc/hosts
hosts的作用就相当一个本地局部的DNS,提供ip到hostname的对应。在互联网的早期时代,网络上计算是相当少的,就那几个ip,记起来也不是什么难事,随着网络上计算机的增多,ip记起来就有点压力了,名字对人来说要比ip好记,hosts就是干这种事的,文件格式非常简单,第一行都是类似这样的:
[code lang=”text”]
IP_address canonical_hostname [aliases…]
[/code]
随着网络上计算机的爆炸性增多,这种本地存放hostname到ip的映射表已经不现实了,并且每台电脑上映射表可能不一样,会造成混乱,因此就出现了DNS这个东东(分布式数据库的典范哇),大家只要配好DNS,映射表都是一样。
虽然有了DNS,/etc/hosts还是保留下来了,为了向前兼容,满足自定义需求。。。并且这个文件里的映射表优先级要高于DNS查询返回的结果。
扯的有点多了。。
说说与之前说的hostname有什么关系吧。
配好hostname后,我们想在本机来通过hostname来访问自己的机子,肿么办?修改hosts ^_^,在里面加一条记录,
[code lang=”text”]
本机ip hostname
[/code]
再讲一个很多人经常遇到的问题,其实也不算是问题,只不过是没弄清原因罢了。有时候我们不改/etc/sysconfig/network,而在/etc/hosts里加一条newhostname到本地ip的记录重启后也会修改hostname,这是为什么呢。
还是要看/etc/rc.d/rc.sysinit这个脚本。
有这样一段:
[code lang=”bash”]
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
[/code]
可以看到,如果HOSTNAME是”localhost”或者”localhost.localdomain”的时候,脚本先获取本机分配的ip地址,然后ipcalc通过ip地址来反查hostname,将查到的hostname设为本机的hostname。
而/etc/sysconfig/network里的默认配置是
HOSTNAME=localhost.localdomain
现在一切都了然了吧 🙂
所以修改/etc/hosts并不能直接修改hostname,而是由于恰巧某些条件的满足而造成的,而这种恰巧的机率又是比较大滴。。
条件是(举一个例子):
本机ip配置为 192.168.1.53
在hosts里有这样一行
192.168.1.53 newhostname