mercredi 6 janvier 2016

NFS

Il y a plusieurs  raisons pour installer un serveur NFS dans notre cluster de Rasberry Pi 2:
•    Pour suppléer aux faiblesses des cartes SD liées au rapport cout / fiabilité-capacité-vitesse.
•    Il peut être plus facile aux nœuds d’échanger des données  via un espace disque commun  plutôt que via des sessions TCP (même si  NFS repose sur du réseau).
•    Pour simplifier le management/configuration/backup du cluster il peut être pratique d’avoir un espace disque partagé par tous les nœuds.
•    Pour booter via NFS et non via la carte SD. Cette dernière  restera nécessaire mais son contenu sera minimaliste et plus facile à maintenir.


Tout ce qui suit s’effectue avec l’utilisateur root.

1 NFS coté serveur

Le serveur que nous utilisons ici est une machine utilisant centos 7, donc pas un Raspberry . Dédier un Raspberry à cette tâche est possible à condition d’utiliser un disque externe, sinon on perd sur tous les tableaux.

Installation serveur NFS (centos)

yum install nfs-utils nfs-utils-lib

(depuis Centos 7.2 nfs-utils-lib n'existe plus car inclu dans nfs-utils)

systemctl enable rpcbind
systemctl enable nfs-server
systemctl start rpcbind
systemctl start nfs-server


Si les services nfs-lock et nfs-idmap sont requis voir la fin de ce post.

Vérifier l’installation
ps -e | grep rpc
    2152 ?        00:00:00 rpcbind
    2323 ?        00:00:00 rpciod
    2337 ?        00:00:00 rpc.statd
    2338 ?        00:00:00 rpc.mountd
    2339 ?        00:00:00 rpc.idmapd

ps -e | grep nfs
    1254 ?        00:00:00 nfsd4_callbacks
    1260 ?        00:00:00 nfsd
    1261 ?        00:00:00 nfsd

    ...
    2001 ?        00:00:00 nfsiod

cat /proc/filesystems | grep nfs
    nodev   nfsd
    nodev   nfs

    nodev   nfs4

rpcinfo -p | sort | grep nfs

   program vers proto   port  service
    100003    3   tcp   2049  nfs
    100003    3   udp   2049  nfs
    100003    4   tcp   2049  nfs
    100003    4   udp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100227    3   udp   2049  nfs_acl

Notez que pour chaque version de nfs (3 ou 4) les deux protocoles (udp et tcp) sont supportés sur le même numéro de port (2049).


Créer les répertoires à exporter
On va créer un répertoires par nœud et deux répertoires d'usage commun.
Le répertoire rpi-fs servira pour le network-boot (DHCP/BOOTP + TFTP)

mkdir -pv /var/nfs/node{01..15} /var/nfs/common /var/nfs/rpi-fs

chown  nfsnobody.nfsnobody        /var/nfs/*
chmod  a=rx,ug+w                  /var/nfs/*


ls –l /var/nfs
drwxrwxr-x 2 nfsnobody nfsnobody  common
drwxrwxr-x 2 nfsnobody nfsnobody  node01
...
drwxrwxr-x 2 nfsnobody nfsnobody  node15

drwxrwxr-x 2 nfsnobody nfsnobody  rpi-fs

Créer la liste des exports


vi /etc/exports

/var/nfs/common 192.168.0.0/24(rw,sync,root_squash,all_squash,no_subtree_check)
/var/nfs/node01 192.168.0.101(rw,sync,root_squash,all_squash,no_subtree_check)
...
/var/nfs/node15 192.168.0.115(rw,sync,root_squash,all_squash,no_subtree_check)
/var/nfs/rpi-fs 192.168.0.0/24(rw,sync,no_root_squash,no_all_squash,no_subtree_check)

Attention : Pas d’espace entre l’IP et la parenthèse ouvrante.
Adapter les noms des nœuds (ici nodexx) et les IP (ici 192.168.0.1xx) à la configuration de votre cluster.
192.168.0.0/24 désigne n’importe quelle machine du réseau 192.168.0.0
L'option no_root_squash pour le partage /var/nfs/rpi-fs utilisé plus tard pour le network boot est importante.


Exporter

exportfs –rav

Vérifier
exportfs -v


NFS v2 

Activer la version 2 de NFS est obligatoire si on veut booter via le réseau. Si ce n'est pas votre but vous pouvez ignorer cette partie.

Normalement la commande
    cat /proc/fs/nfsd/versions
indique avec un '+' les versions acceptées par le serveur nfsd. Par exemple:
   -2 +3 +4 +4.1 +4.2
signifie que la versions 2  n'est pas acceptées par nfsd.

On peut aussi vérifier avec la commande ci-dessous quelles versions sont acceptées :
    rpcinfo -p

Pour booter un Raspberry Pi2 via nfs (network boot) if faut que le serveur nfsd accepte la version 2 de nfs. Pour forcer l'usage de nfsv2 il faut éditer le fichier :
  /etc/sysconfig/nfs
et remplacer la ligne
    RPCNFSDARGS=""
par
    RPCNFSDARGS="-V 2"
et redémarrer nfs avec:
  systemctl restart nfs
  systemctl restart nfs-config

Mais avec nfs il y a tellement de services en jeux que rebooter est plus sûr...

Vous devriez alors obtenir:

cat /proc/fs/nfsd/versions
+2 +3 +4 +4.1 +4.2

et rpcinfo doit montrer
  portmapper en version 2, 3, 4
  mountd en version 1, 2, 3  (c'est bien 1, 2, 3)
  nfs en version 2, 3, 4

2 NFS coté client

Ici on est bien sur un Raspberry (sur celui qui servira à faire la carte SD master).

Installation client NFS  (rasperian)

apt-get install  nfs-common  rpcbind

update-rc.d rpcbind enable
service     rpcbind start


Installation client NFS  (CentOS 7.x)

yum install nfs-utils rcbind

systemctl enable rpcbind
systemctl start  rpcbind


Vérifier l’installation (toute versions)
cat /proc/filesystems | grep nfs
rpcinfo -p            | grep portmap


Tester
Depuis le noeud #10 (qui a l'ip 192.168.0.110) taper
mkdir -pv /mnt/nfs_home /mnt/nfs_common
mount  192.168.0.100:/var/nfs/node10 /mnt/nfs_home
mount  192.168.0.100:/var/nfs/common /mnt/nfs_common

192.168.0.100 est l’ip du serveur NFS (le serveur centos dans notre exemple)
Plus tard ce serveur fera aussi TFTP et éventuellement DHCP.

Si vous essayez de monter un export qui n'existe pas ou qui ne correspond pas votre ip vous obtiendrez ce message d'erreur:
mount.nfs: access denied by server while mounting 192.168.0.100:/var/nfs/node11

Notez que, pendant le temps du montage, le propriétaire des répertoires utilisé pour monter les exports est nobody.nogroup

ls -l /mnt
drwxrwxr-x 2 nobody nogroup     nfs_common
drwxrwxr-x 2 nobody nogroup     nfs_home


A moins que vos programmes s’exécutent en tant que root ou nobody, il faudra certainement faire un chmod o+w  pour écrire dans ces répertoires.

3 Debug NFS

Par défaut NFS n'est pas trés bavard dans les log. Pour avoir plus d'info il faut les demander avec rpcdebug.

  rpcdebug -m nfsd -s all       <-- debuger le serveur
  rpcdebug -m nfs  -s all       <-- debuger le client
  rpcdebug -m rpc  -c all       <-- debug utilisable des deux cotés

  nfsstat --all --list  <-- statistiques du serveur nfs


Aucun commentaire:

Enregistrer un commentaire