永久更改Linux的hostname man hostname里有這么一句話,”The host name is usually set once at system startup in /etc/rc.d/rc.inet1 or /etc/init.d/boot (normally by reading the contents of a file which contains the host name, e.g. /etc/hostname).” RedHat里沒有這個文件,而是由/etc/rc.d/rc.sysinit這個腳本負責設置系統的hostname,它讀取/etc /sysconfig/network這個文本文件,RedHat的hostname就是在這個文件里設置。 所以,如果要永久修改RedHat的hostname,就修改/etc/sysconfig/network文件,將里面的HOSTNAME這一行修改成HOSTNAME=NEWNAME,其中NEWNAME就是你要設置的hostname。 Debian發行版的hostname的配置文件是/etc/hostname。 修該配置文件后,重啟系統就會讀取配置文件設置新的hostname。
我開始在測試的時候,只修改/etc/hosts,里面添加 192.168.1.61 blog.infernor.net blog,而/etc/sysconfig/network維持原狀,也就是里面的HOSTNAME=localhost.localdomain。我重啟系統后居然發現hostname給修改成了blog.infernor.net。這樣看的話,倒真覺得/etc/hosts是hostname的配置文件。后來終于在/etc/rc.d/rc.sysinit這個啟動腳本里發現了問題的所在。 rc.sysinit文件里一開始就設置了hostname 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的 ipaddr= 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 腳本判斷hostname是否為localhost或者localhost.localdomain,如果是的話,將會使用接口IP地址對應的 hostname來重新設置系統的hostname。問題就出在這里,我的/etc/sysconfig/network默認的hostname是 localhost.localdomain,eth0的IP是192.168.1.61,而/etc/hosts里有192.168.1.61的記錄。于是就用192.168.1.61這條記錄來替換了hostname。 估計這也是很多人將/etc/hosts誤以為是hostname的配置文件的原因。