X modelo cliente - servidor

En el principio las computadoras eran aparatos enormes, mainframes, hosts o como quieran llamarlos.

El concepto de red que hoy conocemos no estaba tan difundido, justamente porque esas computadoras eran carisimas, y solo las tenian los militares, las universidades, las grandes empresas, etc.

Entonces, como hacian muchas personas para trabajar en conjunto sin tener que estar en la misma computadora, con 20 teclados a la vez? :) - Se utilizaban terminales 'bobas', justamente por no tener una gran capacidad de procesamiento. De hecho tenian muy poca. Se las vinculaba mediante puerto serie (por ejemplo) al HOST central, y alli obtenian un shell Unix, VMS, etc. Por supuesto, esto era todo muy bueno cuando trabajabamos en modo texto, en la consola simple, tan amada por los odiadores del mouse (me incluyo).

Luego se diseñó un sistema grafico, y las terminales bobas necesitaban tener al menos la capacidad de ejecutar un controlador de modo de video, que no necesitaba tanto procesamiento. Ya eran menos bobas, pero no tanto. Ustedes se preguntaran: "de que sirve solo tener un controlador grafico y no tener poder para ejecutar aplicaciones?" - Bueno, este controlador grafico es en verdad el Servidor X. Un servidor X es un conjunto de controladores de placas de video, y tambien un conjunto de funciones basicas, como por ejemplo: "dibujar en las coordenadas x1,y1,x2,y2 un cuadrado".

Claro, tener funciones de dibujo no sirve de nada si no tenemos programas que las utilicen. Estos programas se llaman "clientes X", ya que acceden a las funciones de un "servidor X". Y si, adivinaron: los clientes X se ejecutaban en los HOSTS centrales, pero se conectaban al servidor X de nuestra terminal ya-no-tan-boba. Este es el concepto de XWindow bajo la arquitectura Cliente/Servidor: Los 'programas' son clientes que se conectan a un servidor, y el servidor hace lo que le piden. Obviamente el servidor X tambien se encarga de controlar el mouse, teclado, y otros dispositivos de entrada, asi como tambien varios monitores simultaneamente, etc.

Luego de tener claro este concepto podemos llegar a suponer de forma muy acertada que esta funcionalidad se mantiene en el actual XWindow, asi que vayamos a la practica:

Imaginen de que no tienen espacio para instalar, por ejemplo, OpenOffice, o que les faltan las librerias necesarias para hacer anda tal programa para XWindow. Si estan en una red, o via banda ancha, o incluso modem (aunque tendremos que armarnos de PACIENCIA!), pueden averiguar si en otra computadora con GNU/Linux se encuentra el programa en cuestion instalado. Entonces, con solamente conectarnos via SSH, o telnet, o como fuere mientras podamos ejecutar un programa instalado en dicho sistema, podremos ver y usar en nuestro servidor X el cliente X en cuestion, o sea el programa que estemos ejecutando.

Ustedes diran: "Claro... y como sabe el cliente X a que servidor X se tiene que conectar?". Simple: lo sabe a traves de una variable de entorno llamada DISPLAY, o a traves de un parametro en la linea de comandos del programa.

En principio, la variable DISPLAY debe contener nuestra direccion IP y tambien el numero de pantalla X que se esta usando. Generalmente por cada PC funciona un solo servidor X por vez, y un solo monitor, por lo que sera el "Display 0". Intentaron alguna vez ejecutar un programa de XWindow directamente desde la consola? Habran visto el mensaje de error "Can't open display" (no se puede abrir la pantalla, digamos). Justamente, los programas X (clientes X) necesitan que haya un display (servidor X) activo para poder funcionar.

Entonces, ya tenemos lo siguiente: la variable DISPLAY debe contener el par direccion_IP:numero_de_display. Por ejemplo, "200.45.23.111:0". Al ejecutar el programa X teniendo esa variable de entorno 'seteada', el cliente X se conectara al servidor X que esta funcionando en 200.45.23.111, y si la coneccion es aceptada (ya veremos por que), enviara datos al display 0.

Entonces, iniciemos XWindow ('startx'). Abramos una xterm o algun equivalente que nos de un shell. Ahora ingresemos por ssh (o como fuere) a algun sistema GNU/Linux donde tengamos una cuenta shell. Para poder setear la variable DISPLAY necesitamos saber nuestra direccion IP. Eso lo podemos hacer con el /sbin/ifconfig. Abramos OTRA xterm, y en dicha xterm ejecutemos ifconfig. Busquemos la interfaz por la que estamos conectados al otro sistema GNU/Linux (por ejemplo, ppp0 o eth0), y tomemos la direccion IP que aparece en "Inet addr:". Llamaremos a este valor "server_ip". Ahora tenemos los elementos necesarios: IP y numero de display (usaremos el 0). Ingresemos el siguiente comando en la sesion remota (la otra cuenta shell): "export DISPLAY=server_ip:0". Por ejemplo, si nuestra direccion IP fuera 200.20.2.22 ingresariamos "export DISPLAY=200.20.2.22:0" en la xterm de la sesion remota, para asi informarle a los clientes X a que servidor y display X deben conectarse para enviar sus graficos, y recibir sus respuestas.

Ahora intentemos ejecutar algun programa de X, por ejemplo otra 'xterm' o el 'gimp' o el que quieran, incluso el KDE (aunque hay que tomar una consideracion especial para esto). Claro, ejecutemoslo desde la sesion remota!.

Si todo sale bien, veremos la xterm remota en nuestra pantalla. Pero no, no va a salir bien, porque no le dimos PERMISO a ese cliente X de que se conecte a nuestro servidor X!

Como le damos permiso? Con el comando 'xhost'. Este comando se utiliza de la siguiente manera:

  • "xhost +": elimina toda restriccion, cualquier cliente puede conectarse
  • "xhost -": activa las restricciones, solo los clientes autorizados pueden conectarse.
  • "xhost +IP": permite que la IP indicada se conecte. "xhost -IP": elimina el permiso de coneccion a la direccion IP indicada.

Entonces, necesitamos saber la direccion IP de la maquina donde se encuentran los clientes X que queremos ejecutar, o sea, donde nosotros ahora estamos via ssh o telnet. Recuerdan como hicimos para obtener la IP de nuestro sistema? Si, con el ifconfig. Hagamos lo mismo en el sistema remoto: "/sbin/ifconfig". Debemos indicar el path completo ya que lo mas probable es que no seamos 'root' en ese sistema, y el /sbin no se incluye en el PATH para usuarios comunes. Una vez obtenida la IP... solo hagamos "xhost +esa_ip" y listo. Volvamos a ejecutar el xterm, y esta vez SI lo veremos aparecer en nuestro display, de a no ser que tengamos iptables o ipchains filtrando los puertos del 6000 al 6063, que son los que XWindow utiliza para recibir conecciones de clientes. Esto lo podemos obtener haciendo "grep x11 /etc/services".

Ahora ustedes piensen: cuando ponen XWindow, no solo aparece el servidor X (el cual pueden cargar con el comando 'X', en vez de 'startx'), sino que aparecen una serie de programas: Administrador de ventanas o de escritorio, alguna que otra xterm o similar, etc. En este caso, el servidor X y los clientes X se conectan mediante la interfaz 'loopback', la famosa direccion IP '127.0.0.1', la que siempre que hagamos 'ifconfig' va a estar, de a no ser que la desactivemos (algo para nada aconsejable).

Claro, en este caso no usamos xhost, ni nada. Somos nosotros mismos ejecutando tanto el server como los clientes, en el mismo teclado, misma PC, mismo usuario, etc.

Entonces, en resumen, todo el tiempo X esta funcionando como servidor y recibe permanentes conecciones de clientes X, y generalmente estos son 'locales', y no 'remotos'.

Veamos entonces, para que un cliente X remoto se ejecute en nuestro display, el resumen de los comandos o pasos necesarios es el siguiente:

  1. Iniciar XWindow por el metodo elegido (X o startx).
  2. Obtener nuestra direccion IP utilizando ifconfig. Este sera el valor que usaremos para la variable DISPLAY en el sistema remoto.
  3. desde un shell (sea de otra consola, o desde una xterm en el XWindow recien cargado) conectarnos por ssh, telnet o el metodo que sea a otro sistema GNU/Linux o U*nix, tambien, ya que el protocolo X es comun a todos.
  4. Obtener la IP del sistema remoto (otra vez ifconfig).
  5. Localmente, habilitar dicha IP con xhost +IP.
  6. Remotamente, ejecutar "export DISPLAY=ip_nuestra:0". ip_nuestra es el valor obtenido en el paso (2).
  7. Ultimo paso, ejecutar el cliente X en cuestion, claro esta desde el sistema remoto.

Y si todo anda bien, o sea, no hay firewalls molestando en ningun lado, veremos el cliente X en nuestra pantalla.

Ahora, utilizar la variable de entorno DISPLAY es la mejor opcion, creo yo, ya que aunque podemos indicar mediante parametros al cliente X a que servidor X conectarse, no siempre este parametro es exactamente igual en todo cliente. En cambio el uso de la variable de entorno DISPLAY esta 'estandarizado'. Aparte nos ahorra el hecho de tener que indicarle mas parametros a los programas!

De todas formas, el parametro que los clientes X aceptan es generalmente "-display" o "--display" y en algunos casos no tiene nada que ver. Tendremos que ver la documentacion o modo de uso (--help si se encuentra disponible, o -h) del cliente en cuestion. Entonces, para ejecutar la xterm mediante parametros o no mediante la variable de entorno, hariamos lo siguiente:

xterm -display 200.20.2.22:0

Otros programas quiza necesiten --display, o incluso un parametro o formato totalmente diferente. Ah! Y en caso de que necesiten eliminar el valor de la variable de entorno DISPLAY, pueden hacerlo con "export DISPLAY=" (con el = al final). Con ello tendra un valor vacio.

De esta forma me despido hasta la proxima, y no olviden que yo armo esta seccion en base a las consultas de los lectores. Escribanme a linux@tectimes.com, que me haran llegar sus consultas e inquietudes.