Multiherramienta PXE basada en Raspberry Pi



Los ingenieros de centros de datos a menudo se enfrentan a la tarea de configurar el servidor inicial. Además, la mayoría de las veces es necesario configurar no uno o dos equipos, sino varias decenas o incluso cientos. Cada vez que nos llega un equipo nuevo, no solo debemos revisarlo minuciosamente antes de ponerlo en funcionamiento, sino también configurarlo adecuadamente para que funcione con nuestros sistemas internos.



Antes de continuar con el procedimiento bastante trivial para configurar el BIOS y la IPMI, debemos asegurarnos de que cada componente del servidor tenga la versión de firmware requerida. En la mayoría de los casos, con raras excepciones, se requiere una versión actualizada, disponible en el sitio web del fabricante de componentes específicos. Hoy te contamos cómo se nos ocurrió la idea de utilizar la ahora popular "frambuesa" para acelerar el proceso.



Cual es la dificultad



Parecería que la tarea es muy sencilla. Bueno, tomemos una distribución de Linux en vivo, impleméntela en una unidad flash USB y arranque desde ella y realice los procedimientos necesarios. Pero no estaba ahí.



El problema es que cada proveedor tiene sus propios métodos y utilidades para actualizar el firmware. Además, no todos son capaces de funcionar correctamente en Linux. Algunos componentes, por ejemplo, BIOS para servidores SuperMicro, es conveniente coser desde MS-DOS. Para algunos componentes, por ejemplo, las tarjetas de red Mellanox, en algunos casos es necesario utilizar Windows y algunos son compatibles con el firmware directamente desde Linux.



Por lo tanto, tendremos que recopilar una imagen de arranque múltiple y escribirla en varias docenas de unidades flash, luego arrancar desde ellas durante mucho tiempo y de manera persistente, o encontrar algo más interesante y rápido. Y aquí es donde viene a la mente el uso de tarjetas de red de servidor con soporte para PXE (Preboot eXecution Environment, pronunciado pixie).



Tomamos la "frambuesa", implementamos un servidor DHCP y TFTP allí, preparamos las imágenes requeridas para la carga. Para cargar masivamente varias docenas de servidores, solo usamos temporalmente un conmutador gigabit de 48 puertos no administrado y listo. De forma predeterminada, la mayoría de los servidores permiten el arranque PXE sin configuración adicional, por lo que es ideal.



Tomé como base un excelente artículo . de Romanenko_Eugene, pero con correcciones para las características de la Raspberry Pi y las tareas que se están resolviendo. ¡Empecemos!



Mermelada de frambuesa



La primera vez que hice esto, la versión más avanzada de Raspberry Pi fue la tercera con una tarjeta de red de 100 Mbps. Francamente, esto no es suficiente para la distribución masiva de imágenes pesadas, por lo que recomiendo encarecidamente utilizar la Raspberry Pi 4 actualmente disponible con un puerto de 1 Gb / s. Otra recomendación es utilizar una tarjeta de memoria rápida y de gran capacidad siempre que sea posible.



Ahora sobre la configuración inicial. No se requiere absolutamente una interfaz gráfica para tal cosa, por lo que puede descargar la versión Lite más simple del sistema operativo Raspberry Pi OS. Desempaquetamos la imagen y la cargamos en la tarjeta MicroSD de cualquier manera conveniente, por ejemplo, usando dd:



sudo dd if=<_> of=/dev/mmcblk0 bs=1M
      
      





Durante el proceso de configuración, puede configurarlo de la forma tradicional conectando un teclado y un monitor, o mediante SSH. Para que el servicio SSH funcione al inicio, cree un archivo vacío llamado ssh en la sección / boot .



Dado que el puerto de red se utilizará para la operación DHCP, puede utilizar una conexión Wi-Fi para acceder a Internet o conectar otra tarjeta de red al Malinka a través de USB. Aquí hay uno, por ejemplo:





Ahora lanzamos la Raspberry Pi, la conectamos a Internet y actualizamos los repositorios y paquetes de software:



sudo apt update
      
      





sudo apt upgrade
      
      





Como estoy usando otra tarjeta de red, la incorporada debe configurarse con una dirección IP estática. Abra la configuración:



sudo nano /etc/dhcpcd.conf
      
      





Agrega las siguientes líneas:



interface eth0
static ip_address=192.168.50.1/24
      
      





