Oracle 12c : Service CRS de montage des partages NFS

1. Contexte

Dans un contexte clusters (Oracle RAC 11g), si vous étiez intéressés par automatiser vos montages NFS grâce à un service du clusterware Oracle, alors sachez qu’Oracle propose un service dédié nommé mountfs dans les nouveautés de la version 12c.
Le besoin se fait sentir lorsque ces partages NFS sont dédiés à Oracle, par exemple pour héberger les binaires du clusterware et ceux du RAC, ou encore les fichiers des bases Oracle ainsi que les sauvegardes, et que ces partages proviennent de NAS certifiés par Oracle.

Avant la 12c :

En effet, dans la version 11g, il est déjà possible de créer un service du clusterware pour monter et démonter les partages NFS automatiquement au démarrage et à l’arrêt du système.
Malheureusement, ce service présente quelques désavantages par rapport au nouveau service de la 12c :
Il nécessite de maintenir sur chacun des nœuds, un script shell similaire à ceux du démarrage des services du système d’exploitation ! Par exemple sur un serveur Linux, ce sera un script du même type que ceux de /etc/init.d qui acceptera en argument start stop status etc. Donc un risque d’erreur dans la maintenance de ce script.
De plus, dans mon cas, le script s’appuyait sur un fichier de configuration maison décrivant la liste des partages NFS à monter. Là encore, ce fichier nécessitait d’être déployé sur chacun des nœuds. Imaginez le nombre de sources d’erreurs possibles dans une architecture Exadata composée de 4 clusters de 4 nœuds chaque, soit 16 serveurs Linux.
Et surtout, c’était du tout ou rien, c’est à dire montage de tous les partages ou aucun montage !

Depuis la 12c :

Avec la 12c, il est possible de créer autant de services que de partages, avec la possibilité de les arrêter les uns indépendamment des autres, et même d’associer des options spécifiques à certains points de montage : par exemple, passer la taille des blocs en lecture/écriture à 64k (par défaut elle est de 32k).
De plus, les options par défaut des montages NFS de la 12c sont celles les plus couramment utilisées : nfs v3, nointr, actimeo=0, etc. Pour mémoire, actimeo=0 désactive l’utilisation du cache client NFS, attribute_caching.
Et enfin, plus besoin de script d’arrêt/démarrage !
Petite contrainte : être root pour créer ces services (disons que mes premiers essais avec le compte grid n’ont pas abouti). Bien que la documentation indique pour chaque commande srvctl s’il est nécessaire d’être root «For some SRVCTL commands, on Linux and UNIX systems, you must be logged in as root», elle ne le précise pas pour "srvctl add mountfs". Néanmoins, au regard de la fonctionnalité, le compte root paraît le plus approprié.

2. Analyse de la configuration du service 11g

L’ancien service nommé nfs_mount dans cet article, indique dans sa configuration le nom du script qui sera lancé pour réaliser les montages NFS. Il a été nommé mount-nfs.sh dans cet exemple, et il ne s’appuie pas sur les fichiers de configuration par défaut du DirectNFS d’Oracle comme $ORACLE_HOME/dbs/oranfstab ou encore /etc/oranfstab, mais sur un fichier spécifique.
Notez que déjà en version 11g, en lieu et place du client NFS fourni par votre système Linux, il est possible de configurer le client NFS d’Oracle nommé « Direct NFS » pour l’accès NFS à vos serveurs de partage.
Les options de montage sont listées dans une variable au début du script et imposent, par là même, d’être communes à tous les montages : MOUNT_OPTIONS="rw,bg,hard,nointr,rsize=32768,wsize=32768,tcp,actimeo=0,vers=3,timeo=600,nolock"
ATTENTION : Parmi ces options, notez que l’option nolock avait été positionnée, ce qui n’est évidemment pas souhaitable. Il y a quelques années, cette option était indispensable lorsque les partages étaient exportés par de très anciennes versions de NFS (côté serveur NFS donc). Par conséquent, il est donc logique que le service nfslock ne soit pas lancé :

