Dove `hostname` memorizza il nome host che ho impostato?


15

Questo è abbastanza sconcertante. Qualcuno sa da dove il hostnamecomando memorizza e legge il nome host?

Ho pensato che fosse / etc / hostname ma non ci sono file simili su questo sistema Linux che sto usando. Ho provato a usare strace per trovare dove si trovava ma nessuna chiamata in lettura ha restituito queste informazioni:

$ 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

Poi ho notato che ha reso univoco syscall che ha restituito queste informazioni:

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

Un grep ricorsivo in / etc / non restituisce nulla:

grep "server-name" -r /etc 

Dove uname memorizza queste informazioni? Solo nella memoria?


1
quale distro linux stai usando?
amir jj,

Risposte:


9

Dai un'occhiata a queste domande e risposte correlate intitolate: da dove uname ottiene le sue informazioni? . Informazioni come il nome host persistono all'interno di una struttura di dati all'interno del kernel Linux, mentre il sistema è in esecuzione. Durante l'avvio di un sistema queste informazioni possono essere ottenute attraverso una varietà di meccanismi che sono tipicamente specifici per la distribuzione.

Se guardi la man 2 unamepagina man c'è una struttura di dati menzionata lì:

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

Il secondo elemento di quella struttura nodename[]è un posto in cui il nome host è memorizzato nel kernel di Linux.

/ proc

Se dai un'occhiata /proc/sys/kernel/hostname, anche il nome host è esposto qui. Questa è una posizione virtuale /proc, ma ti offre un metodo alternativo per accedere al nome host. Domainname del sistema è anche qui, /proc/sys/kernel/domainname.

NOTA: di interesse, questi valori sono specifici dello spazio dei nomi UTS .

Esempio

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

Manipolazione del nome host

Sui sistemi con Systemd è possibile utilizzare lo strumento cli hostnamectlper ottenere / impostare il nome host. Questo lo cambierà permanentemente tra i riavvii.

$ sudo hostnamectl set-hostname --static somehostname

Puoi anche scoprire il suo valore attraverso sysctl:

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

Per le versioni di Fedora, questa domanda e risposta di ask.fedoraproject.org tratta l'argomento in modo piuttosto approfondito, intitolato: Impostazione corretta del nome host - Fedora 20 su Amazon EC2 .


1
Meh. hostnamectl invoca semplicemente una chiamata di sistema. In che modo syscall memorizza le informazioni in modo che siano persistenti durante i riavvii? Questa è la mia domanda, se non anche i PO.
Otheus,

6

Il hostnamecomando non memorizza il nome da nessuna parte ma la memoria del kernel.

Il modo in cui il sistema decide come si chiama al momento dell'avvio dipende dalla configurazione del sistema. Le opzioni vanno dalla lettura di un nome da un file, all'uso di DNS o / etc / hosts per impostare il nome dopo che è stata visualizzata un'interfaccia di rete adatta.


2
Mai /etc/hosts(che è per le ricerche DNS - un sistema che legge il suo nome host da lì è oh così sbagliato) ... ma forse /etc/hostname(contiene il nome completo) o raramente /etc/sysconfig/network(può contenere un HOSTNAME=...comando shell). Su un'istanza di Amazon EC2 potresti anche dover modificare /etc/cloud/cloud.cfg...
David Tonhofer,

4

hostname(1)è solo un front-end per la sethostname(3)chiamata di sistema, che sostanzialmente scrive il nome host nel punto in cui il kernel si aspetta che sia archiviato.

Se vuoi che il cambiamento sia permanente, secondo la filosofia generale di Unix, devi memorizzarlo da solo. La posizione precisa, tuttavia, dipende fortemente dal sistema init. Ad esempio, init di OpenBSD legge il nome host da /etc/myname(durante netstart).

Tutto ciò dovrebbe essere descritto nelle manpage del sistema o nella documentazione di supporto.


2

Da molto tempo * nix sysadmin, dichiarerò l'ovvio, senza un riferimento diretto 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).

Questo vale per la maggior parte delle distro "linux".

--mem


1

In fase di esecuzione viene archiviato in memoria come già risposto dagli altri qui.

Per sopravvivere a un riavvio, deve essere archiviato in un file da qualche parte, che è specifico della distribuzione Linux. Sul mio Fedora 20 è / etc / hostname

Molto probabilmente è memorizzato in / etc. Prova a cercare il nome host effettivo in ecc

grep -r `hostname` /etc

Questo ask.fedoraproject.org Q ha tutti i modi in cui puoi impostare / ottenere il nome host su F20 usando hostnamectlecc .: ask.fedoraproject.org/en/question/37413/…
slm
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.