Назад | Перейти на главную страницу

Установка имени хоста: полное доменное имя или короткое имя?

Я заметил, что «предпочтительный» метод установки имени хоста системы принципиально отличается в системах Red Hat / CentOS и Debian / Ubuntu.

Документация CentOS и Руководство по развертыванию RHEL скажи имя хоста должно быть полное доменное имя:

HOSTNAME=<value>, где <value> должно быть полное доменное имя (FQDN), например hostname.example.com, но может быть любым необходимым именем хоста.

В Руководство по установке RHEL немного более неоднозначно:

Программа установки предложит вам указать имя хоста для этого компьютера, либо как полное доменное имя (FQDN) в формате hostname.domainname или как короткое имя хоста в формате имя хоста.

Справочник Debian говорит имя хоста не следует использовать полное доменное имя:

3.5.5. Имя хоста

Ядро поддерживает систему имя хоста. Сценарий инициализации на уровне запуска S, имеющий символическую ссылку на "/etc/init.d/hostname.sh"устанавливает имя хоста системы во время загрузки (используя имя хоста команда) на имя, хранящееся в "/ etc / hostname". Этот файл должен содержать только системное имя хоста, а не полное доменное имя.

Я не видел никаких конкретных рекомендаций от IBM о том, что использовать, но какое-то программное обеспечение похоже есть предпочтение.

Мои вопросы:

Я бы выбрал последовательный подход во всей среде. Оба решения работают нормально и останутся совместимыми с большинством приложений. Однако есть разница в управляемости.

Я использую короткое имя в качестве параметра HOSTNAME и устанавливаю полное доменное имя в качестве первого столбца в /etc/hosts для IP-адреса сервера, за которым следует короткое имя.

Я не встречал много программных пакетов, которые применяют или отображают предпочтение между ними. Я считаю, что короткое имя более понятное для некоторых приложений, особенно для ведения журнала. Возможно, мне не повезло видеть внутренние домены, такие как server.northside.chicago.rizzomanufacturing.com. Кто хочет видеть это в логах или приглашение оболочки?

Иногда я участвую в приобретении или реструктуризации компании, когда меняются внутренние домены и / или субдомены. Мне нравится использовать короткое имя хоста в этих случаях, потому что ведение журнала, кикстарт, печать, мониторинг системы и т. Д. Не требуют полной реконфигурации для учета новых доменных имен.

Типичная установка сервера RHEL / CentOS для сервера с именем «rizzo» с внутренним доменом «ifp.com» будет выглядеть так:

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

Практически все программное обеспечение чувствительно к правильной настройке имени хоста. Когда я работал на Digg, я однажды отключил весь сайт на 2 часа из-за внесения, казалось бы, невинного изменения в /etc/hosts это повлияло на представление системы об имени хоста. Действуйте осторожно. Тем не менее, вы можете немного запутаться здесь. Я не думаю HOSTNAME= настройка прямо эквивалентна тому, как дистрибутивы на основе Debian используют /etc/hostname.

Что мне подходит в гетерогенной среде, так это:

  1. Задайте имя хоста рекомендованным поставщиком способом, используя условие в вашем программном обеспечении для управления конфигурацией.
  2. Использовать hostname команда для установки имени хоста, используемого ядром и т. д.
  3. В /etc/hosts:

    127.0.0.1    localhost
    10.0.0.1     hostname.example.com     hostname
    

Эта конфигурация меня еще не подвела.

У вас, безусловно, не будет проблем с поиском ссылок в Интернете, которые подскажут вам, что нужно делать так или иначе. Однако мне кажется, что использование короткого имени в качестве имени хоста и наличия полного имени в / etc / hosts, безусловно, намного более распространено. Это кажется более разумным способом, поскольку тогда службы, которым требуется полностью определенное имя, могут быть адаптированы для вызова hostname --fqdn вместо.

Недавно я наткнулся на одно программное обеспечение, которое строго требует, чтобы fqdn возвращался hostname, который был ганети. Они документируют это Вот. Я не вижу причин, по которым они не могут адаптироваться к hostname --fqdn, тем не мение.

В некоторой степени косвенно, исследуя этот вопрос, я достаточно сошел с ума, чтобы проверить исходный код «hostname» и написать сценарий для печати результатов расследования (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"

Результат на виртуальной машине Amazon EC2 под управлением Fedora 19, после ручной установки значений ядра и заполнения /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: никогда не забывайте / etc / hostname в /boot/initrams-FOO.img ...

Параметры / etc / hosts работают хорошо.

Но вы хотите убедиться, что все нужные файлы обновлены, запустите настроить инструмент

Хм ... На хостах linux, если вы хотите изменить HOSTNAME и FQDN, вы должны решить 3 шага (например, новый хост rizzo.ifp.com):

Шаг 1 Измените значение HOST в конфигурации свойств NETWORK:

sudo vi /etc/sysconfig/network

Измените или добавьте строку:

HOSTNAME=rizzo.ifp.com

Шаг 2 Отредактируйте конфигурацию вашего хоста

sudo vim /etc/hosts
#IPv4
127.0.0.1       localhost localhost.localdomain localhost4 localhost4.localdomain4
[External IP]   rizzo rizzo.ifp.com

Шаг 3 Перезагрузите хост. Хорошо, просто проверьте новую конфигурацию.

[rizzo@rizzo]# hostname -f
rizzo.ifp.com

Порядок неправильный. Должно быть:

1.2.3.4 full.example.com full

Пример может выглядеть так:

[External IP] rizzo.example.com rizzo