[oracle@c1node01 ~]$ service nfslock status
 rpc.statd is stopped

…et qu’il le soit automatiquement dès que les montages sans l’option seront créés avec le service de la 12c.
Vous pourrez alors le constater comme ci-dessous :

[root@c1node01 ~]# service nfslock status
 rpc.statd (pid  18555) is running

Parmi les « Local Resources », la commande crsctl affichait notre service nfs_mount :

[root@c1node01 ~]# /u01/app/12.1.0.2/grid/bin/crsctl  status resource -t
Name          Target  State        Server             State details
nfs_mount
              ONLINE  ONLINE       c1node01             STABLE
              ONLINE  ONLINE       c1node02             STABLE
              ONLINE  ONLINE       c1node03             STABLE
              ONLINE  ONLINE       c1node04             STABLE

Et voici la configuration détaillée de la ressource nfs_mount. Notez l’emplacement du script mount-nfs.sh ainsi que les valeurs des TIMEOUT, des ACL ou encore les dépendances :

[oracle@c1node01 ~]$ /u01/app/12.1.0.2/grid/bin/crsctl status resource nfs_mount -f
 NAME=nfs_mount
 TYPE=ora.local_resource.type
 STATE=OFFLINE
 TARGET=ONLINE
 ACL=owner:root:rwx,pgrp:root:r-x,other::r--,user:grid:rwx
 ACTIONS=
 ACTION_SCRIPT=/u01/app/12.1.0.2/grid/crs/script/mount-nfs.sh
 ACTION_TIMEOUT=60
 AGENT_FILENAME=%CRS_HOME%/bin/scriptagent
 AUTO_START=restore
 CHECK_INTERVAL=30
 CHECK_TIMEOUT=0
 CLEAN_TIMEOUT=60
 DEGREE=1
 DELETE_TIMEOUT=60
 DESCRIPTION=NFS resource
 ENABLED=1
 ID=nfs_mount
 INSTANCE_COUNT=4
 INSTANCE_FAILOVER=1
 INTERMEDIATE_TIMEOUT=0
 LOAD=1
 LOGGING_LEVEL=1
 MODIFY_TIMEOUT=60
 NLS_LANG=
 OFFLINE_CHECK_INTERVAL=0
 RESTART_ATTEMPTS=5
 SCRIPT_TIMEOUT=300
 SERVER_CATEGORY=
 START_CONCURRENCY=0
 START_DEPENDENCIES=hard(ora.asm)
 START_TIMEOUT=0
 STOP_CONCURRENCY=0
 STOP_DEPENDENCIES=hard(ora.asm)
 STOP_TIMEOUT=0
 TYPE_VERSION=1.1
 UPTIME_THRESHOLD=1d
 USER_WORKLOAD=no
 USR_ORA_ENV=
 VERSION=

3. Commenter les montages actuels

