¿Cómo exportar e importar correctamente recursos compartidos NFS que tienen subdirectorios como puntos de montaje también?

21

El servidor Aexporta el directorio a /srvtravés de NFS con la opción nohide. Un subdirectorio dentro de /srv, /srv/fooes un punto de montaje para otra ubicación en el servidor NFS usando la --bindopción, como

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

El cliente lo Bimporta A:/srvy lo monta /mnt/srvusando NFS. Los contenidos de /mnt/srvson los contenidos de A:/srv.

El problema es que /mnt/srv/fooestá vacío, mientras espero ver el contenido de A:/bar/foo/allí.

¿Cómo exportar e importar correctamente recursos compartidos NFS que tienen subdirectorios como puntos de montaje también?

mbaitoff
fuente
¿Quizás es más fácil usar el enlace simbólico en A desde /srv/foo --> /bar/foo?
ckhan
1
Intenté esto Esto intentaría llegar a la /bar/foomáquina del cliente B, no al servidor A.
mbaitoff

Respuestas:

27

crossmnt es tu amigo.

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

Me había tropezado con este problema mientras seguía la guía Diskless Arch , y realmente me detuvo. Voy a compartir mis hallazgos aquí, ya que tengo curiosidad por saber si esto funcionará para alguien más.

Según la guía Diskless, tengo el sistema de archivos raíz del cliente sin disco (los datos reales que necesito exportar) en una imagen de bucle invertido, que se ha montado en /srv/des1:

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

Luego creé un punto de montaje, /nfs/des1luego ejecuté el montaje y confirmo que puedo ver todo:

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

Refiriéndome a la guía Arch NFS , pongo lo siguiente en /etc/exportsel servidor:

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

Luego ejecuté un exportfs -raven el servidor para aplicar estos cambios.

Sin embargo, luego monté el recurso compartido en el cliente de prueba con: mount server:/des1 /mnt/tmpsolo para encontrar que es un directorio vacío, cuando esperaba que el sistema de archivos raíz sin disco estuviera allí.

En esta etapa, probé casi todo hasta que algo me llevó a esta opción en la exportspágina de manual:

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. 

Entonces, después de haber intentado todo lo demás, cambié esto para que se /etc/exportsviera así:

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

Después de leer la entrada de la página de manual, pensaría que esto tendría el mismo efecto que el código anterior, pero cuando corrí exportfs -ravnuevamente para registrar los cambios, ¡intenté volver a montarlo desde el cliente y funcionó!

v25
fuente
8

Parece que todos los subpuntos de montaje deben ser exportados por el servidor NFS para que los clientes puedan verlos. En la situación anterior, el /etc/exportsarchivo debería tener el siguiente aspecto:

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

A continuación, la importación /srven el cliente con opción -t nfshará que tanto /srvy /srv/fooadecuadamente disponible.

editar por OP

esta línea

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

ha trabajado en mi caso en lugar de

    /srv/foo    *(rw,nohide,no_subtree_check) 
mbaitoff
fuente
1
crossmnt en la raíz?
meffect
2

Realmente quería hacer esto también, pero parece que hay problemas con esta idea porque los clientes NFS esperan que los números de inodo de archivos sean únicos dentro de la vista del cliente de un solo montaje.

Los problemas se detallan en esta publicación de blog (no por mí): http://utcc.utoronto.ca/~cks/space/blog/unix/MultiFilesystemNFSIssue

Decidí montar los sistemas de archivos por separado y vincularlos juntos, lo que debería funcionar para todos los clientes NFS.

Bluby
fuente
1
Si bien esto puede responder teóricamente la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace para referencia.
slm
0

NOTA: solo un usuario habilitado

Lo que agrega es un conjunto de ediciones en el lado del servidor y el lado del cliente. Del lado del servidor /etc/exportsy /etc/fstabdel lado del cliente.

Lado del servidor

  • Linux Mint 18.3 Sylvia de 32 bits
  • Kernel Linux 4.4.0-138-genérico i686
  • 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
    

Lado del cliente

  • Linux Mint 19 Tara de 64 bits
  • Kernel Linux 4.15.0-38-generic x86_64

    $ cat /etc/fstab
    #NFS Shares line added
    192.168.1.158:/nfsshare /mnt/share nfs rw,soft,intr,noatime,x-gvfs-show
    
Ed Iglehart
fuente
1
¿Que es esto? ¿Es este un archivo? Muchos archivos? Utilice las herramientas de formato para formatear su respuesta para mayor claridad. ¿Podría editar y explicar cómo su respuesta responde a la pregunta?
terdon
(1) Usa tus palabras. (2) ¿Qué ofrece esta oferta que aún no se ha presentado?
G-Man dice 'Restablecer a Mónica' el
disculpas por eso.
Ed Iglehart el