miércoles, 16 de diciembre de 2015

Montar directorios remotos en directorios locales en Linux (válido para Opensuse y otros Sistemas GNU/Linux)

                    (P) Hugo Napoli, 2015                   

Después de montar nuestro servidor Puppy (ver entrada paso a paso), o bien luego de compartir carpetas en algún Sistema GNU/Linux o Windows de nuestra red local, necesitaremos el tan ansiado streaming: la capacidad de ver una película o escuchar una canción que está en otra máquina, con la misma agilidad que nos brinda ella, pero desde nuestro ordenador.
Dicho más claramente: no queremos copiarnos una película desde el servidor o carpeta compartida a nuestro Escritorio (por ejemplo) y reproducirla desde allí, sino que necesitamos reproducirla directamente desde el servidor, utilizando para ello la máquina que ya estamos utilizando.

Opensuse es un excelente Sistema para hacer streaming (en Español, "transmisión contínua" o "ininterrumpida").

Aquí dejo una guía paso a paso (fácil de comprender y seguir), después de haber intentado hasta (casi) el cansancio un modo de generar un método para realizar esto, que a su vez fuese sencillo de poder recordar.

También era necesario que funcionara (¡obviamente!), puesto que no hay tanta información sobre uno de los parámetros más importantes del comando mount.cifs que utilizaremos para todo esto, el cual se ocupa de indicarle al Sistema Operativo qué modo de seguridad utilizaremos para comunicarnos con el servidor (es la última opción que aparece en la última línea de comandos que aparece en el punto 7).

Sobre esto, mucho se puede decir, pero lo cierto es que, investigando, he aprendido que hay varias maneras de comunicarse con el servidor (empleando distintos protocolos de seguridad), y que ninguno parece ser el mejor por mayoría absoluta: todos estarían bastante equilibrados a nivel de ganancias/pérdidas, ventajas/desventajas, etc.
He elegido el modo ntlm en este caso (¡sí!, ¡NT Lan Manager!... ¡Sí! ¡Windows!), porque al compartir archivos en red, es sabido que hoy en día -en una misma red- podemos encontrarnos con Windows XP, Windows 7, Windows 8.1 y Windows 10... ¡al mismo tiempo!
Además, y con algo de suerte a nuestro favor, en esa red, encontraremos también algún servidor Linux, o al menos alguna máquina Linux "cliente" (¿Fedora? ¿Debian? ¿Ubuntu?) de toda esa diversidad de Microsoft que aún sobrevive. ¡Solo por esa razón he utilizado ntlm!, puesto que existen otros modos que tal vez sean más recomendables, como el ntlm2 u otros que incluso nada tengan que ver con Microsoft.
También he pensado que este artículo está orientado a un servidor de red LAN, no a un servidor que esté permanentemente conectado a Internet haciendo "stream" hacia cualquier cliente en cualquier parte del mundo...

Por mas información, ver este enlace de Wikipedia (en Inglés), prestando especial atención al apartado "Vulnerabilities": https://en.wikipedia.org/wiki/NT_LAN_Manager

Es muy importante poder recordar asociando, comprendiendo lo que se está haciendo; de otro modo, los comandos Linux terminan siendo una colección de ingredientes en una receta difícilmente realizable sin el libro de cocina.




1. En primer lugar, necesitaremos crear un directorio en el sistema local de archivos para poder montar en él los directorios externos que queramos.
Elegí el directorio preexistente "/mnt" para ello, ya que el propio Sistema Operativo lo utiliza para propósitos similares.
Dentro de "/mnt", entonces, crearemos un directorio llamado "montaje".
Podemos hacer esto con el siguiente comando:
sudo mkdir /mnt/montaje
El nombre "montaje", puede ser cambiado por cualquier otro, pero los ejemplos que siguen, ya están pensados para este nombre. No olvides de adaptar las líneas que siguen, si es que decides cambiar el nombre "montaje" por cualquier otro.

También se puede utilizar otro directorio en lugar de /mnt para montar nuestros directorios remotos. Por ejemplo, se podría introducir en la terminal o consola "mkdir /home/cristina/montaje", y los archivos montados resultantes, quedarían disponibles dentro del entorno de trabajo del usuario común, en este caso, el usuario "cristina".
Además, de este modo, no serían necesarios los atributos del usuario root (sudo...) para crear las ubicaciones para nuestra futura estructura de archivos y directorios remotos tratados como locales.