En préambule à la création des services de montage 12c (détaillée dans un script fourni à la fin de cet article), il est préférable de commenter la liste des partages actuels dans vos fichiers de configuration d’origine sur chacun des nœuds (communément par l’ajout du symbole # devant chaque ligne).
Pour vous assurer de ne pas oublier un nœud du cluster et vous garantir un retour arrière rapide, les commandes ci-après vont réaliser les étapes suivantes :

  • Sauvegarde des fichiers de configuration oranfstab ou équivalent avant de commenter les montages
  • Passage des montages actuels en commentaires avec un éditeur
  • Recopie du fichier de configuration commenté du 1er nœud sur les autres
  • Et enfin vérification qu’il n’y a pas de différence entre les fichiers sur chacun des nœuds.

En admettant que vos fichiers de configuration oranfstab soient situés sous /etc, pour un cluster Linux composé de 4 nœuds dont le nommage est codifié et se termine par un numéro d’ordre sur deux chiffres comme par exemple c1node01, les commandes suivantes devront être lancées sous le shell de votre premier nœud (il vous faudra probablement les adapter à votre environnement) :

export SERVEUR=$(hostname)   ;  SERVEUR=${SERVEUR/0*/0}   # Récupérer le nom du nœud et y supprimer le dernier chiffre
for serveur in "$SERVEUR"{2,3,4}   ; do      ssh "$serveur"  "mv -iv  /etc/oranfstab  /etc/oranfstab.old"    ; done   # pour chacun des nœuds 2, 3 et 4, renommer le fichier de config
vim    /etc/oranfstab   # préfixer chaque ligne d'export NFS par un dièse
for serveur in "$SERVEUR"{2,3,4}   ; do      scp -p  /etc/oranfstab    "$serveur":/etc/   ; done   # recopie du fichier de config
for serveur in "$SERVEUR"{1,2,3,4} ; do      ssh "$serveur"  "echo -e '\n~~~~~~~~~~~~~~\n ' "$serveur" ;  cat /etc/oranfstab " |  diff  -  /etc/oranfstab  ; done   # comparaison des fichiers de config de chaque nœud 

Pour identifier facilement les options de montage actuelles avant l’opération, la commande suivante va permettre de les mettre en évidence pour les différencier visuellement :

[root@c1node01 ~]# mount | grep nfs | awk -F'type nfs' '{ print $2 "\t" $1}'
(rw,bg,hard,nointr,rsize=32768,wsize=32768,tcp,actimeo=0,vers=3,timeo=600,nolock,addr=10.1.7.30)   svm-easyteam.fr:/HVVP_oracle_p1 on /nas/echange/p1/oracle
(rw,bg,hard,nointr,rsize=32768,wsize=32768,tcp,actimeo=0,vers=3,timeo=600,nolock,addr=10.1.7.30)   svm-easyteam.fr:/HVVP_oracle_p2 on /nas/echange/p2/oracle
(rw,bg,hard,nointr,rsize=32768,wsize=32768,tcp,actimeo=0,vers=3,timeo=600,nolock,addr=10.1.7.27)   svm-easyteam.fr:/HVVR_ECH/r1/oracle on /nas/echange/r1/oracle
(rw,bg,hard,nointr,rsize=32768,wsize=32768,tcp,actimeo=0,vers=3,timeo=600,nolock,addr=10.1.7.27)   svm-easyteam.fr:/HVVR_ECH/r2/oracle on /nas/echange/r2/oracle
(rw,bg,hard,nointr,rsize=32768,wsize=32768,tcp,actimeo=0,vers=3,timeo=600,nolock,addr=10.1.7.27)   svm-easyteam.fr:/HVVR_ECH/r3/oracle on /nas/echange/r3/oracle

4. Création des services de montage des partages NFS

La création d’un service 12c de montage des partages NFS se fera très simplement grâce à la commande :

srvctl add mountfs : Adds Network Attached Storage (NAS) configuration to Oracle Clusterware
  • Avant de continuer, vérifiez tout d’abord que les anciens partages ne sont pas utilisés par qui que ce soit sur aucun des nœuds. La commande lsof reste assez efficace en la matière. Pour s’en convaincre, il suffira, à partir d’une autre session sur un autre nœud, de faire un cd dans un des répertoires d’un des partages, ou encore un less sur un fichier d’un partage.
  • Si les partages ne sont pas en cours d’utilisation, vous pouvez alors lancer la création du nouveau service de partage
  • Puis démontez les anciens partages sur chacun des nœuds
  • Si les anciens partages sont bien démontés, alors lancez le nouveau service de partage

Vous trouverez, à la fin de cet article, ces différentes opérations automatisées pour plusieurs partages NetApp dans un script dénommé srvctl.nfs.service_mountfs.bash. À différentes reprises, ce script s’appuie sur une commande dcli fournie en standard par Oracle et bien utile lorsqu’il est nécessaire de lancer une même commande shell sur une liste de nœuds. L’option -g permet de préciser le nom d’un fichier contenant la liste des nœuds concernés. Pensez donc à préparer ce fichier au préalable.
Parmi les options de la commande srvctl add mountfs, notez plus particulièrement l’option -user qui permet d’autoriser un utilisateur à monter ou démonter le partage NAS. La commande est décrite dans le guide Clustering d’Oracle nommé Clusterware Administration and Deployment Guide.
À posteriori, il est toujours possible de modifier le service pour habiliter un utilisateur par une commande du type :

# srvctl modify mountfs -name mountfs_name   -user nom_utilisateur_à_habiliter

5. Contrôles

Une fois vos nouveaux services mountfs créés, différents contrôles sont possibles :

  • En premier lieu, vérifiez l’accès aux partages en listant le contenu de chacun d’eux, ou encore par la lecture de quelques uns de leurs fichiers
  • La commande mount permet entre autres de lister les partages et leurs options de montage (cf. l’exemple à la fin du point 3 de cet article)
  • La commande crsctl status resource -t renvoie la liste des ressources
  • La commande crsctl status resource service_nfs -f permet d’obtenir les caractéristiques détaillées d’un montage NFS
  • La commande srvctl config mountfs permet d’obtenir les caractéristiques de chacun des montages NFS

Exemples :

[oracle@c1node01 ~]$ crs_status mount
Resource Name             Resource Type    Target     State        Node            FC RC State Details
------------------------- ---------------- ---------- ------------ --------------- -- -- ---------------
Local Resources
-------------------------------------------------------------
ora.echange_p1.mount      mount          L ONLINE     ONLINE       c1node01     0  0 mounted on /nas/echange/p1/oracle
ora.echange_p1.mount      mount          L ONLINE     ONLINE       c1node02     0  0 mounted on /nas/echange/p1/oracle
ora.echange_p1.mount      mount          L ONLINE     ONLINE       c1node03     0  0 mounted on /nas/echange/p1/oracle
ora.echange_p1.mount      mount          L ONLINE     ONLINE       c1node04     0  0 mounted on /nas/echange/p1/oracle
ora.echange_p2.mount      mount          L ONLINE     ONLINE       c1node01     0  0 mounted on /nas/echange/p2/oracle
ora.echange_p2.mount      mount          L ONLINE     ONLINE       c1node02     0  0 mounted on /nas/echange/p2/oracle
ora.echange_p2.mount      mount          L ONLINE     ONLINE       c1node03     0  0 mounted on /nas/echange/p2/oracle
ora.echange_p2.mount      mount          L ONLINE     ONLINE       c1node04     0  0 mounted on /nas/echange/p2/oracle
ora.echange_r1.mount      mount          L ONLINE     ONLINE       c1node01     0  0 mounted on /nas/echange/r1/oracle
ora.echange_r1.mount      mount          L ONLINE     ONLINE       c1node02     0  0 mounted on /nas/echange/r1/oracle
ora.echange_r1.mount      mount          L ONLINE     ONLINE       c1node03     0  0 mounted on /nas/echange/r1/oracle
ora.echange_r1.mount      mount          L ONLINE     ONLINE       c1node04     0  0 mounted on /nas/echange/r1/oracle
ora.echange_r2.mount      mount          L ONLINE     ONLINE       c1node01     0  0 mounted on /nas/echange/r2/oracle
ora.echange_r2.mount      mount          L ONLINE     ONLINE       c1node02     0  0 mounted on /nas/echange/r2/oracle
ora.echange_r2.mount      mount          L ONLINE     ONLINE       c1node03     0  0 mounted on /nas/echange/r2/oracle
ora.echange_r2.mount      mount          L ONLINE     ONLINE       c1node04     0  0 mounted on /nas/echange/r2/oracle
ora.echange_r3.mount      mount          L ONLINE     ONLINE       c1node01     0  0 mounted on /nas/echange/r3/oracle
ora.echange_r3.mount      mount          L ONLINE     ONLINE       c1node02     0  0 mounted on /nas/echange/r3/oracle
ora.echange_r3.mount      mount          L ONLINE     ONLINE       c1node03     0  0 mounted on /nas/echange/r3/oracle
ora.echange_r3.mount      mount          L ONLINE     ONLINE       c1node04     0  0 mounted on /nas/echange/r3/oracle
Cluster Resources
-------------------------------------------------------------
[oracle@c1node01 ~]$ /u01/app/12.1.0.2/grid/bin/crsctl status resource ora.echange_p2.mount  -f
NAME=ora.echange_p2.mount
TYPE=ora.mount.type
STATE=ONLINE
TARGET=ONLINE
ACL=owner:root:rwx,pgrp:oinstall:r-x,other::r--,user:grid:rwx
ACTIONS=
ACTION_SCRIPT=
ACTION_TIMEOUT=60
AGENT_FILENAME=%CRS_HOME%/bin/orarootagent%CRS_EXE_SUFFIX%
AUTO_START=restore
CHECK_INTERVAL=5
CHECK_TIMEOUT=120
CLEAN_TIMEOUT=60
DEGREE=1
DELETE_TIMEOUT=60
DESCRIPTION=CRS resource type for Network File System
ENABLED=1
EXPORT_PATH=/HVVP_oracle_p2
EXPORT_SERVER=svm-easyteam.fr
FS_DESCRIPTION=
FS_OPTIONS=
GH_CREATED=0
ID=ora.echange_p2.mount
INSTANCE_COUNT=4
INSTANCE_FAILOVER=1
INTERMEDIATE_TIMEOUT=0
INTERNAL_MOUNTPOINT_PATH=/nas/echange/p2/oracle
LOAD=1
LOGGING_LEVEL=1
MODIFY_TIMEOUT=60
MOUNTPOINT_PATH=/nas/echange/p2/oracle
MOUNT_TYPE=NFS
NLS_LANG=
OFFLINE_CHECK_INTERVAL=5
RESTART_ATTEMPTS=5
SCRIPT_TIMEOUT=60
SERVER_CATEGORY=
START_CONCURRENCY=0
START_DEPENDENCIES=
START_TIMEOUT=500
STOP_CONCURRENCY=0
STOP_DEPENDENCIES=
STOP_TIMEOUT=120
TYPE_VERSION=1.1
UPTIME_THRESHOLD=1d
USER_WORKLOAD=no
USR_ORA_ENV=

Pour afficher la liste des ressources crs de type mountfs :

/u01/app/12.1.0.2/grid/bin/srvctl config mountfs |  awk '$1  ~ "Name:" { printf "# --------------\n%s\n",$0}
                                                         $1 !~ "Name:" { print $0 }'
# --------------
 Name: echange_r1
 Mount point path: /nas/echange/r1/oracle
 Mount options:
 Export server: svm-easyteam.fr
 Export path: /HVVR_ECH/r1/oracle
 Type: NFS
 User: grid
 Network Attached Storage echange_r1 is enabled.
 Network Attached Storage is individually enabled on nodes:
 Network Attached Storage is individually disabled on nodes:
 # --------------
 Name: echange_r2
 Mount point path: /nas/echange/r2/oracle
 Mount options:
 Export server: svm-easyteam.fr
 Export path: /HVVR_ECH/r2/oracle
 Type: NFS
 User: grid
 Network Attached Storage echange_r2 is enabled.
 Network Attached Storage is individually enabled on nodes:
 Network Attached Storage is individually disabled on nodes:
 # --------------
 etc.

Ci-dessous, un petite boucle qui vous permettra de comparer les montages de tous les filesystems de chacun des nœuds avec ceux du serveur local

echo -e "\n Préférer un lancement à partir du nœud 1 (noter que les différences portent essentiellement sur le type de FS, ext3/ext4)"
export SERVEUR=$(hostname) ; SERVEUR=${SERVEUR/node0*/node0}
for serveur in "$SERVEUR"{1,2,3,4}
do
   ssh "$serveur" "echo -e '\n~~~~~~~~~~~~~~\n ' "$serveur" ; mount " | sort > /tmp/mount."$serveur".$(date '+%Y-%m-%d_%HH')
   echo -e "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\nDiff avec le fichier /tmp/mount.$serveur.$(date '+%Y-%m-%d').sed ...\c"
   sed 's/tcp,.*$//' /tmp/mount."$serveur".$(date '+%Y-%m-%d_%HH') > /tmp/mount."$serveur".$(date '+%Y-%m-%d').sed
   diff /tmp/mount."$serveur".$(date '+%Y-%m-%d').sed /tmp/mount."$SERVEUR"1.$(date '+%Y-%m-%d').sed
done

6. Suppression de l’ancien service nfs_mount

Si tout semble correct après avoir contrôlé l’accès au contenu des partages, supprimez les anciens services NFS 11g (service crs nfs_mount dans cet article) :

/u01/app/12.1.0.2/grid/bin/crsctl delete resource   nfs_mount  -f
/u01/app/12.1.0.2/grid/bin/crsctl status resource   nfs_mount  -f   # pour vérifier

7. ANNEXES

  • Extrait d’une note MOS précisant la liste des options de montage en fonction de la vocation du Filesystem : Mount Options for Oracle files for RAC databases and Clusterware when used with NFS on NAS devices (Doc ID 359515.1)
Operating System Mount options for Binaries ## Mount options for Oracle Datafiles Mount options for CRS Voting Disk and OCR
Linux x86-64 #****
for Linux kernels 2.6
rw,bg,hard,nointr,rsize=32768,
wsize=32768,tcp,vers=3,
timeo=600, actimeo=0
rw,bg,hard,nointr,rsize=32768,
wsize=32768,tcp,actimeo=0,
vers=3,timeo=600
rw,bg,hard,nointr,rsize=32768,
wsize=32768,tcp,noac,vers=3,
timeo=600,actimeo=0
  • Scripts de lancement/arrêt des services de montage NFS :

Ci-dessous vous trouverez deux jeux de commandes qui vous permettront de créer deux scripts, l’un pour le lancement de tous les montages NFS, l’autre pour l’arrêt.

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Lancement des services de montage NFS
# ---------------------------
for partage in r1 r2 r3 p1 p2
do
   echo -e "\n $partage : start du service ...\c"
   /u01/app/12.1.0.2/grid/bin/srvctl start mountfs -name echange_"$partage"
done
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Arrêt des services de montages NFS
# ---------------------------
# syntaxe : srvctl stop mountfs -name mountfs_name [-node node_list] [-force]
for partage in r1 r2 r3 p1 p2
do
   echo -e "\n $partage : stop du service ...\c"
   /u01/app/12.1.0.2/grid/bin/srvctl stop mountfs -name echange_"$partage"
done
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  • Le script de création /root/bin/srvctl.nfs.service_mountfs.bash :
#! /bin/bash
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Nom           : /root/bin/srvctl.nfs.service_mountfs.bash
# Description   : Création des services CRS de montage NFS
# Auteur        : O. FELINUX
# Date création : 10/03/2017
# Révision      : 1.00
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Pré-requis : - sauvegarde des fichiers de config nfstab avant de commenter les montages,
#              - puis recopie de ce fichier de config version commentée (à effectuer manuellement) du 1er nœud sur les autres,
#              - et enfin vérif.
# Do not use CRSCTL commands on any resources that have names prefixed with ora (because these are Oracle resources), unless My Oracle Support directs you to do so.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
export SERVEUR=$(hostname)   ;  SERVEUR=${SERVEUR/node0*/node0}
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Dans chacune des boucles for suivantes, la commande dcli lance sur chaque nœud un "list open files"
#      sur le partage actuel pour s'assurer qu'il n'est pas utilisé. Il est alors nécessaire de taper
#      O ou N pour réaliser ou non le démontage du partage et la création de son remplaçant.
#      Deux boucles ont été nécessaires car ici le nommage des exportpath est différent entre recette et prod
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
for partage in r1 r2 r3
do
    echo -e "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n $partage : lsof ...\c"
    dcli -g ~/dbs_group -l root -t "lsof  /nas/echange/$partage/oracle"
    echo -e "\n\n Continuer ?   [O/N]\r\c"
    echo -e     " Continuer ? \c"
    read reponse
    if [[ "$reponse" == [Oo] ]]
    then
        echo -e "\n $partage : création du service ...\c"
        /u01/app/12.1.0.2/grid/bin/srvctl add   mountfs -name echange_"$partage"   -path /nas/echange/"$partage"/oracle   -exportserver svm-easyteam.fr  -exportpath /HVVR_ECH/"$partage"/oracle
        echo -e "\n $partage : umount...\c"
        if dcli -g ~/dbs_group -l root -t "umount /nas/echange/$partage/oracle"
        then
           echo -e "ok "
           echo -e "\n $partage : start du service ...\c"
           /u01/app/12.1.0.2/grid/bin/srvctl start mountfs -name echange_"$partage"
        else
           echo -e "PROBLEME umount sur l'un des nodes"
        fi
    fi
done
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
for partage in p1 p2
do
    echo -e "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n $partage : lsof ...\c"
    dcli -g ~/dbs_group -l root -t "lsof  /nas/echange/$partage/oracle"
    echo -e "\n\n Continuer ?   [O/N]\r\c"
    echo -e     " Continuer ? \c"
    read reponse
    if [[ "$reponse" == [Oo] ]]
    then
        echo -e "\n $partage : création du service ...\c"
        case "$partage" in
             p1)
                  /u01/app/12.1.0.2/grid/bin/srvctl add   mountfs -name echange_"$partage"   -path /nas/echange/"$partage"/oracle   -exportserver svm-easyteam.fr  -exportpath /HVVP_oracle_"$partage"
                  ;;
             p2)
                  /u01/app/12.1.0.2/grid/bin/srvctl add   mountfs -name echange_"$partage"       -path /nas/echange/"$partage"/oracle   -exportserver svm-easyteam.fr  -exportpath /HVVP_oracle_"$partage"/read_only
                  ;;
             *)
                  echo -e "ERREUR : $partage nom de partage inconnu, désolé"
                  ;;
        esac
        echo -e "\n $partage : umount...\c"
        if dcli -g ~/dbs_group -l root -t "umount /nas/echange/$partage/oracle"
        then
           echo -e "ok "
           echo -e "\n $partage : start du service ...\c"
           /u01/app/12.1.0.2/grid/bin/srvctl start mountfs -name echange_"$partage"
        else
           echo -e "PROBLEME umount sur l'un des nodes"
        fi
    fi
