Tabla de Contenidos
Arranque por red
Pueden ser muchos los motivos para querer arrancar por red: ordenador viejo de cojones que no tiene soporte de arranque por USB y no tienes un CD, no tienes un bootloader instalado en tu máquina y no tienes otra forma de arrancarlo o sencillamente pereza de crear un USB booteable
Para usar el arranque por red, usaremos iPXE
También necesitarás compilar iPXE por tu cuenta, o usar estas imagenes, aunque recomiendo compilarlo por tu cuenta para tener acceso a mas características como nfs y https. Como sabréis yo acostumbro a ser un majete, así que aquí teneis unas builds de iPXE en iso, undionly.kpxe y ipxe.efi con características interesantes.
En este caso estoy usando una máquina virtual en bhyve porque soy un vago, pero como la tengo bridgeada con mi red física, pillará los archivos del server dhcp local
Hay distintos métodos para iniciar iPXE, puedes arrancar una ISO de iPXE en un USB (aunque esto no tiene mucho sentido, pero bueno, podrías, sí), iniciarlo desde DHCP o sencillamente reemplazar el firmware de arranque de tu NIC por iPXE. Vamos a enfocarnos en inciarlo por DHCP y algunas palabras sobre reemplazar la ROM.
Proceso de arrancar por red
- Inicia la BIOS (o UEFI…)
- Intenta arrancar por la NIC
- Obtener archivo de iPXE por tftp
- Cargar iPXE para cargar netboot
- Usar netboot para cargar un OS
Configuración de servidor tftp
En los sistemas operativos que valen la pena (FreeBSD, OpenBSD y Debian) puedes instalar el paquete tftp-hba que es el demonio http. Búsquese en el manual donde tienes que poner los archivos según tu OS, en freebsd es /usr/local/tftp. Así que pongo el tar desempaquetado de arriba en esta ruta.
wget https://suragu.net/ipxe.tgz -O /usr/local/tftp tar xvzf /usr/local/tftp/ipxe.tgz -C /usr/local/tftp
Verificamos si tenemos los archivos undionly.kpxe
, ipxe.efi
y ipxe.iso
(aunque el .iso sobra, realmente)
Creación del servidor DHCP
Véase dhcp para información sobre como crear un server DHCP. Tenemos que agregar algo así en nuestra configuración de isc-dhcp-server (también se puede usar dnsmasq pero yo uso esto)
- dhcp.conf
next-server 192.168.1.207; if exists user-class and option user-class = "iPXE" { filename "http://192.168.1.207/boot.ipxe"; } elsif option client-architecture = 00:00 { filename "undionly.kpxe"; } else { filename "ipxe.efi"; }
next-server sirve para indicarle al PXE de la NIC donde está el servidor tftp de donde sacará iPXE. Luego después de cargar iPXE cargará el archivo localizado en http://192.168.1.207/boot.ipxe (que en mi caso, es esto)
- boot.ipxe
#!ipxe chain http://192.168.1.207/${mac:hexhyp}.txt || chain --autofree http://192.168.1.207/menu.ipxe
Que lo que hace es ver si puede cargar un archivo por http llamado como la dirección MAC del cliente separado por guiones (lo cual es útil cuando quieres que una máquina cargue una cosa específica) y sino, cargar el menu.ipxe que he creado (código al final)
Esta configuración hará que, cuando entre en el booteo por NIC y pille una IP por dhcp, pillará el archivo “undionly.kpxe” si es un sistema BIOS o “ipxe.efi” y lo cargará. Esto es lo que necesitamos.
Uso básico de iPXE
Pues puedes usar el comando
dhcp
para obtener una IP dentro de iPXE, el comando mas importante consideraría yo que son “sanboot” y “boot”. sanboot te permite arrancar desde un dispositivo SAN (como un target iSCSI, o un archivo ISO, nómbralo tu vaya) y chain te permite cargar un script remoto
Aquí podemos ver a iPXE iniciando desde UEFI en este caso
Tras obtener una IP con el comando dhcp, podemos cargar netboot usando el comando
chain --autofree http://boot.netboot.xyz
Con esto, nos cargaría netboot
Cosas raras que son posibles con iPXE
Cambiar la ROM de tu NIC por iPXE
Esto me recuerda a mis tiempos de corebooteador. Esto consiste en cambiar el firmware de PXE que trae por defecto la tarjeta de red. Hacer esto es demasiado texto que consiste en compilar iPXE para tu tarjeta de red (las de los servidores por algún motivo suelen estar soportadas, también las de intel, pero justo la que tengo ahora no lol) y bootear en FreeDOS. cosas que honestamente me dan perezote de explicar
Mas información aquí (no es muy dificil, realmente, aunque ahora que lo pienso, tendría que haber puesto la tarjeta de red en otro ordenador que no tardase la vida en iniciar para flashearlo, pero ya que)
Esto sirve para ahorrarte el paso de tftp en el servidor DHCP, pues no necesitas sacar iPXE de ningún lado, porque lo tienes en la ROM de la NIC, ahorrandote así unos 20 segundos por inicio
Código de el menu.ipxe
La verdad, no funciona la mayoria de cosas, así que usalo como base, si algún dia consigo algo que funcione bien con esto, se actualizará:
- menu.ipxe
#!ipxe # Some menu defaults set menu-timeout 5000 set submenu-timeout ${menu-timeout} isset ${menu-default} || set menu-default exit # Figure out if client is 64-bit capable cpuid --ext 29 && set arch x64 || set arch x86 cpuid --ext 29 && set archl amd64 || set archl i386 ###################### MAIN MENU #################################### :start menu iPXE boot menu for ${initiator-iqn} item --gap -- ------------------------- Sistemas operativos ------------------------------ item --key f freedos Iniciar FreeDOS item --key o openbsd Boot OpenBSD installer item --key f freebsd Boot mfsbsd (freebsd installer) item --key l menu-live Live environments... item --gap -- ------------------------- Herramientas ---------------------------- item --key p sysr Iniciar SystemrescueCD item --key r netboot Iniciar Netboot item --key u ubuntu Iniciar Ubuntu Live (sirve mas de lo que pensarias) item --gap -- ------------------------- Opciones avanzadas ------------------------------- item --key c config Configure settings item shell shell de iPXE item reboot Reboot computer item item --key x exit Exit iPXE and continue BIOS boot choose --timeout ${menu-timeout} --default ${menu-default} selected || goto cancel set menu-timeout 0 goto ${selected} :cancel echo You cancelled the menu, dropping you to a shell :shell echo Type 'exit' to get the back to the menu shell set menu-timeout 0 set submenu-timeout 0 goto start :failed echo Booting failed, dropping to shell goto shell :reboot reboot :freedos sanboot http://192.168.1.207/bootdos.img :freebsd sanboot http://192.168.1.207/mfsbsd.img :openbsd sanboot http://192.168.1.207/install76.iso :sysr chain http://192.168.1.207/sysr.ipxe :netboot chain http://boot.netboot.xyz :ubuntu set mirror http://releases.ubuntu.com set base_dir ubuntu set codename jammy set version_number 22.04 set os_arch amd64 set mirrorcfg mirror/suite=${ubuntu_version} set dir http://releases.ubuntu.com/${version_number}/dists/${version}/main/installer-${arch}/current/images/netboot set ubuntu_iso_url set install_params autoinstall ip=dhcp ds=nocloud-net;s=http://my.autoinstall.com/ url=${ubuntu_iso_url} kernel ${dir}/linux ${install_params} ${mirrorcfg} -- quiet initrd=initrd.gz initrd ${dir}/initrd.gz boot :exit exit