Partager des fichiers¶
Vous stockez des données dans votre home directory ou dans l'espace scratch, et vous souhaitez que d'autres usagers du cluster puissent y accéder ? Plusieurs solutions techniques sont possibles, qui nécessitent de maîtriser les droits sur les systèmes de fichiers Linux (niveau : intermédiaire), ou les listes de contrôle d'accès (ACL) sur NFS v4 (niveau : avancé)
Dans les exemples suivants, on suppose qu'on voudra autoriser l'accès au dossier $HOME/projet/
Alternative 1 : donner accès à tout le monde (droits UNIX)¶
Pour :
Inconvénient :
- Etes-vous certains que vos données ont vocation à être publiques ?
- Il faudra donner un accès à votre home directory ou votre espace scratch : donc pour garder le reste des données protégées, vous devrez vérifier que les autres données sont bien protégées
Voir l'exempleVoir l'exemple
Par la pratique
# Etape 1 : on autorise tout le monde à "traverser" le home directory
# Sans cela, les personnes ne peuvent pas "traverser" $HOME pour atteindre $HOME/projet
chmod a+x $HOME
# Etape 2 : on donne accès aux données existantes, en lecture seule
# Il faut ajouter :
# un droit de lecture (r) sur tous les fichiers existants,
# un droit lecture (r) sur les dossiers pour lister les fichiers,
# un droit de "traverser" (x) les dossiers dossier.
# On utilise la commande "find" pour ajouter les droits de façon sélective sur les fichiers ou les dossiers
find $HOME/projet -type f -exec chmod a+r {} \;
find $HOME/projet -type d -exec chmod a+rx {} \;
# A ce stade, tous les autres usagers pourront faire un "cd /home/MON_LOGIN/projet"
# Attention, ils devront connaître le chemin exact, car mon home n'est pas lisible, ils ne peuvent pas lister le contenu
Alternative 2 : donner accès à un groupe (droits UNIX)¶
C'est une variante de ce qui précède. On utilise un groupe UNIX pour donner des droits spécifiquement à ce groupe.
Pour :
Inconvénient :
- Un groupe UNIX avec les membres autorisés doit exister au préalable (et vous n'avez pas la capacité de créer des groupes)
Voir l'exempleVoir l'exemple
Par la pratique
# Etape 1 : je liste les groupe dont je fais parti
id
# Etape 1 : on autorise tout le monde à "traverser" le home directory
# Sans cela, les personnes ne peuvent pas "traverser" $HOME pour atteindre $HOME/projet
chmod a+x $HOME
# Etape 2 : on change le groupe propriétaire du sous-dossier "projet/"
# On suppose ici qu'il existe un groupe "GROUPE_X" dont je fais partie ainsi que tous les usagers concernés
chgrp -R GROUPE_X $HOME/projet
# Etape 3 : on donne accès aux données existantes, en lecture seule, au groupe
# Il faut ajouter :
# un droit de lecture (r) sur tous les fichiers existants,
# un droit lecture (r) sur les dossiers pour lister les fichiers,
# un droit de "traverser" (x) les dossiers dossier.
# On utilise la commande "find" pour ajouter les droits de façon sélective sur les fichiers ou les dossiers
find $HOME/projet -type f -exec chmod g+r {} \;
find $HOME/projet -type d -exec chmod g+rx {} \;
# Etape 4 : on s'assure que tous les nouveaux fichiers créés seront rattachés au groupe GROUPE_X
find $HOME/projet -type d -exec chmod g+s {} \;
# A ce stade, tous les usagers de "GROUPE_X" pourront faire un "cd /home/MON_LOGIN/projet"
# Attention, ils devront connaître le chemin exact, car mon home n'est pas lisible, ils ne peuvent pas lister le contenu
Alternative 3 : donner accès à un usager (via les ACL)¶
On utilise ici un mécanisme d'autorisation différent, basé sur les ACL. Attention, suivant l'espace de données, on va utiliser :
- les ACL UNIX "classiques" pour la partie scratch
- les ACL NVS v4 pour la partie home
Pour :
- Solution "granulaire", on peut donner accès à un usager très précisément
Inconvénient :
Voir l'exemple pour un accès à votre "home directory"Voir l'exemple pour un accès à votre "home directory"
Par la pratique - On suppose ici qu'on veut donner accès à l'utilisateur dont le login est "mon_collegue
", à un sous-dossier nommé projet
situé directement dans votre home directory
# Etape 1 : on autorise mon_collegue à "traverser" le home directory
nfs4_setfacl -a A::mon_collegue@localdomain:X $HOME
# Etape 2 : on donne accès aux données existantes, en lecture seule
# On utilise la commande "find" pour ajouter les droits de façon sélective sur les fichiers ou les dossiers
find $HOME/projet -type f -exec nfs4_setfacl -a A::mon_collegue@localdomain:R {} \;
find $HOME/projet -type d -exec nfs4_setfacl -a A::mon_collegue@localdomain:RX {} \;
La manipulation des ACL NFS v4 n'est pas forcément facile. Vous pouvez ensuite utiliser :
nfs4_getfacl
pour lister une ACL
nfs4_editfacl
pour éditer dans un fichier l'ensemble de l'ACL
nfs4_getfacl -x ....
pour retirer une entrée d'ACL - Attention, il faut reprendre l'entrée telle que rapportée par nfs4_getfacl
, qui rapporte les usagers sous forme numérique !
Voir l'exemple pour un accès à votre espace scratchVoir l'exemple pour un accès à votre espace scratch
Par la pratique - On suppose ici qu'on veut donner accès à l'utilisateur dont le login est "mon_collegue
", à un sous-dossier nommé projet
situé directement dans votre espace scratch.
Notez que le pseudo-dossier (lien symbolique) nommé scratch
présent dans votre home directory pointe vers un dossier sous /nfs/scratch/<LOGIN>
# Etape 1 : on autorise mon_collegue à "traverser" le dossier parent de l'espace scratch
setfacl -m mon_collegue:rx /nfs/scratch/$USER
# Etape 2 : on donne accès aux données existantes, en lecture seule
# On utilise la commande "find" pour ajouter les droits de façon sélective sur les fichiers ou les dossiers
find $HOME/scratch/projet -type f -exec setfacl -m mon_collegue:r {} \;
find $HOME/scratch/projet -type d -exec setfacl -m mon_collegue:rx {} \;
# Etape 3 : on positionne des droits par défaut pour les nouveaux fichiers créés
setfacl -R -d -m mon_collegue:rx $HOME/scratch/projet
La manipulation des ACL n'est pas forcément facile. Vous pouvez ensuite utiliser :
getfacl
pour lister une ACL
setfacl -x mon_collegue FICHIER_OU_DOSSIER
pour retirer une entrée d'ACL de mon_collegue
setfacl -R -b DOSSIER
pour retirer toutes les ACL sur un dossier et son contenu (option -R
: récursive)