done
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo -e "\n\n Fin de la créations des services, terminer par un petit check ?   [O/N]\r\c"
echo -e     " Fin de la créations des services, terminer par un petit check ? \c"
read reponse
if [[ "$reponse" != [Oo] ]]
then
    echo -e "Sortie du script sans vérif, snif"
    exit 1
fi
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Liste des services des montages NFS
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo -e "\n# --------------\n Liste des services des montages NFS"
/u01/app/12.1.0.2/grid/bin/srvctl config mountfs | awk '$1  ~ "Name:"  { printf "# --------------\n%s\n",$0}
                                                        $1 !~ "Name:"  { print $0 }'
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Proposition de la suppression du service nfs_mount
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo -e "\n Si tout semble correct (vérifier l'accès au contenu des partages), alors penser à supprimer le service nfs_mount"
echo -e   "    avec la commande suivante : /u01/app/12.1.0.2/grid/bin/crsctl delete resource   nfs_mount  -f"
echo -e   "    puis vérifier avec        : /u01/app/12.1.0.2/grid/bin/crsctl status resource   nfs_mount  -f"
exit 0
# option nolock : au cas où, si besoin (normalement inutile et à proscrire si les partages ont été créés à partir de versions récentes de NFS)
#    /u01/app/12.1.0.2/grid/bin/srvctl modify   mountfs -name echange_r1    -mountoptions "nolock"
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~
# FIN /root/bin/srvctl.nfs.service_mountfs.bash
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~