Aquí eth0 es la tarjeta de red integrada de la Raspberry Pi. Es con la ayuda de él que se llevará a cabo la distribución de direcciones IP y la carga de la red. Ahora instale el servidor tftp:



sudo apt install tftpd-hpa
      
      





Después de la instalación, abra el archivo de configuración:



sudo nano /etc/default/tftpd-hpa
      
      





Traemos la línea a la siguiente forma:



TFTP_OPTIONS="--secure -l -v -r blksize"
      
      





En general, uno podría dejar todo como está, pero probar cada vez en una máquina separada a veces no es muy conveniente. Las opciones -l -v -r blksize le permiten probar todo esto en una VM VirtualBox sin ningún problema, solucionando algunos problemas de compatibilidad. Ahora instalamos un servidor DHCP para distribuir direcciones IP:



sudo apt install isc-dhcp-server
      
      





Abra el primer archivo de configuración isc-dhcp-server:



sudo nano /etc/default/isc-dhcp-server
      
      





Indicamos explícitamente la interfaz en la que se supone que funciona el servidor DHCP:



INTERFACESv4="eth0"
      
      





Ahora abra la segunda configuración dhcpd.conf :



sudo nano /etc/dhcp/dhcpd.conf
      
      





Establecemos los parámetros necesarios del servidor, la subred a distribuir y también pasamos el nombre del archivo cargador:



default-lease-time 600;
max-lease-time 7200;
ddns-update-style none;
authoritative;

subnet 192.168.50.0 netmask 255.255.255.0 {
        range 192.168.50.2 192.168.50.250;
        option broadcast-address 192.168.50.255;
        option routers 192.168.50.1;
        filename "pxelinux.0";
}

      
      





Guardamos el archivo y ahora tenemos que descargar el gestor de arranque, los módulos necesarios y formar el menú PXE. Comencemos descargando un conjunto de cargadores Syslinux, en mi caso la versión 5.01 es la más conveniente:



wget https://mirrors.edge.kernel.org/pub/linux/utils/boot/syslinux/syslinux-5.01.zip
      
      





Desembalaje:



unzip syslinux-5.01.zip
      
      





Ahora necesitamos encontrar y extraer el módulo memdisk , que puede cargar imágenes ISO completas en la RAM, el cargador pxelinux.0 y el resto de los módulos combinados . Ejecutamos secuencialmente los comandos que encontrarán y copiarán todo lo que se encuentre en el directorio / srv / tftp:



find ./ -name "memdisk" -type f|xargs -I {} sudo cp '{}' /srv/tftp/
      
      





find ./ -name "pxelinux.0"|xargs -I {} sudo cp '{}' /srv/tftp/
      
      





find ./ -name "*.c32"|xargs -I {} sudo cp '{}' /srv/tftp/
      
      





Después de esta operación, necesitamos crear un archivo de configuración directamente para el menú que se muestra en la pantalla PXE. Vaya a nuestro directorio:



cd /srv/tftp
      
      





Cree un directorio llamado pxelinux.cfg y navegue hasta él:



sudo mkdir pxelinux.cfg
      
      





cd pxelinux.cfg
      
      





Creamos un archivo de configuración:



sudo nano default
      
      





Como ejemplo, tomemos la excelente distribución GRML en vivo y descárguela a través de PXE. A continuación se muestra un ejemplo de configuración terminado:



UI vesamenu.c32                  
PROMPT 0
MENU TITLE Raspberry Pi PXE Server
MENU BACKGROUND bg.png
LABEL bootlocal
   menu label Boot from HDD
   kernel chain.c32
   append hd0 0
   timeout 0
TEXT HELP
Boot from first HDD in your system
ENDTEXT
LABEL grml
   menu label GRML Linux
KERNEL grml/boot/grml32full/vmlinuz
APPEND root=/dev/nfs rw nfsroot=192.168.50.1:/srv/tftp/grml/ live-media-path=/live/grml32-full boot=live lang=us nomce apm=power-off noprompt noeject initrd=grml/boot/grml32full/initrd.img vga=791
LABEL reboot
    menu label Reboot
    kernel reboot.c32
TEXT HELP
Reboot server
ENDTEXT

      
      





Probablemente valga la pena detenerse un poco aquí y averiguar qué hace cada línea:



  • UI vesamenu.c32 : use el módulo vesamenu.c32 para mostrar el menú;
  • PREGUNTA 0 : resalte el elemento de menú cero;
  • TÍTULO DEL MENÚ Servidor Raspberry Pi PXE : establezca el nombre general del menú;
  • FONDO DEL MENÚ bg.png - elemento de diseño, use bg.png como imagen de fondo.


