"Después del juego es antes del juego"
Sepp Herberger

martes, 29 de septiembre de 2015

Lenovo A630/MediaTek 6577: ROM nueva, CWM recovery y reparticionado de memoria interna.


El Lenovo A630 que tenemos en casa llevaba un tiempo dando problemas: necesitaba una buena limpieza y quería aprovechar para instalar un recovery mas potente, por ejemplo el ClockWorkMod y, ya de paso, reparticionar la SD ya que con solo 512Mb de memoria para aplicaciones estaba constantemente quejándose de que se quedaba sin espacio. Vamos a ver una colección de guías y enlaces para hacer todo esto sin brickear nuestro móvil, junto con la solución de los posibles problemas que a mi se me han presentado.

Tenemos pues un Lenovo A630, equipado con un chip MediaTek MK 6577 con la siguiente ROM:

A630_S009_130510
Android 4.0.4
BANDA BASE: A630.V5, 2012/12/17 16:15

En su día ya había rooteado el móvil con ayuda de este manual de mi compañero Esteban.


1. Poner una ROM nueva y limpia.

Por "limpia" entiendo una ROM libre de aplicaciones chinas, con las Gapps y rooteada. Por desgracia la scene de cocineros de este móvil es inexistente, así que no hay mucho donde elegir. Me decanté por ésta de needrom (realmente tampoco hay muchas mas de fiar). Sus características son:

ROM Phone LENOVO A630 ROM Android 4.0.4
Based on Official ROM LENOVO A630 version: Lenovo A630_S008_130111
Gapps include - Rooted
Language support:  Multilang

Los pasos para la instalación deben realizarse en Windows, ya que las aplicaciones necesarias no están para Linux o lo están en modo beta y estas cuestiones tan delicadas no son para experimentar. Estos son:

1) Instalar los drivers para Windows del modo preloader USB VCom de Mediatek 65XX. Instrucciones aquí, es una instalación manual ya que se hace sin tener conectado el móvil al PC. El modo preloader es el modo usado para cargar las ROM en los móviles y tablets MediaTek desde un PC usando un cable USB.

2) Luego descargar la ROM elegida de http://www.needrom.com/download/lenovo-a630-2/. Una vez bajada la descomprimimos y, por comodidad, movemos el directorio entero a C:\, en la raíz de la partición Windows. Estrictamente no es necesario, pero me gusta ponerlo ahí porque a veces las rutas muy largas o con espacios me han chafado la carga de las ROM.

3) Descargar e instalar la aplicación SPFlash, que es la que usaremos para la carga de la ROM. Cualquier versión entre la 3.1320 y la 5.1452 (la última por ahora) nos servirá. Yo he usado la 3.1320. Manuales de uso de SPFlash tenemos en abundancia:

4) Cargar la ROM, siguiendo estos pasos:

  • Abrir SPFlash y elegir el archivo scatter "MT6577_Android_scatter_emmc.txt" en la carpeta de la ROM descargada en el paso 2.
  • Dentro de SPFlash, en Opciones, elegir "USB Model" y "DA Download All->Speed->High Speed"
  • Apagar el móvil y quitar la batería.
  • En SPFlash seleccionar la opción Download o Updgrade ROM Firmware. A mi la primera me daba un error al comenzar el proceso y he tenido que usar la segunda.
  • Enchufar el móvil apagado y sin batería a un puerto USB del PC.
  • Tan pronto se detecte el móvil, empezarán a aparecer barras de progreso de colores morado, amarillo, etc. Cuando todo acabe aparecerá un círculo verde indicando que se acabó. En ese momento se puede desconectar el móvil, poner la batería y encender.

Bueno, pues en la práctica a mi todos estos pasos tan sencillos siempre me han dado problemas en la última fase: en las barras de progreso tarde o temprano me aparecía un error, con mensajes bastante oscuros. Tras probar varios SPFlash distintos e intentar interpretar los errores sin éxito se me ocurrió conectarlo al puerto USB con estas 2 condiciones:

  • Una tarjeta miniSD puesta en el móvil.
  • La bateria puesta de nuevo en el móvil (la he quitado 10 segundos y luego la he vuelto a poner, sin encenderlo).

No se si ambas cosas son necesarias o no, pero sospecho que solo lo sería la segunda. También he leído testimonios de gente con otros MediaTek que pone la batería con el móvil ya enchufado al USB, o que pulsa el botón Vol- y no lo suelta hasta que la ROM esta copiada.... es decir, no hay un método universal, dependerá de nuestro aparato en cuestión.

Una vez hecho esto encendemos el móvil y tras la típica eterna espera de los primeros arranques de una ROM nueva nos saltarán el asistente de configuración de idioma, cuenta, etc. Primera fase acabada.

2. Instalar el Recovery CWM.

Hay varias formas de meter un ClockWorkMod Recovery en un teléfono MediaTek: la primera consiguiendo un fichero .img con la partición de recovery CWM ya preparada y flasheando dicha partición usando SP Flash tools. No encontraba ningún recovery de confianza para el A630, asi que utilicé otro método mas fiable: usar MTKDroidTools.

Una vez mas, mi compañero Esteban lo explica de forma sencilla.

Para no variar  he tenido varios obstáculos: el móvil no me aparecía como rooteado (el recuadro de abajo-izquierda de las MTKDroidTools estaba amarillo en lugar de verde) y al intentar seguir los pasos del enlace anterior me daba error "adbd not install", además en "Recovery y root" solo me salia la opción "seleccionar archivo boot.img" en lugar de las 3 que deberían salir.

Solución: instalar desde Google Play la aplicación busybox y ejecutarla, luego instalar a mano la aplicación "ADBD insecure" y ejecutarla para ponerla en modo "enable". Fuentes y enlaces para descargar:

Un truco que a mi no me ha hecho falta: si el teléfono no arranca después de meter el CWM recovery debemos instalar con SPFlash un boot parcheado (también se crea un recovery) que se crea en la carpeta recovery de MTKDroidTools.

Una vez instalado, apagamos el móvil y para arrancar el recovery pulsamos Vol+ y sin soltarlo apretamos el botón de power. Cuando se encienda soltamos power pero seguimos pulsando Vol+. En un instante aparecerá el texto "Recovery" en la parte inferior de la pantalla, entonces pulsamos el botón central ("Home") del teléfono y ya nos saldrá un menú CWM estándar, desde el que podremos flashear de forma sencilla, realizar wipes (borrados de configuración) y hacer copias de seguridad a la SD del equipo.

3. Hacer copia de seguridad completa con MTK DroidTools.

Desde el Recovery CWM podemos hacer copias de seguridad del sistema a la tarjeta SD, que luego podremos recuperar con el mismo recovery. Pero también es muy interesante hacer una copia de seguridad completa para restaurar con SPFlash, por si el móvil se queda tan brickeado que no nos deja ni entrar en el recovery.

Esta copia se hace con MTKDroidTools siguiendo estos sencillos tutoriales:


Es imprescindible después de realizar la copia con la opción Backup no olvidar usar la opción "Comprobar y Preparar blocks para el FlashTools" (nos pedirá elegir el fichero .md5 de la carpeta del backup que hemos hecho), lo que nos crea una carpeta "!Files_to_FlashTool" con una versión del backup apta para restaurar con SPFlash del paso 1.

4. Reparticionar para dar mas espacio a las aplicaciones.

Como en muchos móviles, la partición inicial para aplicaciones es mísera: 512Mb o menos que se llenan enseguida y hay que andar con Link2SD, int2SD y trucos por el estilo. Lo mas deseable es reparticionar y aumentar esa partición a costa de reducir el espacio para la SD Interna. Nunca entenderé esa costumbre de simular una SD con una partición de la memoria interna del móvil: a fin de cuentas es sencillo y barato poner una SD externa para almacenar las fotos y demás cosas.

Propongo dos métodos:

  1. El método usado por Esteban, le voy a tener que pagar derechos de autor.
  2. Usando HKPhone, muy sencillo si tu móvil es compatible. Se basa en usar una apk que te hace todo y funciona sin problemas en el A630, siempre que esté rooteado y tenga CWM Recovery instalado.

Yo he optado por configurar 2GB para aplicaciones y 512Mb para SD Interna, después entro en el recovery y hago un Wipe-Factory Reset. Una vez dentro del móvil, verifico que en Ajustes->Aplicaciones hay 2Gb de espacio (ahora si que será difícil llenarla) y, por último, en Ajustes->Almacenamiento le digo que guarde las cosas en la SD Externa.

Para comparar, veremos el particionamiento antes de reparticionar usando para ello la apk DiskInfo:

 Internal Storage (MMC)
--------------------------
 * ebr1 [mmcblk0p1] Not mounted
 * sec_ro [mmcblk0p2] (/system/secro) [ext4]                          Used: 5 MB, Free: 0 B, Total space: 5 MB
 * System (android) [mmcblk0p3] (/system) [ext4]                      Used: 419 MB, Free: 92,1 MB, Total space: 512 MB
 * Cache [mmcblk0p4] (/cache) [ext4]                                  Used: 17,4 MB, Free: 494 MB, Total space: 512 MB
 * Data (usrdata) [mmcblk0p5] (/data) [ext4]                          Used: 268 MB, Free: 243 MB, Total space: 512 MB
 * SD card (fat) [mmcblk0p6] (/mnt/sdcard, /mnt/secure/asec) [vfat]   Used: 109 MB, Free: 1,9 GB, Total space: 2,1 GB
 * mmcblk0boot1 [mmcblk0boot1] Not mounted
 * mmcblk0boot0 [mmcblk0boot0] Not mounted

y después de reparticionar:

 Internal Storage (MMC)
