Compartir archivos entre máquinas Linux vía NFS | Algo de Linux

martes, 16 de diciembre de 2008

Compartir archivos entre máquinas Linux vía NFS

¿Qué es NFS?

NFS
(Network File Sistem o Sistema de Ficheros de Red) es una solución ofrecida por los sistemas operativos UNIX/Linux para compartir archivos en redes TCP/IP. Fue desarrollado por SUN Microsystems bajo licencia GPL, lo que facilitó que se convirtiera en un estándar a la hora de convertir archivos en red.

NFS nos permite montar una partición de una máquina remota en un directorio de nuestra máquina como si fuera una partición local.

Veamos qué necesitamos instalar.
  1. Si queremos que nuestra máquina pueda utilizar recursos compartidos por un servidor nfs, instalaremos los paquetes nfs-common y portmap.
  2. Y si lo que queremos es que nuestra máquina pueda realizar ambas funciones: compartir sus recursos y conectarse a otros compartidos, instalaremos los paquetes: nfs-kernel-server y portmap. En este caso, también necesitamos el paquete nfs-common, pero como es una dependencia del paquete nfs-kernel-server, al instalar nfs-kernel-server se instalará también nfs-common.

Lo primero: El portmap.

Como en todos los casos necesitamos portmap, lo primero que hacemos es comprobar si está corriendo.

Sin entrar en muchos detalles, podemos decir que portmap es el mapeador de puertos de linux. Este mapeador se encarga de gestionar la asignación entre aplicaciones y puertos.
Lo normal es que el portmap se encuentre ya instalado.

Para saber si tenemos el portmap instalado y corriendo, no tenemos más que hacer un:

# ps aux | grep portmap

Si está corriendo, la salida del comando anterior será más o menos como la siguiente:

daemon 4204 0.0 0.0 1912 528 ? Ss 16:31 0:00 /sbin/portmap

Si no está corriendo, a lo mejor es porque no está instalado. Así podemos comprobar si está instalado:

# dpkg -l | grep portmap

Si el comando anterior no nos devuelve nada, es porque no está instalado. En ese caso, lo instalamos:

# apt-get install portmap


Si queremos que nuestro equipo pueda compartir recursos. Servidor NFS.

1.- Instalamos nfs-kernel-server.
Una vez que tengamos portmap funcionando, lo que haremos será instalar el paquete nfs-kernel-server. Como ya comentamos antes, al instalarlo, también se instalará el nfs-common:

# apt-get install nfs-kernel-server

Una vez instalado, podemos comprobar si NFS está en marcha haciendo una consulta al portmap, pidiéndole que nos indique qué servicios tiene en marcha:

# rpcinfo -p

El comando nos mostrará todos los servicios que están en marcha, entre ellos el nfs. Como la salida es bastante extensa, os muestro tan sólo las líneas correspondientes al nfs que está corriendo en mi máquina:

100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100003 2 udp 2049 nfs

100003 3 udp 2049 nfs
100003 4 udp 2049 nfs

Si no aparece, debemos comprobar si hay algún problema con los paquetes instalados.

2.- Compartimos directorios
Una vez tenemos los servicios en marcha únicamente nos falta determinar qué queremos compartir. Imaginemos que queremos compartir un directorio llamado backup que se encuentra en el directorio var y en el que almacenaremos las copias de seguridad de una máquina remota:

Para compartir un directorio, debemos editar el archivo /etc/exports e introducir una línea con datos referentes al directorio que queremos compartir, con qué máquinas lo vamos a compartir y las opciones de compartición. Cada línea del /etc/exports tendrá la forma:

directorioacompartir maquinasconlasquecompartir(opcionesdeexportación)

- En directorioacompartir especificamos la ruta absoluta del directorio a compartir.

- En máquinasconlasquecompartir podemos especificar:
  • Un * para compartir con todo el mundo.
  • Una dirección IP para compartir con una máquina concreta.
  • Un rango de direcciones IP con las que compartir, especificando la ip de red y la máscara.
  • Un wildcard con el que compartiremos con las máquinas de un dominio.
- En opcionesdeexportación podemos usar muchas opciones:
  • ro para compartir el directorio en modo sólo lectura.
  • rw para compartir el directorio en modo lectura/escritura.
  • root_squash para conseguir que un usuario root del cliente no pueda escribir con permisos de root en el directorio compartido.
  • no_root_squash hace que se permita que un usuario root del cliente pueda escribir con permisos de root en el directorio compartido.
  • sync hace que el servidor no atienda peticiones antes de que los cambios hechos por una petición de escritura sean escritos en disco.
  • async hace que el servidor atienda peticiones sin comprobar si los cambios hechos por una petición de escritura se han escrito en disco. Es la opción por defecto, si no se especifica nada.
  • subtree_check si se exporta un subdirectorio (no un sistema de ficheros completo) al producirse una petición de un fichero, el servidor comprueba que el fichero solicitado esté en el árbol de directorios exportado.
  • no_subtree_check desactiva la comprobación de subtree_check.
Veamos algunos ejemplos de líneas que podemos incluir en /etc/exports:

/usr/local 192.168.1.0/255.255.255.0(rw,subtree_check)
/var/software 192.168.1.0/24(ro)
/backup 172.19.123.2(rw,no_root_squash,sync)
/tftpboot/boot-image *(rw,no_root_squash,snyc)

