檢視原始碼 Inet 設定

簡介

本節說明如何為 IP 通訊設定 Erlang 執行時系統。它也說明如何透過組態檔來依您的需求進行設定。此資訊主要適用於有特殊設定需求或問題的使用者。在正確設定 IP 的平台上,通常不需要特別設定 Erlang 才能正常運作。

當 Erlang 啟動時,它會讀取 Kernel 變數 inetrc,如果已定義,則會指定使用者設定檔的位置和名稱。範例:

% erl -kernel inetrc '"./cfg_files/erl_inetrc"'

請注意,較早的 Erlang/OTP 版本支援的 .inetrc 檔案的使用現在已過時。

指定設定檔的第二種方式是將環境變數 ERL_INETRC 設定為該檔案的完整名稱。範例 (bash):

% export ERL_INETRC=./cfg_files/erl_inetrc

請注意,Kernel 變數 inetrc 會覆蓋此環境變數。

如果沒有指定使用者設定檔,並且 Erlang 是以非分散式或短名稱分散式模式啟動,Erlang 會使用預設組態設定和原生查找方法,在大多數情況下都能正常運作。Erlang 不會從系統 inet 設定檔(例如 /etc/host.conf/etc/nsswitch.conf)讀取任何資訊(除了 /etc/resolv.conf/etc/hosts,它們會被讀取並在 Unix 平台上監控變更,以用於內部 DNS 用戶端 inet_res)。

如果 Erlang 是以長名稱分散式模式啟動,它需要從某處取得網域名稱,並會讀取系統 inet 設定檔以取得此資訊。任何找到的主機和解析器資訊也會被記錄,但只要 Erlang 設定為使用原生查找,就不會使用。如果將查找方法變更為 'file''dns',這些資訊就會變得有用,請參閱下文。

原生查找(系統呼叫)始終是預設的解析器方法。這適用於所有平台,除了 OSE Delta,其中會使用 'file''dns'(依該優先順序)。

在 Windows 平台上,Erlang 會在以長名稱分散式模式啟動時搜尋系統登錄,而不是尋找設定檔。

設定資料

如果 Erlang 在系統 inet 設定檔(或系統登錄)中找到以下資料,則會在本地資料庫中記錄:

  • 主機名稱和主機位址
  • 網域名稱
  • 名稱伺服器
  • 搜尋網域
  • 查找方法

這些資料也可以在使用者設定檔中明確指定。此檔案應包含設定參數行(每行都以句點終止)。某些參數會將資料新增至設定(例如主機和名稱伺服器),其他參數會覆蓋任何先前的設定(例如網域和查找)。使用者設定檔始終在設定過程中最後檢查,使用者可以藉此覆蓋任何預設值或先前所做的設定。呼叫 inet:get_rc() 以檢視 inet 設定資料庫的狀態。

有效的設定參數如下:

  • {file, Format, File}.
      Format = atom()
      File = string()

    指定 Erlang 要從中讀取設定資料的系統檔案。Format 會告知剖析器如何解譯該檔案

    • resolv (Unix resolv.conf)
    • host_conf_freebsd (FreeBSD host.conf)
    • host_conf_bsdos (BSDOS host.conf)
    • host_conf_linux (Linux host.conf)
    • nsswitch_conf (Unix nsswitch.conf)
    • hosts (Unix hosts)

    File 應指定完整路徑的檔案名稱。

  • {resolv_conf, File}.
      File = string()

    指定 Erlang 要從中讀取內部 DNS 用戶端 inet_res 的解析器設定的系統檔案,並監控變更,即使它不存在。路徑必須是絕對路徑。

    這可以覆蓋設定參數 nameserversearch,具體取決於指定檔案的內容。它們也可能在未來隨時變更,以反映檔案內容。

    如果將檔案指定為空字串 "",則未來不會讀取或監控任何檔案。這會模擬在節點以短名稱分散式模式啟動時,不設定 DNS 用戶端的舊行為。

    如果未指定此參數,則預設為 /etc/resolv.conf,除非設定環境變數 ERL_INET_ETC_DIR,它會將此檔案的目錄定義為可能不是 /etc 的其他目錄。

  • {hosts_file, File}.
      File = string()

    指定 Erlang 要從中讀取內部 hosts 檔案解析器的解析器設定的系統檔案,並監控變更,即使它不存在。路徑必須是絕對路徑。

    當使用查找選項 file 時,會在所有使用上述 {file, hosts, File} 或下方 {host, IP, Aliases} 新增的項目後搜尋這些主機項目。

    如果將檔案指定為空字串 "",則未來不會讀取或監控任何檔案。這會模擬在節點以短名稱分散式模式啟動時,不設定 DNS 用戶端的舊行為。

    如果未指定此參數,則預設為 /etc/hosts,除非設定環境變數 ERL_INET_ETC_DIR,它會將此檔案的目錄定義為可能不是 /etc 的其他目錄。

  • {registry, Type}.
      Type = atom()

    指定 Erlang 要從中讀取設定資料的系統登錄。win32 是唯一有效的選項。

  • {host, IP, Aliases}.
      IP = tuple()

    Aliases = [string()]

    將主機項目新增至主機表。

  • {domain, Domain}.
      Domain = string()

    設定網域名稱。

  • {nameserver, IP [,Port]}.
      IP = tuple()
      Port = integer()

    新增主要名稱伺服器的位址(以及埠,如果不是預設埠),以用於 inet_res

  • {alt_nameserver, IP [,Port]}.
      IP = tuple()
      Port = integer()

    新增次要名稱伺服器的位址(以及埠,如果不是預設埠),以用於 inet_res

  • {search, Domains}.
      Domains = [string()]

    新增 inet_res 的搜尋網域。

  • {lookup, Methods}.
      Methods = [atom()]

    指定查找方法以及嘗試這些方法的順序。有效的方法如下:

    • native (使用系統呼叫)
    • file (使用從系統設定檔和/或使用者設定檔擷取的主機資料)
    • dns (使用 Erlang DNS 用戶端 inet_res 進行名稱伺服器查詢)

    查找方法 string 會嘗試將主機名稱剖析為 IPv4 或 IPv6 字串,並傳回產生的 IP 位址。當 Methods 清單中包含 native 時,會自動先嘗試此方法。若要在此情況下跳過它,則可以在 Methods 清單中的任何位置插入虛擬查找方法 nostring

  • {cache_size, Size}.
      Size = integer()

    設定 dns 查找的解析器快取大小。 native 查找不會快取。預設為 100 個 DNS 記錄。

  • {cache_refresh, Time}.
      Time = integer()

    設定 inet_res 的解析器快取重新整理的頻率(以毫秒為單位)(也就是說,刪除過期的 DNS 記錄)。預設為 1 小時。

  • {timeout, Time}.
      Time = integer()

    設定 inet_res 進行 DNS 查詢時等待重試的時間(以毫秒為單位)。預設為 2 秒。

  • {retry, N}.
      N = integer()

    設定 inet_res 在放棄之前將嘗試的 DNS 查詢次數。預設為 3。

  • {servfail_retry_timeout, Time}.
      Time = non_neg_integer()

    在嘗試所有名稱伺服器後,會有一個逾時,之後才會再次嘗試名稱伺服器。這是為了防止伺服器使用 servfail 快取中的內容回答查詢,inet_res。預設為 1500 毫秒。

  • {inet6, Bool}.
      Bool = true | false

    告知 DNS 用戶端 inet_res 查找 IPv6 位址。預設為 false

  • {usevc, Bool}.
      Bool = true | false

    告知 DNS 用戶端 inet_res 使用 TCP(虛擬電路)而不是 UDP。預設為 false

  • {edns, Version}.
      Version = false | 0

    設定 inet_res 將使用的 EDNS 版本。唯一允許的版本為零。預設為 false,這表示不使用 EDNS。

  • {udp_payload_size, Size}.
      N = integer()

    設定 inet_res 將在 EDNS 查詢中宣告的允許 UDP 酬載大小。同時設定 DNS 查詢將被視為對於 UDP 而言過大,而強制使用 TCP 查詢的限制;這並不完全正確,因為應使用各個名稱伺服器宣告的 UDP 酬載大小,但在實作更智慧的(探查、快取)演算法之前,此簡單策略即可勝任。預設為 1280,這是標準乙太網路 MTU 大小的結果。

  • {udp, Module}.
      Module = atom()

    告知 Erlang 使用另一個基本 UDP 模組,而不是 inet_udp

  • {tcp, Module}.
      Module = atom()

    告知 Erlang 使用另一個基本 TCP 模組,而不是 inet_tcp

  • clear_hosts.

    清除主機表。

  • clear_ns.

    清除已記錄的名稱伺服器清單(主要和次要)。

  • clear_search.

    清除搜尋網域清單。

使用者設定範例

假設使用者不希望 Erlang 使用原生查找方法,而是希望 Erlang 從啟動時讀取所有必要資訊,並使用這些資訊來解析名稱和位址。如果查找失敗,Erlang 應從名稱伺服器要求資料(使用 Erlang DNS 用戶端,設定為使用 EDNS 以允許更大的回應)。當其設定檔變更時,將更新解析器設定。此外,永遠不要快取 DNS 記錄。然後,使用者設定檔(在此範例中名為 erl_inetrc,儲存在目錄 ./cfg_files 中)可以如下所示(Unix):

%% -- ERLANG INET CONFIGURATION FILE --
%% read the hosts file
{file, hosts, "/etc/hosts"}.
%% add a particular host
{host, {134,138,177,105}, ["finwe"]}.
%% do not monitor the hosts file
{hosts_file, ""}.
%% read and monitor nameserver config from here
{resolv_conf, "/usr/local/etc/resolv.conf"}.
%% enable EDNS
{edns,0}.
%% disable caching
{cache_size, 0}.
%% specify lookup method
{lookup, [file, dns]}.

例如,可以如下啟動 Erlang:

% erl -sname my_node -kernel inetrc '"./cfg_files/erl_inetrc"'