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

sábado, 7 de julio de 2018

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 



No hay comentarios:

Publicar un comentario