¿Dónde almacena `hostname` el nombre de host que he configurado?

15

Esto es bastante desconcertante. ¿Alguien sabe dónde hostnamealmacena y lee el comando el nombre de host?

Pensé que era / etc / hostname pero no hay tal archivo en este sistema Linux que estoy usando. Intenté usar strace para encontrar dónde se encontraba, pero ninguna llamada de lectura arrojó esta información:

$ 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

Entonces me di cuenta de que una vez syscall devolvió esta información:

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

Un grep recursivo en / etc / no devuelve nada:

grep "server-name" -r /etc 

¿Dónde almacena Uname esta información? ¿Solo en la memoria?

Peter Krumins
fuente
1
¿Qué distribución de Linux estás usando?
amir jj

Respuestas:

9

Eche un vistazo a este Q&A relacionado con U&L titulado: ¿De dónde obtiene uname su información? . Información como el nombre de host persiste dentro de una estructura de datos dentro del kernel de Linux, mientras el sistema se está ejecutando. Durante el arranque de un sistema, esta información se puede volver a obtener a través de una variedad de mecanismos que generalmente son específicos de la distribución.

Si nos fijamos en la man 2 unamepágina de manual, hay una estructura de datos mencionada allí:

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

El segundo elemento de esa estructura, nodename[]es un lugar donde el nombre de host se almacena dentro del kernel de Linux.

/ proc

Si echas un vistazo /proc/sys/kernel/hostname, el nombre de host también se expone aquí. Esta es una ubicación virtual /proc, pero le ofrece un método alternativo para acceder al nombre de host. Nombre de dominio del sistema es también en este caso, /proc/sys/kernel/domainname.

NOTA: De interés, estos valores son específicos del espacio de nombres UTS .

Ejemplo

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

Manipulando el nombre de host

En los sistemas con Systemd, puede usar la herramienta cli hostnamectlpara obtener / configurar el nombre de host. Esto lo cambiará permanentemente entre reinicios.

$ sudo hostnamectl set-hostname --static somehostname

También puede averiguar su valor a través de sysctl:

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

Para las versiones de Fedora, estas preguntas y respuestas de ask.fedoraproject.org cubren el tema a fondo, titulado: Configuración correcta del nombre de host: Fedora 20 en Amazon EC2 .

slm
fuente
1
Meh hostnamectl simplemente invoca una llamada al sistema. ¿Cómo almacena syscall la información para que sea persistente en todos los reinicios? Esa es mi pregunta, si no los OP también.
Oteo
6

El hostnamecomando no almacena el nombre en otra parte que no sea la memoria del núcleo.

La forma en que el sistema decide cuál es su nombre en el momento del arranque depende de cómo esté configurado el sistema. Las opciones van desde la lectura de un nombre de un archivo hasta el uso de DNS o / etc / hosts para configurar el nombre después de abrir una interfaz de red adecuada.

Kyle Jones
fuente
2
Nunca /etc/hosts(que es para búsquedas de DNS: un sistema que lee su nombre de host desde allí está muy mal) ... pero posiblemente /etc/hostname(contiene el nombre completo) o raramente /etc/sysconfig/network(puede contener un HOSTNAME=...comando de shell). En una instancia de Amazon EC2 también puede que tenga que modificar /etc/cloud/cloud.cfg...
David Tonhofer
4

hostname(1)es solo un front-end para la sethostname(3)llamada al sistema, que básicamente escribe el nombre del host donde el núcleo espera que se almacene.

Si desea que el cambio sea permanente, según la filosofía general de Unix, debe almacenarlo usted mismo. Sin embargo, la ubicación precisa depende en gran medida de su sistema de inicio. Por ejemplo, el inicio de OpenBSD lee el nombre de host de /etc/myname(durante netstart).

Todo esto debe describirse en las páginas de manual de su sistema o en la documentación de respaldo.

Vucar Timnärakrul
fuente
2

Como mucho tiempo * nix sysadmin, declararé lo obvio, sin una referencia directa de 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).

Esto es válido para la mayoría de las distribuciones de "Linux".

--mem

mem
fuente
1

En el tiempo de ejecución, se almacena en la memoria como ya respondieron los demás aquí.

Para sobrevivir a un reinicio, debe almacenarse en un archivo en algún lugar, que es específico de la distribución de Linux. En mi Fedora 20 es / etc / hostname

Lo más probable es que esté almacenado en / etc. Intenta buscar el nombre de host real en etc.

grep -r `hostname` /etc
Arnaud Kleinveld
fuente
Este ask.fedoraproject.org Q tiene todas las formas en que puede configurar / obtener el nombre de host en F20 usando hostnamectletc .: ask.fedoraproject.org/en/question/37413/…
slm