hostname et domainname

Published: 06-12-2015

Updated: 21-05-2016

By: Maxime de Roucy

tags: system systemd

Dans cette page je vais expliqué ce que j’ai compris des différentes documentations que j’ai trouvé concernant le(s) hostname et le(s) domainname.

D’abord il faut comprendre qu’il y a plusieurs « host name » et « domain name ». Le host name le plus courament utilisé n’a rien à voir avec le réseau. C’est juste le nom de la machine… Nous appelerons ce hostname, le hostname POSIX. Il peut être récupéré avec les commandes suivante (il en existe peut-être d’autre) :

max@laptop % hostnamectl --static
laptop
max@laptop % hostname
laptop
max@laptop % uname -n
laptop
max@laptop % sysctl kernel.hostname
kernel.hostname = laptop
max@laptop % cat /proc/sys/kernel/hostname
laptop

Il est recommandé d’utiliser un hostname POSIX ne contenant que des caractères ASCII minuscule sans espace ni point.

On peut le modifier avec les commandes suivantes :

root@laptop # hostnamectl set-hostname laptop
root@laptop # hostname laptop
root@laptop # cat 'laptop' > /etc/hostname
root@laptop # sysctl -w kernel.hostname=laptop
root@laptop # cat 'laptop' > /proc/sys/kernel/hostname

sysctl, /proc/sys/kernel/hostname et hostname modifie le hostname à chaud mais la modification est perdu au reboot. /etc/hostname n’est chargé qu’au boot. hostnamectl modifie le fichier /etc/hostname et le hostname à chaud.

Le hostname POSIX est généralement associé à un autre hostname qui lui correspond au nom DNS de la machine sur le réseau. Nous appelerons ce hostname, le hostname DNS. Associé au domainname DNS il forme le FQDN de la machine sur le réseau. En fait on n’obtient pas le FQDN à partir du hostname DNS et du domainname DNS mais l’inverse, ce sont le hostname DNS et le domainname DNS qui sont déduit du FQDN. Le hostname DNS étant simplement la première partie (caractères jusqu’au premier « . ») du FQDN.

Le fqdn peut être récupéré avec les commandes :

max@laptop % hostname -f
laptop-dns.lan
max@laptop % getent hosts | { grep `uname -n` || uname -s -n ;} | head -1 | awk '{print $2}'
laptop-dns.lan

Le hostname DNS peut être récupéré avec les commandes :

max@laptop % hostname -s
laptop-dns
max@laptop % getent hosts | { grep `uname -n` || uname -s -n ;} | head -1 | awk '{print $2}' | cut -d . -f 1
laptop-dns

Le domainname DNS peut être récupéré avec les commandes :

max@laptop % hostname -d
lan
max@laptop % getent hosts | { grep `uname -n` || uname -s -n ;} | head -1 | awk '{print $2}' | cut -d . -f 2-
lan

Pour déterminer le FQDN et donc le hostname DNS, le système utilise le hostname POSIX. Via les commande getaddrinfo il cherche un (le premier) fqdn qui a pour alias (ou fqdn) le hostname POSIX ; si aucun ne correspond alors le hostname POSIX est utilisé comme hostname DNS (je ne l’ai pas vérifié dans le code, c’est juste une déduction).

Note concernant les commandes listées plus haut : le uname -s -n intervient justement si aucun fqdn n’a pas alias le hostname POSIX, le -s permet d’ajouter une chaîne de caractères (on se fout de son contenu) avant le hostname POSIX -n, pour que le reste de la commande fonctionne.

getent hosts X permet de recuperer les informations DNS correspondant au hostname ou a l’alias X. Les informations sont presentées comme dans le fichier /etc/hosts : IP hostname alias alias…

max@laptop % uname -n
laptop
max@laptop % getent hosts laptop
::1             laptop-dns.lan localhost.localdomain localhost laptop

Ici, « laptop » (qui est mon hostname POSIX) est un alias du fqdn « laptop-dns.lan ». Mon hostname DNS est donc « laptop-dns » et mon domainname DNS est « lan ».

getent se base sur les bases de donnees DNS configure dans /etc/nsswitch.conf et plus particulierement de la ligne « hosts: » dans notre cas. Cette ligne comment quasiment toujours avec « files », soit /etc/hosts. Pour configurer sont hostname DNS il suffit donc de placer dans son fichier /etc/hosts une ligne :

<IP> <fqdn> <hotsname POSIX> alias...

IP est generalement « 127.0.0.1 » et/ou « ::1 » mais ca peut etre n’importe quoi d’autre.

Il existe aussi une notion de domain name NIS (ou YP), mais celui n’est pas utilise (excepté si vous utilisez ce protocole). Le domainname NIS peut être récupéré avec les commandes :

max@laptop # domainname
(none)
max@laptop # sysctl kernel.domainname
kernel.domainname = (none)
max@laptop # cat /proc/sys/kernel/domainname
(none)

Sources non mentionnées precedemment :