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

martes, 18 de diciembre de 2018

Compartir impresora de CUPS mediante Google CloudPrint

1. Impresión en Cloudprint.

Una de las impresoras que tenemos en nuestros centros es la Epson WorkForce WF8590, la cual tiene en su firmware la capacidad de ser compartida en la nube de forma ubicua a través de Google CloudPrint. Tan solo hay que configurar a través de su interfaz web la cuenta de Google que la compartirá y ya la tenemos disponible en Internet.

Una vez hecho esto para la Epson sucede que tarde o temprano te piden compartir otras impresoras del centro con el problema de que no tienen en su firmware esa funcionalidad. Cuando te documentas ves que es posible compartir impresoras que están en un servidor CUPS de Linux en Google CloudPrint como si tuvieran esa funcionalidad de forma nativa, como explican aquí. Vemos que para Linux hay dos paquetes que hacen esto:

2. Paquete cloudprint.

Este programa es el más antiguo, consta de 2 paquetes Debian: cloudprint y cloudprint-service, con el software y el servicio que lo encapsula respectivamente.

Al iniciar el servicio o ejecutar a mano el programa cloudprint (tal como se relata en el apartado correspondiente) nos pedirá las credenciales de las cuentas Gmail donde asociar la impresora. Si en este paso da error 403/404 o similar esto es debido a que la versión que estamos usando es demasiado antigua (para Debian Jessie en los repositorios tenemos la obsoleta versión 0.11.5). La solución es bajar la última vérsion desde este repositorio, donde tenemos la 0.14.5 para Jessie.

Una vez resuelto esto, al arrancar el programa este intenta compartir en la nube todas las impresoras que hay en el CUPS de la máquina. Eso genera un problema si hay impresoras configuradas con el driver raw (el cual no tiene ppd asociado) y dará errores aleatorios, que harán que unas veces funcione y otras no, del tipo:
Traceback (most recent call last):
File "/usr/bin/cloudprint", line 9, in 
load_entry_point('cloudprint==0.14', 'console_scripts', 'cloudprint-cmd')()
File "/usr/share/cloudprint/cloudprint/cloudprint.py", line 620, in main
ppd, description = get_printer_info(cups_connection, name)
File "/usr/share/cloudprint/cloudprint/cloudprint.py", line 372, in get_printer_info
ppd_path = cups_connection.getPPD(printer_name)
cups.IPPError: (1030, 'No encontrado')
Lo conveniente es no tener ese tipo impresoras con driver raw en la máquina desde donde se ejecuta el programa...

Una vez resuelto esto, cuando parece que ya nada puede fallar resulta que al arrancar el programa nos dice:
Establishing connection to xmpp server talk.google.com:5223
ERROR: Could not Connect to Cloud Service. Will Try again in 60 Seconds
La causa de esto es que los chicos de Telefónica nos tienen capado el puerto 5223 de salida y por tanto el servicio no puede comunicarse con Google. Este último obstáculo me hace tirar la toalla y probar con el siguiente software, aunque seguramente fuera de la red educativa si funcionará todo esto.

3. Paquete cloud-print-connector.

Este paquete es mas moderno, tanto que no está en los repositorios de los Debian/Ubuntu mas viejunos. Pero no problem: aunque no hay versión del paquete para Jessie si la hay para Buster y si bajamos el .deb de este enlace veremos que se puede instalar sin problema:
# wget http://ftp.us.debian.org/debian/pool/main/g/google-cloud-print-connector/google-cloud-print-connector_1.12-1+b1_amd64.deb
# dpkg -i google-cloud-print-connector_1.12-1+b1_amd64.deb
# apt-get -f install
Esto es debido a que sus dependencias son bastante relajadas y no necesita versiones muy modernas de los paquetes dependientes, lo cual facilita su integración en sistemas mas antiguos. Supongo que para Ubuntu sucederá algo similar.

Un vez instalado, lo iniciamos a mano tal como cuentan aquí con:
# gcp-connector-util init
Esto nos mostrará unas instrucciones que nos llevan a abrir una página web (con Google Chrome, please) y meter un código de validación en ella. Esto vinculará las impresoras del CUPS de esa máquina con la cuenta de Gmail en la que nos autentiquemos y desde esa cuenta ya podremos imprimir o compartir la impresora hacia otras. El programa que realiza la conexión se arranca:
# gcp-cups-connector &
Pero, claro no es cuestión de arrancarlo a mano cada vez que se reinicie la máquina. Es mas sencillo crear un servicio (el paquete no lo trae, así que lo hacemos a mano):
# cat /etc/systemd/system/cloud-print-connector.service
# Copyright 2016 Google Inc. All rights reserved.
#
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file or at
# https://developers.google.com/open-source/licenses/bsd

[Unit]
Description=Google Cloud Print Connector
Documentation="https://github.com/google/cloud-print-connector"
After=cups.service avahi-daemon.service network-online.target
Wants=cups.service avahi-daemon.service network-online.target

[Service]
ExecStart=/usr/bin/gcp-cups-connector -config-filename /root/gcp-cups-connector.config.json
Restart=on-failure
User=root

[Install]
WantedBy=multi-user.target
Asumimos que /root/gcp-cups-connector.config.json ha sido creado con el "gcp-connector-util init" de antes. Después damos los permisos correctos y activamos el servicio:
# chmod 664 /etc/systemd/system/cloud-print-connector.service 
# systemctl enable cloud-print-connector.service
# systemctl start cloud-print-connector.service
# systemctl status cloud-print-connector.service
Tras varios reinicios se puede comprobar que el servicio funciona correctamente y las impresoras se conectan sin problema a la nube a través de él. Esta vez el firewall de la red educativa no da problemas, por lo que he supuesto usa otros puertos no bloqueados por el firewall corporativo.

4. Otra vuelta de tuerca: traer la impresora de la nube a un CUPS local.

Hemos visto como compartir en la nube las impresoras que están en el CUPS de una máquina. Ahora veremos brevemente como conectar a el CUPS de otro host (por ejemplo un portátil o una máquina que haya en otra sede o en casa) una impresora que está en la nube. La idea es CUPS maquina local-> Google CloudPrint -> CUPS maquina remota.

El conectar la impresora de la nube en un CUPS local nos permite imprimir en ella desde cualquier aplicación, no sólo estaremos limitados a la aplicaciones web de Google.

En esta parte no me voy a prodigar mucho, pongo un enlace y listo: este software. Para Windows tenemos este otro.



Voy a recomendar un excelente podcast sobre ciencia al que me he enganchado hace poco hecho en Canal Extremadura Radio: Principio de Incertidumbre. Es una gozada que nuestros impuestos se inviertan en algo útil e importante.

martes, 11 de diciembre de 2018

Multiseat en infolabs

Ya vimos como hacer funcionar multiseat en Ubuntu 18 aquí. Es conveniente mirarse el artículo enlazado y los 3 anteriores a este para refrescar conceptos.

Tenía pendiente probar a configurarlo en nuestros equipos infolabs, que son HP ProDesk 600 G1 SFF con una tarjeta nVidia GeForce GT 370 PCIe adicional, dos discos de 2TB y 16GB de RAM. En todos los centros tenemos varias decenas de ellos y puede resultar interesante poder duplicarlos y hacer que con cada uno trabajen dos alumnos a la vez. Vamos a la tarea.

Primero veremos las tarjetas VGA que tenemos:
# lspci | grep -i vga
00:02.0 VGA compatible controller: Intel Corporation HD GraphicHP ProDesk 600 G1 SFF)s 530 (rev 06)
01:00.0 VGA compatible controller: NVIDIA Corporation GK208 [GeForce GT 730] (rev a1)
Bien, ahi están las dos tarjetas. Destinaremos la nVidia para el seat0 y la Intel integrada en la placa base para el seat-1.

La configuración multiseat se activa sencillamente así:
# cat /etc/lightdm/lightdm.conf
[LightDM]
logind-load-seats=true
Los comandos básicos para ver la configuración son:
loginctl list-seats : listado de los seats definidos
loginctl seat-status seat0 : listado de los recursos asignados al seat0
loginctl seat-status seat-1 : listado de los recursos asignados al seat-1
loginctl seat-status seat-X : listado de los recursos asignados al seat-X
Incialmente todos los recursos disponibles (tarjetas gráficas, de sonido, puertos usb y dispositivos de entrada) están asociados al seat-0. Lo que haremos será asociar al seat-1 la tarjeta de vídeo Intel y un puerto USB donde conectaremos un HUB al que enchufaremos un teclado y ratón USB. Con eso tendremos un puesto funcional conectado a un monitor, teclado y ratón independiente. Será el seat-1.

Después de probar en otras ocasiones siempre me he encontrado que las tarjetas nVidia que usan el driver nvidia en lugar del libre nouveau dan problemas variados con multiseat y los distintos conectores de vídeo de salida. En nuestro caso el sistema de los infolab nos viene con driver nvidia por defecto y no quería cambiarlo, así que he optado por la configuración que según mi experiencia menos problemas ha dado: usar el conector VGA (el D-sub 15) en lugar del DisplayPort en ambas tarjetas gráficas. Para la tarjeta nVidia uso un convertidor DVI-VGA.

Una vez enchufado todo queda así:



Se pueden ver ambos cables VGA, uno para cada monitor. Luego el cable usb blanco es un hub usb al cual van conectados un teclado y ratón que serán para el seat-1.

Para asignar los recursos al seat-1 los comandos serían:
# loginctl attach seat-1 "/sys/devices/pci0000:00/0000:00:02.0/drm/card1"
# loginctl attach seat-1 "/sys/devices/pci0000:00/0000:00:02.0/drm/renderD129"
# loginctl attach seat-1 "/sys/devices/pci0000:00/0000:00:14.0/usb1/1-1"
Con esto se enlazan al seat-1 la tarjeta en el puerto PCI 02.0 (la gráfica Intel) y el puerto usb1/1-1 (el que tiene conectado el hub usb de la foto). La forma de investigar y determinar qué poner en la ruta del attach ya se mostró en anteriores artículos de esta serie.

Acabado esto ya podemos reiniciar y ver dos pantallas de login con las que iniciar sesión por separado en cada seat.

Llevo varias días de pruebas y la verdad es que está funcionando bien. El primer día tuve un problema con el seat-1 en que la imagen aparecía con colores distorsionados en el monitor, pero no se ha vuelto a repetir. No se si achacarlo a que estaba probando con distintos cableados de vídeo o a un fallo del driver xorg. De momento lo dejo funcionando y si vuelve a pasar y encuentro la solución ampliaré este post.


Esta vez vamos a oír el sonido del viento en Marte capturado por la recién llegada Insight:



Alucinante, es el susurro de otro mundo. Sorprendentemente no es la primera vez que se oyen los vientos de otra atmósfera alienígena. Cuando la alucinante Huygens de la misión Cassini-Huygens aterrizaba en Titán en 2005 grabó esto:



Áspero sonido de viento de nitrógeno a -180ºC con una suave lluvia de metano. Un mundo duro.

martes, 4 de diciembre de 2018

Error en tea4cups al procesar trabajos de impresión

Como ya conté en otra ocasión para gestionar la contabilidad de trabajos de impresión y realizar todo tipo de procesos sobre ellos tengo en uso el filtro tea4cups en cups, en comandita con pkpgcounter.

En una máquina con Manjaro Linux donde lo estaba configurando me encontré con que los trabajos no se imprimían y quedaban atascados en la cola de CUPS. Para depurar y saber que estaba pasando modifiqué el fichero de configuración de cups para activar la depuración:

# cat /etc/cups/tea4cups.conf
.....
[global]
# Should we log debugging information to CUPS' error_log file ?
# defaults to No if unset.
debug : yes
....
....
Luego he mandado un trabajo a imprimir y tras pararse me he ido a ver el log:
# grep -i tea4cups /var/log/cups/error_log
....
....
IOError: [Errno 13] Permission denied: \'/var/spool/cups/tea4cups-VGIM_CONSERJERIA-anonymous-40\'
....
....
Es un error de permisos. Por algún motivo tea4cups tiene problemas para escribir en /var/spool/cups. He intentado cambiar los permisos del directorio, pero al reiniciar el servicio cups vuelven a quedar como estaban originalmente.

La solución está en hacer que tea4cups use otro directorio para trabajar, por ejemplo /var/spool/tea4cups:
# cat /etc/cups/tea4cups.conf
.....
[global]
....

# In which directory will we create our files ? It must already exist !
# This directive MUST be present since there's no sane default value.
# Can be set either in the [global] section or any print queue section.
# The value defined in a print queue section takes precedence over the
# value defined in the [global] section.
#
directory : /var/spool/tea4cups/
....
....
El nuevo directorio lo crearemos con propietario root:cups y permisos 775. Una vez hecho ya si he podido verificar que funciona todo bien. Manjaro es maravilloso, pero al seguir una senda distinta a Debian tiene cosillas como esta.


Quiero dar la enhorabuena a mi compañero de promoción Antonio Plaza por ser reconocido estos días como investigador de referencia mundial en la computación hiperespectral. Aunque la ciencia en España esté maltratada y/o menospreciada por el 90% de los compatriotas y el 99% de los dirigentes siempre hay aldeas galas que resisten. ¡Eres un crack, Antonio!


Ya tenemos otro visitante en Marte desde hace una semana: la misión Insight. Aunque su función no es hacer fotos siempre viene bien tener algo que ver:


