Де "ім'я хоста" зберігає ім'я хоста, яке я встановив?


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

Потім я помітив, що це робило невідомий системний виклик, який повертав цю інформацію:

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

Рекурсивна помилка в / etc / нічого не повертає:

grep "server-name" -r /etc 

Де унме зберігає цю інформацію? Просто на пам’ять?


1
який дистрибутив Linux ви використовуєте?
amir jj

Відповіді:


9

Ознайомтеся з цим пов'язаним питанням U&L Q&A під назвою: Звідки унаме бере інформацію? . Така інформація, як ім'я хоста, зберігається в структурі даних в ядрі 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/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 .


1
Мех. hostnamectl просто викликає системний виклик. Як syscall зберігає інформацію, щоб вона була стійкою при перезавантаженнях? Це моє запитання, як не ОП.
Отей

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, ви повинні зберігати її самостійно. Однак точне розташування сильно залежить від вашої системи init. Наприклад, inIT OpenBSD читає ім'я хоста з /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" дистрибутивів.

--ем


1

Під час виконання він зберігається в пам'яті, як відповіли інші тут уже.

Щоб пережити перезавантаження, його потрібно десь зберегти у файлі, що є специфічним для дистрибуції Linux. У моїй Fedora 20 це / etc / hostname

Він, швидше за все, зберігається в / etc. Спробуйте знайти власне ім’я хоста в тощо

grep -r `hostname` /etc

Цей ask.fedoraproject.org Q має всі способи встановлення / отримання імені хоста на F20 за допомогою hostnamectlтощо: ask.fedoraproject.org/en/question/37413/…
slm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.