3.- Aumentando un poco la seguridad
La única vez que NFS lleva a cabo la autentificación es cuando el cliente intenta montar un recurso compartido NFS. Para limitar el acceso al servicio NFS y aumentar un poco la seguridad, se utilizan los TCP wrappers.

Los TCP wrappers leen los archivos /etc/hosts.allow y /etc/hosts.deny para determinar si a un cliente particular o red tiene acceso o no al servicio NFS.

Lo primero que se comprueba es si el cliente tiene acceso mediante los TCP wrappers. Una vez que al cliente se le permite acceso gracias a un TCP wrapper, el servidor NFS recurre a su archivo de configuración (/etc/exports), para determinar si el cliente tiene suficientes privilegios para acceder a los sistemas de archivos exportados.

Una vez otorgado el acceso, todas las operaciones de archivos y de directorios están disponibles para el usuario.

Podemos establecer un poco más de seguridad usando /etc/hosts.allow y /etc/hosts.deny para especificar qué ordenadores de la red pueden usar los servicios del servidor nfs.

Por ejemplo:

/etc/hosts.deny

portmap:ALL
lockd:ALL
mountd:ALL
rquotad:ALL
statd:ALL

/etc/hosts.allow
portmap:192.168.1.0/255.255.255.0
lockd:192.168.1.0/255.255.255.0
mountd:192.168.1.0/255.255.255.0
rquotad:192.168.1.0/255.255.255.0
statd:192.168.1.0/255.255.255.0

Suponiendo que nuestra red local es la 192.168.1.0, de este modo, denegamos el acceso a todo el mundo, y luego permitimos el acceso tan sólo a las máquinas de nuestra red.

4.- Activar la compartición de archivos
Cada vez que hagamos cambios en el fichero /etc/exports, debemos hacer que nfs vuelva a cargarlo, con el fin de que se apliquen las restricciones que hay en él. Para ello no tenemos más que ejecutar el siguiente comando:

# exportfs -ra

Y listo. Ya tenemos nuestro servidor nfs funcionando.


Si queremos que nuestro equipo pueda usar recursos nfs de otras máquinas. Cliente NFS.


1.- Instalamos nfs-common
Para poder conectarnos a los recursos nfs de servidores, lo que haremos es configurar el equipo como cliente NFS. Para ello, recordemos que debíamos instalar portmap y nfs-common.

Así que, siguiendo las instrucciones del comienzo, comprobamos que tenemos funcionando portmap en el equipo cliente. Una vez comprobado, instalamos nfs-common:

# apt-get install nfs-common

Y ya podemos conectarnos a los recursos de otras máquinas desde un equipo cliente.

2.- Ver qué recursos compartidos en una máquina
Si queremos ver qué directorios tiene compartidos una máquina vía NFS, ejecutamos el comando showmount en la máquina cliente con el parámetro -e:

# showmount -e IPSERVIDOR

Por ejemplo, si tenemos un servidor NFS cuya IP es 192.168.1.2 y queremos ver, desde nuestra máquina cliente, qué directorios tiene exportados, ejecutaremos el comando:

$ showmount -e 192.168.1.2


3.- Conectarse a un recurso compartido de un servidor NFS
Podemos conectarnos a un directorio compartido en una máquina remota, usando el comando mount:

# mount IPServidorNFS:/DirectorioCompartido PuntodeMontaje

Ejemplo: Imaginemos que tenemos un servidor NFS con la siguiente dirección IP: 192.168.1.2 y un directorio compartido: /var/descargas. Supongamos también que en la máquina cliente tenemos un directorio llamado /mnt/nfs donde vamos a montar el directorio de la máquina remota. Montaremos el directorio compartido de la siguiente manera:

# mount 192.168.1.2:/var/descargas /mnt/nfs

Si hacemos un ls /mnt/nfs veremos que el directorio del servidor se encuentra montado.

4.- Conectarse a un recurso compartido cada vez que se inicie la máquina cliente
Si queremos que el directorio compartido vía NFS sea montado en la máquina cliente cada vez que ésta arranque, debemos añadir una entrada en el fichero /etc/fstab.

Imaginemos que tenemos el directorio home compartido en un servidor nfs y queremos montarlo en los clientes. Añadiríamos una línea al fichero fstab de la máquina cliente para montarlo en cada inicio:

192.168.1.2:/home /home nfs rw,hard,intr 0 0


4 comentarios:

Anónimo dijo...

he buscado informacion sobre el tema, lo que has expuesto me lo ha facilitado.. lo testeo y vuelvo a comentar.. Gracias

Anónimo dijo...

amigo eres el amo gracias por el aporte eres lo maximo saludos desde Cuba

Carlos dijo...

tanto lio para compartir una carpeta y sus archivos en linux, me quedo en windows, a pesar de todo lo malo que tiene, como usuario, linux no me facilita nada en este aspecto.

Esteban M. Navas Martín dijo...

Hola, Carlos. Por tu comentario, entiendo que tus conocimientos de sistemas operativos son bastante limitados. ¿Sabes que Microsoft también implementa NFS en sus servidores Windows para permitir la transferencia de archivos entre servidores Windows y servidores Unix?