Wo speichert "Hostname" den von mir festgelegten Hostnamen?

15

Das ist ziemlich rätselhaft. Weiß jemand, wo der hostnameBefehl Hostnamen speichert und liest?

Ich dachte, es wäre / etc / hostname, aber auf diesem Linux-System gibt es keine solche Datei, die ich verwende. Ich habe versucht, mithilfe von strace herauszufinden, wo es sich befindet, aber keine Leseaufrufe haben diese Informationen zurückgegeben:

$ 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

Dann bemerkte ich, dass uname syscall diese Information zurückgab:

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

Ein rekursives grep in / etc / gibt nichts zurück:

grep "server-name" -r /etc 

Wo speichert uname diese Informationen? Nur zur Erinnerung?

Peter Krumins
quelle
1
Welche Linux-Distribution benutzt du?
amir jj

Antworten:

9

Schauen Sie sich diese verwandten Fragen und Antworten zu U & L mit dem Titel: Woher bezieht uname seine Informationen? . Informationen wie der Hostname bleiben in einer Datenstruktur im Linux-Kernel erhalten, während das System ausgeführt wird. Während des Systemstarts können diese Informationen über eine Vielzahl von Mechanismen wiederhergestellt werden, die in der Regel distro-spezifisch sind.

Wenn Sie sich die man 2 unameManpage ansehen, wird dort eine Datenstruktur erwähnt:

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

Das zweite Element dieser Struktur nodename[]ist ein Ort, an dem der Hostname im Linux-Kernel gespeichert ist.

/ proc

Wenn Sie sich das ansehen /proc/sys/kernel/hostname, wird auch hier der Hostname angezeigt. Dies ist ein virtueller Speicherort, der /procIhnen jedoch eine alternative Methode für den Zugriff auf den Hostnamen bietet. Der Domainname des Systems ist auch hier /proc/sys/kernel/domainname.

HINWEIS: Interessanterweise sind diese Werte spezifisch für den UTS-Namespace .

Beispiel

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

Bearbeiten des Hostnamens

Auf Systemen mit Systemd können Sie das CLI-Tool verwenden hostnamectl, um den Hostnamen abzurufen / festzulegen. Dadurch wird es zwischen Neustarts dauerhaft geändert.

$ sudo hostnamectl set-hostname --static somehostname

Sie können den Wert auch herausfinden, indem Sie sysctl:

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

In diesen Fragen und Antworten zu Fedora-Releases unter ask.fedoraproject.org wird das Thema ausführlich behandelt. Der Titel lautet: Richtiges Festlegen des Hostnamens - Fedora 20 auf Amazon EC2 .

slm
quelle
1
Meh. hostnamectl ruft einfach einen Systemaufruf auf. Wie speichert der Syscall die Informationen, damit sie auch nach einem Neustart bestehen bleiben? Das ist meine Frage, wenn nicht auch die OPs.
Otheus
6

Der hostnameBefehl speichert den Namen nur im Kernel-Speicher.

Wie das System beim Booten entscheidet, wie sein Name lautet, hängt davon ab, wie das System konfiguriert ist. Die Optionen reichen vom Lesen eines Namens aus einer Datei bis zur Verwendung von DNS oder / etc / hosts, um den Namen festzulegen, nachdem eine geeignete Netzwerkschnittstelle aufgerufen wurde.

Kyle Jones
quelle
2
Nie /etc/hosts(was für DNS-Lookups ist - ein System, das seinen Hostnamen von dort liest, ist ach so falsch) ... aber möglicherweise /etc/hostname(enthält den vollständig qualifizierten Namen) oder selten /etc/sysconfig/network(enthält möglicherweise einen HOSTNAME=...Shell-Befehl). Auf einer amazon EC2-Instanz müssen Sie möglicherweise auch Änderungen vornehmen /etc/cloud/cloud.cfg...
David Tonhofer,
4

hostname(1)ist nur ein Front-End für den sethostname(3)Systemaufruf, der im Grunde den Hostnamen dahin schreibt, wo der Kernel erwartet, dass er gespeichert wird.

Wenn die Änderung dauerhaft sein soll, müssen Sie sie gemäß der allgemeinen Unix-Philosophie selbst speichern. Die genaue Position hängt jedoch stark von Ihrem Init-System ab. Zum Beispiel liest OpenBSDs init den Hostnamen von /etc/myname(während netstart).

All dies sollte in den Manpages Ihres Systems oder in der zugehörigen Dokumentation beschrieben werden.

Vucar Timnärakrul
quelle
2

Als langjähriger * nix-Sysadmin werde ich das Offensichtliche ohne direkten RTFM-Verweis angeben: :)

   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).

Dies gilt für die meisten Linux-Distributionen.

--mem

mem
quelle
1

Zur Laufzeit wird es im Speicher abgelegt, wie die anderen hier bereits geantwortet haben.

Um einen Neustart zu überstehen, muss er in einer Datei gespeichert werden, die für die jeweilige Linux-Distribution spezifisch ist. Auf meinem Fedora 20 ist es / etc / hostname

Es ist höchstwahrscheinlich in / etc gespeichert. Versuchen Sie, in etc. Nach dem tatsächlichen Hostnamen zu suchen

grep -r `hostname` /etc
Arnaud Kleinveld
quelle
Dieses ask.fedoraproject.org Q bietet alle Möglichkeiten, wie Sie den Hostnamen unter Verwendung von hostnamectletc .: ask.fedoraproject.org/en/question/37413/…
slm