Tres detalles alucinantes:
  • El sismógrafo es capaz de detectar vibraciones del orden del diámetro de un átomo de hidrógeno. No tengo palabras.
  • Sus placas solares tienen una potencia máxima de 4.5kw/h: la misma que tengo contratada en mi casa con los ladrones de Iberdrola. Dan para conectar varios electrodomésticos convencionales, así que para la instrumentación optimizada que lleva ya ni te digo. Podría soportar un aula de infolabs sin problema.
  • La importantísima estación meteorológica incorporada (TWINS) es española. Ha sido desarrollada en el Centro de Astrobiología del INTA en Torrejón de Ardoz. Todo un orgullo nacional.
Bueno, pues a ver si aposenta el sismógrafo en lugar estable y empieza luego pronto a cavar en Marte a ver que hay dentro. Que emoción.

viernes, 23 de noviembre de 2018

Error al actualizar desde mirrors locales de Ubuntu Bionic

Tras crear un mirror local en mi red de los repositorios de Ubuntu Bionic, Google y alguno más siguiendo las indicaciones de nuestro compañero Esteban me he encontrado con que al hacer "apt-get update" en los clientes me saltaba el error de que no podía descargar el fichero:
http://servidor/html/archive/ubuntu/dists/bionic/main/dep11/icons-48x48.tar
Lo cual es una sorpresa ya que "dep11" no es una rama que yo haya incluido en el mirror, ya que solo puse a bajar las ramas amd64 e i386. La causa es al parecer algo que trae el paquete appstream y la solución es borrar mediante puppet el fichero:
/etc/apt/apt.conf.d/50appstream
en todos los PC clientes. De esta manera ya podemos actualizar los puestos a una velocidad más razonable desde dentro de nuestra red.

Clonado de salidas de vídeo en pantalla de login

Ya hemos empleado en varias ocasiones scripts basados en xrandr para configurar el clonado de la pantalla en 2 dispositivos diferentes, normalmente un monitor y un cañón proyector. El script resultante se llama desde un fichero /etc/xdg/autostart/xxx.desktop y así garantizamos que se ejecuta cuando el usuario inicia sesión.

El problema que tuve estos días es que debia clonar la imagen entre una TV LED colgada en un muro y un monitor y no daba con la tecla para que se mostrase la imagen clonada antes de iniciar sesión, en la pantalla de login de lightdm. En este caso el script es mas o menos:
# cat /usr/bin/resolucion_tv_monitor
#!/bin/bash

#En el PC del Taller de Peluqueria las salidas son DVI (Monitor) y HDMI (TV plana): DVI-I-1 y HDMI-1 

test -e $HOME/.config/xfce4/xfconf/xfce-perchannel-xml/displays.xml && rm $HOME/.config/xfce4/xfconf/xfce-perchannel-
xml/displays.xml

HDMI=$(xrandr | grep " connected" | grep HDMI | cut -d" " -f1)
DVI=$(xrandr | grep " connected" | grep DVI | cut -d" " -f1)
xrandr --output $DVI --mode 1024x768 --pos 0x0 --rotate normal --output $HDMI --mode 1920x1080 --pos 0x0 --rotate normal --same-as $DVI --scale-from 1024x768
exit 0
Por si fuera poco el PC tiene un sistema multiseat, por lo que hay otra tarjeta de vídeo más con un monitor independiente para otro usuario que no debe ser clonado y debe mostrar su propia sesión privada.

Lo que se suele hacer en estos casos en generar un fichero xorg.conf que se pondrá en /etc/X11/xorg.conf.d forzando el clonado de ambas salidas, pero tras varios intentos no he sido capaz de dar con la configuración correcta.

La solución por la que me he decantado es olvidarme del xorg.conf y llamar al script antes de mostrar la pantalla de login. ¿Cómo?, pues ejecutándolo al inicio de ligthdm:
# cat /etc/lightdm/lightdm.conf.d/10-resolucion.conf 
[SeatDefaults]
display-setup-script=/usr/bin/resolucion_tv_monitor
Solo debemos tener cuidado de que display-setup-script no esté siendo usado para otro script, ya que solamente puede definirse una única vez.


Acabemos con el maravilloso vídeo grabado desde otro satélite del despegue de una Progress para abastecer la Estación Espacial Internacional:



Seguro que lleva en algún recoveco la pequeña ración de vodka de contrabando que los cosmonautas rusos acostumbran a pasar para consumir desde la época de la Mir y todas las Salyut.

Examinar los puertos de un switch Juniper

Los switchs que nos están instalando últimamente son de la marca Juniper con sistema operativo embebido Junos, que al parecer se basa en el entrañable FreeBSD. Tienen un interface web pero este es bastante lento y va a tirones, por lo que es mejor conectar por SSH para realizar las pocas tareas que nos permiten con ellos.

En esta ocasión estaba mapeando a mano las conexiones del switch y quería examinar que puertos estaban con señal "link up" y que MAC's habia tras ellos.

Para ver el estado de los enlaces de cada puerto el comando es:
> show interfaces terse
 
Interface               Admin Link Proto    Local                 Remote
ge-0/0/0                up    down
ge-0/0/0.0              up    down eth-switch
ge-0/0/1                up    down
ge-0/0/1.0              up    down eth-switch
ge-0/0/2                up    up
ge-0/0/2.0              up    up   eth-switch
ge-0/0/3                up    down
...
...
...
Para ver la tabla MAC con las direcciones mapeadas tras cada puerto:
> show ethernet-switching table

Ethernet-switching table: 60 entries, 56 learned, 0 persistent entries
  VLAN             MAC address       Type         Age Interfaces
  default           ec:3e:f7:5a:9f:c1 Static         - Router
  datos             *                 Flood          - All-members
  datos             00:00:74:9a:f5:68 Learn       3:11 ge-0/0/23.0
  datos             00:14:2a:97:05:cb Learn       1:58 ge-0/0/23.0
  datos             00:16:17:d4:57:dd Learn          0 ge-0/0/23.0
  datos             00:16:e6:82:8e:72 Learn       4:29 ge-0/0/23.0
  datos             00:16:e6:88:0d:21 Learn       4:33 ge-0/0/23.0
  datos             00:19:21:2d:7a:8f Learn         44 ge-0/0/10.0
  datos             00:19:21:2d:7c:b9 Learn         49 ge-0/0/8.0
  datos             00:19:21:2d:7e:f0 Learn       1:03 ge-0/0/12.0
  datos             00:19:99:fd:39:3a Learn         56 ge-0/0/23.0
  ...
  ...
  ...
Con esto he podido realizar un mapeo rápido de lo que buscaba.

Aquí un manual de referencia de Junos.



Hablando de Juno, una fotito de Júpiter tomada por la sonda Juno de la NASA:


Que bonito, lástima que haga tanto frío y haya tanta radiación.

jueves, 8 de noviembre de 2018

Lentitud de páginas web multimedia en thinclients de LTSP Ubuntu 18.

Me ha llegado una incidencia sobre la lentitud de un aula de thinclients sobre LTSP en Ubuntu 18 al abrir páginas web. Tras hacer pruebas in situ pude comprobar que al abrir varias páginas con 10 o mas thincliens encendidos todo se hacía enormemente lento, incluido el servidor LTSP, de tal manera que era imposible trabajar.

Descartado un problema de red me centro en ver que páginas usan: son unas páginas de idiomas que tienen mucho Flash (Odín maldiga al Flash) y que además abren muchas pestañas de Firefox. Haciendo un "ps aux | grep firefox" veo que hay una burrada de instancias de Firefox abiertas (mas de 40 procesos) y que eso puede provocar la fastidiosa lentitud de alguna manera que se me escapa.

En las últimas versiones de Firefox se ha implementado una feature llamada Electrolysis que, al igual que tiene hace tiempo Chrome, implica que Firefox abra procesos a tutiplén (uno o más por cada pestaña) para mejorar el rendimiento. Eso está muy bien para un entorno monousuario, pero en un entorno donde hay 10 o 12 usuarios en la misma máquina abriendo pestañas puede llevar las cosas al límite, especialmente en nuestros servidores LTSP con CPU Intel Core2 Quad de casi 10 años de antigüedad.

¿Se puede controlar este desmadre procesil? Pues en parte si, tocando varias configuraciones. Para hacerlo automático y que se aplique de forma obligatoria a todos los usuarios del PC (evitando tener que tocarlo perfil a perfil) lo mejor es usar el fichero syspref.js global de /etc/firefox:
# cat /etc/firefox/syspref.js
...
...
...
//Limitar el nmero de procesos firefox. Thinclients.
pref("browser.tabs.remote.autostart", false, locked);
pref("extensions.e10sMultiBlockedByAddons", false, locked); 
pref("dom.ipc.processCount", 1, locked); 
y distribuir dicho fichero mediante puppet a las máquinas que lo necesiten.

Con esto el número de instancias de Firefox se queda en 1-2 para cada usuario y la cosa se hace sensiblemente mas manejable: antes iba como el culo y ahora va casi medio bien.

Otra opción podría ser ejecutar Firefox de forma local en los thinclients, con sus propios recursos. Eso se hace lanzándolo así:
# ltsp-localapps firefox
El problema de esto es que:
  • Se ejecuta el Firefox y el Flash de 32bits contenido en la imagen de los thinclients, sensiblemente mas antiguo que el del servidor LTSP. Las imágenes de los thinclients están basadas en Ubuntu 14.
  • Al ejecutarse con el procesador y memoria de los thinclients tarda en arrancar y puede ir bastante ralentizado (suelen ser Pentiums IV con 512Mb de RAM). La ventaja es que no satura el servidor ni los thinclients ajenos.
Si aún así queremos hacerlo funcionar la forma mas adecuada es poner un script en los servidores LTSP que detecte si estamos en un thinclient o el servidor (examinando el contenido de la variable $LTSP_CLIENT) para lanzar el Firefox de una manera u otra:
# cat /usr/local/bin/firefox
#!/bin/bash
if [ ! -z "$LTSP_CLIENT" ]; then
       ltsp-localapps firefox
else
       /usr/lib/firefox/firefox "$@"
fi
exit 0
# chmod +x /usr/local/bin/firefox
Al estar /usr/local/bin por delante de cualquier otro directorio en $PATH siempre se ejecutará primero el script al llamar a "firefox".

Con esto conseguimos que la cosa tire mejor en tanto en cuanto Flash no sea purgado de la faz de la Tierra.

miércoles, 7 de noviembre de 2018

Software Reporter Tool y ralentización de los Windows.

Esta va de Windows. Después de hacer este curso un downgrade de Windows 10 a Windows 7 en varios equipos usados en los ciclos de FP en el centro porque entre actualizaciones, cortanas y demás enredos se hacían inmanejables ha habido un período de calma hasta que me avisaron que algunos empezaban a ir muy lentos de forma injustificada.

Tras mirar con el explorador de procesos no vi ningún proceso desbocado, pero si me chocaba que el procesador estaba siempre por encima del 60%, aún cuando no se hiciese nada. Para dilucidar que pasa en estos casos lo mejor es usar el programa "Process Explorer", que muestra mucha mas información que el explorador de procesos tradicional del Windows.

Ahora si pude ver que había un proceso (antes oculto no se por qué motivo) llamado "Software Reporter Tool" que era el responsable del alto uso de la CPU. Este programa es algo que viene con el Google Chrome y que básicamente no hace nada que no sea hacer la puñeta. Se instala en cada perfil de usuario en la ruta "c:\users\*usuario*\AppData\Local\Google\Chrome\User Data\SwReporter\..." y se arranca cuando buenamente le parece para hacer sus maldades.

No se puede desinstalar pero si borrar, aunque comentan que cuando se actualice Chrome seguramente volverá a aparecer. De momento lo he limpiado en todos los pc ejecutando:
cd c:\users
for /d /r . %d in (SwReporter) do @if exist "%d" rd /s/q "%d"
Y de repente los pc afectados han revivido. Tendremos que estar al acecho para cuando vuelva a aparecer.

lunes, 5 de noviembre de 2018

Volvemos con los libros digitales Santillana: Parachute y C'est à dire / Oxford


1. Actualización de libros de Santillana

Este curso nos han cambiado los libros digitales de Francés de la editorial Santillana: aunque los tenemos instalados de forma local en la red del IES han empezado a amenazar con que no se verán a partir de una fecha si no se actualizan. En su día ya contamos como instalarlos aquí:
Para actualizarlos he descargado la versión nueva de los libros desde la página con las credenciales que me ha dado el profesor, suministradas por la editorial.

