GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Einstellen des Hostnamens:FQDN oder Kurzname?

Lösung 1:

Ich würde einen konsistenten Ansatz für die gesamte Umgebung wählen. Beide Lösungen funktionieren einwandfrei und bleiben mit den meisten Anwendungen kompatibel. Es gibt jedoch einen Unterschied in der Verwaltbarkeit.

Ich verwende den Kurznamen als HOSTNAME-Einstellung und setze den FQDN als erste Spalte in /etc/hosts für die IP des Servers, gefolgt vom Kurznamen.

Ich bin nicht auf viele Softwarepakete gestoßen, die eine Präferenz zwischen den beiden erzwingen oder anzeigen. Ich finde den kurzen Namen für einige Anwendungen sauberer, insbesondere für die Protokollierung. Vielleicht hatte ich Pech, interne Domains wie server.northside.chicago.rizzomanufacturing.com zu sehen . Wer will, sieht das in den Logs oder einem Shell-Prompt ?

Manchmal bin ich an Unternehmenskäufen oder -umstrukturierungen beteiligt, bei denen sich interne Domains und/oder Subdomains ändern. Ich verwende in diesen Fällen gerne den kurzen Hostnamen, da Protokollierung, Kickstarts, Drucken, Systemüberwachung usw. keine vollständige Neukonfiguration erfordern, um die neuen Domänennamen zu berücksichtigen.

Ein typisches RHEL/CentOS-Server-Setup für einen Server namens „rizzo“ mit der internen Domäne „ifp.com“ würde folgendermaßen aussehen:

/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'

Lösung 2:

So ziemlich jede Software reagiert empfindlich auf die korrekte Einstellung des Hostnamens. Während ich bei Digg arbeitete, brachte ich einmal die gesamte Website für 2 Stunden herunter, weil ich eine scheinbar harmlose Änderung in /etc/hosts vorgenommen hatte das beeinflusste die Vorstellung des Systems von Hostnamen. Treten Sie leicht auf. Das heißt, Sie könnten hier etwas verwirrt sein. Ich glaube nicht, dass die HOSTNAME= -Einstellung ist direkt äquivalent dazu, wie Debian-basierte Distributionen /etc/hostname verwenden .

Was für mich in einer heterogenen Umgebung funktioniert, ist:

  1. Legen Sie den Hostnamen in der vom Anbieter empfohlenen Weise fest, indem Sie eine Bedingung in Ihrer Konfigurationsverwaltungssoftware verwenden.
  2. Verwenden Sie den hostname Befehl zum Festlegen des vom Kernel verwendeten Hostnamens usw.
  3. In /etc/hosts :

    127.0.0.1    localhost
    10.0.0.1     hostname.example.com     hostname
    

Diese Konfiguration hat mich noch nicht im Stich gelassen.

Lösung 3:

Sie werden sicherlich kein Problem haben, online Referenzen zu finden, die Ihnen sagen, dass Sie es auf die eine oder andere Weise tun sollen. Es scheint mir jedoch, dass ein kurzer Name als Hostname und der vollständig qualifizierte Name in /etc/hosts sicherlich viel häufiger sind. Es scheint der sinnvollere Weg zu sein, da dann Dienste, die einen vollqualifizierten Namen benötigen, so angepasst werden können, dass sie hostname --fqdn aufrufen stattdessen.

Ich bin in letzter Zeit nur auf eine Software gestoßen, die unbedingt erfordert, dass ein fqdn von hostname zurückgegeben wird , das war ganeti. Dies dokumentieren sie hier. Ich sehe keinen Grund, warum sie sich nicht an hostname --fqdn anpassen können , jedoch.

Lösung 4:

Etwas am Rande, während ich diese Frage recherchierte, war ich verrückt genug, den Quellcode von "Hostname" zu überprüfen und ein Skript zu schreiben, um Untersuchungsergebnisse zu drucken (Fedora 19). Was fehlt, ist ein Blick auf "/etc/hosts", das meiner bescheidenen Meinung nach von vornherein aus all dem herausgehalten werden sollte.

#!/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"

Die Ausgabe auf einer Amazon EC2-VM mit Fedora 19 , nachdem die Kernelwerte manuell gesetzt und /etc/hostname ausgefüllt wurden , aber ohne Änderungen an /etc/hosts könnte dann so aussehen:

== 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

Der belastbare Weg, um den vollständig qualifizierten Hostnamen in Perl zu erhalten, wäre dann:

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}"
      }
   }
}

und in bash wäre es:

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
}

Notizen

Anmerkung 1:HOSTNAME ist eine Shell-Variable, die bash bereitstellt ("Automatisch auf den Namen des aktuellen Hosts gesetzt"), aber es gibt keinen Hinweis darauf, dass bash diesen Wert erreicht.

Hinweis 2:Vergessen Sie niemals /etc/hostname in /boot/initrams-FOO.img ...


Linux
  1. So ändern Sie den Hostnamen unter Ubuntu

  2. Ändern Sie den Hostnamen auf Ubuntu mit GUI und CommandLine

  3. Setzen der umask des Apache-Benutzers

  4. Festlegen der Vim-Hintergrundfarben

  5. Linux - ändern Sie den Hostnamen in der CLI

So ändern Sie den FQDN (Domänenname) unter Ubuntu 20.04 Focal Fossa Linux

So ändern Sie den Hostnamen in Debian 10

So richten Sie den Pretty Hostnamen ein

So ändern Sie den Server-Hostnamen in Ubuntu

So ändern Sie den Hostnamen unter Debian Linux

Was ist der Sinn des Befehls hostnamectl?