--------------------------
 * ebr1 [mmcblk0p1] Not mounted
 * sec_ro [mmcblk0p2] (/system/secro) [ext4]                          Used: 5 MB, Free: 0 B, Total space: 5 MB
 * System (android) [mmcblk0p3] (/system) [ext4]                      Used: 422 MB, Free: 89,2 MB, Total space: 512 MB
 * Cache [mmcblk0p4] (/cache) [ext4]                                  Used: 16,4 MB, Free: 495 MB, Total space: 512 MB
 * Data (usrdata) [mmcblk0p5] (/data) [ext4]                          Used: 477 MB, Free: 1,5 GB, Total space: 2 GB
 * SD card 2 (fat) [mmcblk0p6] (/mnt/sdcard2) [vfat]                  Used: 3,9 MB, Free: 563 MB, Total space: 567 MB
 * mmcblk0boot1 [mmcblk0boot1] Not mounted
 * mmcblk0boot0 [mmcblk0boot0] Not mounted


Con esto ya tenemos el móvil preparado para funcionar una temporada más.

5. Un par de cosas interesantes.


  • Si  enredando perdemos los IMEI del móvil (*) siempre podemos recuperarlos con cualquiera de estos dos métodos:

a) Usando el modo ingeniero de Mediatek. Hay aplicaciones para entrar en el modo ingeniero en el Google Play, una vez allí se usan comandos AT para fijar el IMEI, tal como cuenta, como no, Esteban aquí.

b) Más sencillo: la aplicación MTK DroidTools tiene una opción para meter los IMEI a mano directamente.

Bueno, pues a ver que me pasa está semana para contarlo la próxima.

(*) Considérate afortunado por tener un móvil MediaTek. Los que tienen chip SnapDragon y pierden los IMEI sin tener copia de seguridad de las particiones donde se guardan pueden darse por jodidos. Hay manuales de las herramientas necesarias, pero yo no he podido hacerlas funcionar correctamente y ni Qualcomm ni Xiaomi (en mi caso) te dan ninguna solución para volver a generar las particiones con sus IMEI correspondientes. Por ese motivo, mientras no se tomen en serio a sus clientes y liberen la información para regenerar los IMEI voy a pasar de comprar cualquier aparato con SnapDragon.

miércoles, 23 de septiembre de 2015

Uso de getent para consultar los netgroup


El comando getent es una forma cómoda y sencilla de consultar nuestras bases de datos de usuarios, grupos, máquinas, etc. Por ejemplo, si hacemos:
root@exmachina:~# getent passwd
Nos mostrará todos los usuarios del sistema. En principio diremos: "vaya tonteria, es como un cat  /etc/passwd". Pues no: si los usuarios están además en una BD ldap getent nos mostrará los que hay allí, sin tener que tirar de esotéricas consultas mediante ldadsearch.

Para saber donde están los datos que debe mostrar getent éste consulta el fichero /etc/nsswitch.conf:
root@exmachina:~# cat /etc/nsswitch.conf
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

automount:         files ldap

passwd:         compat ldap
group:          compat ldap
shadow:         compat ldap

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       files ldap
root@exmachina:~#
Como se ve, passwd está en "compat ldap", eso quiere decir que el sistema buscará los usuarios en /etc/passwd y en el servidor ldap de nuestra red. Si al llamar a getent además añadimos un parámetro nos filtrará por dicho usuario, mostrando solamente sus datos:
root@exmachina:~# getent passwd aasanchezl01
aasanchezl01:x:12568:12568:Alberto Antonio Sanchez Lara:/home/alumnos/aasanchezl01:/bin/bash
root@exmachina:~# 
Igual que passwd, con getent podemos consultar varias bases de datos mas: la de grupos de usuarios, la de hosts, etc. La que nos interesa ahora es la de netgroup. Esta base de datos permite hacer grupos de máquinas para aplicarles determinadas directivas. Por ejemplo, podemos definir un grupo de hosts llamado workstation-hosts y luego exportar mediante NFS una carpeta sólo a dicho grupo:
root@servidor-nfs:~# cat /etc/exports 
# /etc/exports: the access control list for filesystems which may be exported
..........
..........
/data/folder    @workstation-hosts(rw,async,no_subtree_check,insecure)
..........
..........
De esta manera solo las máquinas miembros de workstation-hosts pueden montar servidor-nfs:/home/folder.

La definición de los netgroups puede realizarse en el fichero /etc/netgroup (sintaxis aquí) y en el árbol ldap. En este último caso queda con este aspecto:


