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

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:




viernes, 15 de junio de 2018

Ubuntu 2018: postconfiguracion de thinclients en sistemas LTSP

Ya estamos preparando el salto a Ubuntu 18, motivo por el cual estoy atareado como gato en matanza y escribo poco por aquí. En nuestros planes esta seguir con las aulas de thinclient usando como clientes ordenadores de hace 13 años.

Me llena de orgullo y satisfacción verlos ejecutando Libreoffice 6 y Firefox 60 con fluidez mientras los miniportátiles comprados años después echan el bofe abriendo páginas de diarios regionales. Ahí va un video un Fujitsu P300 con 1Gb de RAM, un procesador Pentium IV y una tarjeta gráfica que da vergüenza ajena:



Debido a problemas con la tarjeta de red de los Fujitsu P300 hemos mantenido congelado el kernel de la serie 3.X con un driver retocado que soporta el encendido remoto mediante WOL. Mi compañero Francis se ha ocupado de integrar el entorno de soporte de los thinclients en Ubuntu 18 y ha estimado con muy buen criterio que no es necesario actualizar la versión de la imagen y es mejor quedarla en Ubuntu 14.

A fin de cuentas el único propósito existencial de la imagen de thinclients es levantar una conexión gráfica remota con el servidor de aula, que si corre Ubuntu 18, por lo que una vez inicia sesión el alumno todo funciona en ese entorno y el Ubuntu 14 queda oculto entre bambalinas.

Después de configurar el entorno LTSP como mandan los cánones siempre tenemos unos cuantos problemillas de ajustes que de una vez para otra se repiten y hay que tirar de nuestra memoria para solucionarlos. Estos cambios ya están integrados en la imagen que nos van a distribuir de Ubuntu 18 para LTSP, pero ahora voy a dejarlo anotado como chuleta para cuando pasemos a Ubuntu 22 y nuestros Fujitsu P300 sigan dando el callo junto con la Curiosity en Marte.

  • resolv.conf: los thinclients en ejecución deben tener el resolv.conf de nuestro centro, para poder conectar con otras máquinas si es necesario. Esto se hace poniendo el nameserver/domain del resolv.conf que queremos en la ruta /opt/ltsp/i386/etc/resolvconf/resolv.conf.d/original y regenerando la imagen del cliente con ltsp-update-image.
  • avahi: los clientes se anuncian a si mismos en la red del aula con el nombre "$HOSTNAME.local". De esta forma es fácil identificarlos y acceder a ellos sin averiguar su IP. Para que se anuncien es necesario que avahi esté activado en la imagen de los thinclients, pero por defecto este servicio está parado debido a que está en la lista negra de /usr/share/ltsp/init-ltsp.d/50-rm-system-services. Si quitamos avahi-daemon de ese fichero y regeneramos la imagen del cliente ya funcionará.
  • autenticación en thinclients: cuando hacemos alguna variación en el LTSP (cambio de nombre, clonado, etc) los alumnos no pueden iniciar sesión en los thinclients, dando error de credenciales. En apariencia todo esta bien (configuracion de pam, nsswitch, etc). La causa real es que entre servidor y thinclients se hace una conexión SSH y hay que regenerar esas claves usando "ltsp-update-sshkeys" y reconstruyendo luego la imagen.

Cuando haga la instalación del entorno LTSP en las Siatic subiré una guía. Nos vemos.

jueves, 14 de junio de 2018

Android: entrar y manejar el recovery de un tablet sin usar las teclas de volumen.

Me ha llegado una tablet Android baratuna moribunda de Hogarium que se queda en la pantalla de inicio sin cargar el sistema. Lo normal en esos casos es arrancar pulsando la teclas Power+Vol Down o Up, con lo que entramos en el recoverý de Android y allí hacemos un Factory Reset. Pero en esta tablet se resistía: después de dejarme los dedos cadavéricos apretando no había manera de entrar en el menú de recovery.

Bueno, no hay nada que no se pueda hacer con una buena línea de comandos. Así que enchufé la tablet a mi Manjaro Linux y tecleé:
# adb devices
....
# adb shell
Bien... me dejaba conectar con el adb del Android y entrar en el shell para ejecutar comandos. La tablet no estaba tan muerta como parecía. Ahora pongo:
 # adb reboot recovery
Y reiniciamos el sistema entrando en el recovery.


Ahora solo tengo que moverme con las teclas de volumen y hacer un "Wipe data/factory reset" y "Wipe cache" para restaurar la tablet a fábrica y ver si funciona. Horror, compruebo que siguen sin funcionar la teclas de volumen. En este punto solo hay dos explicaciones: o esas teclas están averiadas (lo cual, como a Rajoy, no me consta) o bien el firmware de la tablet es tan cutre que no trae el driver para manejarlas hasta que no se ha cargado el sistema.

¿Qué hago?: al conector USB micro del tablet (el típico de carga de los móviles) conecto un cable OTG


y a éste un teclado USB. Entro de nuevo en el recovery et voilá... puedo moverme por el menú con las teclas subir/bajar y ejecutar las acciones con Enter. Ya si puedo hacer un Factory Reset y de la Caché. Minutos después tenemos la tablet arrancada ejecutando el asistente de configuración de Android. Otro aparato salvado de la quema.

Por cierto, una vez arrancado el Android completo las teclas de volumen si funcionan :-D.