Я использую Ubuntu и управляю своими хостами с помощью Puppet. До одной или двух машин назад мои хосты разрешили hostname.backend.example.com. Последние две машины разрешаются в hostname.staging.internal. Я немного озадачен тем, как появились эти имена.
# /etc/resolv.conf
nameserver 173.203.4.8
nameserver 173.203.4.9
domain backend.example.com
И
# /etc/hosts
10.182.230.38 web01.staging.internal web01
127.0.0.1 localhost localhost.localdomain
/ bin / hostname отвечает так:
# hostname -a
web01
# hostname -A
108-166-97-91.static.cloud-ips.com web01.staging.internal
# hostname -I
108.166.97.91 10.182.230.38
Существует запись DNS, которая сопоставляет 108.166.97.91 с web01.backend.example.com. Почему, где и как имя хоста получило web01.staging.internal, а не общедоступную запись DNS?
В hostname
команда возвращает результаты из DNS и /etc/hosts
.
hostname
эквивалентен uname -n
и является фактическим "именем хоста" или "узлом" коробки.
Все остальные hostname
аргументы используют это имя узла для поиска информации.
Итак, прежде чем идти дальше, я должен объяснить /etc/hosts
формат файла.
Первое поле довольно очевидно, это IP-адрес, на который должны разрешаться все имена хостов в строке. Второе поле - это основное имя хоста для этого IP. Остальные поля являются псевдонимами.
Итак, если вы бежите hostname -f
сначала он попытается разрешить IP для вашего имени узла. В зависимости от того, как у вас hosts:
запись настроена в /etc/nsswitch.conf
этот метод будет отличаться.
/etc/resolv.conf
пока он не получит обратно IP от DNS. /etc/hosts
чтобы найти строку, где либо основное имя хоста, либо псевдоним является вашим текущим именем узла (uname -n
), а затем вернуть в этой строке имя основного хоста. Получив IP-адрес, он попытается выполнить обратный поиск по этому IP-адресу. Опять же, он будет использовать для этого DNS и ваш файл hosts на основе вашего nsswitch.conf
. В случае использования вашего файла hosts он вернет основную запись (которая является первым полем после IP-адреса в файле).
hostname -a
будет работать только с файлом hosts, так как выполнение обратного поиска в DNS дает только 1 результат. С файлом hosts он возвращает алисы в соответствующей строке (которая является всем после первой записи, основного имени хоста).
Примеры
Если ваше имя узла - foobar, и у вас есть запись в /etc/hosts
например:
127.0.0.1 foobar.example.com foobar localhost.localdomain localhost
Тогда вы получите следующие результаты команды:
# hostname
foobar
# uname -n
foobar
# hostname -f
foobar.example.com
# hostname -a
foobar localhost.localdomain localhost