Comment exporter et importer correctement des partages NFS qui ont également des sous-répertoires comme points de montage?

21

Le serveur Aexporte le répertoire /srvvia NFS avec option nohide. Un sous - répertoire /srv, /srv/fooest un point de montage pour un autre emplacement sur le serveur NFS en utilisant l' --bindoption, comme

server# mount --bind /bar/foo/ /srv/foo/

Le client l' Bimporte A:/srvet le monte à l' /mnt/srvaide de NFS. Le contenu de /mnt/srvest le contenu de A:/srv.

Le problème est qu'il /mnt/srv/fooest vide, alors que je m'attends à en voir le contenu A:/bar/foo/.

Comment exporter et importer correctement des partages NFS qui ont également des sous-répertoires comme points de montage?

mbaitoff
la source
Peut-être plus facile d'utiliser simplement un lien symbolique sur A à partir de /srv/foo --> /bar/foo?
ckhan
1
J'ai essayé ça. Cela tenterait d'accéder à la /bar/foomachine cliente B, pas au serveur A.
mbaitoff

Réponses:

27

crossmnt est votre ami.

/srv        *(rw,fsid=0,no_subtree_check,crossmnt)
anatoly techtonik
la source
10

J'étais tombé sur ce problème en suivant le guide Diskless Arch , et cela m'a vraiment ralenti. Je vais partager mes conclusions ici, car je suis curieux de savoir si cela fonctionnera pour quelqu'un d'autre.

Selon le guide sans disque, j'ai le système de fichiers racine du client sans disque (les données réelles que j'ai besoin d'exporter) dans une image de bouclage, qui a été montée sur /srv/des1:

/srv/des1.img on /srv/des1 type btrfs (rw,relatime,compress=lzo,discard,space_cache)

J'ai ensuite créé un point de /nfs/des1montage, puis exécuté le montage et confirmé que je peux tout voir:

# mkdir -p /nfs/des1 
# mount --bind /srv/des1 /nfs/des1
# ls -l /nfs/des1
bin  boot  dev  usr  #[SNIP]

En me référant au guide Arch NFS , j'ai ensuite mis les éléments suivants /etc/exportssur le serveur:

/nfs/      *(rw,no_root_squash,no_subtree_check,fsid=root)
/nfs/des1/ *{rw,no_root_squash,no_subtree_check,nohide)

J'ai ensuite exécuté un exportfs -ravsur le serveur pour appliquer ces modifications.

Cependant, j'ai ensuite monté le partage sur le client de test avec: mount server:/des1 /mnt/tmpseulement pour trouver que c'est un répertoire vide, quand je m'attendais à ce que le système de fichiers root sans disque soit là.

À ce stade, j'ai tout essayé jusqu'à ce que quelque chose m'amène à cette option dans la exportspage de manuel:

crossmnt
    This option is similar to nohide but it makes it possible for clients
    to move from the filesystem marked with crossmnt to exported filesystems
    mounted on it. Thus when a child filesystem "B" is mounted on a parent "A",
    setting crossmnt on "A" has the same effect as setting "nohide" on B. 

Donc, après avoir essayé tout le reste, j'ai échangé ceci pour que mon /etc/exportsapparence ressemble à ceci:

/nfs/      *(rw,no_root_squash,no_subtree_check,fsid=root,crossmnt)
/nfs/des1/ *{rw,no_root_squash,no_subtree_check)

Après avoir lu l'entrée de la page de manuel, vous penseriez que cela aurait le même effet que le code précédent, mais quand j'ai couru à exportfs -ravnouveau pour enregistrer les modifications, j'ai ensuite essayé de remonter à partir du client et cela a fonctionné!

v25
la source
8

Il semble que chaque sous-point de montage doit être exporté par le serveur NFS pour être visible pour les clients. Dans la situation ci-dessus, le /etc/exportsfichier devrait ressembler à ceci:

/srv        *(rw,fsid=0,nohide,no_subtree_check)
/srv/foo    *(rw,nohide,no_subtree_check)

Ensuite, l'importation /srvsur le client avec option -t nfsrendra les deux /srvet /srv/foocorrectement disponibles.

éditer par OP

cette ligne

    /srv/foo    *(rw,fsid=0,nohide,no_subtree_check)

a travaillé dans mon cas au lieu de

    /srv/foo    *(rw,nohide,no_subtree_check) 
mbaitoff
la source
1
crossmnt sur la racine?
meffect
2

Je voulais vraiment le faire aussi, mais il semble qu'il y ait des problèmes avec cette idée car les clients NFS s'attendent à ce que le nombre d'inodes de fichiers soit unique dans la vue du client d'un montage unique.

Les problèmes sont détaillés dans cet article de blog (pas par moi): http://utcc.utoronto.ca/~cks/space/blog/unix/MultiFilesystemNFSIssue

J'ai décidé de monter les systèmes de fichiers séparément et de les lier ensemble, ce qui devrait fonctionner pour tous les clients NFS.

Bluby
la source
1
Bien que cela puisse théoriquement répondre à la question, il serait préférable d'inclure ici les parties essentielles de la réponse et de fournir le lien de référence.
slm
0

REMARQUE: un seul utilisateur activé

Ce qu'il ajoute, c'est un ensemble de modifications côté serveur et côté client. Côté serveur /etc/exportset /etc/fstabcôté client.

Du côté serveur

  • Linux Mint 18.3 Sylvia 32 bits
  • Noyau Linux 4.4.0-138-i686 générique
  • Asus eeepc

    $ cat /etc/exports 
    #insert shares (one for each mounted partition sub-folder):      
    /nfsshare/ /192.168.1.155(rw,no_root_squash,no_subtree_check,fsid=root,crossmnt)
    /nfsshare/media/ 192.168.1.155(rw,no_root_squash,no_subtree_check)
    /nfsshare/extra/ /192.168.1.155(rw,no_root_squash,no_subtree_check)   
    
    $ cat /etc/fstab  
    #shared media files on /media/ed/
    /media/ed/ /nfsshare/ nfs bind 0 0
    /media/ed/media/ /nfsshare/media/ nfs bind 0 0
    /media/ed//extra /nfsshare/extra/ nfs bind 0 0
    

Côté client

  • Linux Mint 19 Tara 64 bits
  • Kernel Linux 4.15.0-38-x86_64 générique

    $ cat /etc/fstab
    #NFS Shares line added
    192.168.1.158:/nfsshare /mnt/share nfs rw,soft,intr,noatime,x-gvfs-show
    
Ed Iglehart
la source
1
Qu'est-ce que c'est? S'agit-il d'un seul fichier? Beaucoup de fichiers? Veuillez utiliser les outils de mise en forme pour formater votre réponse pour plus de clarté. Pourriez-vous modifier et expliquer comment votre réponse répond à la question?
terdon
(1) Utilisez vos mots. (2) Qu'est-ce que cette offre qui n'a pas déjà été présentée?
G-Man dit `` Réintègre Monica ''
excuses pour cela.
Ed Iglehart