Pensaba que la instalación sería similar a la relatada en el primero de los enlaces anteriores, pero mi sorpresa ha sido que ya no puedo abrir el libro con "firefox /home/.../dpto/Frances/ParaChute_1/exeBrowser.htm". La causa es que exeBrowser.htm ya no viene con los libros de Parachute (con los de C'est à dire, que son para Bachillerato, si vienen por ahora). En su lugar tengo un /home/.../dpto/Frances/ParaChute_1/exeLinux que debo hacer funcionar en Linux sí o sí. Esta vez no puedo usar el comodín del navegador Firefox como la otra vez.

Los pasos para hacerlo funcionar son:
  • Descargar el fichero .zip de la página de Santillana y descomprimirlo en la ruta destino, /home/.../dpto/Frances/*libro*. Poner permisos 777 a la carpeta creada con chmod 777 *carpeta*.
  • Hacer ejecutable el fichero exeLinux con chmod +x.
  • Instalar los paquetes auxiliares necesarios en las máquinas clientes que ejecutarán el programa. Son todos paquetes i386 ya que exeLinux es un programa de 32bits.
    # apt-get install libgtk2.0-0:i386 libxt6:i386 libidn11:i386 libnss3:i386 libxxf86vm1:i386 libcurl4:i386
    
  • Crear el fichero .desktop que se pondrá como enlace directo a la aplicación y ponerlo en el Escritorio de los profesores interesados:
    # cat Parachute1.desktop
    
    #!/usr/bin/env xdg-open
    [Desktop Entry]
    Name=Parachute 1
    Version=4.1.0.0
    Type=Application
    Terminal=true
    StartupNotify=true
    Exec=/home/.../dpto/Frances/ParaChute_1/exeLinux
    Categories=Education
    Icon=/home/.../dpto/Frances/ParaChute_1/recursos/intro01.jpg
    Path=/home/.../dpto/Frances/ParaChute_1/
    
  • Por último probamos la aplicación. En condiciones normales se abrirá y se ejecutará sin problema (al principio pide unas claves de licencia de acceso que debe obtener el profesor) aunque no descartamos nada ya que el ejecutable usa un flash versión 10 embebido (no es que Santillana use una tecnología obsoleta...es que usa una librería anterior a Göbekli Tepe)
  • He encontrado máquinas aisladas donde se queda la ventana en blanco (* ver mas abajo). Atribuyo el fallo a problemas con la configuración de la tarjeta gráfica y las X. Habría que generar y tocar el xorg.conf a mano (seguramente por prueba/error como cuento en el apartado 2) para encontrar la solución, pero no urge y no me he puesto con ello. Con las SIATIC y los LTSP de nuestros centros no hay problema.
  • Donde si hemos encontrado problemas es al abrir los vídeos desde el exeLinux: debe haber algún fallo al llamar al navegador web porque no encuentra el html que muestra el vídeo. De momento como truco para salir del paso lo que hacemos es abrir la carpeta /home/.../dpto/Frances/ParaChute_1/contenido/videos y ejecutar el vídeo directamente.
Bueno, a ver si Santillana se pone las pilas y se pasa a HTML5, que a Flash le quedan 14 meses de vida.

(*) Addenda 2/2/2021: las máquinas donde exeLinux se abre con la ventana en blanco se muestran bien si instalamos estas dos librerias de 32bits:
libidn11:i386 
libcurl4:i386

2. Libros de Oxford Key.

En cuanto a los libros de Oxford hemos tenido que reinstalarlos también tras actualizar a Ubuntu 18. Los pasos para Oxford Key (no serán muy distintos para otros libros de esa editorial) son:
  • Descargamos el programa en la páginas web de OxfordPremium con las credenciales que nos ha dado el profesor. Entramos en el Libro->Recursos para el aula-> Material para la PDI y allí está el enlace.
  • Instalar los paquetes auxiliares necesarios en las máquinas clientes que ejecutarán el programa. Son todos paquetes i386:
    # apt-get install libasound2:i386  libdbus-glib-1-2:i386 libxt6:i386
    
  • La descarga e instalación se realiza en el home de un usuario de prueba, luego se copiará a una ubicación de red. La instalación se lanza con:
    # ./Key/Key to Bachillerato 1/setup-linux-x64
    
  • Si aparece el error:
    Warning: Problem running post-install step. Installation may not complete correctly
     Error running linux-x64/utils/unzip64 -o "/media/reyesmp74/spectrum_ipack_2/dist/archives/books0.zip" -d .shared/books : unzip64: loadlocale.c:130: _nl_intern_locale_data: Assertion `cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))' failed. Aborted
    
    Es debido a que la versión de unzip64 que trae el instalador no es compatible con Ubuntu 18.04. Solución, sobreescribir el unzip64 que trae con el unzip que viene con Ubuntu y relanzar la instalación:
    # cp /usr/bin/unzip "~/Key/Key to Bachillerato 1/dist/default/program_files_linux_x64/linux-x64/utils/unzip64"
    # ./Key/Key to Bachillerato 1/setup-linux-x64
    
  • Copiar la instalación realizada a una carpeta de red tipo /home/.../dpto/Ingles/OxfordKey1.
  • Crear el .desktop hacia el ejecutable /home/.../dpto/Ingles/OxfordKey1/oup tal como hemos visto otras veces
  • Dar, como ya contamos en episodios anteriores, permisos a Flash sobre /home/.../dpto/Ingles/OxfordKey1 abriendo http://www.macromedia.com/support/documentation/es/flashplayer/help/settings_manager04.html con Firefox. Si no hacemos esto los vídeos no se visualizarán.
  • Probamos la aplicación lanzando el .desktop. Todo debería ir bien.
Después de instalar nos hemos dado cuenta de que en algunos equipos al maximizar los vídeos se quedaba colgado el escritorio, teniendo que matar el proceso "oup" para volver. Estos PC tenían todos una tarjeta VGA ATI Radeon HD 3450 y este tipo de cuelgues de Flash suele estar relacionado con ello.

Probando y probando encontré esta configuración para las Xorg que elimina el problema:
# cat /etc/X11/xorg.conf.d/10-xorg.conf 
Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "Monitor0"
    DefaultDepth    24

    Option "DRI" "2"

    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection
La linea "Option 'DRI' '2'" es la clave. ¿Como he logrado saber este parámetro? Pues no tiene ningún encanto ya que he usado un nada emocionante método de prueba y error. He creado a mano un fichero xorg.conf con todas las opciones posibles:
# cat /etc/X11/xorg.conf.d/10-xorg.conf 
Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "Monitor0"
    DefaultDepth    24

    #Option "SWcursor" "boolean"
    #Option "Accel" "boolean"
    #Option "ZaphodHeads" "string"   #          For example: Option "ZaphodHeads" "LVDS,VGA-0" will assign xrandr outputs LVDS and VGA-0 to this instance of the driver.
    #Option "ColorTiling" "boolean"
    #Option "ColorTiling2D" "boolean"
    #Option "DRI" "integer"         
    #Option "EnablePageFlip" "boolean"
    #Option "TearFree" "boolean"
    #Option "AccelMethod" "string"  # glamor/EXA
    #   The following driver Options are supported for glamor :
    #Option "ShadowPrimary" "boolean"
    #   The following driver Options are supported for EXA :
    #   Option "EXAVSync" "boolean"
    #   Option "EXAPixmaps" "boolean"
    #   Option "SwapbuffersWait" "boolean"

    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection
Y luego con paciencia he ido probando valores, reiniciando las X y probando la aplicación hasta que ha sonado la flauta. La lista de opciones de cada driver gráfico las saco con "man". Por ejemplo, en este caso usamos el driver "radeon" y la lista de opciones la he obtenido con:
# man radeon
Y luego con calma he puesto cada opción y su posibles valores en las distintas pruebas hasta dar con la solución.

Bueno, esperemos que el próximo año no nos toquen los libros.

miércoles, 31 de octubre de 2018

Error "Resetting chip after gpu hang" en tarjeta VGA intel

En un PC que tengo en la red sucedía que cada cierto tiempo y de forma aleatoria el escritorio se ponía en negro, se paraba todo y un segundo después volvía a su ser. Evidentemente así no se puede trabajar.

Mirando vi en primer lugar que en su /var/log/Xorg.0.log presentaba de forma repetida los mensajes correspondientes a la detección del monitor/resolución, con los modelines y demás parafernalia. De forma paralela en el syslog se mostraba el error:
kernel: [ 4558.940791] i915 0000:00:02.0: Resetting chip after gpu hang
coincidiendo en el tiempo con los fundidos en negro.

La tarjeta VGA es una Intel integrada en la placa y tras buscar un rato me decanté por esta solución, que implica añadir al grub:
i915.enable_rc6=0 
No tuve éxito: el problema persistía.

Luego, siguiendo otra pista probé a modificar la configuración del Google Chrome para desactivar la aceleración gráfica con otro fracaso total como resultado.

No se puede tirar la toalla, así que me centré por el método lento pero seguro: empezar a tocar parámetros de xorg.conf (con "man intel" vemos todos los parámetros posibles para el driver intel de las xorg) hasta dar con la tecla. Finalmente, con esta configuración:
# cat /etc/X11/xorg.conf.d/10-xorg.conf 
Section "Device"
      Identifier "Intel Graphics"
      Driver "intel"
      Option "TearFree" "true"
      Option "AccelMethod" "sna"
EndSection
y para mi alegría el problema desapareció. El driver "intel" estaba usando por defecto aceleración Glamor pero al parecer forzar SNA soluciona el problema.


Es indigno no aprovechar la ocasión para recordar y homenajear al telescopio espacial Kepler, que hoy ha finalizado su vida al quedarse sin propelente tras descubrir 2600 exoplanetas.


Esta maravilla de la ingeniería por la que nadie, excepto un grupito de pirados, daba un euro se ha dedicado durante 9 años a escudriñar una porción del firmamento y confirmar que los planetas rocosos en zona de aguabilidad no son nada extraordinario ni raro.

Y es que el Principio de Mediocridad es algo que debemos tener siempre en cuenta para saber nuestro sitio en el universo.

martes, 23 de octubre de 2018

Scratch 2 en local para Ubuntu 18 Bionic

En Ubuntu 14 instalaba y ejecutaba Scratch 2 de forma local usando la guía de mi compañero Esteban.

Como este curso hemos tenido algún problema de conexión a Internet me pidieron instalarlo de nuevo de forma local en Ubuntu Bionic. Siguiendo el manual anterior me encontré que la parte "airinstall /root/Scratch-445.air" se paraba con el error:
No se ha podido instalar la aplicación de Adobe AIR. No se han encontrado herramientas Debian para crear paquetes deb (como dpkg-deb o ar) en el sistema.
Evidentemente tengo tanto dpkg-deb como ar instalados. Buscando en Internet en el blog de diocesanos.es encontré la solución. No se sabe cual es la causa de error, pero ahí se hacen eco de un workaround que mete Scratch-445.air de forma indirecta usando el SDK de Adobe AIR. De esta manera nos da igual que airinstall no funcione: no se usa y ya está.

En el blog proponen un script que descarga con wget todo lo necesario y lo instala. Como yo quería hacerlo en muchas máquinas no me interesaba descargar en cada instalación todos los ficheros requeridos, por lo que los he descargado previamente una sola vez y los he puesto junto con el script de tal forma que el directorio queda:
-rw-r--r-- 1 root root 37489410 oct 23 10:10 AdobeAIRSDK.tbz2
-rw-r--r-- 1 root root     1059 oct 23 10:10 adobe-air.tar.gz
-rwxr-xr-x 1 root root     2133 oct 23 11:26 scratch2-bionic.sh
-rw-r--r-- 1 root root 60491365 jul  5  2017 Scratch-456.0.4.air
Y he retocado el script para que no descargue nada. Poniendo todos estos ficheros en un lugar común (por ejemplo la carpeta /home/instituto/scratch2 de nuestra red) basta con entrar por ssh en el pc del usuario y hacer:
# cd /home/instituto/scratch2
# ./scratch2-bionic.sh
Para instalarlo de forma local. Para su ejecución ya no dependemos de Internet: sólo habrá que buscarlo en el menú de aplicaciones del escritorio para lanzarlo o sacar un acceso directo a escritorio.

Todos los ficheros necesarios se pueden descargar de aquí.

sábado, 29 de septiembre de 2018

Mensaje pop-up en escritorio de usuario desde conexión ssh.

Un compañero planteaba el problema de como enviar un mensaje al usuario que tenia abierta una sesión gráfica en el escritorio de la máquina desde una conexión ssh del usuario root. Un escenario típico sería estar haciendo alguna tarea de mantenimiento en remoto y comunicar algo de interés al usuario de la máquina a la que estamos conectados, tipo "ya está instalado el programa" o "no apague la máquina al acabar, por favor".

Para conseguir esto el código a teclear después de entrar por ssh sería:
export XAUTHORITY=/var/run/lightdm/root/:0
mensaje="El programa ya esta instalado, puede probar"
zenity --warning --width=200 --no-wrap --text="$mensaje" --display=:0
Lo importante aquí es asignar a XAUTHORITY la sesión del usuario que está usando el escritorio, ya que por muy root que seamos no podemos enviar el mensaje mostrado por "zenity" a su escritorio sin tener permisos para ello.

En este código hay varias asunciones: que el usuario está en la sesión gráfica :0 (eso se sabe haciendo un "who" antes) y que su fichero XAUTHORITY es /var/run/lightdm/root/:0. Esto último lo sabemos haciendo:
# ps aux | grep X
root       517  2.1  1.0 293236 41432 tty7     Ssl+ 16:28   2:15 /usr/lib/Xorg :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
.....
Estos parámetros serán así de forma general para todas las máquinas de nuestros centros (basadas en una imagen similar de Xubuntu) pero habría que tener cuidado con los valores del display o el xauthority otros casos, como una configuración multiseat o con thinclients.

Me despido con una foto de la Opportunity reaparecida después de la mega-tormenta de arena que ha azotado Marte en los últimos meses:


De momento está mohína y no responde, a ver si con un poco de suerte se cargan las baterías y puede hacer un rearranque del sistema, despertando una vez más victoriosa y con ganas de explorar. Que maravilla, preparada para funcionar 90 soles (días marcianos) lleva mandando datos 14 años. Sin ningún genero de duda está hecha por los mismos técnicos que diseñaron los Fujitsu P300 que tenemos como thinclients en las aulas.


lunes, 10 de septiembre de 2018

Ejecutar un script que necesita conexión de red al apagar la máquina en Ubuntu 18

Ya estamos de vuelta del veranito con las pilas cargadas, vamos al lío: me interesa ejecutar un script cuando las máquinas estén apagándose o reiniciándose pero es importante que durante la ejecución del mismo todavía hubiera red, ya que el script hace conexiones hacia fuera.

Anteriormente con init.d esto lo hacíamos poniendo el script en /etc/rc6.d, pero con Ubuntu 18 y systemd eso se ha acabado. Ahora debemos hacerlo creando un servicio:
# cat /etc/systemd/system/apagado.service 
[Unit]
Description=Script para ejecutar en apagado
Requires=network.target
After=network.target
Before=shutdown.target reboot.target halt.target
DefaultDependencies=no

[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=/bin/bash /root/apagado.sh

[Install]
WantedBy=multi-user.target
Los parámetros Requires/After/Before establecen las dependencias y precedencias con las que se ejecutará el script /root/apagado.sh, que es donde tenemos nuestro código.

Una vez definido el servicio lo activamos con:
# systemctl enable apagado.service
Después reiniciamos la máquina y a partir de ahora el script /root/apagado.sh se ejecutará en cada shutdown/reboot.



martes, 17 de julio de 2018

Multiseat en Ubuntu 18

Tras 2 añitos con multiseat en varias ubicaciones del centro puedo afirmar que son un éxito de crítica y público. Se usan a diario sin mayor problema, habiendo desaparecido la confusión inicial del usuario al ver que hay un solo PC para dos tríadas de monitor, teclado y ratón. Sacamos 2 puestos de trabajo totalmente operativos de dónde solo había un único PC con el único gasto de comprar una tarjeta VGA barata de menos de 40 euros.

Tengo incluso una anécdota de un usuario que me decía que tenia problemas en su PC y señalaba hacia un espacio vacío para referirse a él (donde estaba su antiguo PC hasta que sustituí ambos por uno con multiseat), ya que tenia interiorizado de que el PC que había en la mesa era el de su compañero de despacho y que él no tenía una máquina física a la que aporrear cuando fallaba algo.

Todo el montaje lo tratamos en la serie de artículos parte 1, parte 2 y parte 3.

Con el cambio a Ubuntu 18 temía que esto no funcionase o fuese a dar problemas nuevos. Pues no casi todo lo antiguo vale, la única parte que hay que saltarse porque ya no es necesaria está en el primer artículo, bajo el epígrafe "2. Preparando el entorno", en los párrafos que hablan de añadir un repositorio ppa y actualizar paquetes desde él. Es decir, en Ubuntu 18 debemos ignorar la parte:

Bueno, pues para preparar esto tenemos que empezar añadiendo un repositorio ppa:
# sudo add-apt-repository ppa:ubuntu-multiseat/ppa
Que nos añadirá:
# cat /etc/apt/sources.listd.d/ubuntu-multiseat-ppa-trusty.list 
deb http://ppa.launchpad.net/ubuntu-multiseat/ppa/ubuntu trusty main
# deb-src http://ppa.launchpad.net/ubuntu-multiseat/ppa/ubuntu trusty main
Y actualizamos los paquetes, especialmente los relaciones con las X para soporte multiseat :
# sudo apt-get update
# sudo apt-get upgrade

De hecho si intentamos realizar los pasos anteriores veremos que fallan porque no hay paquetes para Ubuntu 18 Bionic, ya que la última versión es para Ubuntu 16. No se muy bien que ha pasado, pero asumo que lo que implementaba ese repositorio se ha integrado en la paquetería oficial de Ubuntu.

Por tanto sólo haremos la parte:

Tambien hay que editar
# # cat /etc/lightdm/lightdm.conf
[LightDM]
logind-load-seats=true
Para que lightdm reconozca la configuración de los seat y abra una sesión en cada monitor, con todo el hardware asociado.

Tampoco viene mal quitar el paquete light-locker. Hemos observado que produce pantallas en negro y bloqueos especialmente en el seat secundario. Si tenemos pkgsync lo mejor es ponerlo en maynothave.

El resto se hará igual a como se relata en los artículos de hace dos años. De hecho, si guardamos los ficheros creados en /etc/udev/rules.d de Ubuntu 14 seguramente podamos copiarlos a Ubuntu 18 sin problemas, aunque yo he preferido hacerlo todo a mano para controlar mejor el proceso.

Bueno, pues un quebradero menos de cabeza.

martes, 10 de julio de 2018

Ubuntu 18: configuración pantalla y sonido para Siatic (HP ProDesk 600 G1 SFF)

En estos 2 artículos anteriores VGA en HP Prodesk y Clonado de monitor y cañón vimos como lograr poner en Ubuntu 14 la resolución adecuada y la pantalla/cañón clonados en los PC HP ProDesk 600 G1 SFF que tenemos en las Siatics. Básicamente usábamos "xrandr" y un script de inicio en /etc/xdg/autostart para hacerlo.

En la imagen de Ubuntu 18 nos viene de serie el driver propietario nvidia instalado, que nos permite configurar fácilmente un xorg.conf a medida mediante el comando nvidia-settings. La configuración óptima para nuestra instalación de Siatics es:
# cat /etc/X11/xorg.conf.d/10-Siatic-xorg.conf

Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "Monitor0"
    DefaultDepth    24
    Option         "Stereo" "0"
    Option         "nvidiaXineramaInfoOrder" "CRT-1"
    Option         "metamodes" "HDMI-0: 1280x800 +0+0, VGA-0: 1280x800 +0+0"
    Option         "SLI" "Off"
    Option         "MultiGPU" "Off"
    Option         "BaseMosaic" "off"
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection
Es decir, se ponen ambos dispositivos con resolución 1280x800 e imagen clonada. Al estar en xorg.conf.d esto se ejecuta desde el arranque de las X ya en el mismo lightdm.

Un problema adicional que tuvimos anteriormente es que hay instalaciones de Siatic con un cable VGA con terminadores de color negro que tiene menor calidad que el cable normal, con terminadores de color azul. Eso hacía que no se detectasen bien las propiedades del monitor y se quedase en resolución máxima de 1024x768.

Para solucionar eso añadíamos con xrandr varios "modelines" manualmente indicando los parámetros para resoluciones mas altas. Ahora eso no es necesario, supongo que los compañeros que han hecho la imagen de Ubuntu 18 han metido la definición de esos modelines en algún lado o bien el driver nvidia detecta mejor, ya que ahora xrandr si que muestra todas la resoluciones posibles independientemente del cable usado.

La mejor manera de aplicar esta configuración es mediante una regla puppet del tipo:
class xubuntu_18_siatic {
  .....
  .....
  #================================================================
  #Ponemos un xorg.conf.d que fija resolucion 1280x800 clonada en ambas
  #salidas de video.
  file {"/etc/X11/xorg.conf.d/10-Siatic-xorg.conf":
    owner => root , group => root , mode => 644 ,
    source => "puppet:///modules/xubuntu18_siatic/10-Siatic-xorg.conf",
  } 
  ....
  ....
}

En cuanto al sonido teníamos un problema distinto: debíamos anular la salida de sonido de la tarjeta nvidia ya que eso confundía a los usuarios y provocaba que hubiese muchas veces problemas. Como vemos con lspci hay demasiadas tarjetas de sonido y eso despista:
# lspci | grep -i audio
00:03.0 Audio device: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor HD Audio Controller (rev 06)
00:1b.0 Audio device: Intel Corporation 8 Series/C220 Series Chipset High Definition Audio Controller (rev 04)
01:00.1 Audio device: VIDIA Corporation High Definition Audio Controller (rev a1)
El método usado con Ubuntu 14 pasaba por hacer en /etc/rc.local un "remove" del dispositivo 01:00.1 durante el arranque. En esta entrada se puede ver como se hacía.

Debido a que en Ubuntu 18 no hay /etc/rc.local de forma nativa (aunque puede activarse) he encontrado una forma bastante elegante de anular la tarjeta de sonido nvidia, con un fichero en rules.d:
# cat /etc/udev/rules.d/70-audio-nvidia-off.rules
ACTION=="add", KERNEL=="0000:01:00.1", SUBSYSTEM=="pci", RUN+="/bin/sh -c 'echo 1 > /sys/bus/pci/devices/0000:01:00.1/remove'"
De igual forma podemos distribuirlo a todas las Siatics mediante puppet:
   ....
   ....
   #================================================================
   # Regla udev para quitar el audio nvidia y dejar solo el audio de placa base

   file {"/etc/udev/rules.d/70-audio-nvidia-off.rules":
      owner => root , group => root , mode => 644 ,  
      source => "puppet:///modules/xubuntu18_siatic_/70-audio-nvidia-off.rules"
   }
   ....
   ....
Esté método de "quitar" dispositivos PCI podremos también emplearlo en otros tipos de máquinas que tengamos en el centro, como infolabs o ltsp, y así poder quitar no solo dispositivos de sonido que no se usen, sino tambien tarjetas wifi y otros artefactos inútiles.

sábado, 7 de julio de 2018

LTSP: como distinguir entre cliente y servidor de aula.

En un entorno LTSP las sesiones de los clientes y el servidor de aula se ejecutan en siempre en este último, ya que los clientes son "terminales tontos".

A veces nos interesa en un script saber si estamos en el cliente (manejado por el alumno) o en servidor (manejado por el profesor) para permitir o no determinadas cosas. Por ejemplo, la aplicación Control Siatic que usamos para manejar la pizarra debería arrancarse sólo en el puesto del profesor y no en el de los alumnos.

Para saber en cual de ambos puestos estamos podemos usar la variable de entorno "$LTSP_CLIENT", que nos dice si el puesto es un cliente o no.
if [ ! -z "$LTSP_CLIENT" ] 
then
   echo "Estamos en el cliente $LTSP_CLIENT_HOSTNAME"
else
   echo "Estamos en el servidor $HOSTNAME"
fi

Nótese como usamos $LTSP_CLIENT_HOSTNAME para usar el nombre real del thinclient, ya que $HOSTNAME nos da el nombre del servidor de aula en todos los PC del aula, ya sea servidor o uno de los clientes.

Clonezilla en la red privada de un aula mediante arranque PXE

En este post veremos como configurar un arranque de clonezilla mediante PXE en un aula con ordenadores de sobremesa para los alumnos (workstations o infolabs). De esta manera no nos hará falta un pendrive o CD para arrancar el clonezilla para un uso normal.

Ojo, esto no es para clonado multicast: en el caso de que pongamos a clonar varios equipos esto sería una clonación unicast, por lo que cada PC se clonaría independientemente de los demás. Esto implica que el clonado será más lento cuantos mas equipos haya clonando ya que la red se comparte entre todos.

Para poder poner esta configuración tambien es necesario tener una red privada en el aula, con su propio espacio de direcciones 192.168.X.Y y su propio servidor dhcp.

1. Instalación del servidor dhcp y tftp.

En el ordenador del profesor instalamos, si no está ya, isc-dhcp-server. Si dentro del aula hay otro hardware que hace de servidor dhdcp (por ejemplo un punto de acceso wifi), lo desactivamos.

Configuración del servidor dhcp (cambia eth0 por la tarjeta de red que está conectada a la red interna):
# cat /etc/default/isc-dhcp-server 
# Defaults for isc-dhcp-server initscript
# sourced by /etc/init.d/isc-dhcp-server
# installed at /etc/default/isc-dhcp-server by the maintainer scripts

#
# This is a POSIX shell fragment
#

# Path to dhcpd's config file (default: /etc/dhcp/dhcpd.conf).
#DHCPD_CONF=/etc/dhcp/dhcpd.conf

# Path to dhcpd's PID file (default: /var/run/dhcpd.pid).
#DHCPD_PID=/var/run/dhcpd.pid

# Additional options to start dhcpd with.
# Don't use options -cf or -pf here; use DHCPD_CONF/ DHCPD_PID instead
#OPTIONS=""

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
# Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACES="eth0"
Otro fichero con la configuración para decir al arranque PXE donde está el fichero pxelinux.0:
# cat /etc/dhcp/dhcpd.conf 
# TFPT server for PXE boot

option domain-name-servers 172.25.231.2;
default-lease-time 86400;
max-lease-time 604800;
authoritative;

subnet 192.168.0.0 netmask 255.255.255.0 {
  range 192.168.0.100 192.168.0.250;
  filename "/var/lib/tftpboot/pxelinux.0";
  next-server 192.168.0.254;
  option subnet-mask 255.255.255.0;
  option broadcast-address 192.168.0.255;
  option routers 192.168.0.254;
}
Cambia 172.25.231.2 por la IP de tu servidor ldap, 192.168.0.254 por la dirección dentro de la red del aula del PC del profesor y 192.168.0.X por tu espacio de direcciones del aula (en el caso de que uses otro).

A veces la configuración del servicio dhcp no está en /etc/dhcp/dhcpd.conf sino en /etc/ltsp/dhcpd.conf. Esto sucede cuando hemos instalado antes el servicio ltsp-server-standalone. En ese caso habría que modificar este último fichero.

El otro paquete a instalar es el servidor tftpd-hpa. Su configuración es:
# cat /etc/default/tftpd-hpa 
# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS="[::]:69"
TFTP_OPTIONS=""
No olvidemos meter en el mayhave de pkgsync ambos paquetes si no no queremos que se desinstalen.

2. Configuración menú PXE.

Todo el menú está en /var/lib/tftpboot:
# ls -l /var/lib/tftpboot
total 344
-rw-rw-rw- 1 root root  68306 may 25 02:11 bg.png
-rw-rw-rw- 1 root root  20704 jun 21 13:19 chain.c32
drwxrwxrwx 9 root root   4096 jun 21 13:44 clonezilla
-rw-rw-rw- 1 root root  55012 jun 21 13:19 menu.c32
-rw-rw-rw- 1 root root  26720 jun 21 13:20 pxelinux.0
drwxrwxrwx 2 root root   4096 jun 21 13:25 pxelinux.cfg
-rw-rw-rw- 1 root root 152976 jun 21 13:19 vesamenu.c32
Los ficheros chain.c32, menu.c32, vesamenu.c32 y pxelinux.0 los sacamos de /usr/lib/syslinux/ tras instalar el paquete syslinux-common. El fichero bg.png es un fondo de pantalla cualquiera.

Creamos el directorio clonezilla visto en el listado anterior, entramos en el y descargamos clonezilla-live-2.5.5-38-amd64.zip, descomprimiéndolo dentro. Debe quedar:
# ls -l /var/lib/tftpboot/clonezilla/ 
total 262160
drwxrwxrwx 3 root root      4096 mar 29 21:38 boot
-rw-rw-rw- 1 root root 239003081 mar 29 15:38 clonezilla-live-2.5.5-38-amd64.zip
-rw-rw-rw- 1 root root       160 mar 29 21:38 Clonezilla-Live-Version
drwxrwxrwx 3 root root      4096 mar 29 21:35 EFI
-rw-rw-rw- 1 root root     18092 ago 11  2015 GPL
drwxrwxrwx 3 root root      4096 mar 29 21:38 home
-rw-rw-rw- 1 root root  24470488 jun 21 13:44 initrd.img
drwxrwxrwx 2 root root      4096 mar 29 21:38 live
drwxrwxrwx 2 root root      4096 mar 29 21:38 syslinux
drwxrwxrwx 6 root root      4096 mar 29 21:38 utils
-rw-rw-rw- 1 root root   4921104 jun 21 13:43 vmlinuz
Los ficheros vmlinuz e initrd.img no están inicialmente, pero los copiamos del directorio /var/lib/tftpboot/clonezilla/live a /var/lib/tftpboot/clonezilla.

Creamos el directorio pxelinux.cfg y dentro el fichero default:
# cat /var/lib/tftpboot/pxelinux.cfg/default 
DEFAULT vesamenu.c32
PROMPT 0
TIMEOUT 50 # 5 segundos
TOTALTIMEOUT 3000
ONTIMEOUT clonezilla
#MENU HIDDEN  Solo muestra la cuenta atrás, si se pulsa una tecla aparece el menú.
# Menu Configuration
MENU WIDTH 80
MENU MARGIN 10
MENU PASSWORDMARGIN 3
MENU ROWS 15
MENU TABMSGROW 20
MENU CMDLINEROW 20
MENU ENDROW 24
MENU PASSWORDROW 20
MENU TIMEOUTROW 24
MENU TITLE Menu de Arranque de Sistema
MENU MASTER PASSWD $1$xyBSCMrw$FbRbg76bC8fVXL9JjQctC.
MENU PASSPROMPT Introduzca Password:
MENU BACKGROUND bg.png
MENU COLOR TITLE    1;36;44     #c00090f0 #00000000 std

NOESCAPE 1
ALLOWOPTIONS 0

LABEL bootfromdisk
  MENU LABEL Arranque desde Disco duro
  localboot 

LABEL clonezilla
  MENU DEFAULT
  MENU LABEL Clonezilla
  kernel clonezilla/vmlinuz 
  append initrd=clonezilla/initrd.img boot=live union=overlay username=user config components quiet noswap edd=on nomodeset nodmraid locales="es_ES.UTF-8" keyboard-layouts=es fetch=tftp://192.168.0.254/var/lib/tftpboot/clonezilla/live/filesystem.squashfs ocs_daemonon="ssh"  ocs_prerun="echo passwordroot | sshfs -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no root@192.168.0.254:/mnt /home/partimag -o workaround=rename -o password_stdin"  ocs_live_batch=no  vga=788  ip=frommedia  net.ifnames=0   nosplash i915.blacklist=yes  radeonhd.blacklist=yes  nouveau.blacklist=yes  vmwgfx.enable_fbdev=1  keeppxe
Recordemos cambiar las dos ocurrencias de 192.168.0.254 por la IP que tuviera el PC del profesor en tu aula.

Tal como queda, los clientes conecatados la VLAN del aula al arrancar por PXE cargarán un sistema clonezilla completo, como cuando arrancamos con CD o pendrive. Es conveniente automatizar en el arranque la parte en que se monta /home/partimag (el directorio donde estarán las imágenes) para no tener que hacerlo luego a mano nosotros cada vez que clonemos. Eso se hace utilizando el parámetro oc_prerun en la carga del clonezilla vista en el menú anterior.

En mi caso tengo las imágenes en el directorio /mnt del PC del profesor y accedo a ellas montándolas por sshfs. Aquí cada cual puede poner el sistema que quiera: montaje por NFS, por Samba, etc. Lo que si es conveniente, para reducir el tráfico hacia la red externa, es que las imágenes que cargamos estén ubicadas en el PC del profesor, dentro de la red privada del aula.

Esta es mi secuencia de comandos de montaje en /home/partimag:
ocs_prerun="echo passwordroot | sshfs -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no root@192.168.0.254:/mnt /home/partimag -o workaround=rename -o password_stdin" 
Evidentemente, hay que cambiar "passwordroot" por tu contraseña de root o bien usar un usuario no root con permisos sobre /mnt para hacer el montaje.

Por último, como es costumbre de buen sysadmin no viene mal automatizar toda la ristra de cuestiones que nos hace clonezilla: tipo de restauración, nombre de la imagen, disco destino, etc. Esto lo hacemos añadiendo ocs_live_run a la linea de arranque del menú, de una forma similar a como lo hacemos con los pendrives automáticos de Clonezilla:
ocs_live_run="ocs-sr -g auto -e1 auto -e2 -r -j2 -k1 -scr -p poweroff restoredisk nombreImagen sdX"  ocs_live_extra_param=""  ocs_postrun=""
Siendo nombreImagen el nombre del directorio donde está la imagen en /home/partimag y sdX el disco o discos donde clonar.

De esta manera basta con arrancar el/los clientes por PXE y marcharnos, ya que el resto del proceso se haría de forma automática.

3. Configuración arranque PXE en clientes.

Por último, para configurar el arranque PXE en clientes podemos usar su BIOS o bien instalar el paquete ipxe, que añade al Grub /boot/grub.cfg) una entrada que permite elegir ese tipo de arranque, mas o o menos:
### BEGIN /etc/grub.d/20_ipxe ###
menuentry "Network boot (iPXE)" --users "" --class network {
 insmod part_msdos
 insmod ext2
 set root='hd0,msdos3'
 if [ x$feature_platform_search_hint = xy ]; then
   search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos3 --hint-efi=hd0,msdos3 --hint-baremetal=ahci0,msdos3  3e9a285d-eb53-4ff8-a31e-af7be11035d2
 else
   search --no-floppy --fs-uuid --set=root 3e9a285d-eb53-4ff8-a31e-af7be11035d2
 fi
    linux16 /boot/ipxe.lkrn
}

4. Sirviendo el clonezilla por NFS en lugar de por TFTP.

En el apartado 2 vimos como el sistema operativo clonezilla se sirve a los clientes durante el arranque por TFTP, con el parámetro:
fetch=tftp://192.168.0.254/var/lib/tftpboot/clonezilla/live/filesystem.squashfs 
Esto hace que para iniciar el sistema clonezilla en el cliente PXE primero tenga que transmitirse todo el fichero .squashfs completo, lo cual puede llevar unos minutos en función de la saturación de la red.

Otra opción mas ligera consiste en servir el sistema de ficheros donde está clonezilla mediante NFS. Para ello instalamos el nfs-kernel-server y creamos el fichero para compartir:
# cat /etc/exports 
/var/lib/tftpboot/clonezilla  *(ro,sync,no_subtree_check)
El menú PXE será:
LABEL clonezilla-nfs
  MENU DEFAULT
  MENU LABEL Clonezilla-nfs
  kernel clonezilla/vmlinuz 
  append initrd=clonezilla/initrd.img boot=live union=overlay username=user config components quiet noswap edd=on nomodeset nodmraid locales="es_ES.UTF-8" keyboard-layouts=es netboot=nfs nfsroot=192.168.0.254:/var/lib/tftpboot/clonezilla ocs_daemonon="ssh"  ocs_prerun="echo passwordroot | sshfs -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no root@192.168.0.254:/mnt /home/partimag -o workaround=rename -o password_stdin"  ocs_live_batch=no  vga=788  ip=frommedia  net.ifnames=0   nosplash i915.blacklist=yes  radeonhd.blacklist=yes  nouveau.blacklist=yes  vmwgfx.enable_fbdev=1  keeppxe
En esta solución el sistema cargado en initrd monta y accede desde el primer momento a filesystem.squashfs y comienza el arranque de forma inmediata, lo cual hace el proceso mas rápido y vistoso. La parte clave es:
netboot=nfs nfsroot=192.168.0.254:/var/lib/tftpboot/clonezilla 



viernes, 6 de julio de 2018

Repositorio propio de nuestra red local + paquete .deb de Foxit PDF Reader

1. Repositorio propio de nuestra red local.

Como estamos actualizando todos los sistemas a Ubuntu 18 es el momento de crear un repositorio de paquetes propio de mi red.

Este repositorio me permite meter paquetes .deb que no vienen en los repositorios estándar de Ubuntu o de Educarex, pero que si son útiles en el día a día del centro. Ejemplos de eso son master-pdf-editor, Googleearth, drivers de impresoras Epson o Brother, Adobe Reader o paquetes creados/empaquetados por nosotros mismos como aulalinex, controlies o Foxit PDF.

De esta manera los instalaremos posteriormente con una regla puppet del tipo:
package {"nombre-paquete": ensure => installed }
Para crear el repositorio sigo cuidadosamente las instrucciones de mi compañero Esteban, realizando la instalación en el directorio /var/www/html/iesvirgendeguadalupe de mi servidor principal.

El fichero distributions tendría el contenido:
Origin: IES Virgen de Guadalupe
Label: Ubuntu Bionic packages
Suite: bionic
Codename: bionic
Architectures: i386 amd64
Components: main
Description: Paquetes adicionales para el IES
DebIndices: Packages Release . .gz .bz2
SignWith: CFC4E733
La clave pública la guardaremos siguiendo los pasos enumerados por Esteban en su blog en la ruta /var/www/html/iesvirgendeguadalupe/iesvirgendeguadalupe.asc.

Una vez montado el repositorio, cuando queramos añadir un paquete .deb como master-pdf-editor haremos:
# cd /var/www/html/iesvirgendeguadalupe
# wget https://code-industry.net/public/master-pdf-editor-5.0.32_qt5.amd64.deb
# reprepro --ask-passphrase includedeb bionic master-pdf-editor-5.0.32_qt5.amd64.deb 
# rm master-pdf-editor-5.0.32_qt5.amd64.deb el contenido del
Si queremos ver la lista de paquetes añadidos al repositorio haremos (ojo, aquí salen todos los que llevo añadidos yo):
# cd /var/www/html/iesvirgendeguadalupe
# reprepro list bionic
bionic|main|i386: adobereader-enu 9.5.5
bionic|main|i386: arduinoide 1.8.1
bionic|main|i386: aulalinex-alumno 4.2-17
bionic|main|i386: aulalinex-alumno-ltsp 4.2-0
bionic|main|i386: aulalinex-profesor 4.2-17
bionic|main|i386: brother-udev-rule-type1 1.0.0-1
bionic|main|i386: brscan4 0.4.3
bionic|main|i386: dcp9020cdwcupswrapper 1.1.2-1
bionic|main|i386: dcp9020cdwlpr 1.1.2-1
bionic|main|i386: epson-inkjet-printer-escpr 1.6.5-1lsb3.2
bionic|main|i386: epson-printer-utility 1.0.0-1lsb3.2
bionic|main|i386: hl4140cncupswrapper 1.1.1-5
bionic|main|i386: hl4140cnlpr 1.1.1-5
bionic|main|i386: jkiwi 0.9.5
bionic|main|i386: serveraulalinex-ltsp 4.2-0
bionic|main|amd64: FoxitReader 2.4.1
bionic|main|amd64: adobeair 1:2.6.0.19170
bionic|main|amd64: arduinoide 1.8.1
bionic|main|amd64: aulalinex-alumno 4.2-17
bionic|main|amd64: aulalinex-alumno-ltsp 4.2-0
bionic|main|amd64: aulalinex-profesor 4.2-17
bionic|main|amd64: aulalinex-profesor-ltsp 4.2-2
bionic|main|amd64: brother-udev-rule-type1 1.0.0-1
bionic|main|amd64: edu.media.mit.scratch2editor 458.0.1
bionic|main|amd64: epson-inkjet-printer-escpr 1.6.5-1lsb3.2
bionic|main|amd64: ideservice 4.0.4
bionic|main|amd64: imagescan 3.42.2-1epson4ubuntu18.04
bionic|main|amd64: imagescan-plugin-gt-s650 1.0.0-1epson4ubuntu18.04
bionic|main|amd64: imagescan-plugin-networkscan 1.1.1-1epson4ubuntu18.04
bionic|main|amd64: imagescan-plugin-ocr-engine 1.0.0-1epson4ubuntu18.04
bionic|main|amd64: jkiwi 0.9.5
bionic|main|amd64: libdvdcss2 1.2.13-0
bionic|main|amd64: master-pdf-editor 5.0.32
Ya con todo funcionando queda añadirlo a todas las máquinas Ubuntu 18. Eso lo hacemos con una regla puppet como ésta:
class xubuntu18_repositorio {

  file {"/etc/apt/sources.list.d/iesvirgendeguadalupe.list":
     owner=>root, group=>root, mode=>664,
     source=>"puppet:///modules/xubuntu18_repositorio/iesvirgendeguadalupe.list",
     notify => Exec["instalar-certificado-iesvirgendeguadalupe"],
  }

  exec { "instalar-certificado-iesvirgendeguadalupe":
     path => "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
     command => "/usr/bin/wget  -O - http://servidor/html/iesvirgendeguadalupe/iesvirgendeguadalupe.asc | /usr/bin/apt-key add  - ; 
     apt-get update",
     refreshonly => true,
  }
}
Siendo el fichero iesvirgendeguadalupe.list:
deb http://servidor/html/iesvirgendeguadalupe bionic main
Con esto distribuido a todas las máquinas ya podemos instalar cualquier paquete del repositorio de forma rápida con un simple apt-get install "paquete" o una regla puppet.

2. Paquete deb de Foxit PDF Reader.

Foxit PDF es un visor de PDF ligero que es bastante completo y no viene mal tenerlo instalado, junto con evince u okular. Hay determinados PDF generados por Rayuela que solo hemos conseguido imprimirlos bien desde Foxit.

El problema es que hace mucho tiempo que no se distribuyen paquetes .deb, por lo que la instalación se realiza con un fichero ejecutable .run al estilo de Windows. Este método no es automatizable y hay que hacerlo máquina a máquina. Para ahorrarme ese trabajo aburrido he creado un paquete .deb con la última versión.

He descargado FoxitReader.enu.setup.2.4.1.0609(r08f07f8).x64.run de aquí y lo he instalado en mi máquina.

Luego he descargado FoxitReader_1.1.0_i386.deb con:
# wget http://cdn02.foxitsoftware.com/pub/foxit/reader/desktop/linux/1.x/1.1/enu/FoxitReader_1.1.0_i386.deb
Esta es la única versión .deb que hay, la 1.1. Este .deb me servirá de esqueleto para construir uno nuevo conteniendo Foxit 2.4.1. Para ello sigo las instrucciones relatadas en este post antiguo.

Desempaqueto:
dpkg-deb -R FoxitReader_1.1.0_i386.deb foxitreader
Luego en el directorio foxitreader metemos los ejecutables y todo lo que se ha instalado con el .run, editamos los ficheros de controls, postinst y postrm en foxitreader/DEBIAN y reempaquetamos:
# dpkg-deb -b foxitreader FoxitReader_2.4.1_amd64.deb
Con esto ya tenemos el paquete listo para subir a nuestro repositorio creado con reprepro en el punto anterior.

Aquí tenemos el paquete listo para descargar: descarga.

Seguiremos contando cosas de nuestra migración a Ubuntu 18, mucho mas tranquila con el know-how adquirido en la caótica actualización a Ubuntu 14.

miércoles, 20 de junio de 2018

Instalar DRBL en un portátil para clonar mediante multicast imágenes de Ubuntu 18.

En la entrada sobre DRBL anterior contábamos como instalarlo en un portátil con Ubuntu 14 y clonar desde él mediante multicast con un número mínimo de pasos. Ese manual no funciona con las nuevas imágenes clonezilla de Ubuntu 18 que nos han llegado a los centros ya que:

  • Están hechas con un clonezilla mas moderno, concretamente la versión 2.5.5-38-amd64, y los formatos de las imágenes de las particiones no son compatibles.
  • Cambia la forma de configuración de las tarjetas de red.
  • Se hacen preguntas nuevas o distintas durante el proceso de configuración del entorno.

Debido a eso he tenido que reescribir la guía, ajustándola al manejo de nuestras nuevas imágenes de Ubuntu 18. De momento funciona pero habrá que pulir el manual (ya pasó la otra vez puesto que es un proceso bastante engorroso y con muchos flecos), por lo que pueden presentarse problemas. Es dicho caso no dudéis en hacérmelo saber.

La vez anterior cargamos el sistema DRBL sobre un portátil con Ubuntu 14. Esta vez, tras varias pruebas, no ha sido posible usar Ubuntu ya que DRBL sólo da soporte hasta Ubuntu 17.

Por ello me he decantado por usar para el servidor DRBL un Debian Stretch (9.4.0) de este enlace.

Descargo la ISO, la meto en un pendrive con Unetbootin y la instalo en un miniportátil con 250gb de disco duro. Durante la instalación escogemos:
  • Instalación en modo texto, opción "Install".
  • Defino una sola partición conteniendo todo y ocupando el disco completo.
  • Si nos pregunta, decimos que se instale el ssh server, ya que si no luego tendremos que instalarlo a mano.
  • Diremos que no queremos entorno de escritorio. No vamos a usar para nada el entorno gráfico, todo será consola. Incluir el entorno gráfico nos lleva a que se instale wicd o network-manager-gnome y hemos comprobado que al final eso interfiere.

1) Objetivo y hardware.

Objetivo: instalar de forma permanente un sistema de clonación multicast (es decir, que permita clonar muchas máquinas a la vez) basado en DRBL en un portátil, sin tener que usar un sistema live que arranque desde pendrive cada vez que queramos usarlo.

Ventaja: todos los pasos iniciales de la configuración del entorno DRBL solo tendremos que hacerlos una vez: en la instalación. Con DRBL live esto es una secuencia preguntas/respuesta bastante pesada que tienes que hacer con cada nuevo arranque del sistema live. Instalando el DRBL solo se pasa por ahí en la instalación inicial. Adicionalmente, un sistema instalado en disco duro arranca mas rápido que uno live y permite almacenar scripts de ayuda con mas facilidad. Es un ahorro de tiempo y se minimizan las posibilidades de meter la pata en algún paso.

Hardware: partimos de un portátil con Debian 9 instalado. Tiene dos tarjetas de red: wlp1s0 y enp2s0 (wifi y cableada, respectivamente. Es importante tomar nota de como se llaman en tu sistema para luego especificarlas bien). En el pasado usábamos un alias sobre la tarjeta cableada para simular 2 interfaces de red, pero en estos tiempos modernos el nuevo sistema de red ya no permite definir alias.

Usar la wifi como segunda tarjeta de red es un engorro por problemas con los drivers y el firmware, así que crearemos una tarjeta de red virtual y el DRBL picará y nos dejará configurarla. Aclaremos que DRBL necesita dos tarjetas para su configuración pero luego durante el proceso de clonado solamente se usa una de forma efectiva.

Nota importante: en este texto mis tarjetas de red son wlp1s0 y enp2s0. La tarjeta de red virtual que crearemos se llamará tap0. Cuando sigas los pasos en tu portátil usa los nombres que te toquen allí o no funcionará nada.

2) Instalación del software.

Bueno, asumo que ya tenemos nuestro portátil con Debian 9 recién arrancado. Ahora tenemos dos opciones:

  • Seguir configurando todo en modo manual, según los apartados 2 y 3, o
  • Saltar al apartado 4, donde hay un script que realiza muchas tareas de forma automática y/o guiada. De esta manera no tenemos que seguir los apartados 2 y 3.

Si sigues por aquí has decidido hacerlo en modo manual. Lo mas cómodo es conectar a el por ssh desde otro equipo con navegador web para copiar/pegar el código que tenemos por delante. Comprobaciones:

  • Quitamos de sources.list el CD-ROM/ISO, para que las actualizaciones posteriores se hagan por red. El repositorio principal será: "deb http://ftp.es.debian.org/debian stretch main".
  • Verificamos que están los paquetes openssh-server y net-tools. Si no están los instalamos. En el ssh server activar el root login.
  • Si en /etc/network/interfaces la tarjeta de red ethernet aparece con "dhcp" debemos cambiarla a "static" para evitar que coja IP de forma aleatoria cuando estemos clonando.
Vamos a empezar instalando el repositorio y el paquete drbl con sus dependencias. Para hacer esto será obligatorio tener el portátil conectado a la red del centro, claro está:
echo "deb http://free.nchc.org.tw/drbl-core drbl stable" > /etc/apt/sources.list.d/dbrl.list
wget http://drbl.sourceforge.net/GPG-KEY-DRBL
apt-key add GPG-KEY-DRBL
apt-get update
apt-get install -y drbl 

        Leyendo lista de paquetes... Hecho
        Creando árbol de dependencias       
        Leyendo la información de estado... Hecho
        .....
        .....
        .....         
Una vez instalado, vamos a configurar el entorno del servidor con drblsrv.

Empezará una ronda de preguntas insufribles, siendo la regla general esta: contesta siempre la opción por defecto (la que está en mayúsculas).

Es importante tener cuidado y seguir las indicaciones que doy ya que cualquier respuesta incorrecta puede ser fatal. Remarco en negrita la parte donde se hacen las preguntas (son 4 o 5 solamente).
# drblsrv -i

        *****************************************************.
        Sugerencia: cuando una opción sí/no (yes/no) esté disponible, el valor por defecto es la mayúscula, Ej. (y/N), por defecto es "N", cuando pulse "Intro", se usará "N". Si no está seguro de qué opción elegir, presione la tecla "Intro".
        *****************************************************.
        *****************************************************.
        Instalando DRBL para Debian Linux...
        *****************************************************.
        ¿Desea instalar las imágenes de inicio (boot) de red que permitan al cliente instalar alguna distribución GNU/Linux (Debian, Ubuntu, RedHat Linux, Fedora Core, Mandriva, CentOS and OpenSuSE...) a través de la red?  ///NOTA/// Esta acción descargará bastantes archivos (> 100 MB en total) de Internet, por lo que tardará algunos minutos. Si su máquina cliente posee disco duro y es posible instalar GNU/Linux en él, introduzca Y aquí. Si pone "no" aquí, puede ejecutar drbl-netinstall para instalarlos después.
  --->  [y/N] 
        *****************************************************.
        This GNU/Linux distribution uses one kernel to support SMP and non-SMP arch.
        *****************************************************.
        ¿Desea usar la salida de consola serie para los clientes?
        ¡Si NO sabe nada sobre esto, introduzca "N" aquí, sino los clientes mostrarán NOTHING (NADA) en la pantalla!
  --->  [y/N] 
        The CPU arch option for your clients: 2
        La optimización de su sistema está activada, el nivel es el mismo que el del servidor.
        *****************************************************.
        Limpiando la caché de apt para efectuar algunas configuraciones...
        Ign:1 http://ftp.es.debian.org/debian stretch InRelease
        Obj:2 http://ftp.es.debian.org/debian stretch-updates InRelease
        Obj:3 http://ftp.es.debian.org/debian stretch Release                                                      
        Obj:4 http://security.debian.org/debian-security stretch/updates InRelease                                 
        Ign:5 http://free.nchc.org.tw/drbl-core drbl InRelease                           
        Obj:6 http://free.nchc.org.tw/drbl-core drbl Release  
        Leyendo lista de paquetes... Hecho                    
        *****************************************************.
        ¿Desea actualizar su sistema operativo?
  --->  [y/N]  
        *****************************************************.
        2º, instalando los archivos necesarios para DRBL...
        *****************************************************.
        Searching if mkinitrd initscripts lvm2 ntfs-3g genisoimage mkisofs lshw hwinfo aoetools dmidecode lzop lzma xz xz-utils pxz pixz lzip pigz pbzip2 lbzip2 plzip lrzip pv hfsutils hfsprogs dmsetup dmraid kpartx device-mapper tofrodos dos2unix unix2dos dhcp3-server isc-dhcp-server gdisk btrfs-tools ufsutils disktype efibootmgr syslinux-utils tftp-server iptables-services grub-efi-amd64-bin grub-efi-ia32-bin grub2-efi-modules monitoring-plugins-basic nmap dnsmasq available... 
        Package initscripts exists in repository.
        Package lvm2 exists in repository.
        Package ntfs-3g exists in repository.
        Package genisoimage exists in repository.
        Package lshw exists in repository.
        Package hwinfo exists in repository.
        Package aoetools exists in repository.
        Package dmidecode exists in repository.
        Package lzop exists in repository.
        Package lzma exists in repository.
        Package xz-utils exists in repository.
        Package pxz exists in repository.
        Package pixz exists in repository.
        Package lzip exists in repository.
        Package pigz exists in repository.
        Package pbzip2 exists in repository.
        Package lbzip2 exists in repository.
        Package plzip exists in repository.
        Package lrzip exists in repository.
        Package pv exists in repository.
        Package hfsutils exists in repository.
        Package hfsprogs exists in repository.
        Package dmsetup exists in repository.
        Package dmraid exists in repository.
        Package kpartx exists in repository.
        Package tofrodos exists in repository.
        Package dos2unix exists in repository.
        Package isc-dhcp-server exists in repository.
        Package gdisk exists in repository.
        Package btrfs-tools exists in repository.
        Package disktype exists in repository.
        Package efibootmgr exists in repository.
        Package syslinux-utils exists in repository.
        Package grub-efi-amd64-bin exists in repository.
        Package grub-efi-ia32-bin exists in repository.
        Package monitoring-plugins-basic exists in repository.
        Package nmap exists in repository.
        Package dnsmasq exists in repository.
        Leyendo lista de paquetes... Hecho
        Creando árbol de dependencias       
        Leyendo la información de estado... Hecho
        bc ya está en su versión más reciente (1.06.95-9+b3).
        .......
        .......
        1 actualizados, 111 nuevos se instalarán, 0 para eliminar y 0 no actualizados.
        Se necesita descargar 33,1 MB de archivos.
        Se utilizarán 149 MB de espacio de disco adicional después de esta operación.
        Des:1 http://free.nchc.org.tw/drbl-core drbl/stable amd64 drbl-chntpw amd64 20110511-1drbl [425 kB]
        .......
        .......
        http://ftp.es.debian.org/debian stretch/main amd64 tftpd-hpa amd64 5.2+20150808-1+b1 [50,2 kB]
        100% [112 tftpd-hpa 2.651 B/50,2 kB 
        Descargados 33,1 MB en 21s (1.537 kB/s)
        apt-listchanges: Leyendo lista de cambios...
        Extrayendo plantillas para los paquetes: 100%
        Preconfigurando paquetes ...
        Seleccionando el paquete libsigsegv2:amd64 previamente no seleccionado.
        (Leyendo la base de datos ... 112152 ficheros o directorios instalados actualmente.)
        Preparando para desempaquetar .../libsigsegv2_2.10-5_amd64.deb ...
        Desempaquetando libsigsegv2:amd64 (2.10-5) ...
        .......
        .......
        *****************************************************.
        *****************************************************.
        Intentando actualizar algunos paquetes si es necesario...
        *****************************************************.
        En el repositorio ayo, buscando el último  kernel ...
        El último kernel del repositorio ayo es linux-image-4.9.0-6-amd64
        Hay 2 kernels disponibles para los clientes, ¿cual prefiere?
        [1]: kernel 4.9.0-6-amd64 x86_64 (desde este servidor DRBL)
        [2]: linux-image-4.9.0-6-amd64 (desde un repositorio apt)
  --->  [1] 1
        Clients will use the kernel 4.9.0-6-amd64 x86_64 from server.
        Instalar este kernel llevará varios minutos, por favor sea paciente...
        hecho!
        *****************************************************.
        Instalar kernel para los clientes... ...
        En el repositorio ayo, buscando el último kernel ...
        *****************************************************.
        Now run: drblsrv-offline -c -d -a -l es_ES.UTF-8 -s 4.9.0-6-amd64 "" ""
        Using kernel from this server for client...
        *****************************************************.
        Número de versión de su S.O.: Debian 9.4
        *****************************************************.
        *****************************************************.
        Instalar kernel para los clientes... ... 
        The kernel for client is copied from server.
        Installing kernel 4.9.0-6-amd64 for clients... 
        Instalar este kernel llevará varios minutos, por favor sea paciente......hecho!
        Generating modules.dep and map files for clients... done!
        Preparing the kernel firmware for clients...
        Found /boot/memtest86+.bin in this system, copying the memtest file to DRBL local repository...
        Putting memtest86+ in DRBL package repository /usr/share/drbl/pkg/memtest86+/... 
        Memtest86+ version: 
        done!
        Found /usr/lib/PXELINUX/pxelinux.0 in this system:
        PXELinux version: PXELINUX 6.03 PXE 20171018 
        Copying the PXELinux files to DRBL local repository...
        Putting required pxelinux files to /usr/share/drbl/pkg/syslinux//bios/... done!
        Putting required pxelinux files to /usr/share/drbl/pkg/syslinux//bios/... done!
        Putting required pxelinux files to /usr/share/drbl/pkg/syslinux//efi32/... done!
        Putting required pxelinux files to /usr/share/drbl/pkg/syslinux//efi64/... done!
        *****************************************************.
        Creando archivo de configuración para clientes PXE...
        Copying pxelinux.0, gpxelinux.0, menu.c32, vesamenu.c32, chain.c32, mboot.c32, sanboot.c32 and memdisk to /tftpboot/nbi_img...
        Copying memtest86+ to /tftpboot/nbi_img...
        Copying FreeDOS files to /tftpboot/nbi_img/... 
        Generating default pxelinux config (/tftpboot/nbi_img/pxelinux.cfg/default)...
        Use com32 module: vesamenu.c32
        Adding menus for DRBL, local boot, memtest86+, FreeDOS...
        done!
        Removing the old /tftpboot/nbi_img/grub-efi.cfg if it exists...
        Preparing background img and font...
        '/usr/share/grub/unicode.pf2' -> '/tftpboot/nbi_img/unicode.pf2'
        '/usr/share/drbl/image/drblwp.png' -> '/tftpboot/nbi_img/drblwp.png'
        Generating default GRUB network boot config (/tftpboot/nbi_img/grub-efi.cfg/grub.cfg)...
        Adding GRUB EFI boot menu for DRBL, Clonezilla...
        done!
        System architecture is 64-bit.
        Creating the uEFI network booting bootable image /tftpboot/nbi_img/bootia32.efi...
        Creating the uEFI network booting bootable image /tftpboot/nbi_img/bootx64.efi...
        Preparing the grub modules in /tftpboot/nbi_img/grub-efi.cfg...
        The uEFI network booting is ready.
        *****************************************************.
        *****************************************************.
        Creando los archivos de imagen para PXE y el cliente Etherboot, puede durar unos minutos...
        El último kernel para clientes DRBL es 4.9.0-6-amd64
        Running mknic-nbi --kernel 4.9.0-6-amd64 --all --no-modules
        Will client check DHCP server name is "drbl" or not: yes
        The maximum times to try to get IP address for a client: 5
        The pause time after network card is up: 0
        The timeout to wait for network card linked (Unit: 0.1 secs): 70
        The NFS protocol for DRBL system: nfs3
        Setting port for udhcpc request to default...
        Using the kernel modules from /tftpboot/node_root//lib/modules...
        The selected kernel for DRBL clients is: 4.9.0-6-amd64
        Kernel 2.6 or 3 was found, so default to use initramfs.
        Creating the network boot initrd for PXE clients by: mkpxeinitrd-net -k 4.9.0-6-amd64 -t initramfs   -nf 
        Use kernel modules from /tftpboot/node_root//lib/modules/4.9.0-6-amd64.
        Trying to include network card firmwares if they exist in /tftpboot/node_root//lib/firmware/...
        Calling hook udev...
        Creating the initRAMFS image...
        Initramfs, remove ramdisk_size/ramdisk_block in /tftpboot/nbi_img/pxelinux.cfg/default if exists...
        Finished!
        Hecho!
        *****************************************************.
        Hecho!
Ya se han descargado los paquetes necesarios para hacer funcionar el tinglado. Vamos al siguiente paso.

3) Configuración del entorno DRBL:

Veamos la configuración de las tarjetas de red en el portátil. Debe ser algo así como:
# ifconfig
        enp2s0: flags=4163  mtu 1500
                inet 192.168.0.203  netmask 255.255.255.0  broadcast 192.168.0.255
                inet6 fe80::223:81ff:fe13:e582  prefixlen 64  scopeid 0x20
                ether 00:23:81:13:e5:82  txqueuelen 1000  (Ethernet)
                RX packets 32778  bytes 43022297 (41.0 MiB)
                RX errors 0  dropped 0  overruns 0  frame 0
                TX packets 17674  bytes 1527994 (1.4 MiB)
                TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

        lo: flags=73  mtu 65536
                inet 127.0.0.1  netmask 255.0.0.0
                inet6 ::1  prefixlen 128  scopeid 0x10
                loop  txqueuelen 1  (Local Loopback)
                RX packets 23  bytes 708 (708.0 B)
                RX errors 0  dropped 0  overruns 0  frame 0
                TX packets 23  bytes 708 (708.0 B)
                TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

        wlp1s0: flags=4099  mtu 1500
                ether 74:2f:68:94:45:67  txqueuelen 1000  (Ethernet)
                RX packets 0  bytes 0 (0.0 B)
                RX errors 0  dropped 0  overruns 0  frame 0
                TX packets 0  bytes 0 (0.0 B)
                TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
Puede que la tarjeta wifi no te aparezca por problemas de drivers, no importa. Como dijimos vamos a crear una tarjeta de red virtual llamada "tap0".

El esquema de la red que debemos dejar preparado para configurar y clonar será:
        +-- [tap0] 192.168.1.1 +- a WAN, aunque realmente no va a ningún lado ya que no se usa
        +-- [enp2s0] 192.168.100.254 +- al grupo de clientes, 20 con ip 192.168.100.200 - 192.168.100.219
Reitero que sólo enp2s0 se usa en la clonación, la otra tarjeta se usa durante la configuración pero luego queda ociosa. La puñeta es que aun así debe estar ahí.

Para configurar el entorno de clonación usamos el programa dbrlpush. Usado por defecto (dbrlpush -i) hace muchas preguntas y guarda el resultado en /etc/drbl/dbrlpush.conf. Nosotros no lo haremos así.

Si partimos de un fichero /etc/drbl/dbrlpush.conf ya creado podremos cargar casi toda la configuración desde él. De esta manera el número de preguntas es bastante inferior. Ahí va un /etc/drbl/dbrlpush.conf creado a mano listo para meter en nuestros sistemas, copialo tal cual adaptando lo que comento luego:
# cat /etc/drbl/drblpush.conf 
#Setup for general
[general]
domain=drbl.org
nisdomain=penguinzilla
localswapfile=yes
client_init=graphic
login_gdm_opt=login
timed_login_time=
maxswapsize=128
ocs_img_repo_dir=/home/partimag
total_client_no=20
create_account=
account_passwd_length=8
hostname=linex-
purge_client=no
client_autologin_passwd=
client_root_passwd=
client_pxelinux_passwd=
set_client_system_select=yes
use_graphic_pxelinux_menu=yes
set_DBN_client_audio_plugdev=yes
open_thin_client_option=no
client_system_boot_timeout=70
language=es_ES.UTF-8
set_client_public_ip_opt=no
config_file=drblpush.conf
collect_mac=no
run_drbl_ocs_live_prep=yes
drbl_ocs_live_server=
clonezilla_mode=full_clonezilla_mode
live_client_branch=alternative
live_client_cpu_mode=i386
drbl_mode=full_drbl_mode
drbl_server_as_NAT_server=yes
add_start_drbl_services_after_cfg=yes
continue_with_one_port=

#Setup for enp2s0
[enp2s0]
interface=enp2s0
range=200-219
Del fichero anterior cada cual debe ajustar sólo la parte en negrita:

  • total_client_no: número máximo de equipos a clonar a la vez, yo como máximo lo haré de 20 en 20.
  • enp2s0 habría que cambiarlo por el nombre de tu tarjeta de red ethernet.
  • range=200-219 es el rango de IP que reciben los 20 clientes al clonar (pon el rango que quieras o déjalo así, a tu gusto).

Una vez puesto el fichero anterior en su sitio, desconectamos el portátil de la red del centro y lanzamos la configuración del entorno con estos 7 comandos:
# ifconfig wlp1s0 down #Si no tenemos la tarjeta wifi a "up" este comando no sería necesario.
# ip tuntap add name tap0 mode tap
# ifconfig tap0 up
# ifconfig tap0 192.168.1.1 netmask 255.255.255.0
# ifconfig enp2s0 up
# ifconfig enp2s0 192.168.100.254 netmask 255.255.255.0
# drblpush -c /etc/drbl/drblpush.conf
        *****************************************************
        *****************************************************
        *****      MENSAJES VARIOS DE INSTALACION
        *****      SELECCIONA RESPUESTAS POR DEFECTO
        *****************************************************
        *****************************************************
        Enjoy DRBL!!!
        http://drbl.org; http://drbl.nchc.org.tw
        NCHC Free Software Labs, Taiwan. http://free.nchc.org.tw
        *****************************************************.
        Si lo desea, puede reiniciar el servidor DRBL ahora para asegurarse de que todo está listo...(No es necesario, es opcional.).
        *****************************************************.
        ¡El servidor DRBL está preparado! Ahora configure las máquinas cliente para iniciar desde PXE (visite http://drbl.org para mas detalles).
        PS. El archivo de configuración se ha salvado como /etc/drbl/drblpush.conf. De todas formas si quiere ejecutar drblpush con la misma configuración otra vez, debe ejecutarlo como: drblpush -c /etc/drbl/drblpush.conf

Como siempre, ante cualquier pregunta que nos haga contestamos con la opción por defecto. Pasado un rato tendrá creado y configurado todo el entorno para la clonación multicast.

Si drblpush falla con un mensaje como "Error: Error! NFSSERVER is unset! Please set nfsserver in config file "drblpush.conf" or IPADDR in system config file" es posible que no hayamos modificado la parte:
#Setup for enp2s0
[enp2s0]
interface=enp2s0
range=200-219
de drblpush.conf para poner el nombre real de nuestra tarjeta de red. Revisa y corrígelo si hace falta.

Si eso está correcto y el error "NFSSERVER" persiste nos ha funcionado reiniciar el portátil y volver a ejecutar los 7 comandos anteriores.

Si aún así sigue fallando el drblpush deberíamos probar a ejecutarlo a mano con "drblpush -i" y que el genere el drblpush.conf a su gusto. En ese caso es inevitable que nos haga todas las preguntas de rigor.

Ahora ya debería estar todo listo. Pero no, hemos tenido un problemilla: al clonar las imágenes que nos han mandado ha fallado el proceso dando un error de versión de partclone.

Resulta que DRBL instala partclone 0.2.91, pero las imágenes que nos han mandado necesitan la 0.3.11 (están hechas con clonezilla 2.5.5-38-amd64). No hay problema: arranco un clonezilla live y extraigo con dpkg-repack el paquete partclone_0.3.11-drbl4_amd64.deb (tu puedes descargarlo de aquí) y lo he copiado e instalado en nuestro portátil (cruzando los dedos por si daba problemas de dependencias...no los ha dado):
dpkg -i partclone_0.3.11-drbl4_amd64.deb
Con este partclone instalado en nuestro servidor DRBL ya si que se aceptarán las imágenes nuevas que nos han mandado.

4) Atajo rápido.

Dicen en El Señor de los Anillos que "Los atajos cortos traen retrasos largos", esperemos que se equivoquen en este apartado.

Ponemos un script install-drbl.sh que se supone hace lo mismo que los dos apartados anteriores, pero de forma semiautómatica de manera que minimizamos la posibilidad de error. Simplemente hay que ejecutarlo y seguir todos los pasos que te va diciendo, leyendo cuidadosamente todos los mensajes.
#!/bin/bash

if [ $# -ne 2 ]
  then
    echo "Uso: $0  "
    echo "Ejemplo: $0 enp2s0 wlp1s0"
    echo "                       Si no tiene ifconfig instale net-tools y haga 'ifconfig -a'"
    exit 1
fi

echo "Instalando  partclone_0.3.11-drbl4_amd64.deb"
if [ -f  partclone_0.3.11-drbl4_amd64.deb ]
then
   dpkg -i  partclone_0.3.11-drbl4_amd64.deb 
else
   echo "No encontrado partclone_0.3.11-drbl4_amd64.deb"
   echo "Descargalo de https://drive.google.com/open?id=1FELuo9bw8ZzPWqnjhWS8dJG53VTA-2-T y ponlo en el mismo directorio"
   exit 1
fi

ethernet=$1
wifi=$2

echo "ASEGURATE DE TENER CONEXIÓN A INTERNET con el portátil durante los siguientes pasos. Si no la tienes fallará y tendras que conectarte y empezar de nuevo"
echo "Asegurate de tener 'deb http://ftp.es.debian.org/debian stretch main' en /etc/apt/sources.list"
echo "Asegurate de comentar  'deb cdrom:[Debian GNU....' en /etc/apt/sources.list"

read -p "Pulsa enter para continuar."

echo "============================================================================================================================="
echo "Vamos a quitar todo el entorno de escritorio y las X, no son necesarios."
echo "Vamos a instalar y configurar algunos paquetes para la red"
read -p "Pulsa enter para comenzar."

export DEBIAN_FRONTEND=noninteractive

service lightdm stop
apt-get remove --purge --yes --force-yes  wicd lxde lightdm xorg
apt-get  --yes --force-yes autoremove
apt-get install  --yes openssh-server net-tools
sed -i "s/.*PermitRootLogin.*/PermitRootLogin yes/g" /etc/ssh/sshd_config
sed -i.bak "s/dhcp/static/g" /etc/network/interfaces
service sshd restart

echo "============================================================================================================================="
echo "Añadiendo repositorios y paquete drbl."
read -p "Pulsa enter para comenzar."

echo "deb http://free.nchc.org.tw/drbl-core drbl stable" > /etc/apt/sources.list.d/dbrl.list
wget http://drbl.sourceforge.net/GPG-KEY-DRBL
apt-key add GPG-KEY-DRBL
apt-get update
apt-get install -y drbl

echo "============================================================================================================================="
echo "Vamos a instalar el software de drblsrv -i. Se harán 4 preguntas, pulsa Enter en todas ellas para coger la opción por defecto"
read -p "Pulsa enter para comenzar."

drblsrv -i

echo "============================================================================================================================="
echo "Vamos a configurar el software con dbrlpush. Se harán varias preguntas, pulsa Enter en todas ellas para coger la opción por defecto"
echo "Durante este paso se configuran las tarjetas de red y  SE PIERDE LA CONEXION con la red del centro. Si tuvieras que empezar de nuevo reinicia el portatil"
echo "La configuración es para clonar un máximo de 20 clientes. Si deseas mas edita en el script las lineas:"
echo "   total_client_no=20"
echo "   range=200-219"
read -p "Pulsa enter para comenzar."



ifconfig $wifi down
ip tuntap add name tap0 mode tap
ifconfig tap0 up
ifconfig tap0 192.168.1.1 netmask 255.255.255.0
ifconfig $ethernet up
ifconfig $ethernet 192.168.100.254 netmask 255.255.255.0

cat <<END >/etc/drbl/drblpush.conf
#Setup for general
[general]
domain=drbl.org
nisdomain=penguinzilla
localswapfile=yes
client_init=graphic
login_gdm_opt=login
timed_login_time=
maxswapsize=128
ocs_img_repo_dir=/home/partimag
total_client_no=20
create_account=
account_passwd_length=8
hostname=linex-
purge_client=no
client_autologin_passwd=
client_root_passwd=
client_pxelinux_passwd=
set_client_system_select=yes
use_graphic_pxelinux_menu=yes
set_DBN_client_audio_plugdev=yes
open_thin_client_option=no
client_system_boot_timeout=70
language=es_ES.UTF-8
set_client_public_ip_opt=no
config_file=drblpush.conf
collect_mac=no
run_drbl_ocs_live_prep=yes
drbl_ocs_live_server=
clonezilla_mode=full_clonezilla_mode
live_client_branch=alternative
live_client_cpu_mode=i386
drbl_mode=full_drbl_mode
drbl_server_as_NAT_server=yes
add_start_drbl_services_after_cfg=yes
continue_with_one_port=

#Setup for $ethernet
[$ethernet]
interface=$ethernet
range=200-219
END

drblpush -c /etc/drbl/drblpush.conf

echo "============================================================================================================================="
echo "Terminada configuración. Vamos a crear los scripts de clonacion."
read -p "Pulsa enter para comenzar."

cat <<END >/root/lanza-clonacion.sh
#!/bin/bash
service network-manager stop
ifconfig $wifi down
ip tuntap add name tap0 mode tap
ifconfig tap0 up ifconfig tap0 192.168.1.1 netmask 255.255.255.0
ifconfig $ethernet up
ifconfig $ethernet 192.168.100.254 netmask 255.255.255.0
/usr/sbin/dcs
#Reiniciamos todos los servicios:
/usr/sbin/drbl-all-service restart 
echo "Listo: sistema preparado para enviar la imagen por multicast. Enciende los clientes a clonar seleccionando el arranque PXE...."
exit 0
END

chmod +x /root/lanza-clonacion.sh

cat <<END >/root/lanza-clonacion-imagen.sh
#!/bin/bash
num_clientes="10"
imagen="notebookHPFull-14-06-2018"
service network-manager stop
ifconfig $wifi down
ip tuntap add name tap0 mode tap
ifconfig tap0 up ifconfig tap0 192.168.1.1 netmask 255.255.255.0
ifconfig $ethernet up
ifconfig $ethernet 192.168.100.254 netmask 255.255.255.0
drbl-ocs -b -g auto -e1 auto -e2 -r -x -j2 -sc0 -p poweroff --clients-to-wait $num_clientes --max-time-to-wait 300 -l es_ES.UTF-8 startdisk multicast_restore $imagen sda
#Reiniciamos todos los servicios:
/usr/sbin/drbl-all-service restart 
echo "Listo: sistema preparado para enviar la imagen por multicast. Enciende los clientes a clonar seleccionando el arranque PXE...."
exit 0
END

chmod +x /root/lanza-clonacion-imagen.sh

mkdir -p /home/partimag

echo "==============================================================================================================================================="
echo "Creados scripts /root/lanza-clonacion.sh y /root/lanza-clonacion-imagen.sh, revisalos para tu verificar que están conforme a tu configuración."
echo ""
echo "Copia a /home/partimag las imágenes, concecta todo al switch, reinicia y ejecuta lanzar-clonacion.sh"
echo "Suerte!!!"

5) Lanzar la clonación.

