NFS/Ganesha est un serveur NFS et 9P en userspace pouvant à la fois exporter une partie de la hiérarchie de fichier du serveur et exporté des volumes provenant de technologies tel que [GlusterFS](https://wiki.evolix.org/HowtoGlusterFS) et [Ceph](https://wiki.evolix.org/HowtoCeph).
## Installation
Il y a (au moins) deux paquets à installer : le paquet `nfs-ganesha` fournissant le serveur NFS et un paquet fournissant le support du backend à fournir (`nfs-ganesha-vfs` pour exporter une partie de la hiérarchie de fichier, `nfs-ganesha-gluster` pour GlusterFS, `nfs-ganesha-ceph` pour Ceph, ...):
```
apt install nfs-ganesha nfs-ganesha-vfs
```
## Configuration
La configuration de NFS-Ganesha se fait à travers de `/etc/ganesha/ganesha.conf`. Ce fichier est constitué de plusieurs blocs.
### Bloc NFS_CORE_PARAM
Ce bloc définie la configuration globale du serveur.
#### Directives
*`NFS_Port`: Le port sur lequel le serveur écoute pour le protocol NFS. (défaut: `2049`)
*`Rquota_Port`: Le port sur lequel le serveur écoute pour le protocol RQUOTA. (défaut: `875`)
*`Bind_addr`: L'IP sur laquelle le serveur écoute. (défaut: `0.0.0.0`)
*`Protocols`: Les protocoles autorisés à être autorisées dans les exports. (défaut: `[3, 4, 9P]`, donc NFSv3, NFSv4 et 9P)
*`Clustered`: Si le serveur fait partie d'un cluster ou non. (défaut: `true`)
*`mount_path_pseudo`: Si le serveur devrait utiliser l'entrée `Pseudo` (true) ou `Path` (false) pour le chemin utilisable par les clients pour NFSv3 et 9P, fortement recommandé d'être mis à `true` afin de simplifier la gestion étant donné que NFSv4 utilise toujours `Pseudo`. (défaut: `false`)
### Blocs EXPORT
Ces blocs permettent de définir un export NFS/9P.
#### Directives
*`Export_Id`: Ce champ **obligatoire** est un nombre entre 0 (obligatoirement utilisé pour le pseudo-root) et 65535 qui doit être unique à l'export en cours de définition.
*`Path`: Chemin à exporter, la signification de ce champ dépend du backend utilisé, dans le cas du backends `vfs` il s'agit du chemin dans la hiérarchie de fichier.
*`Pseudo`: Chemin utilisé pour le montage sous NFSv4 (et optionnellement NFSv3 et 9P, cf. plus haut).
*`Protocols`: Protocoles pour lesquels cet export existe.
*`Access_Type`: Actions pouvant être faîtes par les clients. (Correspond essentiellement à une option de montage `rw` ou `ro`.) Peut être l'une des valeurs suivantes :
*`MDONLY`: Ne permet pas les opérations `READ` et `WRITE` mais autorise tout le reste.
*`MDONLY_RO`: Ne permet pas les opérations `READ`, `WRITE` et toutes opérations qui modifieraient les attributs de fichiers ou le contenu de répertoires.
*`RootId`, `Root_Id_Squash`, `RootIdSquash`: uid 0 et gid 0 sont remplacés par `Anonymous_Uid` et `Anonymous_Gid`. Le gid 0 est aussi enlevé de la liste des groupes alternatifs.
*`Root`, `Root_Squash`, `RootSquash`: uid 0 combiné à n'importe quel groupe est remplacé par `Anonymous_Uid` et `Anonymous_Gid`. La liste des groupes secondaire n'est pas prise en compte.
*`All`, `All_Squash`, `AllSquash`, `All_Anonymous`, `AllAnonymous`: Tous les utilisateurs et groupes sont remplacés par `Anonymous_Uid` et `Anonymous_Gid`.
*`PrivilegedPort`: Autorisation des ports inférieure à 1024 pour le montage par les clients. (défaut: `false`)
*`Manage_Gids`: Mettre à `true` pour que la liste des groupes secondaire soit généré du côté du serveur au lieu de se basé sur `AUTH_SYS` (permet d'avoir plus de 16 groupes). (défaut: `false`)
* Des blocs `CLIENT`: Permet de gérer les permissions différemment pour certains clients, peut contenir les directives `Access_Type`, `Protocols`, `Anonymous_uid`, `Anonymous_gid`, `SecType`, `PrivilegedPort`, `Manage_Gids` et `Squash`. Il doit contenir une directive `Clients` contenant les clients auxquels ces directives s'appliquent, cette directive accepte les valeurs suivantes, plusieurs valeurs peuvent être utilisées en séparant par des virgules (`,`):
* Un **unique** bloc `FSAL` définissant le backend utilisé pour cet export. Les directives utilisées dépendent du backend. Doit **obligatoirement** contenir une directive `Name` contenant le nom du backend.
### Exemple
Voici un exemple minimal pour exporter en NFSv3 et NFSv4 le `/srv` du serveur en tant que `/foo` en lecture seule, sauf pour 192.0.2.3 et 198.51.100.0/25 qui ont le droit de modifier le contenu des fichiers et 203.0.113.0/24 qui n'a aucun accès.