Où «nom d'hôte» stocke-t-il le nom d'hôte que j'ai défini?

15

C'est assez déroutant. Est-ce que quelqu'un sait d'où la hostnamecommande stocke et lit le nom d'hôte?

Je pensais que c'était / etc / hostname mais il n'y a pas un tel fichier sur ce système Linux que j'utilise. J'ai essayé d'utiliser strace pour trouver où il se trouvait, mais aucun appel de lecture n'a renvoyé ces informations:

$ 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

Ensuite, j'ai remarqué qu'il s'agissait d'un appel système unique qui a renvoyé ces informations:

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

Un grep récursif dans / etc / ne renvoie rien:

grep "server-name" -r /etc 

Où uname stocke-t-elle ces informations? Juste en mémoire?

Peter Krumins
la source
1
quelle distribution linux vous utilisez?
amir jj

Réponses:

9

Jetez un coup d'œil à cette Q&R U&L connexe intitulée: D'où uname obtient-elle ses informations? . Des informations telles que le nom d'hôte persistent dans une structure de données au sein du noyau Linux, pendant que le système fonctionne. Pendant le démarrage d'un système, ces informations peuvent être récupérées via une variété de mécanismes généralement spécifiques à la distribution.

Si vous regardez la man 2 unamepage de manuel, une structure de données y est mentionnée:

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

Le 2ème élément de cette structure, nodename[]est un endroit où le nom d'hôte est stocké dans le noyau Linux.

/ proc

Si vous regardez /proc/sys/kernel/hostname, le nom d'hôte est également exposé ici. Il s'agit d'un emplacement virtuel /proc, mais il vous donne une méthode alternative pour accéder au nom d'hôte. Le nom de domaine du système est ici aussi /proc/sys/kernel/domainname.

REMARQUE: Il est intéressant de noter que ces valeurs sont spécifiques à l'espace de noms UTS .

Exemple

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

Manipulation du nom d'hôte

Sur les systèmes avec Systemd, vous pouvez utiliser l'outil cli hostnamectlpour obtenir / définir le nom d'hôte. Cela le changera définitivement entre les redémarrages.

$ sudo hostnamectl set-hostname --static somehostname

Vous pouvez également découvrir sa valeur grâce à sysctl:

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

Pour les versions de Fedora, cette Q&R ask.fedoraproject.org couvre le sujet de manière assez approfondie, intitulée: Définir correctement le nom d'hôte - Fedora 20 sur Amazon EC2 .

slm
la source
1
Meh. hostnamectl appelle simplement un appel système. Comment le syscall stocke-t-il les informations de manière à ce qu'elles persistent à chaque redémarrage? C'est ma question, sinon les PO également.
Otheus
6

La hostnamecommande ne stocke le nom nulle part ailleurs que la mémoire du noyau.

La façon dont le système décide de son nom au démarrage dépend de la configuration du système. Les options vont de la lecture d'un nom dans un fichier à l'utilisation de DNS ou / etc / hosts pour définir le nom après qu'une interface réseau appropriée a été créée.

Kyle Jones
la source
2
Jamais /etc/hosts(ce qui est pour les recherches DNS - un système qui lit son nom d'hôte à partir de là est tellement faux) ... mais peut-être /etc/hostname(contient le nom complet) ou rarement /etc/sysconfig/network(peut contenir une HOSTNAME=...commande shell). Sur une instance d'Amazon EC2, vous devrez peut-être également modifier /etc/cloud/cloud.cfg...
David Tonhofer
4

hostname(1)n'est qu'un front-end de l' sethostname(3)appel système, qui écrit essentiellement le nom d'hôte là où le noyau s'attend à ce qu'il soit stocké.

Si vous voulez que le changement soit permanent, selon la philosophie générale d'Unix, vous devez le stocker vous-même. L'emplacement précis dépend cependant fortement de votre système d'initialisation. Par exemple, l'init d'OpenBSD lit le nom d'hôte à partir de /etc/myname(pendant netstart).

Tout cela doit être décrit dans les pages de manuel de votre système ou dans la documentation connexe.

Vucar Timnärakrul
la source
2

Pendant longtemps * nix sysadmin, je vais dire l'évidence, sans référence RTFM directe: :)

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

Cela est vrai pour la plupart des distributions "linux".

--mem

mem
la source
1

Au moment de l'exécution, il est stocké en mémoire comme l'ont déjà répondu les autres ici.

Pour survivre à un redémarrage, il doit être stocké quelque part dans un fichier, qui est spécifique à la distribution Linux. Sur mon Fedora 20, c'est / etc / hostname

Il est très probablement stocké dans / etc. Essayez de rechercher le nom d'hôte réel dans etc

grep -r `hostname` /etc
Arnaud Kleinveld
la source
Ce ask.fedoraproject.org Q a toutes les façons dont vous pouvez définir / obtenir le nom d'hôte sur F20 en utilisant hostnamectletc .: ask.fedoraproject.org/en/question/37413/…
slm