2. Ahora, necesitaremos asignar permisos de lectura, escritura y ejecución a "/mnt/montaje", y lo haremos con el siguiente comando:
sudo chmod 777 /mnt/montaje

3. Dentro de montaje, crearemos a su vez los directorios que sean necesarios.
Por ejemplo:
sudo mkdir /mnt/montaje/DIR_EXT_1_LOC

4. Observaremos que los paquetes "smbfs", "samba-client" y "cifs-utils", estén instalados.
De no ser así, podemos instalarlos ejecutando en la terminal:
sudo zypper install smbfs samba-client cifs-utils

5. Para ir asegurándonos de que todo marcha bien, podemos intentar listar los recursos compartidos en el servidor con el siguiente comando, el cual, si lo anterior viene dando sus frutos, nos mostrará una lista de todos los directorios compartidos:
smbclient -L [Dirección IP del servidor] -U [nombre_de_usuario_en_el_servidor]

o bien, por ejemplo,

smbclient -L 192.168.60.200 -U rodolfo

Al llegar a este punto, es posible que el Sistema responda con una de estas dos posibilidades, o bien con ambas:

WARNING: The "idmap gid" option is deprecated
WARNING: The "idmap uid" option is deprecated

Esto estaría haciendo referencia a desajustes en la fecha u hora del servidor respecto a la del ordenador que estamos usando, pertenencia a dominios Samba-Windows diferentes, u otras razones. Para mayor referencia, consulta este debate en Inglés en el foro Toolbox.com para Linux, si lo deseas.
No tenemos por qué alarmarnos. El comando "smbclient -L" funcionará, de todos modos.

6. En este momento, ingresaremos al servidor y a los directorios que van a ser montados antes de correr los comandos del siguiente paso, a los efectos de que el Sistema Operativo vaya reconociendo los subdirectorios y los archivos que están dentro de éste. Así, la espera será mucho menor tras ejecutar el comando de montaje que sigue.

7. Ya estamos listos para ejecutar el siguiente comando cada vez que se necesite montar un directorio remoto como si fuese local:
sudo mount.cifs //192.168.60.200/DIR_EXT_1 /mnt/montaje/DIR_EXT_1_LOC -o user=rodolfo,sec=ntlm

Algunas versiones de OpenSuse, necesitan escribir este comando de un modo ligeramente diferente (ver alteraciones en verde):

sudo mount -t cifs //192.168.60.200/DIR_EXT_1 /mnt/montaje/DIR_EXT_1_LOC -o user=rodolfo,sec=ntlm

La explicación del comando es la siguiente:
  
sudo mount.cifs //[Dirección IP del servidor]/[Directorio dentro del servidor] /mnt/montaje/[Directorio creado manualmente dentro de "montaje"] -o user=[nombre de usuario en el servidor],[modo de seguridad]

La contraseña que habrá que introducir en la terminal (además de la contraseña de root), será la del usuario "rodolfo" en el servidor, no la de ningún usuario local.

También es posible introducir la contraseña de dicho usuario en la misma línea, en este orden y de este modo:

sudo mount -t cifs //192.168.60.200/DIR_EXT_1 /mnt/montaje/DIR_EXT_1_LOC -o user=rodolfo,password=#RoDoLfO45#,sec=ntlm

En este caso, estamos suponiendo que la contraseña del usuario "rodolfo", es "#RoDoLfO45#"-

NOTA: tras un reinicio del Sistema, deberemos ejecutar únicamente el paso 7, o bien, para un mejor rendimiento en el acceso a los archivos, repetiremos los pasos 6 y 7 conjuntamente.




Aquí dejo un script en bash (llamado "Jinete", por lo de "montar archivos") creado por mí. Puedes modificarlo a tu gusto, mencionando siempre (así como lo hago yo mismo) de dónde obtuviste el material.
El script es muy útil si lo modificas según tus necesidades.
Al ejecutarlo, monta dos directorios en /mnt/montaje, solicitando para ello dos contraseñas: la de root, claro está, y la del usuario con el que accedes al servidor.
Finalmente, el mismo abre el navegador de archivos, mostrando los directorios montados.