NFS (Network File System o Sistema de Ficheros en Red) Este servicio tiene como finalidad compartir un sistema de ficheros a través de una red de manera transparente, de forma que sus clientes lo vean como un elemento de almacenamiento local. Para NFS hay clientes disponibles en la mayoría de sistemas operativos, tanto de la familia UNIX/Linux como Mac o Windows. El funcionamiento de NFS, como casi todos los servicios ofrecidos en UNIX/Linux, tiene una arquitectura Cliente/Servidor. Siendo el servidor quien tiene el sistema de ficheros compartido y el conjunto de daemons que permiten el funcionamiento del servicio, es decir que el sistema de ficheros sea visible y accesible. Por su parte, los clientes solamente montan el sistema de ficheros como si fuese local. Estamos hablando que NFS comparte un sistema de ficheros, pero en realidad puede compartir un disco entero, una partición, un directorio, un árbol de estos e incluso un fichero. Con esta flexibilidad, NFS puede usarse en múltiples entornos, aunque principalmente se aplica en la centralización de los directorio home de los usuarios para que independientemente de la estación de trabajo que usen tengan acceso a un único directorio home También es aplicable a la compartición de información en grupos de usuarios, colaboración en proyectos, compartir ficheros, etc. NFS también se usa con ordenadores cliente sin disco duro o con capacidad reducida, de manera que disponen de un recurso que en realidad no tienen. Como podemos comprobar la ventaja que presenta NFS es su centralización ya que facilita el acceso desde cualquier punto de la red, permite la realización de copias de seguridad más sencillas, reduce el consumo de espacio en disco eliminando información duplicada en diferentes ordenadores, también facilita la actualización de versiones de programas, etc. Pero como todo, NFS también presenta inconvenientes, derivados principalmente del uso de la red, estos son, un menor rendimiento y seguridad. Si la red o el servidor tienen mucho uso la velocidad de respuesta se resiente. Y en cuanto a la seguridad podemos decir que su uso se realiza en una red interna que normalmente no se verá sometida a ataques, por lo que no se recomienda usar NFS a través de Internet. Otro posible problema a tener en cuenta se presenta si el servidor no funciona, dejando a los clientes sin la información compartida, especialmente grave si se da acceso a los directorios home. CONFIGURACIÓN DE UN SERVIDOR NFS: La primera tarea a realizar para implantar un servidor NFS, es diseñar el servicio eligiendo qué sistema o sistemas de ficheros vamos a compartir entre qué usuarios y sus puntos de montaje en los clientes, de manera que el uso de la red sea totalmente transparente. En este proceso de diseño debemos tener en cuenta para simplificar, que los sistemas de ficheros exportados sean montados en los clientes en los mismo lugares que en el servidor de manera que no tendremos que recordar las diferentes rutas, aunque esto a nivel funcional no tiene ninguna influencia. Una vez tenemos claro el diseño del servicio, pasaremos a su implementación, con la definición de los ficheros de exportación y la configuración de los programas daemon que se encargarán de dar servicio. Cuando nuestro servicio está en funcionamiento entonces es conveniente un proceso de comprobación que testee los puntos de montaje y el rendimiento por si se detectan cuellos de botella. En la fase de diseño, cuando se eligen los sistemas de ficheros a exportar, debemos observar las siguientes restricciones: • Un servidor NFS no puede exportar un sistema de ficheros del cual él es cliente NFS, no se pueden reexportar sistemas de ficheros. • No es posible exportar un subdirectorio de un directorio exportado si reside en el mismo disco duro físico. Por ejemplo si exportamos /programas y deseamos exportar el subdirectorio /programas/so sólo será posible si están en dos discos duros, en /etc/fstab estarían definidos como: /dev/hda7 /programas reiserfs /dev/hdd2 /programas/so exec,dev,suid,rw reiserfs 1 1 exec,dev,suid,rw 1 1 Lo mismo ocurre si exportamos un subdirectorio y después queremos exportar su directorio padre. En NFS los sistemas de ficheros exportados se indican en el fichero /etc/exports y su sintaxis es la siguiente: trayectoria_sist_exportado cliente(opciones) [cliente(opciones)] donde: trayectoria_sist_exportado representa la trayectoria absoluta (expresada desde la raíz /) del sistema de ficheros, directorio o fichero a exportar. cliente será un ordenador o grupo de estos que pueden montar este recurso compartido y opciones indican las opciones aplicables al montaje por estos clientes. cliente puede expresarse de diferentes formas, facilitando así la definición de grupos en función de nuestra organización de red: • El nombre de un ordenador o su IP, si usamos su nombre deberá poderse obtener su IP mediante /etc/hosts o por DNS. Nombres válidos por ejemplo serían: sancho sancho.toboso.es 192.168.0.2 • Un grupo de ordenadores expresados mediante su nombre combinado con los comodines * y ? por ejemplo: *.toboso.es que abarcaría a todos los ordenadores de esta jerarquía. • Un grupo de ordenadores expresados mediante el par IP/Máscara de Subred, de manera que podamos expresar la red o subred a la que damos acceso al sistema de ficheros: 192.168.0.0 / 255.255.255.0 • También se puede indicar un grupo de ordenadores gobernados mediante NIS, que se especificaría como @grupoNIS : @toboso Finalmente, las opciones que acompañan a cada cliente indican la forma en que pueden montar el sistema de ficheros. Las más usuales: rw → Montaje de Lectura y Escritura. ro → Montaje de Sólo Lectura. secure → La solicitud del cliente debe realizarse mediante un port privilegiado , < 1024. insecure → Permite solicitudes de ports no privilegiados. async → Permite aplicar una caché a la escritura en el disco de forma que se mejora el rendimiento. sync → Obliga a realizar la escritura en el disco para considerar que la operación ha finalizado. subtree_check → Esta opción es muy importante de cara a la seguridad en la exportación de sistema de ficheros, de manera que si estamos exportando sólo una parte de un sistema de ficheros, como un árbol a partir de un subdirectorio determinado, esta opción garantiza que cuando se accede a un fichero sólo se accede a la parte del sistema de ficheros exportada y no se accede al resto. no_subtree_check → Inhibe el efecto anterior, pero mejora el rendimiento. root_squash → También es una opción que mejora la seguridad de manera que con ella el UID y GID de root de un sistema cliente se asocia al UID y GID del usuario anonymous, de manera que no se tendrán los derechos de root en el sistema exportado por NFS. no_root_squash → Ιnhibe root_squash. all_squash → Aplica a todos los usuarios (UID y GID) el UID y GID del usuario anonymous. no_all_squash → Inhibe la opción anterior. anonuid=UID → Asigna el UID de anonymous al usuario cuya UID se indica. anongid=GID → Asigna el GID de anonymous al usuario cuya GID se indica. wdelay → Permite retardar escrituras en el disco si el servidor cree que así puede mejorar el rendimiento. no_wdelay → Inhibe la opción anterior. De las diferentes opciones la más interesante por sus efectos sobre la seguridad es la de root_squash y se aconseja su uso. Un ejemplo de /etc/exports podría ser: /home 192.168.0.0 / 255.255.0.0 (rw,secure,no_subtree_check) /programas @toboso (ro,secure) /usr/local *.toboso.es (ro)192.168.0.100 (rw,secure) En los otros dos ficheros relacionados con NFS encontramos información sobre el estado de funcionamiento del servicio, así en /var/lib/nfs/rmtab se añaden o eliminan las solicitudes de montaje de sistemas de ficheros por parte de los clientes. Mientras que en /var/lib/nfs/xtab contiene la tabla de los sistemas de ficheros exportados en ese momento. DAEMONS NFS: Los daemons o demonios, son programas residentes en memoria que permanecen a la espera de atender alguna solicitud del servicio al que atienden, así en NFS en la parte servidora encontramos los siguientes: • nfsd: es el daemon que suministra todos los servicios ofrecidos por NFS menos los de bloqueos en la caída del sistema y el sistema de quotas (restricciones en el consumo de espacio en el sistema de ficheros). • mountd: se encarga de estudiar las solicitudes de montaje que realizan los clientes. • portmap: facilita a los clientes los servicios NFS de que dispone el servidor. • statd: se encarga de la recuperación del sistema después de una caída del servidor NFS. • lockd: es el encargado de gestionar el bloqueo del servidor NFS (lleva un registro de las operaciones realizadas para poder saber cuales se han completado y en caso de fallo en el servidor, poder llegar a un estado consistente del sistema de ficheros). • rquotad: permite establecer una política de límites en el consumo del sistema de ficheros exportado. Estos procesos suelen arrancar mediante un script con su mismo nombre situado en los directorios /etc/init.d o /etc/rc.d/init.d . En el caso de nfsd también se puede indicar el número de copias iniciales del proceso para atender de manera eficiente las solicitudes simultáneas que se produzcan. Este valor se establece en el script nfs con la variable RPCNFSCOUNT=8 , aquí pondremos el valor más apropiado para nuestra instalación. Si tenemos muchas solicitudes lo aumentaremos y en caso contrario lo debemos reducir. Los scripts implicados en el arranque del servicio NFS son: /etc/init.d/nfs que pone en funcionamiento rpc.mountd, rpc.nfsd y rpc.quotad que son los procesos asociados a nfsd, mountd y rquotad. El prefijo rpc es de Remote Procedure Call, ya que en realidad el servicio NFS se basa en este tipo de procedimientos. /etc/init.d/portmap es un script que pone en marcha los servicios necesarios para poder usar RPC y como se ha visto son necesarios para trabajar con NFS. Finalmente, tenemos el script /etc/init.d/nfslock que gestiona básicamente statd ya que lockd lo arranca nfsd automáticamente cuando es invocado. Todos estos scripts de arranque aceptan los parámetros start, para arrancar el servicio, stop para detenerlo , restart para reiniciarlo y también status para comprobar si están en funcionamiento. Así para poner manualmente en marcha el servicio NFS ejecutaríamos, estando en /etc/init.d : #./portmap start #./nfs start # ./nfslock start y para detener el servicio usaríamos los mismos scripts en orden inverso y con el parámetro stop. Se debe tener en cuenta que los servicios ofrecidos por portmap pueden ser usados por otros servicios además de NFS como por ejemplo NIS, así que se debe ser muy cuidadoso a la hora de reiniciarlo o pararlo. COMANDOS NFS: Tenemos una serie de comandos que nos permitirán, por un lado exportar nuevos sistemas de ficheros o eliminar alguno de los exportados sin modificar /etc/exports y por otro monitorizar el funcionamiento de nuestro servidor NFS. Estos comandos son: • exportfs • showmount • rpcinfo -p • nfsstat El comando exportfs permite manejar las tablas de los sistemas de ficheros exportados que usa el núcleo del sistema operativo junto con el fichero /var/lib/nfs/xtab de manera que con este comando podemos añadir o eliminar sistemas de ficheros exportados sin tener que modificar /etc/exports ni reiniciar NFS (/etc/init.d/nfs restart). La sintaxis de exportfs es: # exportfs -o opts ordenador:path_fs_exportado Esto exporta un nuevo sistema de ficheros sin modificar /etc/exports y donde: -o opts son las opciones con las cuales se exporta el sistema de ficheros (ro,rw, secure, etc.) , esta parte es opcional. ordenador representa los clientes que podrán acceder al sistema de ficheros exportado. path_fs_exportado es la trayectoria al sistema de ficheros que estamos exportando. Ejemplo: # exportfs -o ro *.toboso.es:/usr/local Con exportfs solo o con la opción -v obtenemos la lista de sistemas de ficheros exportados, la opción -v además indica las opciones con las que han sido exportados. Si usamos la opción -u, se deja de exportar el sistema de ficheros que le acompaña. # exportfs -u cliente: path_fs_exportado #exportfs -u *.toboso.es:/usr/local en este caso tampoco hemos modificado /etc/exports. Si ponemos # expotfs -ar actualiza las modificaciones hechas en /etc/exports, vuelve a leer el fichero de exportación. El comando showmount permite ver los sistemas de ficheros exportados que tienen montados en este momento los ordenadores clientes, si no se le da ningún parámetro, showmount mostrará la información asociada al conjunto de clientes, mientras que si ponemos la IP o el nombre de un servidor, nos presentará sólo la información de éste. Con showmount podemos usar las opciones siguientes: -a Presenta los clientes y los sistemas de ficheros que tiene montados. -d Sólo muestra los sistemas de ficheros montados. -e Presenta la lista de los sistemas de ficheros exportados por el servidor NFS. Este comando es útil sobre todo en los clientes, para conocer los sistemas exportados por el servidor, pero al mismo tiempo puede ser peligroso a nivel de seguridad porque da a conocer esta información. Para que showmount funcione en los clientes deben tener en ejecución el daemon rpc.mountd. El comando rpcinfo que con la opción -p nos indica el conjunto de programas que están usando RPC, entre ellos NFS. Rpcinfo -p nos mostrará la ID asociada al programa RPC, su versión , si usa TCP o UDP y el port en el que atiende las solicitudes. Finalmente, el comando nfstat muestra estadísticas sobre el funcionamiento del servidor NFS útiles para ajustar su funcionamiento. EL CLIENTE NFS: Básicamente, un cliente NFS necesita: 1. Que portmap, statd y lockd estén funcionando, normalmente desde el arranque del sistema. 2. Si es necesario modificar /etc/fstab en el cliente para facilitar el uso del comando mount para montar los sistemas de ficheros exportados. Como ya comentamos, desde un cliente los sistemas de ficheros exportados, se montan como si fuesen locales, usando el comando mount, de manera que si deseamos facilitar la escritura en la linea de comandos o bien queremos que se monten automáticamente, deberán ser añadidos al fichero /etc/fstab del cliente. Cuando usemos mount junto con un sistema de ficheros exportado por NFS, debemos especificar éste sistema de ficheros con la opción -t nfs. Sintaxis: #mount -t nfs servidor:sistema_ficheros punto_montaje_local -o opts donde: servidor será el nombre o la IP del servidor NFS. sistema_ficheros indicamos el sistema de ficheros exportado que deseamos montar. punto_montaje_local será la trayectoria dentro de la máquina cliente donde se montará el nuevo sistema de ficheros. -o opts representa una serie de opciones que le podemos dar a mount en el montaje de NFS. Las más útiles son: rsize=nº se establece el tamaño del buffer de lectura en bytes, su valor por defecto es de 4096, mientras que se recomienda usar un buffer de mayor tamaño, normalmente de 8192 bytes. wsize=nº como la anterior pero para definir el buffer de escritura y se le aplican las mismas consideraciones que a rsize. hard con esta opción al trabajar con NFS el sistema insiste con las operaciones hasta que recibe el mensaje del servidor “server not reponding”. soft permite que al trabajar con NFS las operaciones fallen y terminen sin insistir como en el caso de hard. intr permite interrumpir el comando mount mediante Ctrl+c por si no puede establecer la conexión con el servidor cuando se ha habilitado al opción hard. lock aplica el bloqueo sobre ficheros exportados por NFS mediante los procesos statd y lockd., pero el manejo de los bloqueos supone una sobrecarga de manera que si queremos mejorar el rendimiento usaremos la opción contraria: nolock. Ejemplos: #mount -t nfs quijote:/usr/local /usr/local #mount -t nfs quijote:/home /home -o rsize=8192,wsize=8192,hard,intr,nolock Si queremos añadir estas entradas a /etc/fstab: quijote:/usr/local /usr/local nfs auto 0 0 quijote:/home /home nfs auto,user,rsize=8192,wsize=8192,hard,intr,nolock 0 0 y después para montarlos: #mount /usr/local #mount /home y si queremos montar todos los sistemas de ficheros contenidos en /etc/fstab: #mount -a