GNU/Linux >> Linux の 問題 >  >> Linux

ホスト名の設定:FQDN または短い名前?

解決策 1:

環境全体で一貫したアプローチを選択します。どちらのソリューションも正常に機能し、ほとんどのアプリケーションとの互換性が維持されます。ただし、扱いやすさには違いがあります。

HOSTNAME 設定として短い名前を使用し、/etc/hosts の最初の列として FQDN を設定します。 サーバーの IP の後に短い名前が続きます。

私は、この 2 つの間の優先順位を強制または表示する多くのソフトウェア パッケージに遭遇したことはありません。一部のアプリケーション、特にロギングでは、短い名前の方がすっきりしていることがわかりました。 server.northside.chicago.rizzomanufacturing.com のような内部ドメインを見るのは運が悪かったのかもしれません .ログやシェル プロンプトでそれを見たい人 ?

時々、会社の買収や、内部ドメインやサブドメインが変更されるリストラに関与しています。ロギング、キックスタート、印刷、システム監視などは、新しいドメイン名を考慮して完全に再構成する必要がないため、これらの場合に短いホスト名を使用するのが好きです。

内部ドメイン「ifp.com」を持つ「rizzo」という名前のサーバーの典型的な RHEL/CentOS サーバーのセットアップは次のようになります。

/etc/sysconfig/network:
HOSTNAME=rizzo
...

-

/etc/hosts:
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

172.16.100.13   rizzo.ifp.com rizzo

-

[[email protected] ~]# hostname 
rizzo

-

/var/log/messages snippet:
Dec 15 10:10:13 rizzo proftpd[19675]: 172.16.100.13 (::ffff:206.15.236.182[::ffff:206.15.236.182]) - Preparing to               
 chroot to directory '/app/upload/GREEK'
Dec 15 10:10:51 rizzo proftpd[20660]: 172.16.100.13 (::ffff:12.28.170.2[::ffff:12.28.170.2]) - FTP session opened.
Dec 15 10:10:51 rizzo proftpd[20660]: 172.16.100.13 (::ffff:12.28.170.2[::ffff:12.28.170.2]) - Preparing to chroot                
to directory '/app/upload/ftp/SRRID'

解決策 2:

ほとんどすべてのソフトウェアは、ホスト名を正しく設定することに敏感です。 Digg で働いていたとき、/etc/hosts. システムのホスト名の概念に影響を与えました。軽く踏む。とはいえ、ここで少し混乱するかもしれません。 HOSTNAME= とは思えない 設定は、Debian ベースのディストリビューションが /etc/hostname を使用する方法と直接同等です .

異機種混在環境でうまくいくのは、次のとおりです。

<オール>
  • 構成管理ソフトウェアの条件を使用して、ベンダーが推奨する方法でホスト名を設定します。
  • hostname を使用 カーネルなどで使用されるホスト名を設定するコマンド
  • /etc/hosts で :

    127.0.0.1    localhost
    10.0.0.1     hostname.example.com     hostname
    
  • この構成はまだ失敗していません.

    解決策 3:

    オンラインで参照を見つけるのに問題はありません。間違いなく何らかの方法でそれを行うように指示されます.ただし、ホスト名として短い名前を使用し、/etc/hosts に完全修飾名を使用することは、確かにはるかに一般的であるように思えます。完全修飾名を必要とするサービスは hostname --fqdn を呼び出すように適応できるため、より賢明な方法のようです。

    hostname によって fqdn が返されることを厳密に要求するソフトウェアを最近 1 つだけ見つけました。 、ガネーティでした。彼らはこれをここに文書化しています。 hostname --fqdn に適応できない理由がわかりません

    解決策 4:

    この質問を調査している間、私は「ホスト名」のソースコードをチェックし、調査結果を出力するスクリプトを書くのに十分夢中になっています (Fedora 19)。欠けているのは "/etc/hosts" です。私の謙虚な意見では、これはそもそもこのすべてから遠ざける必要があります。

    #!/bin/bash
    
    function pad {
       if [[ $1 == '?' ]]; then
          printf "%-23s" "?"
       else
          printf "%-23s" "'$1'"
       fi
    }
    
    # ----- Kernel -----
    
    # Two ways to configure the kernel values: 
    # 1) Put FQDN into "kernel.hostname" and nothing into "kernel.domainname"
    # 2) Put machine name into "kernel.hostname" and DNS domain name into "kernel.domainname" (makes more sense)
    
    echo "== Kernel values =="
    echo
    
    H=`/sbin/sysctl -n kernel.hostname`
    D=`/sbin/sysctl -n kernel.domainname`
    
    echo "Kernel hostname: '$H'"
    echo "Kernel domainname: '$D'"
    
    # ----- What does bash say -----
    
    echo
    echo "== According to bash =="
    echo
    
    echo "HOSTNAME = '$HOSTNAME'"
    
    # ----- Hostname config file ------
    
    echo
    echo "== Hostname config file =="
    echo
    
    ETCH="/etc/hostname"
    
    if [[ -f $ETCH ]]; then
       CONTENTS=`cat $ETCH`
       echo "File '$ETCH' contains: '$CONTENTS'"
    else
       echo "File '$ETCH' does not exist"
    fi
    
    # ----- Network config file ------
    
    echo
    echo "== Network config file =="
    echo
    
    SYSN="/etc/sysconfig/network"
    
    if [[ -f $SYSN ]]; then
       LINE=`grep -e "^HOSTNAME=" $SYSN`
       if [[ -n $LINE ]]; then
          echo "File '$SYSN' contains: '$LINE'"
       else 
          echo "File '$SYSN' exists but does not contain a line for 'HOSTNAME'"
       fi
    else
       echo "File '$SYSN' does not exist"
    fi
    
    # ----- Nodename -------
    
    echo
    echo "== Nodename =="
    echo
    
    UNAME=`uname --nodename` # On Linux, this is the hostname
    
    echo "The 'nodename' given by 'uname --nodename' is: '$UNAME'"
    
    # ----- The 'hostname' mess ------
    
    THE_HOSTNAME=`hostname`
    SHORT_NAME=`hostname --short`
    NIS_DNAME=`domainname`     
    YP_DNAME=`hostname --yp`    # Same as `nisdomainname` ; this may fail with "hostname: Local domain name not set"
    
    if [[ $? != 0 ]]; then
       YP_DNAME="?"
    fi
    
    echo
    echo "== 'hostname' directly obtained values =="
    echo
    echo "The result of gethostname();"
    echo "...obtained by running 'hostname'"
    echo "Hostname: $(pad $THE_HOSTNAME)"
    echo
    echo "The part before the first '.' of the value returned by gethostname();"
    echo "...obtained by running 'hostname --short'"
    echo "Short name: $(pad $SHORT_NAME)"
    echo
    echo "The result of getdomainname(); the code of 'hostname' seems to call this the 'NIS domain name';"
    echo "...on Linux, this is the kernel-configured domainname;"
    echo "...obtained by running 'domainname'"
    echo "NIS domain name: $(pad $NIS_DNAME)"
    echo
    echo "The result of yp_get_default_domain(), which may fail;"
    echo "...obtained by running 'ĥostname --yp'"
    echo "YP default domain: $(pad $YP_DNAME)"
    
    DNS_DNAME=`hostname --domain`  # Same as `dnsdomainname`'
    FQDN_NAME=`hostname --fqdn`
    ALIAS_NAME=`hostname --alias`
    
    echo
    echo "== 'hostname' values obtained via DNS =="
    echo
    echo "The part after the first '.' of the 'canonical name' value returned by getaddrinfo(gethostname());"
    echo "...obtained by running 'hostname --domain'"
    echo "DNS domain name: $(pad $DNS_DNAME)"
    echo
    echo "The 'canonical name' value returned by getaddrinfo(gethostname());"
    echo "...obtained by running 'hostname --fqdn'"
    echo "Fully qualified hostname: $(pad $FQDN_NAME)"
    echo
    echo "Alias obtained by gethostbyname(gethostname());"
    echo "...obtained by running 'hostname --alias'"
    echo "Hostname alias: $(pad $ALIAS_NAME)"
    
    BY_IP_ADDR=`hostname --ip-address`
    ALL_IP_ADDR=`hostname --all-ip-addresses`
    ALL_FQDN_NAMES=`hostname --all-fqdn`
    
    echo
    echo "== 'hostname' values obtained by collecting configured network addresses =="
    echo
    echo "Collect the IP addresses from getaddrinfo(gethostname()), apply getnameinfo(ip) to all those addresses;"
    echo "...obtained by running 'hostname --ip-address'"
    echo "By IP address: $BY_IP_ADDR"
    echo
    echo "Call getnameinfo(NI_NUMERICHOST) on all addresses snarfed from active interfaces;"
    echo "...obtained by running 'hostname --all-ip-addresses'"
    echo "All IP addresses: $ALL_IP_ADDR"
    echo
    echo "Call getnameinfo(NI_NAMEREQD) on all addresses snarfed from active interfaces (involves lookup in /etc/hosts);"
    echo "...obtained by running 'hostname --all-fqdn'"
    echo "All fully qualified hostnames: $ALL_FQDN_NAMES"
    

    Fedora 19 を実行している Amazon EC2 VM での出力 、カーネル値を手動で設定し、 /etc/hostname を入力した後 、ただし /etc/hosts に変更はありません 次のようになります:

    == Kernel values ==
    
    Kernel hostname: 'kyubee'
    Kernel domainname: 'homelinux.org'
    
    == According to bash ==
    
    HOSTNAME = 'ip-172-31-24-249.localdomain'
    
    == Hostname config file ==
    
    File '/etc/hostname' contains: 'kyubee.homelinux.org'
    
    == Network config file ==
    
    File '/etc/sysconfig/network' exists but does not contain a line for 'HOSTNAME'
    
    == Nodename ==
    
    The 'nodename' given by 'uname --nodename' is: 'kyubee'
    
    == 'hostname' directly obtained values ==
    
    The result of gethostname();
    ...obtained by running 'hostname'
    Hostname: 'kyubee'
    
    The part before the first '.' of the value returned by gethostname();
    ...obtained by running 'hostname --short'
    Short name: 'kyubee'
    
    The result of getdomainname(); the code of 'hostname' seems to call this the 'NIS domain name';
    ...on Linux, this is the kernel-configured domainname;
    ...obtained by running 'domainname'
    NIS domain name: 'homelinux.org'
    
    The result of yp_get_default_domain(), which may fail;
    ...obtained by running 'ĥostname --yp'
    YP default domain: 'homelinux.org'
    
    == 'hostname' values obtained via DNS ==
    
    The part after the first '.' of the 'canonical name' value returned by getaddrinfo(gethostname());
    ...obtained by running 'hostname --domain'
    DNS domain name: ''
    
    The 'canonical name' value returned by getaddrinfo(gethostname());
    ...obtained by running 'hostname --fqdn'
    Fully qualified hostname: 'kyubee'
    
    Alias obtained by gethostbyname(gethostname());
    ...obtained by running 'hostname --alias'
    Hostname alias: ''
    
    == 'hostname' values obtained by collecting configured network addresses ==
    
    Collect the IP addresses from getaddrinfo(gethostname()), apply getnameinfo(ip) to all those addresses;
    ...obtained by running 'hostname --ip-address'
    By IP address: fe80::8f6:8eff:fe49:9e21%eth0 172.31.24.249
    
    Call getnameinfo(NI_NUMERICHOST) on all addresses snarfed from active interfaces;
    ...obtained by running 'hostname --all-ip-addresses'
    All IP addresses: 172.31.24.249
    
    Call getnameinfo(NI_NAMEREQD) on all addresses snarfed from active interfaces (involves lookup in /etc/hosts);
    ...obtained by running 'hostname --all-fqdn'
    All fully qualified hostnames: ip-172-31-24-249.eu-west-1.compute.internal
    

    perl で完全修飾ホスト名を取得する回復力のある方法は次のようになります:

    sub getHostname {
    
       my $hostname_short = `/bin/hostname --short`;
       if ($? != 0) { print STDERR "Could not execute 'hostname --short' -- exiting\n"; exit 1 }
       chomp $hostname_short;
    
       my $hostname_long  = `/bin/hostname`;
       if ($? != 0) { print STDERR "Could not execute 'hostname' -- exiting\n"; exit 1 }
       chomp $hostname_long;
    
       if ($hostname_long =~ /^${hostname_short}\..+$/) {
          # "hostname_long" is a qualified version of "hostname_short"
          return $hostname_long
       }
       else {
          # both hostnames are "short" (and are equal)
          die unless ($hostname_long eq $hostname_short);
    
          my $domainname = `/bin/domainname`;
          if ($? != 0) { print STDERR "Could not execute 'domainname' -- exiting\n"; exit 1 }
          chomp $domainname;
    
          if ($domainname eq "(none)") {
             # Change according to taste
             return "${hostname_short}.localdomain"
          }
          else {
             return "${hostname_short}.${domainname}"
          }
       }
    }
    

    bash では次のようになります:

    function getHostname {
    
       local hostname_short=`/bin/hostname --short`
    
       if [ $? -ne 0 ]; then
          echo "Could not execute 'hostname --short' -- exiting" >&2; exit 1
       fi
    
       local hostname_long=`/bin/hostname`
    
       if [ $? -ne 0 ]; then
          echo "Could not execute 'hostname' -- exiting" >&2; exit 1
       fi
    
       if [[ $hostname_long =~ ^"$hostname_short"\..+$ ]]; then
          # "hostname_long" is a qualified version of "hostname_short"
          echo $hostname_long
       else
          # both hostnames are "short" (and are equal)
          if [[ $hostname_long != $hostname_short ]]; then
             echo "Cannot happen: '$hostname_long' <> '$hostname_short' -- exiting" >&2; exit 1
          fi
    
          local domainname=`/bin/domainname`
    
          if [ $? -ne 0 ]; then
             echo "Could not execute 'domainname' -- exiting" >&2; exit 1
          fi
    
          if [[ domainname == '(none)' ]]; then
             # Change according to taste
             echo "${hostname_short}.localdomain"
          else
             echo "${hostname_short}.${domainname}"
          fi
       fi
    }
    

    メモ

    注 1:HOSTNAME は bash が提供するシェル変数 (「現在のホストの名前に自動的に設定されます」) ですが、bash がその値に到達したことを示すものはありません。

    注 2:/boot/initrams-FOO.img 内の /etc/hostname を決して忘れないでください ...


    Linux
    1. シェル論理演算子の優先順位&&、||?

    2. ホスト名を変更する方法は?

    3. GUI とコマンドラインを使用して Ubuntu のホスト名を変更する

    1. Apache ユーザーの umask の設定

    2. Vim の背景色の設定

    3. 現在のgitブランチの名前をシェルスクリプトの変数に取得する方法は?

    1. RHEL および CentOS 7 でホスト名と FQDN (完全修飾ドメイン名) を設定および変更する方法

    2. コンピューター名 (ホスト名ではない) を取得するには?

    3. hostnamectl コマンドのポイントは何ですか?