# GNU Hurd

GNU Hurd est un ensemble de programmes et de bibliothèques servant de base au système d'exploitation GNU. Commencé vers 1990, il s'agit d'un logiciel libre publié sous licence GNU GPL.
Le but recherché est de remplacer les fonctionnalités d'un noyau de type UNIX, tout en maintenant une large compatibilité avec ceux-ci. Il respecte autant que possible les spécifications POSIX, tout en évitant les restrictions d'action arbitrairement imposées à l'utilisateur.
Son nom est un double acronyme récursif, « Hurd » signifiant « Hird of Unix-Replacing Daemons », et « Hird » « Hurd of Interfaces Representing Depth » et un jeu de mots avec la proximité du mot « herd », qui signifie troupeau en anglais.

## Architecture à micro-noyau

Contrairement aux noyaux UNIX classiques, essentiellement monolithiques, GNU Hurd se fonde sur un micro-noyau, qui fournit uniquement les fonctions de base (accès basique au matériel et à la mémoire, gestion des tâches et de la communication entre celles-ci). Il se compose d'une série de services (appelés serveurs), fournissant des fonctions et des abstractions de plus haut niveau (système de fichiers, processus Unix, gestion des permissions, console, pilotes évolués...). Cette conception est donc plus modulaire et plus facile à faire évoluer dynamiquement. Cependant, ces serveurs indépendants doivent fréquemment communiquer, ce qui affecte les performances du système.
Le micro-noyau utilisé est GNU Mach, une implémentation Mach. Il existe d'autres systèmes de type UNIX utilisant Mach, tels OSF/1, NeXTSTEP, Lites (en) et MkLinux. Ils ont en commun une architecture basée sur le modèle serveur : le noyau monolithique du système UNIX traditionnel est ainsi remplacé par deux composants distincts, le micro-noyau et un serveur monolithique qui fournit la compatibilité Unix (BSD le plus souvent, sauf évidemment pour MkLinux). Mac OS X utilise également Mach comme base de son noyau monolithique xnu.

## Choix d’un micro-noyau

Depuis 2004, des efforts ont été réalisés pour exécuter le portage de Hurd sur une nouvelle génération de micro-noyau, le L4, mais la progression a été très lente, par manque de temps et de développeurs. Toutefois, durant 2005, le développeur principal de Hurd, Neal Walfield, termine la structure du gestionnaire de mémoire pour ce portage, et Marcus Brinkmann a porté pour sa part l’essentiel de la bibliothèque du langage C (glibc), le code de démarrage des processus, permet aux applications de fonctionner, notamment le célèbre programme hello world. Pendant ce temps, beaucoup de développeurs investissent du temps pour étudier le micro-noyau expérimental Coyotos issu du projet EROS de l’Université Johns-Hopkins$^,$.
En 2006, Marcus Brinkmann et d’autres se sont associés avec Jonathan Shapiro, un architecte de poids du Coyotos, pour discuter de sa possible utilisation avec GNU/Hurd. Ces discussions se sont poursuivies en 2007, lentement. Puis en 2008, Neal Walfield a commencé un travail sur la base du micro-noyau Viengoos comme une alternative$^,$. En 2009, Jonathan Shapiro a annoncé que le travail collaboratif avait cessé. En 2011, le développement de Viengoos est en pause par manque de temps de la part de Neal Walfield.
En parallèle, un groupe de développeurs continue le portage sur le micro-noyau de départ, une version de Mach.

## Spécificités