La imagen de fondo se puede hacer con anticipación. Por defecto, es adecuada una imagen de 640x480 con una profundidad de color de no más de 24 bits, en formato PNG o JPG. Debe copiarse a / srv / tftp de antemano . Ahora echemos un vistazo a cada sección. La primera sección se ha introducido por conveniencia. Si necesita arrancar desde el primer disco duro, entonces registramos:



  • LABEL bootlocal - nombre de la sección interna;
  • etiqueta de menú Arrancar desde HDD : cómo se mostrará el menú de usuario;
  • kernel chain.c32 : usamos el módulo chain.c32, que puede arrancar desde varios medios;
  • añadir hd0 0 : indica explícitamente que la carga debe realizarse desde la primera partición del primer disco duro;
  • tiempo de espera 0 : aquí puede establecer un tiempo de espera en segundos, después del cual la descarga comenzará automáticamente, o especificando 0 para eliminar el temporizador.
  • AYUDA DE TEXTO : indica el comienzo del texto de ayuda para el usuario;
  • Arranque desde el primer disco duro de su sistema : texto de sugerencia;
  • ENDTEXT : indica el final del texto de la sugerencia.


Aproximadamente de la misma forma, formamos la sección de recarga. La única diferencia será la llamada al módulo reboot.c32, que en realidad envía el auto a reiniciarse. Bueno, antes de examinar qué hace la tercera sección, que carga la distribución GRML, hablemos de qué se cargará realmente y cómo.



Todo es un archivo



La imagen ISO en sí está disponible en el sitio web de esta distribución en vivo. Descárguelo y cámbiele el nombre por conveniencia, en el ejemplo tomaremos la versión de 32 bits:



wget https://download.grml.org/grml32-full_2020.06.iso
      
      





mv grml32-full_2020.06.iso grml.iso
      
      





Ahora tenemos que forzar el arranque de esta imagen de alguna manera. Por un lado, puede usar el módulo memdisk y forzarlo a que primero cargue todo el contenido "sin procesar" de la imagen directamente en la RAM y luego transfiera el control sobre el arranque. Pero este método solo es bueno para imágenes muy pequeñas, por ejemplo, es conveniente arrancar MS-DOS de esta manera. Las imágenes grandes tardan mucho en cargarse en la memoria y no siempre funcionan adecuadamente.



Por lo tanto, aún debe "destripar" la imagen y transferir solo el kernel y livefs para arrancar. Pero se pueden proporcionar más archivos del disco al sistema a pedido utilizando el servidor NFS. Este enfoque funciona mucho más rápido y de manera más adecuada, pero requiere gestos adicionales, como instalar un servidor NFS.



Se realiza de forma elemental:



sudo apt install nfs-kernel-server
      
      





Para no ensuciar los archivos, cree un directorio separado para grml:



sudo mkdir /srv/tftp/grml
      
      





Necesitaremos montar el ISO, así que nos encargaremos del punto de montaje temporal:



sudo mkdir /tmp/iso
      
      





Montamos la imagen. El sistema le advertirá que la imagen está montada en modo de solo lectura:



sudo mount -o loop grml.iso /tmp/iso
      
      





Copie de forma recursiva el contenido de la imagen en nuestro directorio separado:



sudo cp -R /tmp/iso/* /srv/tftp/grml
      
      





Para evitar problemas con los derechos de acceso, cambiamos de propietario y de forma recursiva asignamos a este directorio los derechos de la serie "Casa libre, vive quien quieras":



sudo chown -R nobody:nogroup /srv/tftp/grml/
      
      





sudo chmod -R 755 /srv/tftp/grml/
      
      





Ahora es fácil decirle al servidor NFS que debe proporcionar el directorio / srv / tftp / grml a cualquier dirección IP de nuestra subred:



sudo nano /etc/exports
      
      





Registramos la línea:



/srv/tftp/grml 192.168.50.0/24(rw,sync,no_subtree_check)
      
      





Actualice la lista y reinicie el servidor NFS:



sudo exportfs -a
      
      





sudo systemctl restart nfs-kernel-server
      
      





Ahora finalmente tenemos la oportunidad de dividir correctamente el proceso de descarga en dos etapas condicionales. El primer paso es cargar el kernel y el sistema de archivos en vivo. La segunda etapa consiste en extraer todos los demás archivos a través de NFS. Es hora de echar un vistazo a la sección restante:



  • LABEL grml - nombre de la sección;
  • etiqueta de menú GRML Linux : visualización en el menú;
  • KERNEL grml / boot / grml32full / vmlinuz - especifique la ruta al kernel, relativa a la raíz / srv / tftp ;
  • APENDER root = / dev / nfs rw nfsroot = 192.168.50.1: / srv / tftp / grml / live-media-path = / live / grml32-full boot = live lang = us nomce apm = power-off noprompt noeject initrd = grml /boot/grml32full/initrd.img vga = 791 - aquí decimos que estamos usando NFS, escribimos las rutas a la raíz condicional, configuramos algunos parámetros adicionales recomendados en la documentación e indicamos la ruta relativa a initrd.


Ahora todo lo que queda es iniciar el servidor TFTP y DHCP secuencialmente y puede intentar iniciar en PXE. Si todo se hace correctamente, verá el menú creado:





Seleccionando el elemento GRML Linux, presione Enter y ver que tenemos un proceso de carga de imágenes exitoso:





Por lo tanto, obtuvimos la capacidad de iniciar en red la distribución GRML, que es popular entre los administradores de sistemas. Pero, ¿qué pasa con el mismo MS-DOS y cómo puede preparar de forma independiente una imagen para actualizar el BIOS? Hablemos de esto más a fondo.



En DOS confiamos



¿Sigue en uso el sistema operativo de los años 80 del último milenio en el siglo XXI? No importa lo extraño que pueda parecer, pero para algunas tareas específicas, MS-DOS sigue siendo relevante y bastante útil por sí mismo. Una de estas tareas es actualizar el firmware del BIOS en los servidores.



Tomemos como ejemplo alguna placa base, por ejemplo, Supemicro X11SSL-F y descarguemos la actualización del BIOS del sitio oficial. En el interior vemos un conjunto de archivos similar:



user@linux:~//X11SSLF0_B26> ls -l
 16592
-rw-r--r-- 1 user users   169120   1  2015 AFUDOSU.SMC
-rw-r--r-- 1 user users     5219  20  2003 CHOICE.SMC
-rw-r--r-- 1 user users    22092  27  2014 FDT.smc
-rw-r--r-- 1 user users     3799  15  2016 FLASH.BAT
-rw-r--r-- 1 user users     3739  22  2019 Readme for UP X11 AMI  BIOS.txt
-rw-r--r-- 1 user users 16777216  25 23:48 X11SSLF0.B26

      
      





Vemos que ya tenemos un archivo BAT listo para usar que nos permite actualizar la BIOS. Pero para hacer esto, debe tener un servidor ya cargado en MS-DOS. Ahora le mostraremos exactamente cómo hacer esto.



En primer lugar, necesitamos preparar una pequeña imagen sin procesar del disco duro con el sistema operativo. Cree una nueva máquina virtual a través de Oracle VM VirtualBox con un pequeño disco de 32 megabytes. Seleccionamos el formato QCOW, después de todas las manipulaciones se puede convertir fácilmente a raw.



Seguro que todos sabéis de dónde sacar imágenes de disquetes con MS-DOS, así que móntelas dentro de la máquina virtual y ejecute la instalación:





Cambiamos las imágenes de disquete en la unidad virtual dos veces y después de literalmente 20 segundos tenemos una imagen qcow con un nuevo sistema operativo MS-DOS 6.22:





La forma más sencilla ahora de copiar archivos a este disco es montarlo en cualquier otra máquina virtual que ejecute Windows o Linux. Luego de esta operación, volvemos a montar el disco en la máquina virtual MS-DOS y verificamos que los archivos estén visibles:





Si lo desea, incluso puede configurar la carga automática para ejecutar un archivo BAT para que el BIOS se actualice automáticamente. Pero recuerde que esta es una operación potencialmente peligrosa y que la realiza bajo su propio riesgo y riesgo. Ahora apague la máquina virtual y conviértala en una imagen sin procesar usando qemu-img.



qemu-img convert -f qcow -O raw DOS.qcow dos.img
      
      





Copie la imagen IMG resultante en un directorio separado de nuestro servidor TFTP:



sudo mkdir /srv/tftp/dos
      
      





sudo cp dos.img /srv/tftp/dos
      
      





Ahora abra la configuración /srv/tftp/pxelinux.cfg/default para editar y agregue un elemento más al menú:



LABEL DOS
        kernel memdisk
        initrd dos/dos.img
        append raw

      
      





Guardamos la configuración y ahora tenemos un nuevo elemento de menú en el menú PXE, seleccionando cuál cargamos la imagen creada:





De la misma manera, puede crear imágenes que contengan tanto utilidades como para divertirse con juegos de DOS antiguos.



En Windows Veritas



Intentemos ahora arrancar la imagen en vivo desde WinPE (entorno de preinstalación de Windows). A menudo, simplemente no es necesario descargar una versión completa, solo un número limitado de funciones es suficiente. Esta cosa encuentra un uso real al flashear algunos dispositivos.



El mismo Mellanox, absorbido por Nvidia hace un año, lanza la utilidad Mellanox Firmware Tools para actualizar sus tarjetas de red en diferentes versiones para WinPE. Por supuesto, ahora ya hay varias opciones de MFT disponibles, pero un par de veces nos enfrentamos a la necesidad de coser la versión de WinPE.



Crear su propia imagen WinPE e integrar el software necesario no es una tarea demasiado difícil, pero su explicación está más allá del alcance de este artículo. Para dominar este proceso en detalle, puede visitar el excelente recurso winpe.ru . Como ejemplo, tomaremos cualquier ensamblaje ya hecho para demostrar el proceso de lanzamiento.



A menudo, estos ensamblajes son imágenes iso o archivos rar con imágenes iso. Antes de elegir una imagen de este tipo, necesitamos obtener el cargador de arranque adecuado.



wimboot es un gestor de arranque bastante simple capaz de cargar imágenes en formato wim (Windows Imaging Format). Se puede usar junto con syslinux o con su hermano más avanzado, iPXE... Cree un directorio separado en / srv / tftp :



sudo mkdir wimboot
      
      





cd wimboot
      
      





Descargue el cargador de arranque en sí:



wget https://github.com/ipxe/wimboot/releases/latest/download/wimboot
      
      





Ahora es el momento de montar la imagen. Cree un directorio temporal en / tmp :



sudo mkdir winpe
      
      





Vaya al directorio con la imagen de ensamblaje ISO descargada y ejecute:



sudo mount -o loop <_> /tmp/winpe
      
      





Cree un directorio en / srv / tftp , donde colocaremos los archivos que necesitemos:



sudo mkdir /srv/tftp/winpe
      
      





Ahora buscamos en el ensamblaje y copiamos 4 archivos:



sudo cp BOOTMGR /srv/tftp/winpe
      
      





sudo cp bcd /srv/tftp/winpe
      
      





sudo cp boot.sdi /srv/tftp/winpe
      
      





sudo cp boot.wim /srv/tftp/winpe
      
      





El asunto es pequeño: agregue la siguiente sección al archivo de configuración /srv/tftp/pxelinux.cfg/default :



LABEL WinPE
        menu label WinPE
        com32 linux.c32 wimboot/wimboot
        append initrdfile=winpe/BOOTMGR,winpe/bcd,winpe/boot.sdi,winpe/boot.wim

      
      





De hecho, usamos el módulo linux.c32 para cargar el gestor de arranque, una excelente tautología , y le pasamos los parámetros en el formato familiar para wimboot. Por lo tanto, primero se carga wimboot, luego se descomprimen los archivos necesarios y se ejecutan secuencialmente.





Es importante tener en cuenta que los archivos se cargan mediante TFTP, lo cual no es muy rápido y conveniente. En general, puede modificar ligeramente la configuración y estirarlos de una manera diferente. Pero para tareas utilitarias simples, esto es suficiente.





En lugar de una conclusión



No hay conocimientos técnicos en este artículo, pero cuando surgió la necesidad, la Raspberry Pi hizo un gran trabajo. No necesitó buscar una toma de corriente adicional, el puerto USB del servidor libre más cercano era perfecto. No hay problemas adicionales para encontrar un lugar en un estante abarrotado hasta los ojos. Funciona exactamente como debería, y sus reducidas dimensiones te permiten tenerlo siempre a mano.



En realidad, hay muchos tutoriales en la red para configurar netboot. El único problema es que se utilizan diferentes medios y diferentes enfoques para diferentes imágenes. Elegir el enfoque correcto a veces puede llevar mucho tiempo, y realmente espero que este material ayude a muchas personas a ahorrar tiempo al resolver diversas tareas relacionadas con la necesidad de implementar rápidamente PXE en una computadora de placa única Raspberry Pi.






All Articles