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

viernes, 10 de octubre de 2014

Sistema de clonado remoto (parte 1 de 3)

Muchas veces tengo que clonar un equipo con Clonezilla o simplemente ejecutar un fsck a uno de sus discos corruptos desde un SystemRescueCD y no encuentro el momento en que esté el aula libre para hacerlo tranquilamente. También sucede a veces que el equipo está en otro edificio y tengo que desplazarme hasta allí para realizar todo el proceso, perdiendo más tiempo entre paseos y esperas de lo que tardo luego en hacerlo. Lo ideal sería poder realizarlo desde mi puesto, mientras tengo otras ventanas abiertas y voy trabajando a la vez en varias cosas. Vamos a ver como conseguirlo.
 
Una forma sencilla de hacerlo sería tener un IPKVM  por equipo. El problema es que cuestan 600 euros o más y nosotros somos un país en quiebra, así que vamos a desechar esta idea. Nuestro reto es hacer que, sin presencia física, un equipo dentro de una red accesible por nosotros se encienda y arranque un SystemRescueCD-Clonezilla perfectamente funcional e independiente del sistema que tenga el PC en el disco duro, al que podremos conectarnos por ssh para realizar nuestra intervención.
 
 
La técnica que usaremos será un arranque por PXE: dicho tipo de arranque nos permite arrancar un PC y cargar en él un sistema operativo por red, independientemente del estado del sistema que tenga en su disco duro. Un entorno PXE se compone de dos partes: un PC cliente, que será donde cargaremos el sistema operativo, y un PC servidor (es decir, en la red donde esté el equipo que queramos clonar debe haber un servidor que sea configurable por nosotros) , con todas las utilidades necesarias configuradas para servir el sistema operativo por red a quien se lo pida.
 
En lo que respecta al PC cliente, el equipo simplemente debe tener el arranque por red activo (lo que se conoce como arranque PXE o netboot) y como mas prioritario en la BIOS. Todos los equipos modernos tienen dicho arranque y para los antiguos hay soluciones como usar Grub o un CD que contenga arranque PXE en su menú de inicio (por ejemplo, el CD de Clonezilla trae uno y hay herramientas para crear discos y CD PXE ad-hoc).
 
En lo que respecta al PC servidor, debemos tener un servicio TFTP y un servicio DHCP. Vamos a explicar como configurarlos.
 
1. Servicio TFTP: en este servidor se servirá mediante el protocolo TFTP el software básico para el arranque, el menú de opciones a mostrar al usuario (definido en un formato similar al del menú de syslinux.cfg) y los kernel e initrd necesarios para el arranque de los distintos sistemas ofertados en el menú.
 
En mi caso, el servidor TFTP está en un servidor distinto al servidor DHCP ya que es una máquina donde tengo un poco de todo, pero nada impide que estén ambos en el mismo servidor. Instalamos el paquete tftpd-hpa y lo configuramos editando el fichero /etc/default/tftpd-hpa para que tenga el siguiente contenido:
RUN_DAEMON="yes"
OPTIONS="-l -s /var/lib/tftpboot"

Ahora arrancamos el servicio tftp con:

sudo /etc/init.d/tftpd-hpa start

Comprobamos que está funcionando con:

netstat -lu

Que debe mostrar, entre otras, una línea como:

udp        0      0 *:tftp                  *:*

2. Servicio DHCP. Este servicio, encargado de dar las IP a los equipos que la soliciten durante su arranque, puede guardar su configuración en local o bien en un árbol ldap,  que es como lo tenemos en los centros educativos de Extremadura.
 
Además de su funcionamiento usual, que es dar una IP, una máscara de red y una puerta de enlace a quien lo solicite, este servicio DHCP dará también un next-server (la ip del PC que contiene el servidor TFTP) y una ruta al fichero de arranque dentro del TFTP, que serán usados para el arranque PXE. Si un equipo no está arrancando por PXE estos 2 últimos parámetros serán ignorados después de recibirlos tras la petición DHCP que haga para configurar su red.
 
El servicio que usamos  es isc-dhcp-server, que tiene esta configuración:
cat /etc/default/isc-dhcp-server
# Defaults for dhcp initscript
# sourced by /etc/init.d/dhcp
# installed at /etc/default/isc-dhcp-server by the maintainer scripts

#
# This is a POSIX shell fragment
#

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#    Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACES=""
<&nbsp>
root@servidor:/etc# cat /etc/dhcp/dhcpd.conf
ldap-server "ldap";
ldap-port 389;
ldap-base-dn  "dc=instituto,dc=extremadura,dc=es";
ldap-dhcp-server-cn "ldap";
ldap-method dynamic;
ddns-update-style none;

Como vemos, la configuracion de dhcpd.conf apunta a un servidor ldap, ya que la tengo allí guardada siguiendo las directrices de DebianEdu.

En el servidor ldap hay que indicarle los parámetros necesarios para los arranques PXE, mediante phpldapadmin vamos al nodo DHCPConfig->Internal->group1 y añadimos estos atributos:

dhcpStatements
    next-server <ip-o-nombre-servidor-tftp>
    filename "pxelinux.0"

He aquí una captura de pantalla de como queda el nodo:

Nota: tal donde está definido en la imagen anterior, el servicio TFTP sólo funcionará con equipos cuya configuración de red esté definida en la rama DHCPConfig->Internal->group1 (en nuestro caso, equipos que tienen IP fija en la red del centro). Si queremos que afecte a otro grupo de equipos habría que crear el atributo en la correspondiente rama.

Si no queremos o no necesitamos empantanarnos montando un servidor ldap para guardar la configuracion DHCP, podemos optar por la solución mas simple de configurarlo todo en ficheros locales, añadiendo a /etc/dhcp/dhcpd.conf:
# TFPT server for PXE boot
next-server <ip-o-nombre-servidor-tftp>;
filename "pxelinux.0";

que quedaría, por ejemplo, así:

option domain-name-servers 62.31.64.39, 62.31.112.39;
default-lease-time 86400;
max-lease-time 604800;
authoritative;

subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.70 192.168.1.100;
filename "pxelinux.0";
next-server 192.168.1.50;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
option routers 192.168.1.1;
}

3. Configuración del entorno PXE. En /var/lib/tftpboot (si no existe, lo creamos previamente) pondremos los ficheros y directorios necesarios para el arranque por PXE. Los mínimos son:

├── bg.png
├── chain.c32
├── disks
│   └── memdisk
├── menu.c32
├── pxelinux.0
├── pxelinux.cfg
│   └── default
└── vesamenu.c32

De estos ficheros, chain.c32, menu.c32, vesamenu.c32, memdisk y pxelinux.0 se obtienen del paquete syslinux-common, concretamente del directorio /usr/lib/syslinux/ creado durante su instalación. Todos estos ficheros contienen los programas básicos para mostrar un menú y arrancar diversos sistemas operativos por red. El fichero bg.png es simplemente un fondo para el menú de arranque de 640x480 pixels, podemos usar cualquiera que queramos.

El fichero pxelinux.cfg/default es la definición menú de arranque en si mismo. Por tanto, creamos los directorios, ponemos cada fichero en su sitio y creamos el fichero pxelinux.cfg/default con este contenido:

DEFAULT vesamenu.c32
PROMPT 0
TIMEOUT 100
TOTALTIMEOUT 3000
ONTIMEOUT bootfromdisk
#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$14DzWOrr$SPjIdHevOHioR7MQ7IzAj/
MENU PASSPROMPT Introduzca Password:
MENU BACKGROUND bg.png
MENU COLOR TITLE    1;36;44     #c00090f0 #00000000 std

NOESCAPE 1
ALLOWOPTIONS 0

LABEL bootfromdisk
MENU DEFAULT
MENU LABEL Arranque desde Disco duro
localboot 0
MENU BEGIN
   MENU TITLE Herramientas Sysadmin
   MENU PASSWD
   LABEL freedos
   MENU LABEL Freedos (con memtest)
      kernel disks/memdisk
      append initrd=disks/freedos.img floppy keeppxe
   LABEL anterior
   MENU LABEL Volver
      MENU EXIT
MENU END

El fichero tiene el aspecto de un menú syslinux.cfg que se usa frecuentemente en los disquetes y CD de arranque de Linux, donde se define la estética del menú, el timeout para seleccionar una opción, la opción por defecto, una contraseña para acceder a determinadas opciones de acceso restringido(generada con /usr/bin/md5pass, programa que se instala con el paquete syslinux) y las opciones en si mismas.

Nuestro menú quedará:

├── Arranque desde disco duro
└── Herramientas Sysadmin (protegido el acceso con contraseña)
     ├── Freedos (con memtest)
     └── Volver

Una vez definido el menú, para probar si todo funciona simplemente arrancamos un cliente que tenga activo el PXE y tras la carga del sistema debería aparecer con las opciones descritas:

  • Continuar el arranque con el sistema operativo contenido en el disco duro.
  • Herramientas sysadmin (hay que entrar una contraseña para acceder) :
    • Ejecutar el disco de Freedos con Memtest, que carga un entorno MS-DOS desde donde podemos hacer chequeo de los módulos de memoria RAM del PC. Esto es simplemente por poner algo que sirva para probar que funciona bien el sistema.
    • Volver al menú anterior.
Bueno, pues con esto ya tenemos el entorno preparado para empezar en serio. En la siguiente parte abordaremos como meter un SystemsRescueCD y Clonezilla, que nos permitirá cargarlo por red en cualquier PC sin necesidad de usar CD ni pendrives para ello.
 
Hasta pronto.....
 

No hay comentarios:

Publicar un comentario