今天在使用tcpdump的时候,遇到了需要主机名的时候,然后我就hostname了一下,查出来了我的主机名bogon,我想着有个自己独有的主机名haiming,
在/etc/hosts文件内进行了修改,修改完成后,主机名仍然没有被改掉。试了好几次,都不行,google了一下之后,突然发现还有/etc/sysconfig/network 这个文件,
在修改了这个文件之后,我试了一下,主机名还是没有改掉,后来又查了好一会,才弄明白,和这个有牵扯的文件一共有四个,
/etc/hosts
/etc/sysconfig/network
/etc/rc.d/rc.sysinit
/proc/sys/kernel/hostname
首先先解释一下第一个文件,/etc/hosts文件是存放ip地址和主机名一一对应关系的文件,就如同DNS服务一样。
第二个文件真正是用来存放主机的hostname的。但是这个hostname只有在启动的时候才会被读到第四个文件中,所以当修改第二个问件之后,必须重新启动才能
实现重置hostname的效果
第三个文件是开机的时候会运行的一个脚本文件。这个文件就是将/etc/sysconfig/network的hostname内容读到/proc/sys/kernel/hostname中
第四个文件就是平时大家在命令行输入hostname后,就会读取该文件,然后显示结果。
修改hostname的方法总结如下。
hostname xxx 运行后立即生效(新回话生效) 只能修改/proc/sys/kernel/hostname文件,下次启动就又要读取/etc/sysconfig/network文件,则设置的会丢失
echo xxx >/proc/sys/kernel/hostname 和上面一样
sysctl kernel.hostname=xxx 和上面一样
修改/etc/sysconfig/network的hostname值,那么重启后生效,并永久生效
下面再来说说hostname -i
在命令行上输入hostname -i 你会看到一个ip地址,这个地址往往和ifconfig显示的ip地址不相同。
下面是关于hostname -i 的解释
Display the IP address(es) of the host. Note that this works only if the host name can be resolved. Avoid using this option; use hostname --all-ip-addresses instead.
这个ip地址是在开机的时候被设置的,开机的时候往往网络连接还没有搭建好,需要一个ip地址来启动网络,则/etc/rc.d/rc.sysinit文件就会生成 一个IP地址,相关代码如下
337 # In theory there should be no more than one network interface active 338 # this early in the boot process -- the one we're booting from. 339 # Use the network address to set the hostname of the client. This 340 # must be done even if we have local storage. 341 ipaddr= 342 if [ "$HOSTNAME" = "localhost" -o "$HOSTNAME" = "localhost.localdomain" ]; then 343 ipaddr=$(ip addr show to 0.0.0.0/0 scope global | awk '/[[:space:]]inet / { print gensub("/.*","","g",$2) }') 344 for ip in $ipaddr ; do 345 HOSTNAME= 346 eval $(ipcalc -h $ip 2>/dev/null) 347 [ -n "$HOSTNAME" ] && { hostname ${HOSTNAME} ; break; } 348 done 349 fi 350所以此ip地址和ifconfig出来的IP地址不相同。