165 votos

Configuración del nombre de host: nombre completo o nombre corto?

Me he dado cuenta de que el "preferido" método de configuración del nombre de host del sistema es fundamentalmente diferente entre Red Hat/CentOS y Debian/Ubuntu.

CentOS documentación y la guía de implementación de red hat enterprise linux decir el nombre de host debe ser el FQDN:

HOSTNAME=<valor>, donde debe ser el Dominio completo Name (FQDN), tales como hostname.expample.com pero puede ser cualquiera nombre de host es necesario.

La guía de instalación de red hat enterprise linux es un poco más ambigua:

El programa de instalación le pedirá que proporcione un nombre de host para este equipo, ya sea como un nombre de dominio completo (FQDN) en el formato de nombre de host.domainname o como un nombre de host corto en el formato de nombre de host.

La guía de referencia Debian dice el nombre de la máquina no debe usar el FQDN:

3.5.5. El nombre de host

El kernel mantiene el nombre de host del sistema. El script de inicio en el nivel de ejecución S que es un enlace simbólico a "/etc/init.d/hostname.sh" establece el sistema de nombre de host en el momento del arranque (usando el comando hostname) para el nombre almacenado en "/etc/hostname". Este archivo debe contener únicamente el nombre de host del sistema, no es un nombre de dominio completamente cualificado.

Yo no he visto todas las recomendaciones específicas de IBM acerca de cual usar, pero algunos programas de software parece tener una preferencia.

Mis preguntas:

  • En un entorno heterogéneo, es mejor utilizar el proveedor de recomendación, o elegir uno y ser consistente a través de todos los hosts?
  • ¿Qué software se ha encontrado que es sensible a si el hostname el nombre completo o nombre corto?

97voto

Tina Puntos 21

Yo elegiría un enfoque coherente a través de todo el entorno. Ambas soluciones funcionan bien y seguirá siendo compatible con la mayoría de las aplicaciones. Hay una diferencia en la facilidad de administración, sin embargo.

Voy con el nombre corto como el nombre de host de configuración, y establecer el FQDN como la primera columna de /etc/hosts para la IP del servidor, seguido por el nombre corto.

No he encontrado muchos paquetes de software que cumplir o mostrar una preferencia entre los dos. Me parece que el nombre corto que se limpiador para algunas aplicaciones, específicamente en el registro. Quizás he tenido mala suerte en ver los dominios internos como server.northside.chicago.rizzomanufacturing.com. El que quiera ver que en los registros o un intérprete de comandos de shell?

A veces, estoy involucrado en la empresa, adquisiciones o reestructuraciones donde los dominios internos y/o subdominios cambio. Me gusta que utilicen el nombre de host en estos casos debido a que el registro, kickstart, impresión, sistemas de vigilancia, etc. no necesita plena reconfiguración de la cuenta para los nuevos nombres de dominio.

Un típico RHEL/CentOS servidor de configuración para un servidor denominado "rizzo" con dominio interno "ifp.com" quedaría como:

/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

-

[root@rizzo ~]# 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'

36voto

Armend Krasniqi Puntos 36

Prácticamente todo el software es sensible a la correcta configuración del nombre de host. Mientras estaba trabajando en Digg una vez me trajo a la totalidad del sitio durante 2 horas debido a la fabricación de un aparentemente inocente cambio en /etc/hosts que afectó el sistema de la noción de nombre de host. La banda de rodadura a la ligera. Dicho esto, puede ser un poco confundido aquí. No creo que el HOSTNAME= valor es directamente equivalente a cómo distribuciones basadas en Debian usar /etc/hostname.

Lo que funciona para mí en un entorno heterogéneo es:

1. Set the hostname in the vendor-recommended manner, using a conditional in your config management software.
2. Use the "hostname" command to set the hostname used by the kernel, etc.
3. In /etc/hosts:

127.0.0.1    localhost
10.0.0.1     hostname.example.com     hostname

Esta configuración no me ha fallado todavía.

29voto

stew Puntos 5826

Que sin duda tendrá ningún problema en encontrar referencias en línea que te diga que sin duda hacerlo de una manera o de otra. A mí me parece, sin embargo, que tener un nombre corto como el nombre de host, y tienen el nombre completo en el /etc/hosts es sin duda mucho más frecuente. Parece que los más de manera sensata, como la continuación de los servicios que necesita un nombre completo que se puede adaptar a llamar a hostname --fqdn lugar.

Sólo he venido a través de una pieza de software recientemente que rígidamente se requiere un fqdn para ser devueltos por hostname, que fue ganeti. Que este documento aquí. No veo ninguna razón por la que no se puede adaptar a hostname --fqdn, sin embargo.

10voto

David Tonhofer Puntos 250

Algo tangencial, mientras que la investigación de esta cuestión, he estado yendo lo suficientemente loco como para comprobar el código fuente de "nombre de host" y escribir una secuencia de comandos para imprimir los resultados de investigación (Fedora 19). Lo que falta es un aspecto en "/etc/hosts", que en mi humilde opinión, debe mantenerse el infierno fuera de todo esto en el primer lugar.

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

La salida de Amazon EC2 VM corriendo Fedora 19, después de ajustar manualmente el núcleo de los valores y de llenado /etc/hostname, pero sin cambios a /etc/hosts , entonces podría ser como esta:

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

La elasticidad de la forma de obtener el nombre de host completo en perl sería:

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

y en bash sería:

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
}

Notas

Nota 1: el nombre de host es una variable de shell bash ("establece Automáticamente en el nombre de la máquina actual.") pero no hay ninguna indicación acerca de bash llega a ese valor.

Nota 2: no olvidar Nunca /etc/hostname en /boot/initrams-FOO.img ...

-4voto

Riaan Puntos 199

El /etc/hosts opciones funciona bien.

Pero usted quiere asegurarse de que toda la adecuada actualización de los archivos de ejecutar el programa de instalación de la herramienta

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: