NFS, o Network File System (Sistema de archivos en red) es un protocolo de sistema de archivos distribuido que le permite montar directorio remotos en su servidor. Esto le permite gestionar el espacio de almacenamiento en una ubicación diferente y escribir en ese espacio desde múltiples clientes. NFS proporciona una forma relativamente estándar y eficiente de acceder a sistemas remotos sobre una red y funciona bien en aquellas situaciones en las que debe accederse a los recursos regularmente.
En esta guía repasaremos cómo instalar el software necesario para la funcionalidad NFS en Ubuntu 20.04, configuraremos dos montajes NFS en un servidor y cliente, y montaremos y desmontaremos los intercambios remotos.
Usaremos dos servidores en este tutorial, con uno compartiendo parte de su sistema de archivos con el otro. Para continuar, necesitará lo siguiente:
Dos servidores Ubuntu 20.04. Cada uno de estos debería tener un usuario no root con privilegios sudo
, un firewall configurado con UFW y una red privada, si está disponible.
Para obtener ayuda para configurar un usuario no root con privilegios sudo
y un firewall, siga nuestra guía Configuración inicial para servidores con Ubuntu 20.04.
Si está usando Droplets de DigitalOcean para su servidor y cliente, puede obtener más información sobre cómo configurar una red privada en nuestra documentación en Cómo crear una VPC.
A lo largo de este tutorial, nos referimos al servidor que comparte sus directorios como el host y al servidor que monta estos directorios como el client. Necesitará conocer la dirección IP de ambos. Asegúrese de usar la dirección de red privada, si está disponible.
A lo largo de este tutorial, nos referiremos a estas direcciones IP por los marcadores de posición host_ip
y client_ip
. Sustituya según sea necesario.
Comenzaremos instalando los componentes necesarios en cada servidor.
En el servidor host, instale el paquete nfs-kernel-server
, que le permitirá compartir sus directorios. Ya que esta es la primera operación que está realizando con apt
en esta sesión, actualice su índice de paquetes locales antes de la instalación:
- sudo apt update
- sudo apt install nfs-kernel-server
Una vez instalados estos paquetes, cambie al servidor cliente.
En el servidor cliente, debemos instalar un paquete llamado nfs-common
, que proporciona funcionalidad NFS sin incluir componentes del servidor. De nuevo, actualice el índice de paquetes locales antes de la instalación para garantizar que tiene información actualizada:
- sudo apt update
- sudo apt install nfs-common
Ahora que ambos servidores tienen los paquetes necesarios, podemos comenzar a configurarlos.
Vamos a compartir dos directorios independientes, con diferentes ajustes de configuración, para ilustrar dos formas clave en las que pueden configurarse los montajes NFS con respecto al acceso de un súper usuario.
Los súper usuarios pueden hacer cualquier cosa en cualquier parte del sistema. Sin embargo, los directorios montados en NFS no son parte del sistema sobre el cual se montan, de forma que por defecto, el servidor NFS rechaza realizar operaciones que requieran privilegios de súper usuario. Esta restricción predeterminada significa que los súper usuarios en el client no pueden escribir archivos como root, reasignar propiedad, o realizar cualquier otra tarea de súper usuario en el montaje NFS.
A veces, sin embargo, existen usuarios de confianza en el sistema client que necesitan realizar estas acciones sobre el sistema de archivo montado pero no tienen necesidad de acceso de súper usuario en el host. Puede configurar el servidor NFS para permitir esto, aunque introduce un elemento de riesgo, ya que como tal un usuario podría obtener acceso root a todo el sistema host.
En el primer ejemplo, crearemos un montaje NFS de finalidad general que utiliza el comportamiento NFS para hacer que sea difícil para un usuario con privilegios root sobre el equipo cliente interactuar con el host usando los privilegios de súper usuario del cliente. Puede usar algo como esto para guardar los archivos que se subieron usando un sistema de administración de contenidos o para crear espacio para que los usuarios compartan fácilmente los archivos de los proyectos.
Primero, cree el directorio compartido:
- sudo mkdir /var/nfs/general -p
Ya que estamos creándolo con sudo
, el directorio es propiedad del usuario root del host:
- ls -la /var/nfs/general
Outputdrwxr-xr-x 2 root root 4096 May 14 18:36 .
NFS traducirá cualquier operación root sobre el cliente a las credenciales nobody:nogroup
como medida de seguridad. Por tanto, debemos cambiar la propiedad del directorio para que coincida con esos credenciales.
- sudo chown nobody:nogroup /var/nfs/general
Ahora está listo para exportar este directorio.
En nuestro segundo ejemplo, el objetivo es hacer que los directorios de inicio del usuario guardados en el host estén disponibles en los servidores cliente, permitiendo al mismo tiempo a los administradores de confianza de esos servidores cliente el acceso para administrar convenientemente a los usuarios.
Para hacer esto, exportaremos el directorio /home
. Debido a que ya existe, no necesitamos crearlo. No cambiaremos los permisos tampoco. Si lo hiciésemos, podría provocar varios problemas para cualquiera con un directorio de inicio en el equipo host.
A continuación, profundizaremos en el archivo de configuración NFS para configurar el intercambio de estos recursos.
En el equipo host, abra el archivo /etc/exports
en su editor de texto con privilegios root:
- sudo nano /etc/exports
El archivo tiene comentarios que muestran la estructura general de cada línea de configuración. La sintaxis es la siguiente:
directory_to_share client(share_option1,...,share_optionN)
Deberemos crear una línea para cada uno de los directorios que queremos compartir. Asegúrese de cambiar el marcador de posición client_ip
mostrado aquí a su dirección IP real:
/var/nfs/general client_ip(rw,sync,no_subtree_check)
/home client_ip(rw,sync,no_root_squash,no_subtree_check)
Aquí, estamos usando las mismas opciones de configuración para ambos directorios con la excepción de no_root_squash
. Vamos a echar un vistazo a lo que significa cada una de estas opciones:
rw
: esta opción proporciona al equipo client acceso de lectura y escritura para el volumen.sync
: esta opción fuerza a NFS a escribir los cambios en el disco antes de responder. Esto resulta en un entorno más estable y consistente ya que la respuesta refleja el estado real del volumen remoto. Sin embargo, también reduce la velocidad de las operaciones de archivo.no_subtree_check
: esta opción evita la comprobación del subtree, que es un proceso por el cual el host debe comprobar si el archivo está realmente disponible aún en el árbol exportado para cada solicitud. Esto puede causar muchos problemas cuando se cambia el nombre a un archivo mientras el client lo tiene abierto. En casi todos los casos, es mejor deshabilitar la comprobación del subtree.no_root_squash
: por defecto, NFS traduce las solicitudes desde un usuario root remotamente a un usuario sin privilegios en el servidor. Esto estaba pensado como función de seguridad para evitar que una cuenta root en el client usara el sistema de archivos del host como root. no_root_squash
deshabilita este comportamiento para ciertos intercambios.Una vez que termine de hacer estos cambios, guarde y cierre el archivo. A continuación, para hacer que los intercambios estén disponibles para los clientes que ha configurado, reinicie el servidor NFS con el siguiente comando:
- sudo systemctl restart nfs-kernel-server
Antes de poder usar realmente los nuevos intercambios, sin embargo, deberá asegurar que las reglas del firewall permiten ese tráfico a los intercambios.
Primero, vamos a comprobar el estado del firewall para ver si está habilitado, y si es así, para ver qué permite actualmente:
- sudo ufw status
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
En nuestro sistema, solo se permite el tráfico SSH, así que necesitaremos añadir una regla para el tráfico NFS.
Con muchas aplicaciones, puede usar sudo ufw app list
y habilitarlas por su nombre, pero nfs
no es una de esas. Sin embargo, debido a que ufw
también comprueba /etc/services
para el puerto y el protocolo de un servicio, aún podemos añadir NFS por nombre. Las buenas prácticas recomiendan que permita la regla más restrictiva que seguirá permitiendo el tráfico que desea permitir, de forma que permitir el tráfico desde cualquier sitio, será específico.
Utilice el siguiente comando para abrir el puerto 2049
en el host, asegurando de sustituir la dirección IP del client:
- sudo ufw allow from client_ip to any port nfs
Puede verificar el cambio escribiendo lo siguiente:
- sudo ufw status
Debería ver el tráfico permitido desde el puerto 2049
en el resultado:
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
2049 ALLOW 203.0.113.24
OpenSSH (v6) ALLOW Anywhere (v6)
Esto confirma que UFW solo permitirá el tráfico NFS en el puerto 2049
desde nuestro equipo client.
Ahora que el servidor host se configura y presenta sus intercambios, prepararemos nuestro client.
Para hacer que los intercambios remotos estén disponibles en el client, debemos montar los directorios en el host que queremos compartir para vaciar los directorios en el client.
Nota: Si hay archivos y directorios en su punto de montaje, se ocultarán tan pronto como monte el intercambio NFS. Para evitar la pérdida de archivos importantes, asegúrese de que si monta en un directorio que ya existe que ese directorio esté vacío.
Crearemos dos directorios para nuestros montajes:
- sudo mkdir -p /nfs/general
- sudo mkdir -p /nfs/home
Ahora que tenemos una ubicación para poner los intercambios remotos y hemos abierto el firewall, podemos montar los intercambios usando la dirección IP de nuestro servidor host:
- sudo mount host_ip:/var/nfs/general /nfs/general
- sudo mount host_ip:/home /nfs/home
Estos comandos montarán los intercambios desde el equipo host sobre el equipo client. Puede comprobar que se montan correctamente de varias formas. Puede comprobar esto con un comando mount
o findmnt
, pero df-h
proporciona una resultado más legible:
- df -h
OutputFilesystem Size Used Avail Use% Mounted on
udev 474M 0 474M 0% /dev
tmpfs 99M 936K 98M 1% /run
/dev/vda1 25G 1.8G 23G 8% /
tmpfs 491M 0 491M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 491M 0 491M 0% /sys/fs/cgroup
/dev/vda15 105M 3.9M 101M 4% /boot/efi
tmpfs 99M 0 99M 0% /run/user/1000
10.132.212.247:/var/nfs/general 25G 1.8G 23G 8% /nfs/general
10.132.212.247:/home 25G 1.8G 23G 8% /nfs/home
Ambos intercambios que montamos aparecen en la parte inferior. Debido a que se montaron a partir del mismo sistema de archivos, muestran el mismo uso de disco. Para ver cuánto espacio se está usando bajo cada punto de montaje, utilice el comando de uso del disco du
y la ruta del montaje. El indicador -s
proporciona un resumen de uso en vez de mostrar el uso de cada archivo. -h
imprime un resultado legible por el ser humano.
Por ejemplo:
- du -sh /nfs/home
Output36K /nfs/home
Esto nos muestra que el contenido de todo el directorio de inicio está usando solo 36k del espacio disponible.
A continuación, vamos a acceder a los intercambios escribiendo algo a cada uno de ellos.
Primero, escriba un archivo de prueba al intercambio /var/nfs/general
:
- sudo touch /nfs/general/general.test
A continuación, compruebe su propiedad:
- ls -l /nfs/general/general.test
Output-rw-r--r-- 1 nobody nogroup 0 Aug 1 13:31 /nfs/general/general.test
Debido a que montamos este volumen si cambiar el comportamiento predeterminado de NFS y creamos el archivo como el usuario root del equipo cliente a través del comando sudo
, la propiedad del archivo cae a nobody:nogroup
. Los súper usuarios del cliente no podrán realizar las acciones administrativas típicas, como cambiar el propietario de un archivo o crear un nuevo directorio para un grupo de usuarios en este intercambio montado en NFS.
Para comparar los permisos del intercambio de finalidad general con el intercambio del directorio de inicio, cree un archivo en /nfs/home
de la misma forma:
- sudo touch /nfs/home/home.test
A continuación observe la propiedad del archivo:
- ls -l /nfs/home/home.test
Output-rw-r--r-- 1 root root 0 Aug 1 13:32 /nfs/home/home.test
Creamos home.test
como root usando el comando sudo
, exactamente de la misma forma en que creamos el archivo general.test
. Sin embargo, en este caso es propiedad de root porque anulamos el comportamiento predeterminado cuando especificamos la opción no_root_squash
en este montaje. Esto permite que nuestros usuarios root en el equipo cliente actúe como root y hace que la administración de las cuentas de usuario sea mucho más conveniente. Al mismo tiempo, significa que no tenemos que proporcionar a estos usuarios acceso root en el host.
Podemos montar los intercambios NFS remotos automáticamente al arranque añadiéndolos al archivo /etc/fstab
en el client.
Abra este archivo con privilegios root en su editor de texto:
- sudo nano /etc/fstab
En la parte inferior del archivo, añada una línea para cada uno de nuestros intercambios. Tendrán el siguiente aspecto:
. . .
host_ip:/var/nfs/general /nfs/general nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
host_ip:/home /nfs/home nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
Nota: Puede encontrar más información sobre las opciones que especificamos aquí en la página man de NFS. Puede acceder a esto ejecutando el siguiente comando:
- man nfs
El client montará automáticamente las particiones remotas en el arranque, aunque puede tardar algo de tiempo en establecer la conexión y para que los intercambios estén disponibles.
Si ya no desea que el directorio remoto se monte en su sistema, puede desmontarlo saliendo de la estructura del directorio del intercambio y desmontando, de esta forma:
- cd ~
- sudo umount /nfs/home
- sudo umount /nfs/general
Observe que el comando se llama umount
no unmount
como podría esperar.
Esto eliminará los intercambios remotos, dejando solo su almacenamiento local accesible:
- df -h
OutputFilesystem Size Used Avail Use% Mounted on
udev 474M 0 474M 0% /dev
tmpfs 99M 936K 98M 1% /run
/dev/vda1 25G 1.8G 23G 8% /
tmpfs 491M 0 491M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 491M 0 491M 0% /sys/fs/cgroup
/dev/vda15 105M 3.9M 101M 4% /boot/efi
tmpfs 99M 0 99M 0% /run/user/1000
Si también desea impedir que se vuelvan a montar en el siguiente reinicio, edite /etc/fstab
y elimine la línea u omítala colocando un carácter #
al principio de la línea. También puede evitar el montaje automático eliminado la opción auto
, que le permitirá montarlo manualmente.
En este tutorial, creamos un host NFS e ilustramos algunos comportamientos NFS claves al crear dos montajes NFS diferentes, que compartimos con un cliente NFS.
Si desea implementar NFS en producción, es importante observar que el protocolo no está cifrado. En los casos en que esté compartiendo sobre una red privada, esto puede no ser un problema. En otros casos, será necesaria una VPN o algún otro tipo de túnel cifrado para proteger sus datos.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!