web-dev-qa-db-fra.com

Comment suivre les liens Symlinks dans NFS?

J'ai des disques différents avec des images

/media/drive1/pictures/
/media/drive2/pictures/
/media/drive3/pictures/
/media/drive4/pictures/
# ...

J'ai un dossier appelé Partager qui a des symboles de symboles pour Tous Sous-fromager de chaque images Répertoire de chaque lecteur. Je fusionne chaque sous-dossier avec un script comme celui-ci:

# I do this for every drive
for item in "/media/drive1/pictures/"*
do
    target=/media/share/pictures/`basename "$item"`
    if [ ! -d "$target" ]; then
        ln -s "$item" "$target"
        chown -h lsc:lsc "$target"
    fi
done

J'ai partagé cela avec succès avec Samba pour un coup d'œil maintenant.

[global]
# ...
follow symlinks = yes

Comme il s'agit d'un réseau privé pur et la part est réadaptée, la sécurité n'est pas une grosse affaire.

### /etc/exports
/media/share *(ro,async)

Quand je mène ma part mount 1.2.3.4:/ foo Les liens symboliques essaient de suivre l'hôte local.

Ma question : Comment puis-je partager un dossier qui suit Symlinks On L'hôte qui partage le mont?

NOTE : le bind bind solution dans /etc/fstab ne fonctionnera pas ici, puisque chaque sous-dossier de /media/share/ pointe vers différents emplacements/disques.

6
Lucas

Cette approche ne fonctionnera pas avec les actions montées NFS. Les liens symboliques contiennent uniquement un chemin d'accès à un autre fichier ou répertoire sur le système d'origine où ils sont partagés. À moins que vous ne preniez soin de créer les liens relatifs ou de dupliquer les mêmes structures de répertoires sur des systèmes distants comme l'initiateur de la part, ils ne fonctionnent tout simplement pas.

Je ne peux penser à aucune méthode qui permettra la structure de répertoire comme vous l'avez décrite via NFS et vous donnera la fonctionnalité que vous recherchez.

Vous voudrez peut-être examiner les fonctionnalités avancées de l'automobile, en particulier cette page intitulée: Définition des options de carte automobile avancées .

Les références

5
slm

Pourquoi ne pouvez-vous pas faire tous les liens symboliques? Cela ferait l'affaire.

En supposant que sur le serveur NFS (1.2.3.4), vous avez le suivi suivant (différents lecteurs physiques possibles)

/media/drive1/pictures/
/media/drive2/pictures/
/media/drive3/pictures/
/media/drive4/pictures/
# ...

Dans le script, changez votre ligne LN de

 ln -s "$item" "$target"

lire

 ln -s "../${item#/media/}" "$target"

Cela créerait vos liens symboliques dans le format de

../drive1/pictures/...

Depuis que vous mentionnez que c'est un réseau privé et une sécurité n'est pas une préoccupation, vous pouvez définir les exportations vers

### /etc/exports
/media *(ro,async)

Puis sur les boîtes client qui montent le NFS

mkdir -p foo; mount 1.2.3.4:/media foo

Dans Foo, vous allez maintenant voir partager, conduire1, drive2, drive3, drive4, ...

Donc, en effet, vous avez monté l'ensemble du répertoire multimédia sur votre client et que les symboles sont relatifs afin qu'ils fonctionnent bien. La quantité de changement nécessaire est assez minimale, la ${item#/media/} Syntaxe peut être supportée ou non être prise en charge par votre version de Bash, tout équivalent ferait (vous pouvez utiliser des commandes SED, AWK ou tout ce que vous connaissez bien pour couper le/le support /).

Le seul problème à gauche est des noms uniques, si vous avez le dossier ou le fichier suivant

/media/drive1/pictures/same_name1
/media/drive2/pictures/same_name1

Le code actuel

if [ ! -d "$target" ]; then
    ln -s "$item" "$target"
    chown -h lsc:lsc "$target"
fi

Sauter la création d'un lien symbolique après la première cible est rencontrée. Vous pouvez donc avoir des fichiers qui manquent des liens sympathiques purement parce que le nom est déjà utilisé dans un autre lecteur.

Vous auriez besoin de modifier votre nom symbolique pour apporter une sorte d'identifiant unique pour ces cas.

if [ -d "$target" ]; then
    #extract out the "drive1" part from $item and prepend it to target 
    target="$(echo item | sed -e 's!/media/\([^/]*\)/pictures.*!\1!g')_${target}"
fi

if [ ! -d "$target" ]; then
    ln -s "$item" "$target"
    chown -h lsc:lsc "$target"
fi
2
forbidder

Vous pouvez faire un montage de type de liaison, c'est mieux que des liens dans de nombreuses situations, dans le fichier FSTAB que vous pouvez mettre:

/source    /dest    none defaults,bind   0   0   
1

Il fonctionne avec les options d'exportation NFS 'Nohide, Crossmnt'

  1. / dev/sdc1 monté sur/partagé
  2. / dev/sdd1 monté sur/partagé/disk2
  3. / etc/exportations a l'option de montage nohide et crossmnt
  4. Maintenant recharger les exportations avec exportsfs -ra

Ref: https://linux.die.net/man/5/exports

1
Seff