一直以來被Linux的hostname和fqdn(Fully Qualified Domain Name)困惑了好久,今天專門抽時間把它們的使用細節弄清了。 一、設置hostname/fqdn 在Linux系統內設置hostname很簡單,如: $ hostname florian 如果...
一直以來被Linux的hostname和fqdn(Fully Qualified Domain Name)困惑了好久,今天專門抽時間把它們的使用細節弄清了。
一、設置hostname/fqdn
在Linux系統內設置hostname很簡單,如:
$ hostname florian
如果要設置fqdn的話,需要對/etc/hosts進行配置。
$ cat /etc/hosts
127.0.0.1 localhost
192.168.1.1 florian.test.com florian
/etc/hosts配置文件的格式是:
ip fqdn [alias]...
即第一列為主機ip地址,第二列為主機fqdn地址,第三列以後為別名,可以省略,否則至少要包含hostname。
上述配置文件的配置項的第一行為localhost的配置,第二行為主機名florian配置fqdn=florian.test.com,ip=192.168.1.1。
至於fqdn的功能變數名稱尾碼,最好和文件/etc/sysconfig/network的HOSTNAME配置保持一致:
$ cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=test.com
二、查看hostname/fqdn
配置完成後,可以使用shell命令查看hostname和fqdn:
$ hostname && hostname -f
florian
florian.test.com
使用ping去測試hostname的ip映射是否成功。
$ ping florian
PING florian.test.com (192.168.1.1) 56(84) bytes of data.
$ ping florian.test.com
PING florian.test.com (192.168.1.1) 56(84) bytes of data.
也可以使用python命令獲取hostname和fqdn。
$ python
Python 2.6.6 (r266:84292, Dec 7 2011, 20:48:22)
[GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> socket.gethostname()
'florian'
>>> socket.getfqdn()
'florian.test.com'
三、使用ip設置hostname帶來的fqdn問題
以上描述了正常設置hostname和fqdn的方法,但是有時會使用ip地址直接作為hostname,此時會有些不同。
$ hostname 192.168.1.1
$ hostname && hostname -f
192.168.1.1
192.168.1.1
我們發現使用ip作為hostname後,使用shell命令查詢hostname和fqdn都是ip地址!!!這是因為DNS協議會解析hostname的內容,當發現其為ip地址時,則不會再去查詢/etc/hosts文件。
再使用python查看一下,會發現python獲取的fqdn竟然還是florian.test.com!!!
$ python
Python 2.6.6 (r266:84292, Dec 7 2011, 20:48:22)
[GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> socket.gethostname()
'192.168.1.1'
>>> socket.getfqdn()
'florian.test.com'
即便是刷新dns緩存也無濟於事:
$ service nscd reload
將/etc/hosts文件的第二行註釋:
cat /etc/hosts
127.0.0.1 localhost
# 192.168.1.1 florian.test.com florian
刷新dns緩存:
$ service nscd reload
我們發現fqdn恢復正常了。
$ python
Python 2.6.6 (r266:84292, Dec 7 2011, 20:48:22)
[GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> socket.gethostname()
'192.168.1.1'
>>> socket.getfqdn()
'192.168.1.1'
之所以會有這樣的行為,是因為python解析fqdn的邏輯和DNS並不完全一致,它會根據hostname查詢對應的ip地址,然後在/etc/hosts內獲取ip地址對應的配置行(第一行有效),然後解析fqdn列和alias列,並返回第一個包含字元'.'的對應列的值。
因此,使用ip設置hostname時,需要註意兩點:
- 首先,將hostname設置為ip地址
- 其次,將/etc/hosts內包含該ip的配置項移除
為了保險起見,我們可以在/etc/hosts內儘可能靠前的位置添加如下配置:
cat /etc/hosts
127.0.0.1 localhost
192.168.1.1 192.168.1.1
這樣,即便是之後有包含該ip的配置項也不會生效,python會優先解析第二行的配置項,並獲取和ip地址完全一樣的fqdn地址。當然,使用shell命令hostname獲取fqdn也不會出錯,因為hostname已經被設為ip地址形式了。
四、參考資料
- Linux下配置FQDN: https://onebitbug.me/2014/06/25/settings-fqdn-in-linux/
- linux基礎:設置FQDN和Hostname: http://www.chenshake.com/linux-foundation-set-fqdn-hostname/
- Is it valid for a hostname to start with a digit?: http://serverfault.com/questions/638260/is-it-valid-for-a-hostname-to-start-with-a-digit