Bueno, pues ya tenemos todo configurado en nuestro portátil y nunca más vamos a pasar todo lo anterior.

Ahora habría que copiar a /home/partimag los directorios con las imágenes clonezilla correspondientes, meter en /root los 2 scripts que pongo a continuación y cuando queramos lanzar una clonación con DRBL seguimos estos pasos:
  1. Encendemos el portátil. Si tuviéramos X, no iniciamos sesión en el escritorio ya que eso puede arrancar servicios como Network Manager o Wicd que interfieran en la configuración de red.
  2. Lo conectamos a un switch que permita multicast (cuanto mas sencillo sea el switch mejor).
  3. Conectamos al switch los ordenadores a clonar preparados para arrancar por PXE.
  4. Ejecutamos uno de los scripts que indico mas abajo. Cuando acabe nos dirá que ya está todo preparado.
  5. Arrancamos los portátiles que vamos a clonar seleccionando arranque PXE y nos vamos a otra cosa

El script básico que probaremos en primer lugar es:
# cat /root/lanza-clonacion.sh
#!/bin/bash
service network-manager stop
ifconfig wlp1s0 down #Si no tenemos la tarjeta wifi a "up" este comando no sería necesario.
ip tuntap add name tap0 mode tap
ifconfig tap0 up
ifconfig tap0 192.168.1.1 netmask 255.255.255.0
ifconfig enp2s0 up
ifconfig enp2s0 192.168.100.254 netmask 255.255.255.0
/usr/sbin/dcs
#Reiniciamos todos los servicios:
/usr/sbin/drbl-all-service restart 
echo "Listo: sistema preparado para enviar la imagen por multicast. Enciende los clientes a clonar seleccionando el arranque PXE...."
exit 0
Este script nos hará unas preguntillas: tipo de restauración, disco donde restaurar, imagen a restaurar, número de clientes, tiempo de espera, etc, y lanzará el proceso que quedará a la espera de arrancar los clientes por PXE y dejar que se cargue la imagen automáticamente.

