domingo, 23 de enero de 2011

Cómo compartir archivos de OpenBSD (y posiblemente otros unixes) a Mac OS X con NFS

Esto me costó trabajo ya que al momento de hacerlo no conocía bien ambas plataformas, por eso es que deseo compartirlo.

La necesidad que quería cubir era tener un modo de respaldar archivos de mi computadora con OS X a un disco duro donde el filesystem estuviera encriptado. Esto también lo podía hacer con Linux, pero nada como usar OpenBSD para tareas de encripción que para eso está diseñado, además de contar con la estabilidad, coherencia y consistencia de un sistema BSD, además de que era una buena oportunidad para aprender más de este sistema operativo.

También podía hacer algo parecido por medio de FTP, de samba, de SSH... pero todas estas soluciones tenían algunos inconvenientes, pero en especial para mí era importante copiar archivos desde el finder, como si se tratara de un disco local.

Otra solución era utilizar el protocolo Apple Talk desde OpenBSD, que para mí hubiese sido la mejor solución pero al parecer este protocolo ya no se actualiza en los últimos kerneles y los desarrolladores de OpenBSD lo odian no se por qué. Linux sí lo soporta sin problemas pero no quería usar Linux.

Por suerte gracias a que OS X tiene una base BSD soporta NFS en forma nativa, al igual que OpenBSD, así que en teoría debía ser sencillo. Obviamente no lo fue porque si no no estaría escribiendo esto.

En este pequeño tutorial, howto, artículo o lo que sea, me voy a enfocar solamente en la parte de OS X que fue la que dio más problemas, sólo dire que en OpenBSD lo único que hice fue configurar un disklabel como volumen encriptado con bioctl(8) y softraid(4).

Levantar el servicio de NFS en OpenBSD fue muy sencillo, sólo hubo que consultar la documentación de nfsd(8), portmap(8), mountd(8) y exports(5).

Los problemas vinieron cuando quise que OS X se conectara como cliente NFS, que no es tan intuituvo. La documentación que viene con el finder dice que usando la opción de "Conectarse al servidor" y poniendo en la url algo como nfs://IP/directorio ya funcionaba. Pues no, no funcionó. Mandaba permiso denegado.

Investigando en internet me encontré que muchas de las implementaciones de NFS en Unix (en Linux no), por seguridad, no aceptan conexiones de clientes NFS que envian peticiones desde puertos no privilegiados (es decir con un número de puerto mayor a 1024). Existe una opción de mountd(8) para evitar esto, pero la documentación dice:

-n Do not require that clients make mount requests from reserved
ports. (Normally, only mount requests from reserved ports are
accepted.) This option should only be specified if there are
clients, such as PCs, that need it. The use of -n is STRONGLY
discouraged, as it opens up a wide range of security problems.


Osea que no recomiendan usar esa opción, pero la documentación de mount_nfs en OS X dice:


resvport
Use a reserved socket port number. This is useful for mounting servers that require clients to use a reserved port number on the mistaken belief that this makes NFS more secure. (For the rare case where the client has a trusted root account but untrustwor-thy users and the network cables are in secure areas this does help, but for normal desktop clients this does not apply.)


Decidí que la gente está loca y hacerle caso a OpenBSD, es decir no usar la opción -n de mountd(8) y usar la opción resvport de mount_fs de OS X. Más adelante explico cómo encaja todo.

Bueno el caso es que puse la opción resvport en algún lado y seguia mandando el mismo mensaje. Después estuve peleando con fstab, con la utilidad de discos que en algunas páginas web dicen que sirve para el NFS y nada. Todo eso es mentira. Lo que en realidad funciona es una característica de OS X llamada automount o automounter pero casi nadie sabe cómo funciona, al menos entre la gente que usa productos de Apple, porque quienes saben de Unix desde hace años lo conocen.

Es parecido a algo llamado autofs que existe en Linux pero al parecer en OS X es una implementación distinta, pues se trata del automounter de Sun Microsystems.

Para poder echar a andar el automounter me costó encontrar información, existe en algún lado una guía oficial de Apple, que aunque tiene cosas útiles termina confundiendo más que lo que ayuda.

Me sirvió más esta guía del libro de O'reilly titulado Managing NFS and NIS second edition el capítulo 9 de este libro habla sobre el automounter en forma muy comprensible, lo recomiendo a todo el que quiera aprender el funcionamiento del automounter y de NFS.

Bueno, para no hacer más larga esta historia, lo que hay que hacer es configurar un indirect mapping en el automounter de OS X.

Un indirect mapping es una cosa que funciona así: en el automounter definimos un directorio (carpeta para usar terminos maqueros/windowseros) para accesar al servicio NFS (un punto de montaje), de tal forma que al abrirlo desde el finder (o cuando algun programa haga referencia a el), automáticamente automounter se conectará al servidor NFS y podremos visualizarlo como un directorio cualquiera del finder.

Pasados algunos segundos (configurables) si ningún programa está haciendo referencia al directorio (o no está abierto en el finder) automáticamente se desconectará del servicio NFS.

El primer archivo que hay que modificar es /etc/autofs.conf, como es tradición en Unix con cualquier editor de textos como vi, aunque tal vez alguien más quiera usar la utilidad TextEdit.app. Los archivos en /etc únicamente el usuario root (conocido en OS X como system administrator, que no es lo mismo que una cuenta normal de administrador y cuyo password se definió al encender la computadora por primera vez, ¿si recuerdas qué password usaste verdad?).

Para quienes saben usar unix, es fácil, solo basta con ejecutar vi con sudo y darle el password de una cuenta de administrador. Espero me perdonen por explicar cosas obvias pero la mayoría de los maqueros y principiantes en sistemas unix no saben utilizar todos estos comandos.

Para los demás, hay que abrir la utilidad de Terminal y ejecutar

sudo /Applications/TextEdit.app/Contents/MacOS/TextEdit /etc/autofs.conf


Tal vez pida un password de administrador. Tal vez sea necesario hacerlo desde una cuenta de administrador. Si esto no funciona, otra alternativa es habilitar el usuario de root como se menciona en el link de root algunas líneas arriba y hacer la edición de estos archivos iniciando una sesión con ese usuario.

Siguiendo con la configuración del automounter, las opciones más relevantes son

AUTOMOUNT_TIMEOUT


Yo lo puse de esta manera:

AUTOMOUNT_TIMEOUT=30


Así cuando cierre el finder o cualquier programa que esté haciendo uso del directorio NFS compartido desde OpenBSD, solo debo esperar 30 segundos y se desconectará.

Otra opción importante es

AUTOMOUNTD_NOBROWSE


Que la puse en FALSE pero no recuerdo si eso es necesario.

Otra opción que tal vez quieran activar es

AUTOMOUNTD_TRACE=2


Esto genera mensajes de debugeo útiles en /var/log/system.log, pero los que no sepan para qué sirve eso, lo pueden dejar como viene.

Luego viene la creación del mapa indirecto. El punto de montaje que elegí fue /Users/makz/RemoteFS/NFS es decir, en mi home.

Para esto cree un directorio vacío RemoteFS (puede ser cualquier nombre) y dentro un directorio NFS (también puede ser cualquier nombre) que será el punto de montaje.

¿Porque no crear solamente RemoteFS? Lo que sucede es que OS X constantemente y por diferentes situaciones consulta qué archivos y directorios existen en el directorio home (en mi caso /Users/makz), entonces si se utiliza como punto de montaje un directorio que está en el home, cada vez que OS X haga esta consulta el automounter al detectar que algo está haciendo referencia al directorio del punto de montaje, intentará conectarse al NFS y si está abajo, tendremos constantemente tiempos de espera que hacen lenta la respuesta de todo el sistema.

Al poner el directorio del punto de montaje dentro de otro directorio, lo protegemos de esto, pues al parecer OS X no desciende a buscar todo lo que hay dentro de los directorios del home.

Para crear el mapa indirecto hay que hacer dos cosas:

- Definir el mapa indirecto en un archivo dentro de /etc
- Referenciar el archivo de mapas en /etc/auto_master

En mi caso cree un archivo llamado /etc/auto_nas (usando otra vez sudo) que contiene lo siguiente:


nas1_vicviperII 192.168.2.194:/backup
nas2_vicviperII 192.168.2.194:/extra_space3


Son dos mapas indirectos, ya que en mi servidor NFS OpenBSD estoy exportando dos filesystems NFS. Los nombres de los mapas son nas1_vicviperII y nas2_vicviperII vicviper II es el nombre de la computadora donde tengo instalado OpenBSD, puede ser cualquier nombre, y lo demás pues es obviamente la dirección IP de esa computadora y los nombres de los filesystems exportados.

Ahora hay que incluir este archivo en /etc/auto_master. Por lo regular ya tiene algunas entradas, así que solo hay que agregar, el mío quedo asi:

#
# Automounter master map
#
+auto_master # Use directory service
/net -hosts -nobrowse,hidefromfinder,nosuid
/home auto_home -nobrowse,hidefromfinder
/Network/Servers -fstab
/- -static
/Users/makz/RemoteFS/NFS auto_nas -intr,resvport=1024,deadtimeout=10,timeo=10,retrycnt=1


Para conocer el sifgnicado de estas opciones está el man de mount_nfs en OS X.

Si todo sale bien el resultado debería ser algo así, estando arriba el servicio de NFS:










Los archivos funcionan desde el finder como cualquier archivo normal, incluso funciona la vista previa y todo



Con esto podemos comprobar el estado del montaje




Después de un rato, ya no está el montaje NFS porque ya lo cerré en el finder (el mapa siempre aparece, lo que desapareció fue el montaje del filesystem)



Esto es todo. Para la próxima, si lo considero necesario, tal vez explique la parte de OpenBSD.

No hay comentarios.: