Onde o `hostname` armazena o nome do host que eu defini?

15

Isso é bastante intrigante. Alguém sabe de onde o hostnamecomando armazena e lê o nome do host?

Eu pensei que era / etc / hostname, mas não existe esse arquivo neste sistema Linux que estou usando. Tentei usar o strace para descobrir onde ele estava localizado, mas nenhuma chamada de leitura retornou essas informações:

$ 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

Então notei que o syscall não era o nome que retornava essas informações:

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

Um grep recursivo em / etc / não retorna nada:

grep "server-name" -r /etc 

Onde a uname armazena essas informações? Apenas na memória?

Peter Krumins
fonte
1
qual distro linux você está usando?
jj Amir

Respostas:

9

Veja estas perguntas e respostas relacionadas à U&L, intituladas: De onde a uname obtém suas informações? . Informações como o nome do host persistem em uma estrutura de dados no kernel do Linux, enquanto o sistema está em execução. Durante a inicialização do sistema, essas informações podem ser recuperadas por meio de uma variedade de mecanismos tipicamente específicos da distribuição.

Se você olhar para a man 2 unamepágina do manual, há uma estrutura de dados mencionada 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
           };

O segundo elemento dessa estrutura nodename[]é um local em que o nome do host é armazenado no kernel do Linux.

/ proc

Se você der uma olhada /proc/sys/kernel/hostname, o nome do host também será exposto aqui. Este é um local virtual /proc, mas fornece um método alternativo para acessar o nome do host. O nome do domínio do sistema também está aqui /proc/sys/kernel/domainname,.

NOTA: De interesse, esses valores são específicos ao espaço para nome UTS .

Exemplo

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

Manipulando o Nome do Host

Nos sistemas com Systemd, você pode usar a ferramenta cli hostnamectlpara obter / definir o nome do host. Isso irá alterá-lo permanentemente entre as reinicializações.

$ sudo hostnamectl set-hostname --static somehostname

Você também pode descobrir seu valor através de sysctl:

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

Para lançamentos do Fedora, esta seção de perguntas e respostas do ask.fedoraproject.org aborda o tópico de maneira bem detalhada, intitulada: Configurando corretamente o nome do host - Fedora 20 no Amazon EC2 .

slm
fonte
1
Meh. O hostnamectl simplesmente chama uma chamada do sistema. Como o syscall armazena as informações para que sejam persistentes nas reinicializações? Essa é a minha pergunta, se não os OPs também.
Otheus 20/05
6

O hostnamecomando não armazena o nome em nenhum lugar, exceto na memória do kernel.

Como o sistema decide qual é o seu nome no momento da inicialização depende de como o sistema está configurado. As opções variam da leitura de um nome de um arquivo até o uso de DNS ou / etc / hosts para definir o nome após a criação de uma interface de rede adequada.

Kyle Jones
fonte
2
Nunca /etc/hosts(que é para pesquisas de DNS - um sistema que lê o nome do host a partir daí é tão errado) ... mas possivelmente /etc/hostname(contém o nome completo) ou raramente /etc/sysconfig/network(pode conter um HOSTNAME=...comando shell). Em uma instância do Amazon EC2, você também pode ter que modifiy /etc/cloud/cloud.cfg...
David Tonhofer
4

hostname(1)é apenas um front-end para a sethostname(3)chamada do sistema, que basicamente grava o nome do host no local em que o kernel espera que seja armazenado.

Se você deseja que a mudança seja permanente, conforme a filosofia geral do Unix, você deve armazená-la. A localização precisa, no entanto, depende muito do seu sistema init. Por exemplo, o init do OpenBSD lê o nome do host em /etc/myname(durante netstart).

Tudo isso deve ser descrito nas páginas de manual ou na documentação de suporte do seu sistema.

Vucar Timnärakrul
fonte
2

Há muito tempo * nix sysadmin, afirmo o óbvio, sem uma referência direta ao 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).

Isso vale para a maioria das distribuições "linux".

--mem

mem
fonte
1

Em tempo de execução, ele é armazenado na memória, conforme respondido pelos outros aqui.

Para sobreviver a uma reinicialização, ele deve ser armazenado em um arquivo em algum lugar, específico da distribuição Linux. No meu Fedora 20 é / etc / hostname

Provavelmente é armazenado em / etc. Tente procurar o nome do host real em etc

grep -r `hostname` /etc
Arnaud Kleinveld
fonte
Este Q do ask.fedoraproject.org tem todas as maneiras pelas quais você pode definir / obter o nome do host no F20 usando hostnamectletc .: ask.fedoraproject.org/en/question/37413/…
slm