GNU Hurd se compose donc d'un ensemble de serveurs fonctionnant en interaction. Au lieu d'un seul programme imposant incluant absolument tout, de la gestion du synchronisme jusqu'au réseau, chacun de ses composants est géré par un serveur indépendant. Chaque serveur fournit un certain nombre de services, sous formes d'appels (RPC). Ces appels sont organisés en interfaces. Ces interfaces sont définies indépendamment des serveurs fournis par ledit noyau : elles sont censées être stables (elles n'ont changé qu'une seule fois depuis 1999) et documentées.
Cela rend en principe le développement dudit noyau plus facile. Pour remplacer un composant, il suffit de créer un serveur implémentant ces mêmes interfaces. On peut aussi remplacer et/ou modifier les composants non essentiels (la majorité) sans arrêter le système. De plus, si l'un des composants plante, il ne doit pas entraîner l'ensemble du système.
Dans le développement initial de Mach, cette idée d'un ensemble de serveurs interagissant était considérée comme un des buts principaux concernant le design, mais GNU Hurd est apparu comme étant le premier système basé sur Mach, fonctionnant de cette manière. Quoi qu'il en soit, il est apparu que le groupe développant Mach était bien trop occupé à travailler sur Mach pour réfléchir au système d'exploitation dans sa globalité.
Plusieurs concepts d'UNIX sont implémentés ou étendus dans GNU Hurd.
En particulier, celui-ci reprend le principe unixien « tout s'interface comme un fichier » et l'étend pour répondre à une problématique courante des systèmes multi-serveurs : l'identification des serveurs et le contrôle d'accès à ceux-ci. En effet, deux serveurs, pour communiquer entre eux, doivent pouvoir se contacter. Sur l'Internet, ce sont les adresses IP et le DNS qui remplissent ce rôle. Dans le monde CORBA, ce sont les IOR. MachOS proposait un service de nommage qui permet de contacter un serveur par son nom. Cependant, ce système ajoute un élément critique au système (le serveur de noms) et ne règle pas la question du contrôle d'accès. GNU Hurd prend le parti d'utiliser le système de fichiers comme système de nommage : à chaque fichier, il associe un programme. Ces programmes sont des serveurs ordinaires qui implémentent une interface particulière : celle des accès fichiers (lecture, écriture, changement des droits et de propriétaire, etc.) : ils sont appelés « traducteurs » (translator). Tous les serveurs dudit noyau sont des traducteurs, excepté auth et proc (pour lesquels toute tâche créée dispose automatiquement d'un moyen de communiquer avec ces serveurs). Les systèmes de fichiers sont un exemple de traducteur : ils sont associés à tous les fichiers fournis par ce système de fichiers. Ce qui correspond au montage sous UNIX est le lancement d'un traducteur de fichier sous GNU/Hurd. La nature des traducteurs (programmes ordinaires) rend plus aisée la conception de services spécifiques comme le traducteur ftpfs permet à l'utilisateur de naviguer sur un site FTP distant comme dans une arborescence locale, ou mirrorfs, qui permet à l'utilisateur de monter plusieurs systèmes de fichiers les uns sur les autres.
Sous Unix, chacun des programmes a un identifiant associé, user id ou ID, qui correspond normalement à celui de l'utilisateur qui l'a lancé. Cet ID dicte les actions permises par ce programme. Aucun processus externe ne peut changer l'ID d'un programme en mémoire, et aucun processus ne peut (normalement) obtenir un privilège qu'il n'a pas au démarrage. Sous GNU/Hurd, un processus tourne sous un ensemble d'identifiants, cet ensemble pouvant être nul (aucun ID associé) ou contenant plusieurs ID. Un processus ayant suffisamment de privilèges peut ajouter ou retirer des ID à un autre processus. Par exemple, il existe un serveur password qui retourne un ID lorsque le login est validé.
L'aspect le plus intéressant dudit noyau réside dans la capacité qu'a l'utilisateur de lancer son propre système de services. Tout utilisateur peut attacher n'importe quel traducteur à un système de fichiers pour son usage personnel : un utilisateur peut même remplacer des serveurs systèmes, comme le serveur d'authentification, par celui de son choix. Tout cela peut se faire sans affecter les autres utilisateurs, grâce à des privilèges bien définis. En fait, il est même possible, toujours pour le simple utilisateur, de relancer un système GNU/Hurd, qui sera alors un sous-Hurd (un Hurd dans le Hurd).

## Distributions

Richard Stallman, fondateur du projet GNU, avait annoncé qu'il espérait la sortie d'une version officielle de GNU OS (également appelée GNU/Hurd) avant la fin de l'année 2002 (déclaration qui avait beaucoup surpris les développeurs). Il n'existait au départ qu'une distribution basée sur le Hurd, au stade de développement, mais qu'il était possible d'utiliser pour certaines tâches non critiques : Debian GNU/Hurd. Celle-ci existe toujours.
Depuis, quelques rares distributions ont vu le jour :
* superunprivileged.org propose un LiveCD basé sur Debian GNU/Hurd, réalisé par Ben Asselstine avec l'aide d'Alfred Szmidt. Ce LiveCD (datant de 2005 - le site n'existe plus) fournit un système de base suffisant pour découvrir et démontrer les fonctionnalités de GNU/Hurd.
* Début 2010, des membres de la communauté Archlinux ont lancé une distribution GNU/Hurd, basée sur ArchLinux, sous le nom de Arch Hurd.
* Mai 2013 : une nouvelle version de Debian GNU/Hurd basé sur Debian 7.0 a vu le jour.
* Avril 2015 : sortie de Debian GNU/Hurd 2015 basé sur Jessie.
Ces distributions utilisent toutes un chargeur de démarrage (bootloader) pouvant gérer la spécification multiboot, comme sait le faire GRUB, ce qui est requis pour utiliser le noyau Hurd.
Compte tenu de la disponibilité d'autres noyaux de système d'exploitation qui permettent une utilisation de l'ensemble des outils GNU, le développement est lent. Ce noyau souffre encore d'importantes limitations liées au support matériel, par exemple il n'existe aucun support pour les cartes son.

## Personnalités du projet

* Thomas Bushnell
* Roland McGrath
* Neal Walfield