Si queremos consultar los netgroup definidos la orden sería "getent netgroup", pero puesta así sola da un error diciendo que esa base de datos no soporta enumeración. Eso traducido quiere decir que hay que especificar además que netgroup estamos consultando (es decir, no podemos preguntar por todos los netgroups a ciegas, debemos saber sus nombres), por ejemplo:
root@exmachina:~# getent netgroup workstation-hosts
workstation-hosts     (a01-pro, -, -) (a13-o01, -, -) (...................
root@exmachina:~#
Si hacemos la prueba veremos que saca todas las máquinas del grupo en una sola línea, en la forma de tuplas "(nombre, -, -)" que lo hacen bastante ilegible. Si queremos que saque las máquinas en líneas separadas y adicionalmente filtrar por algún valor tendremos que usar una combinacion de sed y grep. Por ejemplo:
root@exmachina:~# getent netgroup workstation-hosts |  sed 's/-)/-)\n/g' | grep a2
  (a20-pro, -, -)
  (a21-pro, -, -)
root@exmachina:~#
Se enumeran los hosts, pero en lineas separadas con el sed que convertirá "-)" en "-)\n", insertando un retorno de carro. Después se filtra para que solo salgan los hosts cuyo nombre contenga "a2". De esta forma consultamos de una forma rápida si un host está o no en un netgroup.

Este uso de sed permite dividir en líneas separadas sentencias muy largas. Por ejemplo, otro uso si tenemos un fichero de insert sql todo en una línea y queremos dividirlo en un registro por línea:
root@exmachina:~# cat aminno_member_email.dump 
INSERT INTO `member_details` VALUES (9,0,0,'1953-11-24','Speak',1,65772,173,2,1,1,5), (10,0,0,'1971-10-11','Fine',1,47628,163,1,1,1,3), (11,0,0,'1968-02-11','Help',1,38556,152,1,1,2,0), (12,0......
root@exmachina:~#
El comando sed haria una sustitución de  ",)" por ",)\n":
root@exmachina:~# sed 's/,(/,\n(/g' aminno_member_email.dump > mail.dump
Bueno, pues hasta la siguiente, :-).

martes, 15 de septiembre de 2015

Panel inmutable para todos los usuarios en XFCE

En entornos educativos/empresariales como los nuestros es muy conveniente mantener uniformes los escritorios de todos los usuarios, haciendo que sean personalizables el menor número de opciones posible.

Cuando usábamos Gnome2 teníamos los ficheros mandatory que nos permitían fijar cosas como el fondo de pantalla y varias opciones mas del escritorio. En nuestro breve paso por Gnome3 también vimos que había una manera de hacerlo.   Al pasarnos a XFCE nos llevamos la agradable sorpresa de que también existía esa posibilidad: el modo kiosco que permite bloquear configuraciones de xfconf, el gestor de configuraciones de dicho escritorio.

Básicamente consiste en meter ficheros xml (donde se almacena la configuración de XFCE) en la ruta /etc/xdg/xfce4/xfconf/xfce-perchannel-xml/, con determinadas partes bloqueadas o desbloqueadas (con los parámetros locked/unlocked). Estas configuraciones bloqueadas se impondrán siempre sobre la configuración personal del usuario almacenada en ~/.config/xfce4/xfconf/xfce-perchannel-xml/. En ambos directorios hay muchos ficheros xml, cada uno de los cuales configura determinados aspectos de nuestro entorno XFCE4.

root@servidor:~/.config/xfce4/xfconf/xfce-perchannel-xml# ls -1
displays.xml
keyboards.xml
pointers.xml
thunar-volman.xml
xfce4-desktop.xml
xfce4-keyboard-shortcuts.xml
xfce4-mixer.xml
xfce4-panel.xml
xfce4-session.xml
xfce4-settings-manager.xml
xsettings.xml 
Se puede configurar y bloquear el panel, el fondo de pantalla, el control de volumen, el volume manager del explorador de archivos y muchísimas cosas más. Las posibilidades son mucho mayores que en Gnome2 y Gnome3.

Como ejemplo vamos a ver como poner un panel (definido en el fichero xfce4-panel.xml) fijo e inmutable para todos los usuarios. Para ello cogemos un usuario de prueba y configuramos desde el entorno gráfico el panel tal como queremos quedarlo finalmente. Luego simplemente copiamos el fichero ~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-panel.xml a la ubicación /etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xfce4-panel.xml y lo modificamos para que quede bloqueado para todo el mundo excepto para el usuario "root" (fragmento marcado en rojo).

root@servidor:/etc/xdg/xfce4/xfconf/xfce-perchannel-xml/# cat xfce4-panel.xml
<?xml version="1.0" encoding="UTF-8"?>

<channel name="xfce4-panel" version="1.0" locked="*" unlocked="root">
  <property name="panels" type="uint" value="1">
    <property name="panel-0" type="empty">
      <property name="size" type="uint" value="36"/>
      <property name="length" type="uint" value="100"/>
      <property name="locked" type="bool" value="true"/>
      <property name="autohide" type="bool" value="false"/>
      <property name="position-locked" type="bool" value="true"/>
      <property name="plugin-ids" type="array">
        <value type="int" value="1"/>
        <value type="int" value="2"/>
        <value type="int" value="3"/>
        <value type="int" value="4"/>
        <value type="int" value="5"/>
        <value type="int" value="6"/>
        <value type="int" value="7"/>
        <value type="int" value="8"/>
        <value type="int" value="9"/>
        <value type="int" value="10"/>
        <value type="int" value="11"/>
        <value type="int" value="12"/>
      </property>
      <property name="horizontal" type="bool" value="true"/>
      <property name="position" type="string" value="p=10;x=0;y=991"/>
      <property name="leave-opacity" type="uint" value="80"/>
      <property name="enter-opacity" type="uint" value="100"/>
      <property name="background-style" type="uint" value="1"/>
      <property name="background-color" type="array">
        <value type="uint" value="38053"/>
        <value type="uint" value="38053"/>
        <value type="uint" value="38053"/>
        <value type="uint" value="65535"/>
      </property>
    </property>
  </property>
  <property name="plugins" type="empty">
    <property name="plugin-1" type="string" value="whiskermenu">
      <property name="show-menu-icons" type="bool" value="true"/>
      <property name="show-button-title" type="bool" value="true"/>
      <property name="custom-menu-file" type="string" value=""/>
      <property name="button-icon" type="string" value="linex-icon"/>
      <property name="button-title" type="string" value="Inicio"/>
      <property name="custom-menu" type="bool" value="false"/>
    </property>
    <property name="plugin-2" type="string" value="separator">
      <property name="style" type="uint" value="1"/>
    </property>
    <property name="plugin-3" type="string" value="showdesktop"/>
    <property name="plugin-4" type="string" value="launcher">
      <property name="items" type="array">
        <value type="string" value="system-config-printer.desktop"/>
      </property>
    </property>

    <property name="plugin-5" type="string" value="launcher">
      <property name="items" type="array">
        <value type="string" value="google-chrome.desktop"/>
      </property>
    </property>
    <property name="plugin-6" type="string" value="launcher">
      <property name="items" type="array">
        <value type="string" value="rayuela.desktop"/>
      </property>
    </property>
    <property name="plugin-7" type="string" value="places"/>
    <property name="plugin-8" type="string" value="actions"/>
    <property name="plugin-9" type="string" value="tasklist">
      <property name="grouping" type="uint" value="0"/>
      <property name="include-all-workspaces" type="bool" value="false"/>
      <property name="flat-buttons" type="bool" value="false"/>
      <property name="show-handle" type="bool" value="true"/>
    </property>
    <property name="plugin-10" type="string" value="systray">
      <property name="show-frame" type="bool" value="false"/>
      <property name="rows" type="uint" value="1"/>
    </property>
    <property name="plugin-11" type="string" value="gnome-sound-applet"/>
    <property name="plugin-12" type="string" value="datetime"/>

  </property>
</channel>
Al ser XML no es muy legible (tampoco importa mucho, ha sido generado automáticamente al configurar el panel con el entorno gráfico), pero mas o menos se puede ver que  se define el tamaño, el orden de los plugins y el color de fondo. Posteriormente se definen los plugins que formarán parte del panel:
  1. Menú Whisker.
  2. Separador.
  3. Botón de "Mostrar escritorio".
  4. Lanzador system-config-printer.desktop (este lanzador y los siguientes deben estar definidos en /usr/share/applications/, como cualquier otro fichero .desktop ), para abrir la aplicación de gestión de impresoras.
  5. Lanzador google-chrome.desktop, para abrir Google Chrome.
  6. Lanzador  rayuela.desktop, para abrir directamente la página de Rayuela.
  7. Plugin "Lugares", con accesos directos a las carpetas más comunes. Necesita que instalemos previamente el paquete xfce4-places-plugin.
  8. Plugin "Actions", para botón de salida de sesión.
  9. Plugin "Tasklist", para mostrar la lista de ventanas abiertas.
  10. 11. 12....  Fecha, control de volumen, etc.
Al principio del todo, las líneas:
locked="*" unlocked="root"
Hacen que todo lo que cuelgue de ese nodo XML esté bloqueado para todo el mundo excepto para el usuario root, de tal forma que no podrá modificarse. Podemos especificar grupos de usuarios anteponiento  "@" y poner varios separándolos por ";", por ejemplo:
locked="*" unlocked="root;@teachers;usuario01"
El panel estará bloqueado para todos, excepto para root, los miembros del grupo "teachers" y el usuario "usuario01".

Al aplicar el locked/unlocked un "channel" afecta a todo lo contenido dentro de él. Cuando se aplica sobre una "property" solo afecta a dicha property, no a las que estén dentro de ella.

El resultado final es algo así como:
 

Este panel será inmodificable por el usario y aparecerá con ese aspecto a todos los usuarios que hagan login en la máquina donde se ha configurado, imponiéndose sobre sus configuraciones particulares. Con ayuda de puppet podemos distribuirlo a todas las máquinas que queramos.

Si queremos que un usuario pueda modificar el panel, simplemente hay que añadir su nombre de usuario en el atributo unlocked del XML.

Para finalizar un par de cosas: mostramos el contenido de /usr/share/applications/rayuela.desktop, ya que no viene por defecto en nuestras distribuciones:

~ # cat rayuela.desktop 
[Desktop Entry]
Version=1.0
Name=Rayuela
Comment=Aplicación Rayuela
Exec=google-chrome http://rayuela.educarex.es
Terminal=false
Icon=/usr/share/icons/hicolor/64x64/apps/rayuela.png
Type=Application
Categories=Network;WebBrowser;
MimeType=text/html;text/xml;application/xhtml_xml;image/webp;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;
X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito

El icono rayuela.png usado es este:

Otra cosa que quiero comentar es la configuración del plugin Places. Como se puede ver tengo varias carpetas que quiero que siempre estén accesibles para el usuario desde allí (y desde el explorador de archivos Thunar, ya que usa el mismo fichero de configuración). El fichero usado por Places es ~/.gtk-bookmarks y tiene el siguiente contenido:

~ # cat .gtk-bookmarks
file:///home/aulas
file:///home/instituto
file:///media/salaprofesores
file:///media/escaner
file:///media/docprofesorado
file:///media/filmoteca

Siendo todas distintas carpetas de red montadas en el /etc/fstab de la máquina. Si queremos que se aplique a todos los usuarios una alternativa es copiar este .gtk-bookmarks a todos sus home. Otra opción mas cómoda es configurarlo de una manera centralizada, por ejemplo en la carpeta de red de acceso libre /home/instituto :

~# ls -l /home/instituto/comunes/.gtk-bookmarks.sprof
-r--r--r-- 1 root teachers 146 jul 17 13:14 /home/instituto/comunes/.gtk-bookmarks.sprof

Para conseguir  que todos los usuarios que hagan login en una máquina tengan su ~/.gtk-bookmarks apuntando a /home/instituto/comunes/.gtk-bookmarks.sprof lo que hago es meter el siguiente script en el arranque de la sesión X:
~# cat /etc/X11/Xsession.d/99session_tasks
#!/bin/bash
#Irá en /etc/X11/Xsession.d
#El nombre no es al azar, debe ser: XXcustom_script, sin extensiones, sino Xsession no lo procesa.
#Meter aqui cosas a realizar en cada inicio de sesión
#Crea un acceso a la lista de carpetas estándar para que se muestren en thunar y en el plugin lugares del panel.

ln -sf /home/instituto/comunes/.gtk-bookmarks.sprof $HOME/.gtk-bookmarks
Nota 8/2/2016: lo anterior era para Wheezy. En Ubuntu Trusty los bookmarks se guardan adicionalmente en la ruta $HOME/.config/gtk-3.0/bookmarks, por lo que el script debería ser:
~# cat /etc/X11/Xsession.d/99session_tasks
#!/bin/bash
#Irá en /etc/X11/Xsession.d
#El nombre no es al azar, debe ser: XXcustom_script, sin extensiones, sino Xsession no lo procesa.
#Meter aqui cosas a realizar en cada inicio de sesión
#Crea un acceso a la lista de carpetas estándar para que se muestren en thunar y en el plugin lugares del panel.

ln -sf /home/instituto/comunes/.gtk-bookmarks.sprof $HOME/.gtk-bookmarks
ln -sf /home/instituto/comunes/.gtk-bookmarks.sprof $HOME/.config/gtk-3.0/bookmarks
De esta manera, aun cuando el usuario borrase o manipulase su .gtk-bookmarks, en el siguiente inicio de sesión se restauraría. Adicionalmente en /home/instituto/comunes podemos ubicar varios .gtk-bookmarks.xxx para usar en función de la máquina y/o el usuario.

Bueno, pues el resto de ficheros XML de xfce4 se configurarían de forma similar. Solo hay que probar e investigar que demonios se configura dentro de cada uno y tendremos un escritorio totalitario y dictatorial que haría las delicias del Amado Líder:


Hasta la próxima, tovariches.

martes, 8 de septiembre de 2015

OpenWrt: repetidor de redes wifi con los router Astoria ARV7518 y ARV4158 de ya.com.

Ya prometí en su día continuar con OpenWrt. Como lo prometido es deuda y un Lanister siempre paga sus deudas, aquí estamos.

Despues del proyecto con un servidor usbip basado en un router Astoria ARV7158PW de ya.com, seguía teniendo otro ARV7518 (blanco) y además un ARV4518 (gris oscuro). Quería hacer con en ellos un repetidor wifi para extender un par de señales wifi que me llegaban débiles en dos ubicaciones.

Sobre este tema de la repetición/extensión de señales wifi existe una gran confusión que al final se me ha contagiado. Voy a intentar exponer lo que creo que tengo claro:

  • El repetir/extender una señal wifi puede hacerse con el mismo BSSID y contraseña o bien con una BSSID (y opcionalmente contraseña) distinta. Depende del método elegido.
  • El WDS permite extender una red wifi pero los dos routers deben ser compatibles (a veces misma marca, modelo y firmware) y usar cifrado WEP. Es  por tanto un método quisquilloso e inseguro.
  • Hay dispositivos repetidores que se pueden comprar por unos 20-30 euros, que se conectan a un enchufe de corriente, se configuran mediante un interfaz web y ya está. Esa es la forma fácil.
  • La forma divertida es utilizar OpenWRT sobre un router abandonado. Dependiendo de la tarjeta de red que tenga, se puede hacer de dos maneras:
  1. Si tiene una tarjeta de red Atheros, se puede usar el método del pseudo-bridge con el paquete relayd, que es el que usado yo en este tutorial.
  2. Si tiene una tarjeta Broadcom u otra marca, o bien Atheros y no queremos usar pseudo-bridge tenemos que pinchar un dispositivo wifi USB en el puerto correspondiente del router, que servirá para repetir/extender la señal que llegue por la tarjeta wifi propia del router. Necesitamos por tanto un dispositivo wifi USB extra compatible con OpenWRT y programar el encaminamiento entre ambas tarjetas de red.

Como he adelantado, voy a usar el método del pseudo-bridge con relayd, aprovechando que ambos routers Astoria tienen tarjeta Atheros (eso se ve en la página de http://wiki.openwrt.org dedicada a cada router).

1. Instalación de OpenWRT

Si ya tenemos cargado OpenWRT o bien el router no es de este tipo, podemos saltarnos este apartado.

El primer paso es cargar OpenWRT en ambos routers. Eso está sobradamente explicado en mi entrada previa y en estás páginas:


Conviene leerse todo varias veces para tener claro todo el proceso, la carga de OpenWrt en estos routers no es trivial. Además hace falta conseguir un conversor TTL-USB para conectar via puerto serie en los pines de la placa base del router y poder cargar el firmware desde minicom u otra utilidad de comunicación por puerto serie.

A la hora de cargar OpenWRT tenemos que decantarnos por el firmware mas adecuado posible. Después de múltiples pruebas puedo decir que los que mejor me han funcionado cotidianamente y a la hora de instalar/actualizar luego desde los repositorios de software de OpenWRT son:

  1. Attitude: mas estable, pone la wifi a 3db maximo
  2. Barrier: un pelín menos estable, pero pone la wifi a 20db. Es la que aconsejo: https://downloads.openwrt.org/barrier_breaker/14.07/lantiq/xway/openwrt-lantiq-xway-ARV7518PW-squashfs.image

El hilo de referencia para cualquier duda y problema es éste del foro Seguridad Wireless. Aquí vienen explicados todos los problemas, hay enlaces en abundancia y siempre te echan una mano si te pasa algo inesperado.

Recordemos que, de forma general, tras instalar OpenWRT el router queda iempre configurado con la IP 192.168.1.1 y podemos conectar a el por cable ethernet usando el comando telnet sin contraseña. En la primera conexión es conveniente dar una contraseña al usuario root y a partir de entonces las conexiones se harán con ssh.

2. Configurar el repetidor.

Ya tenemos OpenWRT y nuestro router tiene tarjeta de red wifi Atheros, así que vamos a configurarla como repetidor. Hay varios métodos, mis fuentes han sido:

Tras leer lo anterior y ver las distintas posibilidades me decidí por usar el método de pseudo-bridge con relayd, ya que mis  router  tienen una sola tarjeta de red. Este método hace que con una sola tarjeta y antena wifi podamos "levantar" dos tarjetas de red virtuales: una recibe la señal como cliente wifi conectado a la red remota y la otra crea un punto de acceso (con un BSSID nuevo) que reemite la señal con mas potencia de la que llega. Ambas tarjetas se conectan entre sí con el software relayd.

La documentación disponible sobre relayd que he consultado es:
Los pasos preliminares son instalar el paquete relayd y wireless-tools. Para toda la configuración tenemos que conectar con cable de red el router con un PC y usar la conexión ssh para introducir los comandos y configuraciones.

root@OpenWrt:/root# opkg update
root@OpenWrt:/root# opkg install wireless-tools
root@OpenWrt:/root# opkg install relayd
root@OpenWrt:/root# /etc/init.d/relayd enable
Con wireless-tools se nos instalan dos comandos muy útiles:
  • iwconfig: que nos muestra la configuración de las tarjetas wifi, si están conectadas y en que modo están funcionando.
  • iwlist: comando que nos muestra una lista de las redes wifi detectadas, para que veamos si nos llega la red que queremos repetir. Este escaneo de las señales wifi se hace con:
root@OpenWrt:/root# iwlist wlan0 scan
Veamos ahora como configurar los diferentes ficheros que entran en juego, esto lo podemos hacer con un editor de textos sencillo como nano o vi. Antes de nada aclarar dos cosas:
  • Suponemos que la red wifi a la que nos queremos conectar tiene IP en el rango 192.168.1.X y el router wifi principal tiene la IP 192.168.1.1 y activo el servidor DHCP, mientras que la tarjeta wifi de nuestro router con OpenWRT se configurará con la IP 192.168.1.254
  • La tarjeta ethernet de nuestro router se configurará con la IP 192.168.10.1, para que no esté en el mismo rango que la red wifi. Eso quiere decir que una vez establecida está IP para conectarnos al router por cable tendremos que usar una dirección del rango 192.168.10.X en la tarjeta de red del PC usado.
Empezamos con etc/config/network:

root@OpenWrt:/etc/config# cat network
config interface 'loopback'
 option ifname 'lo'
 option proto 'static'
 option ipaddr '127.0.0.1'
 option netmask '255.0.0.0'

config interface 'lan'
 option ifname 'eth0'
 option type 'bridge'
 option proto 'static'
 option ipaddr '192.168.10.1'
 option netmask '255.255.255.0'
        option gateway '192.168.1.1'
        option dns   '192.168.1.1'

config interface 'wwan'
 option proto 'static'
        option ipaddr '192.168.1.254'
        option netmask '255.255.255.0'
        option gateway '192.168.1.1'

config interface 'stabridge'
        option 'proto' 'relay'
        option 'network' 'lan wwan'
        option ipaddr '192.168.1.254'

Repetimos para que quede claro: la tarjeta de red cableada se configura con la ip 192.168.10.1, para que no entre en conflicto con la red inalámbrica, que está en el rango 192.168.1.X.  De ese rango, el router principal estará en 192.168.1.1 y nuestro router repetidor tendrá la IP 192.168.1.254 en su tarjeta wifi. En el caso de que nuestra wifi trabaje con otros rangos nos toca adaptar todo a esos rangos.

Seguimos por /etc/config/dhcp:
root@OpenWrt:/etc/config# cat dhcp

config dhcp 'lan'
 option interface 'lan'
 option start '100'
 option limit '150'
 option leasetime '12h'
 option ignore '1'

config dhcp 'wan'
 option interface 'wan'
 option ignore '1'
 option ipaddr '192.168.1.254'

Como se puede ver, desactivamos el servidor dhcp en todos los dispositivos de nuestro router, debido a que el servidor dhcp que se usará será el que trae el router principal.

A continuacion vemos /etc/config/wireless:
root@OpenWrt:/etc/config# cat wireless 

config wifi-device 'radio0'
 option type 'mac80211'
 option hwmode '11g'
 option path 'pci0000:00/0000:00:0e.0'
 option htmode 'HT20'
 option disabled '0'
 option channel '1'
 option txpower '30'
 option country 'ES'

config wifi-iface
 option network 'wwan'
 option encryption 'psk'
 option device 'radio0'
 option mode 'sta'
 option bssid '20:08:E0:1A:EF:00'
 option key '023AB82VBT207E'
 option ssid 'RED_PPAL'

config wifi-iface
        option device 'radio0'
        option mode 'ap'
        option ssid 'RED_PPAL_EXT'
        option encryption 'psk'
        option key '021FC3DABDEFF9'
        option network 'lan'
Comentemos, porque aquí está lo importante:

Las partes en rojo serían las que se deben modificar para adaptar a nuestro caso.
  • En la primera parte configuramos el interfaz de red "radio0" en modo "sta", es decir, cliente de una red llamada RED_PPAL, con el BSSID 20:08:E0:1A:EF:00 y la contraseña especificada allí. Su canal de emisión es el 1. Estos datos los podemos haber sacado con el comando "iwlist wlan0 scan"
  • En la segunda parte configuramos el mismo interfaz "radio0" ahora como "ap", es decir punto de acceso que emite una red llamada RED_PPAL_EXT con la contraseña indicada.
  • Ambas redes están conectadas entre si por "relayd" con la configuracion que pusimos en /etc/config/network en el apartado que reproduzco a continuaciónor:
    config interface 'stabridge'
            option 'proto' 'relay'
            option 'network' 'lan wwan'
            option ipaddr '192.168.1.254' 
  • Para generar un archivo wireless inicial que nos sirva de esqueleto con las opciones básicas podemos usar el comando:
root@OpenWrt:/etc/config# wifi detect > /etc/config/wireless

Despues de todo esto podemos reiniciar el router o bien hacer:
root@OpenWrt:/etc/config# wifi restart
root@OpenWrt:/etc/config# /etc/initd.d/network reload

Para que se apliquen todos los cambios. Una vez hecho todo podemos hacer un ifconfig para ver si todas las IP están bien:

root@OpenWrt:/etc/config# ifconfig
br-lan    Link encap:Ethernet  HWaddr 00:00:83:89:C0:00  
          inet addr:192.168.10.1  Bcast:192.168.10.255  Mask:255.255.255.0
          inet6 addr: fe80::200:83ff:fe89:c000/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3675589 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3947947 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:171524389 (163.5 MiB)  TX bytes:1227898183 (1.1 GiB)

eth0      Link encap:Ethernet  HWaddr 00:00:83:89:C0:00  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:262442 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2985540 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:15931319 (15.1 MiB)  TX bytes:126165971 (120.3 MiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

wlan0     Link encap:Ethernet  HWaddr 74:31:70:E3:C5:2C  
          inet addr:192.168.1.254  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::7631:70ff:fee3:c52c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3969028 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9536355 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1289510975 (1.2 GiB)  TX bytes:656004708 (625.6 MiB)

wlan0-1   Link encap:Ethernet  HWaddr 76:31:70:E3:C5:2C  
          inet6 addr: fe80::7431:70ff:fee3:c52c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3418118 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3950724 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:207491261 (197.8 MiB)  TX bytes:1296309014 (1.2 GiB)

Con iwconfig veremos que las dos tarjetas de red wifi virtuales están en el modo correcto y si vemos el espacio radioeléctrico con un dispositivo wifi (un móvil con Wifi Analyzer, por ejemplo) nos aparecerá  con una potencia estupenda la nueva red RED_PPAL_EXT a la que podremos conectarnos y ver que recibimos una IP sumistrada por el router wifi principal y que nos conectamos a la red que comparte éste sin problema.

Y con esto acaba el artículo de OpenWRT. Si encontrase alguna otra cosa interesante más que se pueda hacer le dedicaré otro artículo....

Addenda 28/Julio/2017: hubo una pequeña cosa (comentada en los enlaces referenciados) que se me pasó comentar y que luego he tenido que implementar varias veces. Siempre se me olvidaba anotarlo aquí y siempre perdía un rato recordando el paso que faltaba. De hoy no pasa que lo apunte.

Es un problema con el firewall de OpenWrt: si lo dejamos tal cual viene de serie corta el tráfico entre lan y wwan, por lo que conectamos a la red wiri nueva y recibimos IP, pero no deja navegar. La solución es sencilla: o deshabilitamos el firewall o, menos bruto, permitimos el tráfico entre ambas redes. Para permitir el tráfico hay que editar /etc/config/firewall y modificarlo así (en negrita la parte que seguramente tengamos que tocar/añadir):
.....
.....
config 'zone'
 option 'name' 'lan'
 option 'input' 'ACCEPT'
 option 'output' 'ACCEPT'
 option 'forward' 'ACCEPT'
 option 'network' 'lan wwan'
.....
.....
Después reiniciamos el firewall y ya funcionará bien todo:
root@OpenWrt:/# /etc/init.d/firewall restart
Con esto ya tenemos configurado nuestro Astoria, un pequeño gran router que nos está dando un servicio tremendo.

sábado, 5 de septiembre de 2015

Reaprovechando Thinclients HP5710 (Parte 3 y última)

Nuestro problema inicial para instalar Debian Squeeze es que el disco flash del aparato solo tiene 512Mb, ni un mísero Gigabyte. Cualquier distribución de los últimos años necesita mucho mas simplemente para una instalación básica.

Para intentarlo optamos por elegir la imagen netinst de Debian, ya que es la que menos ocupa (135-175Mb la ISO), a ver si hay suerte. La grabamos en un pendrive como hicimos con DSL, arrancamos e iniciamos la instalación, instalando todo mas pelado que en un Estado neoliberal: sin X y sin servidores de ningún tipo, nosotros luego iremos metiendo los paquetes según vayan haciendo falta. Cuando nos pregunta el nombre de equipo, yo lo he llamado "thinclient", aunque si hacemos una instalación múltiple habría que numerarlo.

Despues de instalar, verificamos que cabe en el disco duro y reiniciamos para arrancar. Siguiendo las instrucciones de aquí hacemos más hueco, borrando además /usr/lib/doc y /usr/lib/man (ocupan espacio y no los vamos a usar). Despues de eso instalamos xserver-xorg  y x2goclient (este último desde backports) junto con sus paquetes dependientes y tachán... compruebo cabe todo y hasta sobra un poquitín:


/dev/sda1               467449    410406     32105  93% /

El kernel usado es:

root@thinclient:~# cat /proc/version 
Linux version 2.6.32-5-486 (Debian 2.6.32-48squeeze6) (jmm@debian.org) (gcc version 4.3.5 (Debian 4.3.5-4) ) #1 Tue May 13 16:15:32 UTC 2014


Los paquetes que nos han quedado en esta instalación mínima para ejecutar x2goclient son:

root@thinclient:~# dpkg -l 
Deseado=Desconocido/Instalar/Eliminar/Purgar/Retener
| Estado=No/Instalado/Config-files/Desempaquetado/Medio-conf/Medio-inst/espera-disparo/pendiente-disparo
|/ Err?=(ninguno)/Requiere-reinst (Estado,Err: mayúsc.=malo)
||/ Nombre                          Versión                        Descripción
+++-===============================-===============================-==============================================================================
ii  acpi                            1.5-2                           displays information on ACPI devices
ii  acpi-support-base               0.137-5                         scripts for handling base ACPI events such as the power button
ii  acpid                           1:2.0.7-1squeeze4               Advanced Configuration and Power Interface event daemon
ii  adduser                         3.112+nmu2                      add and remove users and groups
ii  apt                             0.8.10.3+squeeze1               Advanced front-end for dpkg
ii  apt-utils                       0.8.10.3+squeeze1               APT utility programs
ii  aptitude                        0.6.3-3.2+squeeze1              terminal-based package manager (terminal interface only)
ii  aspell                          0.60.6-4                        GNU Aspell spell-checker
ii  aspell-es                       1.10-9                          Spanish dictionary for aspell
ii  base-files                      6.0squeeze10                    Debian base system miscellaneous files
ii  base-passwd                     3.5.22                          Debian base system master password and group files
ii  bash                            4.1-3                           The GNU Bourne Again SHell
ii  bsdmainutils                    8.0.13                          collection of more utilities from FreeBSD
ii  bsdutils                        1:2.17.2-9                      Basic utilities from 4.4BSD-Lite
ii  busybox                         1:1.17.1-8                      Tiny utilities for small and embedded systems
ii  console-setup                   1.68+squeeze2                   console font and keymap setup program
ii  console-terminus                4.30-2                          Fixed-width fonts for fast reading on the Linux console
ii  coreutils                       8.5-1                           GNU core utilities
ii  cpio                            2.11-4                          GNU cpio -- a program to manage archives of files
ii  cron                            3.0pl1-116                      process scheduling daemon
ii  dash                            0.5.5.1-7.4                     POSIX-compliant shell
ii  debconf                         1.5.36.1                        Debian configuration management system
ii  debconf-i18n                    1.5.36.1                        full internationalization support for debconf
ii  debian-archive-keyring          2010.08.28+squeeze1             GnuPG archive keys of the Debian archive
ii  debian-reference-common         2.46                            Debian system administration guide, common files
ii  debian-reference-en             2.46                            Debian system administration guide, English original
ii  debian-reference-es             2.46                            Debian system administration guide, Spanish translation
ii  debianutils                     3.4                             Miscellaneous utilities specific to Debian
ii  dictionaries-common             1.5.17                          Common utilities for spelling dictionary tools
ii  diffutils                       1:3.0-1                         File comparison utilities
ii  discover                        2.1.2-5                         hardware identification system
ii  discover-data                   2.2010.10.18                    Data lists for Discover hardware detection system
ii  dmidecode                       2.9-1.2                         Dump Desktop Management Interface data
ii  dmsetup                         2:1.02.48-5                     The Linux Kernel Device Mapper userspace library
ii  doc-debian-es                   2.6                             Debian FAQ translated to Spanish
ii  dpkg                            1.15.11                         Debian package management system
ii  e2fslibs                        1.41.12-4stable1                ext2/ext3/ext4 file system libraries
ii  e2fsprogs                       1.41.12-4stable1                ext2/ext3/ext4 file system utilities
ii  findutils                       4.4.2-1+b1                      utilities for finding files--find, xargs
ii  fontconfig                      2.8.0-2.1                       generic font configuration library - support binaries
ii  fontconfig-config               2.8.0-2.1                       generic font configuration library - configuration
ii  gcc-4.4-base                    4.4.5-8                         The GNU Compiler Collection (base package)
ii  gettext-base                    0.18.1.1-3                      GNU Internationalization utilities for the base system
ii  gnupg                           1.4.10-4+squeeze4               GNU privacy guard - a free PGP replacement
ii  gpgv                            1.4.10-4+squeeze4               GNU privacy guard - signature verification tool
ii  grep                            2.6.3-3+squeeze1                GNU grep, egrep and fgrep
ii  groff-base                      1.20.1-10                       GNU troff text-formatting system (base system components)
ii  grub-common                     1.98+20100804-14+squeeze1       GRand Unified Bootloader, version 2 (common files)
ii  grub-pc                         1.98+20100804-14+squeeze1       GRand Unified Bootloader, version 2 (PC/BIOS version)
ii  gzip                            1.3.12-9+squeeze1               GNU compression utilities
ii  hostname                        3.04                            utility to set/show the host name or domain name
ii  hwinfo                          16.0-2                          Hardware identification system
ii  ifupdown                        0.6.10                          high level tools to configure network interfaces
ii  info                            4.13a.dfsg.1-6                  Standalone GNU Info documentation browser
ii  initramfs-tools                 0.98.8                          tools for generating an initramfs
ii  initscripts                     2.88dsf-13.1+squeeze1           scripts for initializing and shutting down the system
ii  insserv                         1.14.0-2                        Tool to organize boot sequence using LSB init.d script dependencies
ii  install-info                    4.13a.dfsg.1-6                  Manage installed documentation in info format
ii  installation-report             2.44                            system installation report
ii  iproute                         20100519-3                      networking and traffic control tools
ii  iptables                        1.4.8-3                         administration tools for packet filtering and NAT
ii  iputils-ping                    3:20100418-3                    Tools to test the reachability of network hosts
ii  isc-dhcp-client                 4.1.1-P1-15+squeeze8            ISC DHCP client
ii  isc-dhcp-common                 4.1.1-P1-15+squeeze8            common files used by all the isc-dhcp* packages
ii  ispanish                        1.10-9                          Spanish dictionary for ispell
ii  ispell                          3.1.20.0-7                      International Ispell (an interactive spelling corrector)
ii  jwm                             2.0.1-3                         Very small lightweight pure X11 window manager with tray and menus
ii  kbd                             1.15.2-2                        Linux console font and keytable utilities
ii  keyboard-configuration          1.68+squeeze2                   system-wide keyboard preferences
ii  klibc-utils                     1.5.20-1+squeeze1               small utilities built with klibc for early boot
ii  laptop-detect                   0.13.7                          attempt to detect a laptop
ii  libacl1                         2.2.49-4                        Access control list shared library
ii  libaspell15                     0.60.6-4                        GNU Aspell spell-checker runtime library
ii  libattr1                        1:2.4.44-2                      Extended attribute shared library
ii  libaudio2                       1.9.2-4squeeze1                 Network Audio System - shared libraries
ii  libaudit0                       1.7.13-1+b2                     Dynamic library for security auditing
ii  libavahi-client3                0.6.27-2+squeeze1               Avahi client library
ii  libavahi-common-data            0.6.27-2+squeeze1               Avahi common data files
ii  libavahi-common3                0.6.27-2+squeeze1               Avahi common library
ii  libblkid1                       2.17.2-9                        block device id library
ii  libboost-iostreams1.42.0        1.42.0-4                        Boost.Iostreams Library
ii  libbsd0                         0.2.0-1                         utility functions from BSD systems - shared library
ii  libbz2-1.0                      1.0.5-6+squeeze1                high-quality block-sorting file compressor library - runtime
ii  libc-bin                        2.11.3-4                        Embedded GNU C Library: Binaries
ii  libc6                           2.11.3-4                        Embedded GNU C Library: Shared libraries
ii  libcomerr2                      1.41.12-4stable1                common error description library
ii  libcups2                        1.4.4-7+squeeze5                Common UNIX Printing System(tm) - Core library
ii  libcwidget3                     0.5.16-3                        high-level terminal interface library for C++ (runtime files)
ii  libdb4.8                        4.8.30-2                        Berkeley v4.8 Database Libraries [runtime]
ii  libdbus-1-3                     1.2.24-4+squeeze2               simple interprocess messaging system
ii  libdevmapper1.02.1              2:1.02.48-5                     The Linux Kernel Device Mapper userspace library
ii  libdiscover2                    2.1.2-5                         hardware identification library
rc  libdrm-intel1                   2.4.21-1~squeeze3               Userspace interface to intel-specific kernel DRM services -- runtime
rc  libdrm-radeon1                  2.4.21-1~squeeze3               Userspace interface to radeon-specific kernel DRM services -- runtime
ii  libdrm2                         2.4.21-1~squeeze3               Userspace interface to kernel DRM services -- runtime
ii  libedit2                        2.11-20080614-2                 BSD editline and history libraries
ii  libept1                         1.0.4                           High-level library for managing Debian package information
ii  libexpat1                       2.0.1-7+squeeze1                XML parsing C library - runtime library
ii  libfontconfig1                  2.8.0-2.1                       generic font configuration library - runtime
ii  libfontenc1                     1:1.0.5-2                       X11 font encoding library
ii  libfreetype6                    2.4.2-2.1+squeeze4              FreeType 2 font engine, shared library files
ii  libfribidi0                     0.19.2-1                        Free Implementation of the Unicode BiDi algorithm
ii  libgcc1                         1:4.4.5-8                       GCC support library
ii  libgcrypt11                     1.4.5-2+squeeze1                LGPL Crypto library - runtime library
ii  libgdbm3                        1.8.3-9                         GNU dbm database routines (runtime version)
ii  libglib2.0-0                    2.24.2-1                        The GLib library of C routines
ii  libgnutls26                     2.8.6-1+squeeze3                the GNU TLS library - runtime library
ii  libgpg-error0                   1.6-1                           library for common error values and messages in GnuPG components
ii  libgssapi-krb5-2                1.8.3+dfsg-4squeeze7            MIT Kerberos runtime libraries - krb5 GSS-API Mechanism
ii  libhal1                         0.5.14-3                        Hardware Abstraction Layer - shared library
ii  libhd16                         16.0-2                          Hardware identification system library
ii  libice6                         2:1.0.6-2                       X11 Inter-Client Exchange library
ii  libjpeg62                       6b1-1                           The Independent JPEG Group's JPEG runtime library (version 6.2)
ii  libk5crypto3                    1.8.3+dfsg-4squeeze7            MIT Kerberos runtime libraries - Crypto Library
ii  libkeyutils1                    1.4-1                           Linux Key Management Utilities (library)
ii  libklibc                        1.5.20-1+squeeze1               minimal libc subset for use with initramfs
ii  libkrb5-3                       1.8.3+dfsg-4squeeze7            MIT Kerberos runtime libraries
ii  libkrb5support0                 1.8.3+dfsg-4squeeze7            MIT Kerberos runtime libraries - Support library
ii  liblcms1                        1.18.dfsg-1.2+b3                Color management library
ii  libldap-2.4-2                   2.4.23-7.3                      OpenLDAP libraries
ii  liblocale-gettext-perl          1.05-6                          Using libc functions for internationalization in Perl
ii  liblzma2                        5.0.0-2                         XZ-format compression library
ii  libmng1                         1.0.10-1+b1                     Multiple-image Network Graphics library
ii  libncurses5                     5.7+20100313-5                  shared libraries for terminal handling
ii  libncursesw5                    5.7+20100313-5                  shared libraries for terminal handling (wide character support)
ii  libnewt0.52                     0.52.11-1                       Not Erik's Windowing Toolkit - text mode windowing with slang
ii  libnfnetlink0                   1.0.0-1                         Netfilter netlink library
ii  libpam-modules                  1.1.1-6.1+squeeze1              Pluggable Authentication Modules for PAM
ii  libpam-runtime                  1.1.1-6.1+squeeze1              Runtime support for the PAM library
ii  libpam0g                        1.1.1-6.1+squeeze1              Pluggable Authentication Modules library
ii  libpci3                         1:3.1.7-6                       Linux PCI Utilities (shared library)
ii  libpciaccess0                   0.12.0-1                        Generic PCI access library for X
ii  libpcre3                        8.02-1.1                        Perl 5 Compatible Regular Expression Library - runtime files
ii  libpixman-1-0                   0.16.4-1+deb6u1                 pixel-manipulation library for X and cairo
ii  libpng12-0                      1.2.44-1+squeeze4               PNG library - runtime
ii  libpopt0                        1.16-1                          lib for parsing cmdline parameters
ii  libqt4-network                  4:4.6.3-4+squeeze1              Qt 4 network module
ii  libqt4-svg                      4:4.6.3-4+squeeze1              Qt 4 SVG module
ii  libqtcore4                      4:4.6.3-4+squeeze1              Qt 4 core module
ii  libqtgui4                       4:4.6.3-4+squeeze1              Qt 4 GUI module
ii  libreadline6                    6.1-3                           GNU readline and history libraries, run-time libraries
ii  libsasl2-2                      2.1.23.dfsg1-7                  Cyrus SASL - authentication abstraction library
ii  libselinux1                     2.0.96-1                        SELinux runtime shared libraries
ii  libsepol1                       2.0.41-1                        SELinux library for manipulating binary security policies
ii  libsigc++-2.0-0c2a              2.2.4.2-1                       type-safe Signal Framework for C++ - runtime
ii  libslang2                       2.2.2-4                         The S-Lang programming library - runtime version
ii  libsm6                          2:1.1.1-1                       X11 Session Management library
ii  libsqlite3-0                    3.7.3-1                         SQLite 3 shared library
ii  libss2                          1.41.12-4stable1                command-line interface parsing library
ii  libssh-4                        0.5.3-1~bpo60+1                 tiny C SSH library
ii  libssl0.9.8                     0.9.8o-4squeeze14               SSL shared libraries
ii  libstdc++6                      4.4.5-8                         The GNU Standard C++ Library v3
ii  libtasn1-3                      2.7-1+squeeze+1                 Manage ASN.1 structures (runtime)
ii  libtext-charwidth-perl          0.04-6                          get display widths of characters on the terminal
ii  libtext-iconv-perl              1.7-2                           converts between character sets in Perl
ii  libtext-wrapi18n-perl           0.06-7                          internationalized substitute of Text::Wrap
ii  libtiff4                        3.9.4-5+squeeze10               Tag Image File Format (TIFF) library
ii  libudev0                        164-3                           libudev shared library
ii  libusb-0.1-4                    2:0.1.12-16                     userspace USB programming library
ii  libutempter0                    1.1.5-3                         A privileged helper for utmp/wtmp updates (runtime)
ii  libuuid-perl                    0.02-4                          Perl extension for using UUID interfaces as defined in e2fsprogs
ii  libuuid1                        2.17.2-9                        Universally Unique ID library
ii  libwrap0                        7.6.q-19                        Wietse Venema's TCP wrappers library
ii  libx11-6                        2:1.3.3-4+squeeze1              X11 client-side library
ii  libx11-data                     2:1.3.3-4+squeeze1              X11 client-side library
ii  libxapian22                     1.2.3-2                         Search engine library
ii  libxau6                         1:1.0.6-1                       X11 authorisation library
ii  libxaw7                         2:1.0.7-1                       X11 Athena Widget library
ii  libxcb1                         1.6-1+squeeze1                  X C Binding
ii  libxcomp3                       3.2.0-7-1.1+b1                  NX X compression library
ii  libxdmcp6                       1:1.0.3-2                       X11 Display Manager Control Protocol library
ii  libxext6                        2:1.1.2-1+squeeze1              X11 miscellaneous extension library
ii  libxfont1                       1:1.4.1-5                       X11 font rasterisation library
ii  libxft2                         2.1.14-2                        FreeType-based font drawing library for X
ii  libxi6                          2:1.3-8                         X11 Input extension library
ii  libxinerama1                    2:1.1-3+squeeze1                X11 Xinerama extension library
ii  libxkbfile1                     1:1.0.6-2                       X11 keyboard file manipulation library
ii  libxmu6                         2:1.0.5-2                       X11 miscellaneous utility library
ii  libxmuu1                        2:1.0.5-2                       X11 miscellaneous micro-utility library
ii  libxpm4                         1:3.5.8-1                       X11 pixmap library
ii  libxrender1                     1:0.9.6-1+squeeze1              X Rendering Extension client library
ii  libxt6                          1:1.0.7-1+squeeze1              X11 toolkit intrinsics library
ii  linux-base                      2.6.32-48squeeze6               Linux image base package
ii  linux-image-2.6-486             2.6.32+29                       Linux 2.6 for old PCs (meta-package)
ii  linux-image-2.6.32-5-486        2.6.32-48squeeze6               Linux 2.6.32 for old PCs
ii  locales                         2.11.3-4                        Embedded GNU C Library: National Language (locale) data [support]
ii  login                           1:4.1.4.2+svn3283-2+squeeze1    system login tools
ii  logrotate                       3.7.8-6                         Log rotation utility
ii  lsb-base                        3.2-23.2squeeze1                Linux Standard Base 3.2 init script functionality
ii  man-db                          2.5.7-8                         on-line manual pager
ii  manpages                        3.27-1                          Manual pages about using a GNU/Linux system
ii  manpages-es                     1.55-9                          Spanish man pages
ii  mawk                            1.3.3-15                        a pattern scanning and text processing language
ii  module-init-tools               3.12-2+b1                       tools for managing Linux kernel modules
ii  mount                           2.17.2-9                        Tools for mounting and manipulating filesystems
ii  nano                            2.2.4-1                         small, friendly text editor inspired by Pico
ii  ncurses-base                    5.7+20100313-5                  basic terminal type definitions
ii  ncurses-bin                     5.7+20100313-5                  terminal-related programs and man pages
ii  net-tools                       1.60-23                         The NET-3 networking toolkit
ii  netbase                         4.45                            Basic TCP/IP networking system
ii  netcat-traditional              1.10-38                         TCP/IP swiss army knife
ii  nxproxy                         3.2.0-1-1                       NX X compression library
ii  openssh-blacklist               0.4.1                           list of default blacklisted OpenSSH RSA and DSA keys
ii  openssh-blacklist-extra         0.4.1                           list of non-default blacklisted OpenSSH RSA and DSA keys
ii  openssh-client                  1:5.5p1-6+squeeze5              secure shell (SSH) client, for secure access to remote machines
ii  openssh-server                  1:5.5p1-6+squeeze5              secure shell (SSH) server, for secure access from remote machines
ii  os-prober                       1.42                            utility to detect other OSes on a set of drives
ii  passwd                          1:4.1.4.2+svn3283-2+squeeze1    change and administer password and group data
ii  pciutils                        1:3.1.7-6                       Linux PCI Utilities
ii  perl-base                       5.10.1-17squeeze6               minimal Perl system
ii  procps                          1:3.2.8-9squeeze1               /proc file system utilities
ii  readline-common                 6.1-3                           GNU readline and history libraries, common files
ii  rsyslog                         4.6.4-2                         enhanced multi-threaded syslogd
ii  sed                             4.2.1-7                         The GNU sed stream editor
ii  sensible-utils                  0.0.4                           Utilities for sensible alternative selection
ii  sysv-rc                         2.88dsf-13.1+squeeze1           System-V-like runlevel change mechanism
ii  sysvinit                        2.88dsf-13.1+squeeze1           System-V-like init utilities
ii  sysvinit-utils                  2.88dsf-13.1+squeeze1           System-V-like utilities
ii  tar                             1.23-3                          GNU version of the tar archiving utility
ii  tasksel                         2.88                            Tool for selecting tasks for installation on Debian systems
ii  tasksel-data                    2.88                            Official tasks used for installation of Debian systems
ii  tcpd                            7.6.q-19                        Wietse Venema's TCP wrapper utilities
ii  traceroute                      1:2.0.15-1                      Traces the route taken by packets over an IPv4/IPv6 network
ii  ttf-dejavu-core                 2.31-1                          Vera font family derivate with additional characters
ii  tzdata                          2014e-0squeeze1                 time zone and daylight-saving time data
ii  ucf                             3.0025+nmu1                     Update Configuration File: preserve user changes to config files.
ii  udev                            164-3                           /dev/ and hotplug management daemon
ii  usbutils                        0.87-5squeeze1                  Linux USB utilities
ii  util-linux                      2.17.2-9                        Miscellaneous system utilities
ii  util-linux-locales              2.17.2-9                        Locales files for util-linux
ii  vim-common                      2:7.2.445+hg~cb94c42c0e1a-1     Vi IMproved - Common files
ii  vim-tiny                        2:7.2.445+hg~cb94c42c0e1a-1     Vi IMproved - enhanced vi editor - compact version
ii  wget                            1.12-2.1                        retrieves files from the web
ii  whiptail                        0.52.11-1                       Displays user-friendly dialog boxes from shell scripts
ii  wspanish                        1.0.25                          The Spanish dictionary words for /usr/share/dict
ii  x11-common                      1:7.5+8+squeeze1                X Window System (X.Org) infrastructure
ii  x11-xkb-utils                   7.5+5                           X11 XKB utilities
ii  x2goclient                      3.99.2.1-5~bpo60+1              X2Go Client application (Qt4)
ii  xauth                           1:1.0.4-1                       X authentication utility
ii  xbitmaps                        1.1.0-1                         Base X bitmaps
ii  xfonts-base                     1:1.0.1                         standard fonts for X
ii  xfonts-encodings                1:1.0.3-1                       Encodings for X.Org fonts
ii  xfonts-utils                    1:7.5+2                         X Window System font utility programs
ii  xinit                           1.2.0-2                         X server initialisation tool
ii  xkb-data                        1.8-2                           X Keyboard Extension (XKB) configuration data
ii  xserver-common                  2:1.7.7-18                      common files used by various X servers
ii  xserver-xorg                    1:7.5+8+squeeze1                the X.Org X server
ii  xserver-xorg-core               2:1.7.7-18                      Xorg X server - core server
ii  xserver-xorg-input-all          1:7.5+8+squeeze1                the X.Org X server -- input driver metapackage
ii  xserver-xorg-input-evdev        1:2.3.2-6                       X.Org X server -- evdev input driver
ii  xserver-xorg-input-kbd          1:1.4.0-2                       X.Org X server -- keyboard input driver
ii  xserver-xorg-input-mouse        1:1.5.0-2                       X.Org X server -- mouse input driver
ii  xserver-xorg-input-synaptics    1.2.2-2                         Synaptics TouchPad driver for X.Org server
ii  xserver-xorg-input-wacom        0.10.5+20100416-1               X.Org X server -- Wacom input driver
ii  xserver-xorg-video-vesa         1:2.3.0-3                       X.Org X server -- VESA display driver
ii  xterm                           261-1                           X terminal emulator
ii  xz-utils                        5.0.0-2                         XZ-format compression utilities
ii  zlib1g                          1:1.2.3.4.dfsg-3                compression library - runtime

Como se ve, es lo menos que podemos tener para que funcione todo bien.

Después de esto creamos un usuario "thinclient" con contraseña "thinclient", que será el que se usará para hacer login. Nos interesa que por facilidad se haga login automaticamente, pero no tenemos Display Manager (ni falta que hace), así que lo modificamos /etc/inittab para hacer autologin en consola:

.....
#1:2345:respawn:/sbin/getty 38400 tty1
#Para el autologin:

1:2345:respawn:/bin/login -f thinclient tty1 </dev/tty1 >/dev/tty1 2>&1
.......

Además también nos viene bien que se ejecuten automáticamente las X para entrar en el entorno gráfico, para ello editamos .bash_profile en /home/thinclient y añadimos:

.......
if [ -z "$DISPLAY" ] && [ $(tty) == /dev/tty1 ]; then
    startx
fi
.......

Si se ve la lista de paquetes comprobaremos que no tenemos ningún escritorio ni gestor de ventanas: ni XFCE, ni  KDE, ni LXDE, nada de nada. Nuestro objetivo es ejecutar x2goclient a pantalla completa para conectar con nuestro servidor. Eso se logra editando /etc/X11/xinit/xinitrc para que quede así:

#!/bin/sh
# /etc/X11/xinit/xinitrc
#
# global xinitrc file, used by all X sessions started by xinit (startx)

# invoke global X session script
#/usr/bin/jwm & #no hace falta gestor de ventanas
#xterm -geometry 80x66+0+0 -name login &

exec /usr/bin/x2goclient --thinclient --session=a99-pro --no-session-edit --add-to-known-hosts --haltbt

# . /etc/X11/Xsession

Este es el script que se ejecuta al arrancar las X y básicamente lo modificamos para que para que se ejecute x2goclient usando una sesión determinada ("a99-pro"), que no será modificable por el usuario, que no preguntará por la aceptación de las claves ssh, que no usara window manager y que presentará un botón para el apagado del thinclient (haltbt). Mas información en la página de manual de x2goclient.

Al cargar el sistema se hará el login automático y se cargarán el entorno gráfico, viéndose en pantalla:


En el home de nuestro usuario debemos incluir la configuración local para el cliente x2go. Como hemos establecido que no se puede editar por el usuario (para evitar que los usuarios lo toquen y lo desconfiguren), lo metemos a mano en este fichero:

root@thinclient:~# cat .x2goclient/sessions 
[20150619092956042]
speed=4
pack=16m-jpeg
quality=9
fstunnel=true
export=
iconvto=UTF-8
iconvfrom=ISO8859-1
useiconv=false
fullscreen=false
width=1024
multidisp=false
display=1
height=768
dpi=96
setdpi=false
xinerama=false
usekbd=true
layout=es
type=pc105/es
sound=true
soundsystem=pulse
startsoundsystem=true
soundtunnel=true
defsndport=true
sndport=4713
print=true
name=a99-pro
icon=:icons/128x128/x2gosession.png
host=a99-pro
user=usuarioprueba
key=
sshport=22
autologin=false
krblogin=false
rootless=false
published=false
applications=WWWBROWSER, MAILCLIENT, OFFICE, TERMINAL
command=/usr/bin/startxfce4
rdpoptions=
rdpserver=
xdmcpserver=localhost

Comentemos: la sesión se llama "a99-pro", por que ese es el nombre del servidor con la parte servidora de x2go al que nos conectaremos. El usuario prefijado es "usuarioprueba", que debe ser un usuario local creado en dicho servidor.  Como gestor de ventanas en la sesión remota usamos XFCE4, aunque puede ponerse cualquier otro.

Si no sabemos como definir todos los parámetros lo mejor es lanzar un cliente x2go a mano permitiendo configurar la sesión desde él. Luego el fichero "sessions" creado será el que usaremos.

Una vez escrita la contraseña se realizará la conexión:


Y una vez completada la conexión se mostrará el escritorio remoto, en este caso una sesión de XFCE completa que correrá a toda velocidad en nuestro thinclient:


Otro fichero que no se muy bien para que vale, pero ahi queda:

root@thinclient:~/.x2goclient# cat sizes 
[mainwindow]
size=@Size(533 400)
pos=@Point(24 24)
maximized=false

Por último, recordemos que al ejecutar el cliente x2go añadimos el parámetro "haltbt". Dicho parámetro añade un botón de apagado a la ventana de inicio de sesión remota de x2go, de forma que el usuario pueda apagar el thinclient desde allí, ya que como hemos dicho el cliente x2go se ejecuta a pantalla completa sin entorno de escritorio, por lo que no hay manera sencilla de apagar el dispositivo.

Dicho botón se puede ver en la siguiente imagen:


Al pulsar el botón de apagado, el cliente x2go lo que hace es crear el fichero "/home/thinclient/.halt", de manera que se notifique al sistema la intención de apagarlo. El apagado lo hacemos con el siguiente script que guardamos en /root/check-halt:

#!/bin/bash

rm -f /home/thinclient/.halt
while true
do 
   #Chequeamos cada 10 segundos la existencia del fichero .halt y en ese caso apagamos. 
   /usr/bin/test -e /home/thinclient/.halt && /sbin/halt
   /bin/sleep 10s
done
exit 0

Para arrancarlo al inicio de todo y quedarlo ejecutando de fondo eternamente ponemos en /etc/rc.local:

......
/root/check-halt &
exit 0

Una vez modificados /root/check-halt y /etc/rc.local ya tenemos todo preparado para funcionar.

Aparte de hacerlo para nuestro thinclient todo esto podemos hacerlo en general si en casa o en cualquier otro sitio tenemos un ordenador potente, que haría de servidor x2go y uno o varios PC mas modestos que queremos aprovechar como clientes.

Bueno, una vez funcionando todo ya tenemos posibilidad de montar un aula para ofimática con varios thinclients y un servidor medianamente potente. Misión cumplida.

Antes de finalizar comentaremos tres cosas mas:

Driver de vídeo radeon.

El driver que hemos usado para las X es el driver "vesa", pero la tarjeta gráfica es ATI Radeon RV100 QY [Radeon 7000/VE], asi que lo  mas adecuado es instalar el driver correcto:

# apt-get install xserver-xorg-video-radeon

Este paquete y sus dependencias siguen cabiendo en el disco (no olvidemos eso cada vez que instalemos algo). Ahora tenemos que configurar el /etc/X11/xorg.conf por defecto:

Section "ServerLayout"
    Identifier     "X.org Configured"
    Screen      0  "Screen0" 0 0
    InputDevice    "Mouse0" "CorePointer"
    InputDevice    "Keyboard0" "CoreKeyboard"
EndSection

Section "Files"
    ModulePath   "/usr/lib/xorg/modules"
    FontPath     "/usr/share/fonts/X11/misc"
    FontPath     "/usr/share/fonts/X11/cyrillic"
    FontPath     "/usr/share/fonts/X11/100dpi/:unscaled"
    FontPath     "/usr/share/fonts/X11/75dpi/:unscaled"
    FontPath     "/usr/share/fonts/X11/Type1"
    FontPath     "/usr/share/fonts/X11/100dpi"
    FontPath     "/usr/share/fonts/X11/75dpi"
    FontPath     "/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType"
    FontPath     "built-ins"
EndSection

Section "Module"
    Load  "dri"
    Load  "glx"
    Load  "dbe"
    Load  "record"
    Load  "extmod"
    Load  "dri2"
EndSection

Section "InputDevice"
    Identifier  "Keyboard0"
    Driver      "kbd"
EndSection

Section "InputDevice"
    Identifier  "Mouse0"
    Driver      "mouse"
    Option        "Protocol" "auto"
    Option        "Device" "/dev/input/mice"
    Option        "ZAxisMapping" "4 5 6 7"
EndSection

Section "Monitor"
    #DisplaySize      410   230    # mm
    Identifier   "Monitor0"
    VendorName   "GSM"
    ModelName    "E1911"
    HorizSync    30.0 - 61.0
    VertRefresh  56.0 - 75.0
    Option        "DPMS"
EndSection

Section "Device"
        ### Available Driver options are:-
        ### Values: <i>: integer, <f>: float, <bool>: "True"/"False",
        ### <string>: "String", <freq>: "<f> Hz/kHz/MHz"
        ### [arg]: arg optional
        #Option     "NoAccel"                # [<bool>]
        #Option     "SWcursor"               # [<bool>]
        #Option     "Dac6Bit"                # [<bool>]
        #Option     "Dac8Bit"                # [<bool>]
        #Option     "BusType"                # [<str>]
        #Option     "CPPIOMode"              # [<bool>]
        #Option     "CPusecTimeout"          # <i>
        #Option     "AGPMode"                # <i>
        #Option     "AGPFastWrite"           # [<bool>]
        #Option     "AGPSize"                # <i>
        #Option     "GARTSize"               # <i>
        #Option     "RingSize"               # <i>
        #Option     "BufferSize"             # <i>
        #Option     "EnableDepthMoves"       # [<bool>]
        #Option     "EnablePageFlip"         # [<bool>]
        #Option     "NoBackBuffer"           # [<bool>]
        #Option     "DMAForXv"               # [<bool>]
        #Option     "FBTexPercent"           # <i>
        #Option     "DepthBits"              # <i>
        #Option     "PCIAPERSize"            # <i>
        #Option     "AccelDFS"               # [<bool>]
        #Option     "IgnoreEDID"             # [<bool>]
        #Option     "CustomEDID"             # [<str>]
        #Option     "DisplayPriority"        # [<str>]
        #Option     "PanelSize"              # [<str>]
        #Option     "ForceMinDotClock"       # <freq>
        #Option     "ColorTiling"            # [<bool>]
        #Option     "VideoKey"               # <i>
        #Option     "RageTheatreCrystal"     # <i>
        #Option     "RageTheatreTunerPort"     # <i>
        #Option     "RageTheatreCompositePort"     # <i>
        #Option     "RageTheatreSVideoPort"     # <i>
        #Option     "TunerType"              # <i>
        #Option     "RageTheatreMicrocPath"     # <str>
        #Option     "RageTheatreMicrocType"     # <str>
        #Option     "ScalerWidth"            # <i>
        #Option     "RenderAccel"            # [<bool>]
        #Option     "SubPixelOrder"          # [<str>]
        #Option     "ClockGating"            # [<bool>]
        #Option     "VGAAccess"              # [<bool>]
        #Option     "ReverseDDC"             # [<bool>]
        #Option     "LVDSProbePLL"           # [<bool>]
        #Option     "AccelMethod"            # <str>
        #Option     "DRI"                    # [<bool>]
        #Option     "ConnectorTable"         # <str>
        #Option     "DefaultConnectorTable"     # [<bool>]
        #Option     "DefaultTMDSPLL"         # [<bool>]
        #Option     "TVDACLoadDetect"        # [<bool>]
        #Option     "ForceTVOut"             # [<bool>]
        #Option     "TVStandard"             # <str>
        #Option     "IgnoreLidStatus"        # [<bool>]
        #Option     "DefaultTVDACAdj"        # [<bool>]
        #Option     "Int10"                  # [<bool>]
        #Option     "EXAVSync"               # [<bool>]
        #Option     "ATOMTVOut"              # [<bool>]
        #Option     "R4xxATOM"               # [<bool>]
        #Option     "ForceLowPowerMode"      # [<bool>]
        #Option     "DynamicPM"              # [<bool>]
        #Option     "NewPLL"                 # [<bool>]
        #Option     "ZaphodHeads"            # <str>
    Identifier  "Card0"
    Driver      "radeon"
    VendorName  "ATI Technologies Inc"
    BoardName   "Radeon RV100 QY [Radeon 7000/VE]"
    BusID       "PCI:0:13:0"
EndSection

Section "Screen"
    Identifier "Screen0"
    Device     "Card0"
    Monitor    "Monitor0"
    SubSection "Display"
        Viewport   0 0
        Depth     1
    EndSubSection
    SubSection "Display"
        Viewport   0 0
        Depth     4
    EndSubSection
    SubSection "Display"
        Viewport   0 0
        Depth     8
    EndSubSection
    SubSection "Display"
        Viewport   0 0
        Depth     15
    EndSubSection
    SubSection "Display"
        Viewport   0 0
        Depth     16
    EndSubSection
    SubSection "Display"
        Viewport   0 0
        Depth     24
    EndSubSection
EndSection

Bueno, tras esto se supone que las X van mas rápidas. No he notado nada especial pero tampoco ha empeorado, haciendo una prueba con glxgears da 15fps, lo cual es mas que suficiente para nuestros fines.

Memorias USB

Un problema de todos los entornos de thinclients es el montaje de dispositivos USB, ya que el escritorio que se ejecuta es remoto y no hay forma sencilla de que detecte que en el cliente se ha conectado una memoria USB. El sistema de x2go es parecido al de rdesktop: no se montan. La solución dada es automontarlos sobre una carpeta determinada (/mnt por ejemplo) y compartir esa carpeta entre el x2go cliente y servidor. En la documentación de x2go viene explicado como hacerlo. Un problema que siempre queda en el aire en estos casos es como realizar un desmontaje seguro: no hay respuestas.

En nuestro caso no he hecho nada ya que no vamos a usar pendrives. Todo se hará con herramientas en la nube.

Sonido en thinclients.

Es posible redirigir el sonido del escritorio remoto desde el servidor al hardware del cliente, ya que x2go lo permite al definir la configuración de la sesión. Para ello hay que instalar y configurar alsa, esd o pulse en el cliente. Como no vamos a reproducir vídeos (por limitaciones de la conexión) ni escuchar música tampoco lo configuro. Además, puede que ese software no quepa en nuestro disco duro.

Bueno, pues podemos decir que misión cumplida. Nos sentaremos a esperar el siguiente embolado.

=========FIN DE LA CITA===========