Где `hostname` хранит имя хоста, которое я установил?

15

Это довольно загадочно. Кто-нибудь знает, где hostnameкоманда хранит и читает имя хоста?

Я думал, что это был / etc / hostname, но в этой системе Linux такого файла нет. Я попытался использовать strace, чтобы найти его, но никакие вызовы чтения не вернули эту информацию:

$ strace hostname 2>&1 | grep read
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340^\0\0\0\0\0\0"..., 832) = 832
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\30\2\0\0\0\0\0"..., 832) = 832
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\16\0\0\0\0\0\0"..., 832) = 832
read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tr"..., 1024) = 248
read(3, "", 1024)                       = 0

Тогда я заметил, что это сделал samecall uname, который возвратил эту информацию:

uname({sys="Linux", node="server-name", ...}) = 0

Рекурсивный grep в / etc / ничего не возвращает:

grep "server-name" -r /etc 

Где uname хранит эту информацию? Просто в памяти?

Питер Круминьш
источник
1
какой дистрибутив Linux вы используете?
Амир Джей

Ответы:

9

Посмотрите на соответствующие вопросы и ответы по U & L под названием: Откуда uname получает информацию? , Такая информация, как имя хоста, сохраняется в структуре данных в ядре Linux, пока система работает. Во время загрузки системы эта информация может быть повторно получена с помощью различных механизмов, которые обычно являются специфичными для конкретного дистрибутива.

Если вы посмотрите на man 2 unameсправочную страницу, там упоминается структура данных:

           struct utsname {
               char sysname[];    /* Operating system name (e.g., "Linux") */
               char nodename[];   /* Name within "some implementation-defined
                                     network" */
               char release[];    /* Operating system release (e.g., "2.6.28") */
               char version[];    /* Operating system version */
               char machine[];    /* Hardware identifier */
           #ifdef _GNU_SOURCE
               char domainname[]; /* NIS or YP domain name */
           #endif
           };

Второй элемент этой структуры nodename[]- это место, где имя хоста хранится в ядре Linux.

/ Proc

Если вы посмотрите /proc/sys/kernel/hostname, имя хоста здесь также выставлено. Это виртуальное местоположение, /procно оно дает вам альтернативный способ доступа к имени хоста. Доменное имя системы тоже здесь /proc/sys/kernel/domainname.

ПРИМЕЧАНИЕ. Интересно, что эти значения зависят от пространства имен UTS .

пример

$ sudo hostname
oldhost
$ sudo unshare --uts /bin/bash
$ sudo echo newhost > /proc/sys/kernel/hostname 
$ hostname
newhost
$ exit
$ hostname
oldhost

Управление именем хоста

В системах с Systemd вы можете использовать инструмент cli hostnamectlдля получения / установки имени хоста. Это изменит его навсегда между перезагрузками.

$ sudo hostnamectl set-hostname --static somehostname

Вы также можете узнать его стоимость через sysctl:

$ sudo sysctl -a | grep kernel.hostname
kernel.hostname = myhostname

В выпусках Fedora вопросы и ответы по этому вопросу ask.fedoraproject.org довольно подробно освещаются: « Правильно задано имя хоста - Fedora 20 в Amazon EC2» .

SLM
источник
1
Мех. hostnamectl просто вызывает системный вызов. Как системный вызов хранит информацию, чтобы она сохранялась при перезагрузках? Это мой вопрос, если не ОП.
Отей
6

Команда hostnameнигде не хранит имя, кроме памяти ядра.

То, как система решит, как ее назвать во время загрузки, зависит от того, как она настроена. Варианты варьируются от чтения имени из файла до использования DNS или / etc / hosts для установки имени после установки подходящего сетевого интерфейса.

Кайл Джонс
источник
2
Никогда /etc/hosts(что для поиска DNS - система, которая читает свое имя хоста оттуда, о, очень неправильно) ... но возможно /etc/hostname(содержит полное имя) или редко /etc/sysconfig/network(может содержать HOSTNAME=...команду оболочки). На экземпляре Amazon EC2 вам также может понадобиться изменить /etc/cloud/cloud.cfg...
Дэвид Тонхофер
4

hostname(1)это просто интерфейс для sethostname(3)системного вызова, который в основном записывает имя хоста туда, где ядро ​​ожидает его сохранения.

Если вы хотите, чтобы изменение было постоянным, в соответствии с общей философией Unix, вы должны хранить его самостоятельно. Однако точное местоположение сильно зависит от вашей системы инициализации. Например, initBSD init читает имя хоста из /etc/myname(во время netstart).

Все это должно быть описано в руководствах вашей системы или в сопроводительной документации.

Вукар Тимнаракрул
источник
2

Как долгое время * nix sysadmin, я констатирую очевидное без прямой ссылки на RTFM: :)

   hostnamectl may be used to query and change the system hostname and
   related settings.

   This tool distinguishes three different hostnames: the high-level
   "pretty" hostname which might include all kinds of special characters
   (e.g. "Lennart's Laptop"), the static hostname which is used to
   initialize the kernel hostname at boot (e.g. "lennarts-laptop"), and
   the transient hostname which is a fallback value received from network
   configuration. If a static hostname is set, and is valid (something
   other than localhost), then the transient hostname is not used.

   Note that the pretty hostname has little restrictions on the characters
   used, while the static and transient hostnames are limited to the
   usually accepted characters of Internet domain names.

   The static hostname is stored in /etc/hostname, see hostname(5) for
   more information. The pretty hostname, chassis type, and icon name are
   stored in /etc/machine-info, see machine-info(5).

Это справедливо для большинства дистрибутивов "linux".

--mem

мем
источник
1

Во время выполнения он сохраняется в памяти, как уже отвечали другие здесь.

Чтобы пережить перезагрузку, она должна храниться где-то в файле, что зависит от дистрибутива Linux. На моей Fedora 20 это / etc / hostname

Скорее всего, он хранится в / etc. Попробуйте найти фактическое имя хоста в etc

grep -r `hostname` /etc
Арно Кляйнвельд
источник
Это ask.fedoraproject.org Q имеет все способы , которые вы можете установить / получить имя хоста на F20 , используя и hostnamectlт.п .: ask.fedoraproject.org/en/question/37413/...
ОДС