En el apartado 4 de la entrada del blog previa a ésta vienen capturas de pantalla de todo el proceso de preguntas y las respuestas correctas, síguela si no sabes que responder. En plan telegrama sería: All/Clonezilla Start/Restore Disk/No comprobar Imagen/Reboot/Elegir imagen/Elegir disco/Multicast/Clients-Time-To-Wait/Nº de clientes a clonar y Tiempo de espera(300 segundos suele estar bien). Luego seria solo esperar a que haga sus cosas y vuelva al prompt diciendo que ya puedes arrancar los clientes para clonarlos.

Aquí un ejemplo de una clonación de 5 en paralelo:


Cuando veamos que funciona podemos ahorrarnos la ristra de preguntas anteriores adaptando en su lugar el siguiente script, donde decimos que se cargue la imagen notebookHPFull-14-06-2018 (sacada de /home/partimag/notebookHPFull-14-06-2018) en el disco sda de 10 clientes, esperando 300 segundos a que estén todos arrancados para iniciar el multicast y apagándolos luego.

El comando drbl-ocs que pongo y sus parámetros son mostrados en pantalla al acabar la ejecución del script anterior (es una salida de /usr/bin/dcs que nos invita a utilizar dbrl-ocs para agilizar el proceso en futuras clonaciones):
# cat /root/lanza-clonacion-imagen-portatiles.sh
#!/bin/bash
service network-manager stop
ifconfig wlp1s0 down #Si no tenemos la tarjeta wifi a "up" este comando no sería necesario.
ip tuntap add name tap0 mode tap
ifconfig tap0 up
ifconfig tap0 192.168.1.1 netmask 255.255.255.0
ifconfig enp2s0 up
ifconfig enp2s0 192.168.100.254 netmask 255.255.255.0
drbl-ocs -b -g auto -e1 auto -e2 -r -x -j2 -sc0 -p poweroff --clients-to-wait 10 --max-time-to-wait 300 -l es_ES.UTF-8 startdisk multicast_restore notebookHPFull-14-06-2018 sda
#Reiniciamos todos los servicios:
/usr/sbin/drbl-all-service restart 
echo "Listo: sistema preparado para enviar la imagen por multicast. Enciende los clientes a clonar seleccionando el arranque PXE...."
exit 0
Con este script nos ahorramos incluso las preguntas: conectamos, arrancamos, ejecutamos el script, arrancamos los clientes y nos vamos a hacer otras cosas mientras se clonan en paralelo.

Y ya está, como haría Atlas con la batería al 100%, vayamos corriendo a clonar: