Montar un servidor de terminales con LTSP | Algo de Linux

miércoles, 1 de abril de 2009

Montar un servidor de terminales con LTSP

Últimamente he tenido que montar un par de servidores de terminales. Así que, por si se me olvida lo que he hecho, que se me olvidará... voy a escribir este artículo, y si tengo que volver a hacerlo ya tengo un punto de partida.
No voy a entrar, de momento, en detalles sobre como instalar un servidor dhcp, que es necesario para dar ip a los terminales. Ya lo haré cuando tenga un poco más de tiempo.

LTSP (Linux Terminal Server Project) es un proyecto que nos proporciona un conjunto aplicaciones que nos permitirán conectar muchos equipos con pocos recursos a un servidor Linux. Estos equipos serán clientes ligeros del servidor.

Las aplicaciones que ejecutemos en los clientes correrán directamente en el servidor, que aceptará entradas y mostrará su salida en las pantallas de los clientes ligeros. No obstante, LTSP, en su versión 5, dispone de una herramienta experimental, llamada localapps que nos permite hacer que algunas aplicaciones se ejecuten en el cliente.

Para montar un servidor de terminales, tendremos que instalar los siguientes paquetes, como mínimo:
  • ltsp-server
  • Un servidor tftp, como por ejemplo: atftp.
  • Un servidor dhcp: como dhcp3-server o dnsmasq. En nuestros centros usamos dhcp3-server-ldap porque usamos ldap como backend para almacenar los datos.
Si usamos nfs para servir la imagen a nuestros terminales, instalaremos además:
  • nfs-kernel-server
Y si nuestros terminales reciben la imagen via nbd, instalaremos el paquete:
  • nbd-server
Se necesitan algunos paquetes más, pero como son dependencias, al instalar los paquetes que hemos dicho, se instalarán todos los demás que son necesarios.

Un paquete necesario, que se me olvidaba mencionar, es openssh-server, dado que el tráfico entre el servidor y los clientes viaja encriptado. Pero bueno, es un paquete que se suele tener instalado.

En cualquier caso, si no queremos instalar uno a uno los paquetes mencionados, siempre podemos instalar el paquete ltsp-server-standalone y se instalará todo lo necesario para montar un servidor de terminales:

# apt-get install ltsp-server-standalone

En nuestros centros las imágenes se sirven mediante nbd. Yo tengo instalados tanto nfs-kernel-server como nbd-server. Y con unos pequeños cambios puedo usar un sistema u otro. Por defecto, se usa nfs, así que, luego veremos cómo cambiar a nbd.

ltsp se instala en /opt. Por lo que, al terminar la instalación, tendremos el siguiente directorio: /opt/ltsp
En este directorio se guardará tanto el sistema que compartimos por nfs como las imágenes que servimos vía nbd.
Cuando creemos las imágenes para los clientes, tendremos un subdirectorio por cada tipo de imagen que sirvamos a los terminales. Por ejemplo, si vamos a servir imágenes i386, en /opt/ltsp tendremos un directorio /opt/ltsp/i386. En cuanto a las imágenes a servir por nbd, se almacenarán en /opt/ltsp/images.

Una vez instalados los paquetes, si usamos nfs, tendremos que compartir el directorio /opt/ltsp. Ésto lo haremos añadiendo la siguiente línea al directorio /etc/exports del servidor de terminales:

/opt/ltsp *(ro,no_root_squash,async)

Una vez añadida, hacemos que el servidor nfs relea el archivo /etc/exports ejecuntando en un terminal el comando:

# exportfs -ra

El siguiente paso, será configurar el servidor dhcp que hayamos instalado. De momento, como he dicho anteriormente, no voy entrar en detalles, y, cuando tenga más tiempo, por si a alguien le interesa, publicaré un artículo más detallado explicando cómo configurar dhcp3-server o dnsmasq. En cualquier caso, podemos ver ejemplos sobre cómo configurar dhcp en /usr/share/doc/ltsp-server/examples/dhcpd.conf o /etc/ltsp/dhcpd.conf y adaptarlos a nuestra red.

