Gdzie „nazwa hosta” przechowuje nazwę hosta, którą ustawiłem?

15

To dość zagadkowe. Czy ktoś wie, gdzie hostnamepolecenie przechowuje i odczytuje nazwę hosta?

Myślałem, że to / etc / hostname, ale w tym systemie Linux nie ma takiego pliku, którego używam. Próbowałem użyć strace, aby znaleźć lokalizację, ale żadne wywołania odczytu nie zwróciły tych informacji:

$ 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

Potem zauważyłem, że to nie nazwa połączenia systemowego, które zwróciło tę informację:

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

Rekurencyjny grep w / etc / nic nie zwraca:

grep "server-name" -r /etc 

Gdzie uname przechowuje te informacje? Właśnie w pamięci?

Peter Krumins
źródło
1
z jakiego systemu Linux korzystasz?
amir jj

Odpowiedzi:

9

Spójrz na pokrewne pytania i odpowiedzi dotyczące U&L zatytułowane: Skąd uname pobiera informacje? . Informacje, takie jak nazwa hosta, pozostają w strukturze danych w jądrze Linux, gdy system jest uruchomiony. Podczas uruchamiania systemu informacje te można uzyskać ponownie za pomocą różnych mechanizmów, które zazwyczaj są specyficzne dla dystrybucji.

Jeśli spojrzysz na man 2 unamestronę man, wspomniana tam struktura danych:

           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
           };

Drugi element tej struktury nodename[]to jedno miejsce, w którym nazwa hosta jest przechowywana w jądrze systemu Linux.

/ proc

Jeśli przyjrzysz się temu /proc/sys/kernel/hostname, nazwa hosta również jest widoczna tutaj. Jest to lokalizacja wirtualna /proc, ale daje alternatywną metodę dostępu do nazwy hosta. Nazwa domeny systemu jest tutaj też /proc/sys/kernel/domainname.

UWAGA: Interesujące są te wartości specyficzne dla przestrzeni nazw UTS .

Przykład

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

Manipulowanie nazwą hosta

W systemie z Systemd możesz użyć narzędzia cli, hostnamectlaby uzyskać / ustawić nazwę hosta. Spowoduje to zmianę na stałe między restartami.

$ sudo hostnamectl set-hostname --static somehostname

Możesz również dowiedzieć się o jego wartości poprzez sysctl:

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

W przypadku wydań Fedory niniejsze pytanie ask.fedoraproject.org dość dokładnie omawia ten temat, zatytułowany: Prawidłowe ustawienie nazwy hosta - Fedora 20 na Amazon EC2 .

slm
źródło
1
Meh hostnamectl po prostu wywołuje wywołanie systemowe. W jaki sposób syscall przechowuje informacje, aby były trwałe po ponownym uruchomieniu? To moje pytanie, jeśli nie również PO.
Otheus
6

hostnameKomenda nie przechowuje nazwę wszędzie, ale pamięć jądra.

To, w jaki sposób system decyduje, jak ma nazywać się podczas uruchamiania, zależy od konfiguracji systemu. Dostępne opcje to od odczytu nazwy z pliku, po użycie DNS lub / etc / hosts do ustawienia nazwy po uruchomieniu odpowiedniego interfejsu sieciowego.

Kyle Jones
źródło
2
Nigdy /etc/hosts(co jest do wyszukiwania DNS - system, który odczytuje z niego swoją nazwę hosta, jest tak źle) ... ale prawdopodobnie /etc/hostname(zawiera w pełni kwalifikowaną nazwę) lub rzadko /etc/sysconfig/network(może zawierać HOSTNAME=...polecenie powłoki). Na instancji Amazon EC2 może być konieczne zmodyfikowanie /etc/cloud/cloud.cfg...
David Tonhofer,
4

hostname(1)jest tylko nakładką na sethostname(3)wywołanie systemowe, które zasadniczo zapisuje nazwę hosta w miejscu, w którym jądro spodziewa się, że zostanie ono zapisane.

Jeśli chcesz, aby zmiana była trwała, zgodnie z ogólną filozofią uniksową musisz ją zapisać sam. Dokładna lokalizacja zależy jednak w dużej mierze od twojego systemu init. Na przykład init OpenBSD odczytuje nazwę hosta z /etc/myname(podczas netstart).

Wszystko to należy opisać na stronach systemowych lub w dokumentacji pomocniczej.

Vucar Timnärakrul
źródło
2

Jako długi sysadmin * nix podam oczywiste, bez bezpośredniego odniesienia 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).

Dotyczy to większości dystrybucji Linuksa.

- mem

mem
źródło
1

W czasie wykonywania jest on przechowywany w pamięci, jak już odpowiedzieli inni tutaj.

Aby przetrwać restart, musi być gdzieś zapisany w pliku, który jest specyficzny dla dystrybucji Linux. Na mojej Fedorze 20 jest to / etc / hostname

Najprawdopodobniej jest przechowywany w / etc. Spróbuj wyszukać rzeczywistą nazwę hosta w itp

grep -r `hostname` /etc
Arnaud Kleinveld
źródło
Ten ask.fedoraproject.org Q ma wszystkie sposoby na ustawienie / pobranie nazwy hosta na F20 za pomocą hostnamectletc .: ask.fedoraproject.org/en/question/37413/…
slm