Onde o 'hostname' armazena o hostname que eu configurei?

15

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

Eu achei que era / etc / hostname, mas não existe tal arquivo neste sistema Linux que estou usando. Eu tentei usar o strace para encontrar onde ele estava localizado, mas nenhuma chamada de leitura retornou essa informação:

$ strace hostname 2>&1 | grep read
read(3, "7ELF
uname({sys="Linux", node="server-name", ...}) = 0
grep "server-name" -r /etc 
$ strace hostname 2>&1 | grep read
read(3, "7ELF
uname({sys="Linux", node="server-name", ...}) = 0
grep "server-name" -r /etc 
%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%>%pre%%pre%%pre%%pre%0^%pre%%pre%%pre%%pre%%pre%%pre%"..., 832) = 832 read(3, "7ELF%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%>%pre%%pre%%pre%%pre%0%pre%%pre%%pre%%pre%%pre%"..., 832) = 832 read(3, "7ELF%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%>%pre%%pre%%pre%%pre%0%pre%%pre%%pre%%pre%%pre%%pre%"..., 832) = 832 read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tr"..., 1024) = 248 read(3, "", 1024) = 0
%pre%%pre%%pre%%pre%%pre%%pre%%pre%>%pre%%pre%%pre%%pre%0^%pre%%pre%%pre%%pre%%pre%%pre%"..., 832) = 832 read(3, "7ELF%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%>%pre%%pre%%pre%%pre%0%pre%%pre%%pre%%pre%%pre%"..., 832) = 832 read(3, "7ELF%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%>%pre%%pre%%pre%%pre%0%pre%%pre%%pre%%pre%%pre%%pre%"..., 832) = 832 read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tr"..., 1024) = 248 read(3, "", 1024) = 0

Em seguida, notei que o syscall do uname retornou essa informação:

%pre%

Um grep recursivo em / etc / retorna nada:

%pre%

Onde o uname armazena esta informação? Apenas na memória?

    
por Peter Krumins 25.10.2014 / 00:17

5 respostas

8

Dê uma olhada nestes P & A relacionados com perguntas e respostas intituladas: De onde o uname obtém suas informações? . Informações como o nome do host persistem em uma estrutura de dados dentro do kernel do Linux, enquanto o sistema está em execução. Durante a inicialização de um sistema, essa informação pode ser recuperada através de uma variedade de mecanismos que são tipicamente específicos da distribuição.

Se você olhar a página man 2 uname man, há uma estrutura de dados mencionada:

           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 lugar onde o nome do host é armazenado dentro do kernel do Linux.

/ proc

Se você der uma olhada em /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 de domínio do sistema também está aqui, /proc/sys/kernel/domainname .

OBSERVAÇÃO: De interesse, esses valores são namespace UTS específico .

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

No sistema com o Systemd, você pode usar a ferramenta cli hostnamectl para obter / definir o nome do host. Isso mudará permanentemente entre as reinicializações.

$ sudo hostnamectl set-hostname --static somehostname

Você também pode descobrir seu valor em sysctl :

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

Para os lançamentos do Fedora, este FAQ do site ask.fedoraproject.org cobre bastante bem o tópico, intitulado: Definindo corretamente o nome do host - Fedora 20 no Amazon EC2 .

    
por 25.10.2014 / 02:02
5

O comando hostname não armazena o nome em nenhum lugar além da 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 vão desde a leitura de um nome a partir de um arquivo, até o uso do DNS ou do / etc / hosts para definir o nome depois que uma interface de rede adequada foi ativada.

    
por 25.10.2014 / 00:43
4

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

Se você quiser que a mudança seja permanente, de acordo com a filosofia geral do Unix, você deve armazená-la você mesmo. O local preciso, no entanto, depende muito do seu sistema init. Por exemplo, o init do OpenBSD lê o nome do host de /etc/myname (durante netstart ).

Tudo isso deve ser descrito nas manpages do seu sistema ou na documentação de suporte.

    
por 25.10.2014 / 00:54
2

Como um longo tempo * nix sysadmin, vou declarar 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

    
por 14.02.2017 / 20:45
1

No tempo de execução, ele é armazenado na memória como respondido pelos outros já.

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

É mais provável que seja armazenado em / etc. Tente procurar o nome do host atual em

grep -r 'hostname' /etc
    
por 25.10.2014 / 08:06