Linux修改hostname

svoid發表於2015-04-08

檢視主機hostname的方式

shell> hostname
rac4

shell> cat /proc/sys/kernel/hostname
rac4

shell> cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=rac4

修改hostname

# 通過hostname命令修改hostname,立即生效但重啟後會失效
shell> hostname RAC3
同立即生效但重啟後會失效
shell> echo RAC3 > /proc/sys/kernel/hostname
shell> sysctl kernel.hostname=RAC3
kernel.hostname = RAC3

# 通過network檔案中的hostname,重啟後生效
shell> vi /etc/sysconfig/network
====================================================
NETWORKING=yes
HOSTNAME=RAC3
====================================================
shell> shutdown -r now

hostname與/etc/hosts的關係

hosts檔案的作用相當如DNS,提供IP地址到hostname的對應。Linux系統在向DNS伺服器發出域名解析請求之前會查詢/etc/hosts檔案,如果裡面有相應的記錄,就會使用hosts裡面的記錄。/etc/hosts檔案通常裡面包含這一條記錄
127.0.0.1 localhost.localdomain localhost
hosts檔案格式是一行一條記錄,分別是IP地址 hostname aliases,三者用空白字元分隔,aliases可選。

127.0.0.1到localhost這一條最好不要修改,因為很多應用程式會用到這個,比如sendmail,修改之後這些程式可能就無法正常執行。

修改hostname後,如果想要在本機上用newhostname來訪問,就必須在/etc/hosts檔案裡新增一條newhostname的記錄。

more /etc/hosts
127.0.0.1   localhost localhost.localdomain 
192.168.1.252  com.svoid  svoid

這樣,就可以通過svoid或者com.svoid 來訪問本機。

從上面這些來看,/etc/hosts於設定hostname是沒直接關係的,僅僅當需要在本機上用新的hostname來訪問自己的時候才會用到/etc/hosts檔案,兩者沒有必然的聯絡。

但是如果預設hostname為 localhost 或 localhost.localdomain, 將會使用/etc/hosts中介面IP地址對應的 hostname 來重新設定系統的hostname。

問題重現

shell> more /etc/hosts
127.0.0.1   localhost localhost.localdomain 
192.168.1.252  rac4

shell> more /etc/sysconfig/network   #修改hostname
NETWORKING=yes
HOSTNAME=localhost

shell> hostname localhost            #修改hostname
shell> shutdown -r now

shell> hostname       #重啟之後發現hostname沒變
rac4

檢視/etc/rc.d/rc.sysinit啟動指令碼

HOSTNAME=$(/bin/hostname)
if [ -f /etc/sysconfig/network ]; then
    . /etc/sysconfig/network
fi
if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then
    HOSTNAME=localhost
fi


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

參考:
http://www.cnblogs.com/yuechaotian/archive/2013/02/20/2918175.html
http://www.cnblogs.com/kerrycode/p/3595724.html

整理自網路

Svoid
2015-04-03

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29733787/viewspace-1551858/,如需轉載,請註明出處,否則將追究法律責任。

相關文章