El siguiente paso, será crear el S.O. para los clientes. Como mis clientes son de arquitectura i386, ejecutamos la herramienta ltsp-build-client, que creará el entorno necesario para los clientes en /opt/ltsp/i386:

# ltsp-build-client --arch i386

Eso sí. Tendremos que tener un buen ancho de banda, porque se bajará un montón de paquetes para crear el entorno chroot. Si no disponemos de un buen ancho de banda, siempre podemos tirar de un mirror local. Yo tengo un mirror local en un disco duro externo y es lo que uso para crear el chroot.

Hay dos archivos en el chroot que nos permiten personalizar el cliente:
  • /etc/lts.conf
  • /etc/default/ltsp-client-setup.
Podemos ver ejemplos de configuración en /usr/share/doc/ltsp-client

Si quisiéramos actualizar los paquetes del entorno chroot para los clientes, primero hacemos el chroot:

# chroot /opt/ltsp/i386

Ahora que estamos en el entorno chroot de los terminales, ejecutamos:

# mount -t proc proc /proc

Actualizamos la lista de paquetes:

# apt-get update

Y actualizamos los paquetes:

# apt-get upgrade

Una vez terminada la actualización del chroot, desmontamos /proc:

# umount /proc

Y tecleamos el comando exit para salir del chroot.

Si nuestro kernel ha sido actualizado, tendremos que ejecutar el comando ltsp-update-kernels para asegurarnos de que nuestro chroot use la última versión:

# ltsp-update-kernels

Todos nuestros clientes usarán el último kernel la próxima vez que se reinicien.

Por último, si estamos usando nbd, ejecutaremos ltsp-update-image para que se cree una versión actualizada de la imagen que se servirá a los terminales:

# ltsp-update-image --arch i386

La primera vez que montemos el servidor de terminales, ejecutaremos:

# ltsp-update-sshkeys

Como el servidor de terminales se comunica con los clientes mediante un canal encriptado, la primera vez es necesario que se creen los certificados SSL. Sin la ejecución de este comando ningún cliente podrá hacer login en el servidor.

También tendremos que ejecutar ltsp-update-sshkeys cuando en el cliente intentemos hacer login y recibamos un error diciéndonos algo así como que "Este esquipo no está autorizado para conectarse al servidor".

Eso sí. Es importante que cuando tengamos que hacer un ltsp-update-sshkeys, primero ejecutemos un ltsp-update-sshkeys y seguidamente hagamos un ltsp-update-image. Y no al revés. También habrá que hacerlo cuando, por lo que sea, cambiemos la IP del servidor de terminales.


Qué usar: ¿nfs o nbd?
En Debian, por defecto, se usa nfs para servir el sistema a los terminales.
La ventaja que tiene usar nfs es que no es necesario crear una imagen. Se usa directamente el sistema montado en /opt/ltsp/i386.
Como desventaja, podemos decir que a mayor número de usuarios el sistema se ralentiza.

Si usamos nbd para servir el sistema a los terminales, la desventaja es que es necesario hacer una imagen comprimida (ltsp-update-image).
La ventaja está en que a mayor número de usuarios el sistema no se hace más lento, si no que se mantiene igual.

¿Cómo cambiar de nfs a nbd?
Primero.- Para usar nbd, lo primero que tenemos que hacer es instalar dos módulos en el chroot:
  • squashfs
  • aufs
Para ello, hacemos el chroot:

# chroot /opt/ltsp/i386

Ahora que estamos en el entorno chroot de los terminales, ejecutamos:

# mount -t proc proc /proc

Actualizamos la lista de paquetes:

# apt-get update

E instalamos los paquetes que nos instalan los módulos squashfs y aufs:

# apt-get install squashfs-modules-2.6.26-1-686 aufs-modules-2.6.26-1-686

Ojo. En el ejemplo tenemos instalado el kernel 2.6.26-1-686, por lo que instalamos los paquetes squashfs y aufs para ese módulo.

Una vez instalados, actualizamos el initrd:

# update-initramfs

Una vez terminado, desmontamos /proc:

# umount /proc

Y tecleamos el comando exit para salir del chroot.

Segundo.- Vamos a modificar dos ficheros:
  • /opt/ltsp/i386/boot/pxelinux.cfg/default
  • /opt/ltsp/i386/etc/default/ltsp-client-setup
En el fichero /opt/ltsp/i386/boot/pxelinux.cfg/default viene una línea como la siguiente: DEFAULT vmlinuz ro initrd=initrd.img quiet root=/dev/nfs ip=dhcp boot=nfs
Para que no se use nfs, la comentamos y ponemos una como la siguiente:
DEFAULT vmlinuz ro initrd=initrd.img quiet

Para no tener que acordarme, así es como tengo el fichero /opt/ltsp/i386/boot/pxelinux.cfg/default:

# Para usar nfs
#DEFAULT vmlinuz ro initrd=initrd.img quiet root=/dev/nfs ip=dhcp boot=nfs

# Para usar nbd
DEFAULT vmlinuz ro initrd=initrd.img quiet

Cuando quiero usar nbd comento la línea nfs y cuando quiero usar nfs comento la línea nbd

Una vez modificado el primer fichero, tenemos que modificar /opt/ltsp/i386/etc/default/ltsp-client-setup
En este segundo fichero lo único que tenemos que cambiar es el parámetro root-write-method=" " por root-write-method="aufs"

Una vez modificados los dos ficheros, como el primero afecta al kernel, ejecutamos un ltsp-update-kernels:

# ltsp-update-kernels

Y como usamos nbd, una vez hecho el ltsp-update-kernels haremos el ltsp-update-image:

# ltsp-update-image --arch i386

Si queremos volver a usar nfs, lo único que tendremos que hacer es modificar los dos ficheros anteriores. No tenemos que volver a crear la imagen, puesto que, mediante nfs, no se usan imágenes.

5 comentarios:

Atila dijo...

¿Has probado TCOS?
Es mucho más fácil de instalar.

Esteban M. Navas dijo...

No. No he probado TCOS. LinEx está integrado en DebianEdu y el proyecto implantado es LTSP.

Atila dijo...

Pues, desde mi punto de vista, es muchísimo más fácil que LTSP y ha sido desarrollado por Mario, un estupendo (y joven) programador de Valladolid, dispuesto siempre a echarte una mano en cualquier problema que se te presente. Pensado para usarse con Debian y Ubuntu y con repositorio propio.

Esteban M. Navas dijo...

No puedo hablar de TCOS porque no lo conozco.
En cambio, de LTSP puedo decirte que es un proyecto muy maduro con unos cuantos años de rodadura, adoptado por distribuciones como Skolelinux, Edubuntu, etc... para su uso en ambientes educativos, que es donde lo tenemos implantado. Tiene cosas muy interesantes, como por ejemplo, que el tráfico entre el servidor y los terminales viaja cifrado mediante túneles ssh, importantísimo a la hora de mantener la seguridad. Dispone de la posibilidad de usar nfs o nbd para servir el sistema a los terminales, según se prefiera. Y, en su última versión, dispone de una herramienta que permite ejecutar aplicaciones de forma local en los clientes.
En cuanto a la instalación, no me parece compleja. Puedes instalar un servidor con tan sólo instalar el paquete ltsp-server-standalone. Quizás, lo que más complicado puede parecer es la configuración, pero una vez que se conoce cómo funciona, no es tan difícil.

Luirro dijo...

Hola.
Intenté pasar de NFS a NDB siguiendo tus instrucciones, pero ahora no puedo bootear el cliente delgado. Esto es lo que me tira:

mount: mounting /dev/nbd0 on /rofs failed: Invalid argument.
mount: mounting /rofs on /root/rofs failed: Invalid argument.
mount: mounting /dev/ on /root/dev failed: Invalid argument.
mount: mounting /sys on /root/sys failed: Invalid argument.
mount: mounting /proc on /root/proc failed: Invalid argument.
Target filesystem doesn't have /sbin/init.
No init found. Try passing init=bootarg.

... y aparece un prompt de BusyBox.

¿Alguna ayuda?

GRACIAS.