Установка имени хоста: полное доменное имя или краткое имя?
Я заметил, что «предпочтительный» метод установки имени хоста системы принципиально отличается между системами Red Hat /CentOS и Debian /Ubuntu.
документация CentOS и Руководство по развертыванию RHEL сказать, что имя хоста должно быть FQDN :
HOSTNAME = <value>
, где<value>
должен быть Полностью квалифицированный домен Имя (FQDN), напримерhostname.example.com
, но может быть любым hostname необходимо.
руководство по установке RHEL немного более двусмысленны:
Программа установки предложит вам указать имя хоста для этого компьютера, либо как полное доменное имя (FQDN) в формате имя_хоста.домена или как короткое имя хоста в формате имя хоста .
Ссылка Debian говорит, что имя хоста не следует использовать FQDN :
3.5.5. Имя хоста
Ядро поддерживает систему имя хоста . Скрипт init на уровне запуска S, который символически привязан к « /etc/init.d/hostname.sh », устанавливает систему имя хоста во время загрузки (с помощью команды имя хоста ) в сохраненное имя в " /etc /hostname ". Этот файл должен содержать только имя системного хоста, не полное доменное имя.
Я не видел никаких конкретных рекомендаций от IBM, о которых можно использовать, но некоторое программное обеспечение , кажется, имеет предпочтение.
Мои вопросы:
- В гетерогенной среде лучше использовать рекомендацию поставщика или выбрать один и быть согласованным на всех хостах?
- С каким программным обеспечением вы столкнулись, который чувствителен к тому, установлено ли имя хоста для полного доменного имени или короткого имени?
7 ответов
Я бы выбрал последовательный подход во всей среде. Оба решения работают нормально и будут совместимы с большинством приложений. Однако есть разница в управляемости.
Я иду с коротким именем в качестве параметра HOSTNAME и устанавливаю FQDN в качестве первого столбца в /etc /hosts
для IP-адреса сервера, за которым следует краткое имя.
Я не сталкивался с множеством программных пакетов, которые обеспечивают или демонстрируют предпочтение между ними. Я считаю, что короткое имя будет более чистым для некоторых приложений, особенно для ведения журнала. Может быть, мне не повезло увидеть внутренние домены, например server.northside.chicago.rizzomanufacturing.com
. Кто хочет видеть это в журналах или приглашении оболочки ?
Иногда я участвую в приобретении или реструктуризации компаний, где меняются внутренние домены и /или поддомены. Мне нравится использовать короткое имя хоста в этих случаях, потому что регистрация, кикстарт, печать, мониторинг системы и т. Д. Не нуждаются в полной реконфигурации для учета новых доменных имен.
Типичная настройка сервера RHEL /CentOS для сервера с именем «rizzo» с внутренним доменом «ifp.com» будет выглядеть так:
/и т.д. /sysconfig /сети:
HOSTNAME = Риццо
...
-
/и т.д. /хосты:
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 ~] # имя хоста
Риццо
-
/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]) - Подготовка к
chroot в каталог '/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.
Dec 15 10:10:51 rizzo proftpd [20660]: 172.16.100.13 (:: ffff: 12.28.170.2 [:: ffff: 12.28.170.2]) - Подготовка к chroot
в каталог '/app /upload /ftp /SRRID'
Практически все программное обеспечение чувствительно к правильной настройке имени хоста. В то время как я работал в Digg, я как-то привел весь сайт в течение 2 часов из-за того, что я сделал невидимое изменение в /etc /hosts
, которое повлияло на представление системы имени хоста. Протезируйте слегка. Тем не менее, вы можете быть немного смущены здесь. Я не думаю, что параметр HOSTNAME =
напрямую эквивалентен тому, как дистрибутивы на основе Debian используют /etc /hostname
.
Что работает для меня в гетерогенной среде:
- Задайте имя хоста в рекомендованном производителем порядке, используя условное выражение в вашем программном обеспечении для управления конфигурацией.
- Используйте команду
hostname
для установки имени хоста, используемого ядром, и т. д. -
В
/etc /hosts
:127.0.0.1 localhost 10.0.0.1 hostname.example.com имя хоста
Эта конфигурация еще не сработала.
У вас наверняка не будет проблем с поиском ссылок в Интернете, которые скажут вам определенно сделать это так или иначе. Однако мне кажется, что короткое имя как имя хоста и полное имя в /etc /hosts, безусловно, гораздо более распространено. Это кажется более разумным, так как тогда услуги, которые нуждаются в полностью квалифицированном имени, могут быть адаптированы для вызова hostname --fqdn
.
Я только недавно наткнулся на одну часть программного обеспечения, которая жестко требует, чтобы fqdn возвращался с помощью hostname
, который был ganeti. Они документируют этот здесь . Однако я не вижу причин, по которым они не могут адаптироваться к hostname --fqdn
.
Несколько тангенциально, исследуя этот вопрос, я достаточно схожу, чтобы проверить исходный код «hostname» и написать сценарий для печати результатов расследования (Fedora 19). То, что отсутствует, - это взгляд на «/etc /hosts», который, по моему скромному мнению, должен быть в стороне от всего этого.
#! /Bin /Баш
функциональная панель {
если [[$ 1 == '? ]]; тогда
printf "% -23s" "?"
еще
printf "% -23s" "'$ 1'"
фи
}
# ----- Ядро -----
# Два способа настройки значений ядра:
# 1) Поместите FQDN в "kernel.hostname" и ничего в "kernel.domainname"
# 2) Поместите имя машины в «kernel.hostname» и доменное имя DNS в «kernel.domainname» (имеет больше смысла)
echo "== Значения ядра =="
эхо
H = `/sbin /sysctl -n kernel.hostname`
D = `/sbin /sysctl -n kernel.domainname`
echo "Имя хоста ядра: '$ H'"
echo "Kernel domainname: '$ D'"
# ----- Что говорит баш -----
эхо
echo "== Согласно bash =="
эхо
echo "HOSTNAME = '$ HOSTNAME'"
# ----- Конфигурационный файл имени хоста ------
эхо
echo "== Конфигурационный файл имени хоста =="
эхо
ETCH = "/и т.д. /имя хоста"
если [[-f $ ETCH]]; тогда
СОДЕРЖАНИЕ = `cat $ ETCH`
echo «Файл» $ ETCH содержит: '$ CONTENTS' "
еще
echo «Файл» $ ETCH «не существует»
фи
# ----- Сетевой файл конфигурации ------
эхо
echo "== Сетевой файл конфигурации =="
эхо
SYSN = "/и т.д. /sysconfig /сеть"
если [[-f $ SYSN]]; тогда
LINE = `grep -e" ^ HOSTNAME = "$ SYSN`
если [[-n $ LINE]]; тогда
echo «Файл» $ SYSN содержит: «$ LINE»
еще
echo «Файл» $ SYSN существует, но не содержит строки для «HOSTNAME»
фи
еще
echo "Файл" $ SYSN 'не существует "
фи
# ----- Nodename -------
эхо
echo "== Nodename =="
эхо
UNAME = `uname --nodename` # В Linux это имя хоста
echo «Имя« nodename », данное« uname --nodename », равно:« $ UNAME »
# ----- «hostname» mess ------
THE_HOSTNAME = `hostname`
SHORT_NAME = `имя хоста --short`
NIS_DNAME = `domainname`
YP_DNAME = `имя хоста --yp` # То же, что и` nisdomainname`; это может завершиться неудачей с "hostname: Локальное имя домена не установлено"
если [[$? ! = 0]]; тогда
YP_DNAME = "?"
фи
эхо
echo "== 'hostname' непосредственно полученные значения =="
эхо
echo "Результат gethostname ();"
echo "..., полученный при запуске 'hostname'
echo "Имя хоста: $ (pad $ THE_HOSTNAME)"
эхо
echo «Часть перед первым». значения, возвращаемого gethostname (); "
echo "..., полученный при запуске 'hostname --short'
echo "Сокращенное имя: $ (pad $ SHORT_NAME)"
эхо
echo "Результат getdomainname (), код« hostname », похоже, называет это« доменное имя NIS »;
echo "... в Linux, это имя домена, настроенное на ядро;"
echo "... полученный путем запуска 'domainname'
echo "доменное имя NIS: $ (pad $ NIS_DNAME)"
эхо
echo "Результат yp_get_default_domain (), который может завершиться неудачей;"
echo "... полученным путем запуска 'Ä ¥ ostname -yp'"
echo "Домен YP по умолчанию: $ (pad $ YP_DNAME)"
DNS_DNAME = `hostname --domain` # То же, что` dnsdomainname` '
FQDN_NAME = `имя хоста --fqdn`
ALIAS_NAME = `имя хоста - alias`
эхо
echo "== 'hostname', полученные через DNS =="
эхо
echo «Часть после первого». значения «канонического имени», возвращаемого getaddrinfo (gethostname ());
echo "..., полученный при запуске« hostname --domain »
echo "DNS-доменное имя: $ (pad $ DNS_DNAME)"
эхо
echo "Значение« канонического имени », возвращаемое getaddrinfo (gethostname ());
echo "... полученный путем запуска 'hostname --fqdn'"
echo "Полностью квалифицированное имя хоста: $ (pad $ FQDN_NAME)"
эхо
echo "Псевдоним, полученный gethostbyname (gethostname ());
echo "... полученное путем запуска 'hostname -alias'"
echo "Псевдоним имени хоста: $ (pad $ ALIAS_NAME)"
BY_IP_ADDR = `имя хоста --ip-адрес`
ALL_IP_ADDR = `имя хоста - all-ip-addresses`
ALL_FQDN_NAMES = `имя хоста - all-fqdn`
эхо
echo "== 'hostname', полученные путем сбора настроенных сетевых адресов =="
эхо
echo «Соберите IP-адреса из getaddrinfo (gethostname ()), примените getnameinfo (ip) ко всем этим адресам»;
echo "... полученный путем запуска 'hostname --ip-address'
echo "По IP-адресу: $ BY_IP_ADDR"
эхо
echo «Вызвать getnameinfo (NI_NUMERICHOST) на всех адресах, отлаженных от активных интерфейсов»;
echo "... полученный путем запуска 'hostname -all-ip-addresses'"
echo "Все IP-адреса: $ ALL_IP_ADDR"
эхо
echo "Позвонить getnameinfo (NI_NAMEREQD) на всех адресах, отлаженных от активных интерфейсов (включает поиск в /etc /hosts);
echo "... полученный путем запуска 'hostname -all-fqdn'"
echo "Все полные имена хостов: $ ALL_FQDN_NAMES"
Выход на виртуальной машине Amazon EC2 под управлением Fedora 19 , после ручной установки значений ядра и заполнения /etc /hostname
, но без изменений в /etc /hosts
может выглядеть следующим образом:
== Значения ядра ==
Имя хоста ядра: 'kyubee'
Kernel доменное имя: 'homelinux.org'
== Согласно bash ==
HOSTNAME = 'ip-172-31-24-249.localdomain'
== Конфигурационный файл хоста ==
Файл '/etc /hostname' содержит: 'kyubee.homelinux.org'
== Сетевой файл конфигурации ==
Файл '/etc /sysconfig /network' существует, но не содержит строки для 'HOSTNAME'
== Nodename ==
«Nodename», заданное'uname --nodename': 'kyubee'
== 'hostname' непосредственно полученные значения ==
Результат gethostname ();
... полученный путем запуска 'hostname'
Имя хоста: 'kyubee'
Часть перед первым «.» значения, возвращаемого gethostname ();
... полученный путем запуска «hostname --short»
Краткое название: 'kyubee'
Результат getdomainname (); код «hostname», похоже, называет это «доменным именем NIS»;
... в Linux это доменное имя, сконфигурированное с помощью ядра;
... полученный путем запуска 'domainname'
NIS доменное имя: 'homelinux.org'
Результат yp_get_default_domain (), который может завершиться неудачей;
... полученный путем запуска 'Ä ¥ ostname -yp'
Домен YP по умолчанию: 'homelinux.org'
== 'hostname' значения, полученные через DNS ==
Часть после первого '.' значения «канонического имени», возвращаемого getaddrinfo (gethostname ());
... полученный путем запуска «hostname --domain»
DNS доменное имя: ''
Значение «канонического имени», возвращаемое getaddrinfo (gethostname ());
... полученный путем запуска 'hostname --fqdn'
Полноценное имя хоста: 'kyubee'
Псевдоним, полученный gethostbyname (gethostname ());
... полученный путем запуска 'hostname -alias'
Имя псевдонима узла: ''
== 'hostname', полученные путем сбора настроенных сетевых адресов ==
Соберите IP-адреса из getaddrinfo (gethostname ()), примените getnameinfo (ip) ко всем этим адресам;
... полученный путем запуска «hostname -ip-address»
По IP-адресу: fe80 :: 8f6: 8eff: fe49: 9e21% eth0 172.31.24.249
Вызовите getnameinfo (NI_NUMERICHOST) на всех адресах, которые могут быть перехвачены с помощью активных интерфейсов;
... полученный путем запуска 'hostname -all-ip-addresses'
Все IP-адреса: 172.31.24.249
Вызовите getnameinfo (NI_NAMEREQD) по всем адресам, зачищенным от активных интерфейсов (включает поиск в /etc /hosts);
... полученный путем запуска 'hostname -all-fqdn'
Все полные имена хостов: ip-172-31-24-249.eu-west-1.compute.internal
Устойчивый способ получить полное имя хоста в perl будет следующим:
sub getHostname {
my $ hostname_short = `/bin /hostname --short`;
if ($?! = 0) {print STDERR «Не удалось выполнить« hostname --short »- выход из \ n"; exit 1}
chomp $ hostname_short;
my $ hostname_long = `/bin /hostname`;
if ($?! = 0) {print STDERR "Не удалось выполнить 'hostname' - exit \ n"; exit 1}
chomp $ hostname_long;
if ($ hostname_long = ~ /^${hostname_short}\..+$/) {
# "hostname_long" - это квалифицированная версия "hostname_short"
return $ hostname_long
}
else {
# оба имени хоста являются «короткими» (и равными)
die if ($ hostname_long eq $ hostname_short);
my $ domainname = `/bin /domainname`;
if ($?! = 0) {print STDERR "Не удалось выполнить 'domainname' - exiting \ n"; exit 1}
chomp $ domainname;
if ($ domainname eq "(none)") {
# Изменить по вкусу
return "$ {hostname_short} .localdomain"
}
else {
return "$ {hostname_short}. $ {domainname}"
}
}
}
и в bash это будет:
function getHostname {
local hostname_short = `/bin /hostname --short`
если [$? -ne 0]; тогда
echo «Не удалось выполнить« hostname --short »- выйти«> & 2; выход 1
фи
local hostname_long = `/bin /hostname`
если [$? -ne 0]; тогда
echo "Не удалось выполнить" hostname "- exit"> & 2; выход 1
фи
if [[$ hostname_long = ~ ^ "$ hostname_short" \ .. + $]]; тогда
# "hostname_long" - это квалифицированная версия "hostname_short"
echo $ hostname_long
еще
# оба имени хоста являются «короткими» (и равными)
if [[$ hostname_long! = $ hostname_short]]; тогда
echo "Не может быть:" $ hostname_long '<>' $ hostname_short '- exit "> & 2; выход 1
фи
local domainname = `/bin /domainname`
если [$? -ne 0]; тогда
echo "Не удалось выполнить" domainname "- exit"> & 2; выход 1
фи
if [[domainname == '(none)']]; тогда
# Изменить по вкусу
echo "$ {hostname_short} .localdomain"
еще
echo "$ {hostname_short}. $ {domainname}"
фи
фи
}
Примечания
Примечание 1: HOSTNAME - это переменная оболочки, которая предоставляет bash («Автоматически назначается имя текущего хоста»), но нет никаких указаний о том, что bash достигает этого значения.
Примечание 2: Никогда не забывайте /etc /hostname в /boot/initrams-FOO.img ...
Параметры /etc /hosts работают хорошо.
Но вы хотите убедиться, что все соответствующие файлы обновлены, запустите инструмент setup
Hm ... В хостах linux, если вы хотите изменить HOSTNAME и FQDN, вы должны решить три шага (например, новый хост rizzo.ifp.com ):
Шаг # 1 Измените значение HOST в конфигурации NETWORK config:
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
[Внешний IP] rizzo rizzo.ifp.com
Шаг # 3 Перезагрузите хост Хорошо, просто проверьте новую конфигурацию
[rizzo @ rizzo] # имя хоста -f
rizzo.ifp.com
Порядок неправильный. Это должно быть:
1.2.3.4 full.example.com full
Итак, пример может понравиться:
[Внешний IP] rizzo.example.com rizzo