[howto] Arrancando desde la red, sin CD ni disco rígido.

Siguiendo la saga del post anterior en donde presentaba a dnsmasq como la navaja suiza del arranque remoto para clientes sin disco rígido – lo que se conoce como diskless o thin clients – completo el artículo con una breve explicación acerca de como poner en funcionamiento este sistema para que nos sirva como DHCP server, TFTP server y PXE server.

Englobando un poco la idea general, lo que se persigue es:

  1. Nunca mas tener que volver a usar un CD o un diskette para arrancar una PC.
  2. Arrancar un ordenador usando únicamente la red (Tenga este disco rígido o no)
  3. Disponer de una serie de imágenes para arrancar desde la red entre las que incluyo:
    • Algunas distribuciones de linux (Cualquier versión de Ubuntu y System Rescue CD)
    • Imágenes ISO de cualquier CD Booteable
    • Windows desde la red.
    • Imágenes de Diskette booteables.

Todo esto se consigue combinando tres piezas que tienen que interactuar entre si:

  • Dnsmasq
  • Grub4Dos
  • PXElinux

Dnsmasq:

es el encargado de recibir las peticiones PXE iniciales y pasarle al cliente su número de IP inicial, el nombre del archivo binario desde el cual bootear y la dirección del servidor tftp desde el cual obtener dicho archivo.

En el siguiente paso y teniendo Dnsmasq la capacidad de actuar como tftp server, se encarga de servir al cliente con el archivo binario desde el cual bootear, que será grldr, el grub loader de grub4dos.

Grub4dos:

Se encarga de presentarnos un bonito menú de arraque – con imagen de fondo y tododesde el cual seleccionar que imagen queremos arrancar y llegado el caso pasarle el control de la pila PXE usando chainload pxelinux para que podamos arrancar diferentes distribuciones de linux.

Pxelinux:

Cumple exactamente la misma función que grub4dos, permitiendo bootear en este caso diferentes distribuciones de linux sin usar el livecd.

Instalación y configuración de dnsmasq:

Usando el gestor de paquetes de su distribución instalen dnsmasq en la pc que hará de servidor PXE. En Gentoo:

emerge dnsmasq

El archivo de configuración se ubica en /etc/dnsmasq.conf. Usando el método para filtrar las líneas comentariadas que expliqué en este otro post voy a dejar visible únicamente lo relevante.

Primero, especificar cual será la interface de red por la cual se servirán peticiones modificando la siguiente línea:

interface=eth0

Si quieren que los clientes tengan un nombre de dominio asociado al nombre de host, modificar la línea:

domain=midominio.com

Y descomentariar esta otra:

expand-hosts

Al hacerlo. Durante el arraque por red o al obtener una dirección de IP desde el servidor DHCP, dnsmasq asignará además el nombre de dominio al hostname con lo que la pc que se anunció a si misma como pepito responderá tanto al nombre de host pepito como a pepito.midominio.com.

Especificar el rango de direcciones de IP que queremos servir, la máscara de subred y el lease time:

dhcp-range=192.168.0.10,192.168.0.20,255.255.255.0,12h

Dnsmasq reservará durante doce horas los números de IP que hubiera asignado y usará el rango de 10 a 20.

Habilitar el tftp server descomentariando esta linea:

enable-tftp

Especificar cual será el directorio raíz desde el cual se servirán imágenes por tftp:

tftp-root=/tftproot

Y el cargador de arranque que se le pasará al cliente:

dhcp-boot=grldr

Siendo grldr el cargador de arraque y al no haber especificado ninguna ruta para el archivo, dnsmasq entiende que la ruta al archivo grldr es /tftproot/grldr.

Y eso es todo! Con esas poquitas líneas dnsmasq ya está configurado para hacer todo el trabajo.

Si en tu red ya existiera otro dhcp server en funcionamiento probablemente te interese descomentariar esta opción:

dhcp-authoritative

Eso hará que dnsmasq se haga cargo de todos los leases asignados por otros servidores dhcp de la red cuando entre en funcionamiento.

Por último, crear el directorio raiz del servidor tftp:

sudo mkdir  /tftproot

sudo chmod 755 /tftproot

E iniciar el servicio:

/etc/init.d/dnsmasq start

Grub4dos:

De la página web del proyecto descargar el siguiente archivo:

grub4dos-0.4.4.zip

Dentro del .zip al descomprimirlo encontrarán el archivo grldr. Copiar este archivo a /tftproot:

cp ruta_al_archivo_comprimido/grldr /tftproot

Crear en archivo menu.lst y editarlo son su editor de texto de cabecera:

touch /tftproot/menu.lst

nano /tftproot/menu.lst

Ahora si, ya podemos empezar a agregar opciones dentro del menú de Grub agregando estas entradas al archivo menu.lst. Empezando por las opciones por defecto:

default 0
timeout 30
splashimage=(pd)/splash.xpm.gz

Default 0 indica cual de todas las entradas del menú iniciará al cabo de 30 segundos, – por timeout 30 -. La entrada cero es la primera de la lista.

 

Splashimage indica cual será la imagen de fondo que tendrá grub al presentar el menú en formato .xpm.gz. Pueden elegir una de las tantas que hay disponibles en internet o crear una propia a su gusto.

Copien su archivo .xpm.gz a /tftproot.

(pd) por Pxe Device es el formato que usa grub4dos para referirse al servidor tftp.

Ejemplos prácticos de arranque de imágenes:

Bootear una imagen de diskette:

title Mi imagen de diskette de DOS booteable
map –mem (pd)/img/img_diskette.bin (fd0)
map –hook
root (fd0)
chainloader +1

Pueden encontrar unas cuantas imágenes de diskettes de DOS de las cuales servirse en Bootdisk.com. Nuevamente, copiar el archivo de imagen de diskette a /tftproot.

Cargar Memtest86, el testeador de memorias por excelencia:

Esta vez necesitaremos de memdisk, que es parte del paquete syslinux. Primero instalar syslinux (que de paso, instalará también pxelinux que usaremos mas adelante) con el gestor de paquetes de su distribución. En Gentoo:

emerge syslinux

Copiar a continuación memdisk desde la ruta en donde lo instaló syslinux a /tftproot:

cp  /usr/share/syslinux/memdisk /tftproot

Descargar la última versión disponible de memtest86 en versión binaria booteable y copiarla a /tftproot.

Generar la entrada en el menú de grub de esta forma:

title Cargar Memtest86
kernel (pd)/memdisk
initrd (pd)/memtest.igz

Bootear cualquier imágen de CD en formato ISO:

El procedimiento es muy similar al usado al arrancar una imagen de diskette. Copien el ISO a /tftproot y luego generen la entrada en el menú de grub.

title Mi CD Booteable
map –mem (pd)/imagen_de_cd.iso (0xFF)
map –hook
root (0xFF)
chainloader (0xFF)

Acotaciones al margen:

  • Este método carga la imagen ISO completa en la memoria RAM. Si van a cargar un archivo .iso de 600 MB necesitarán como mínimo esa cantidad de memoria ram instalada en el sistema.
  • No sirve para arrancar imágenes ISO de cd instaladores de windows.
  • No sirve para arrancar imágenes de Livecd de distribuciones Linux.

¿Entonces para que sirve?

Se puede usar para arrancar una imagen de Hirens BootCD usando el método anterior por ejemplo.

Como en este Hirens BootCD se incluye dentro de la carpeta /HBCD una versión de Windows XP livecd que usa como cargador el acrhivo XPLOADER.BIN. Podemos arrancarla desde la red también copiando el archivo .iso a /tftproot y agregando esta entrada al menú de Grub:

title Hirens MINI XP

map –mem (pd)/iso/hirens_boot_cd.iso (0xFF)
map –hook
root (0xFF)
chainloader (0xFF)/HBCD/XPLOADER.BIN

PXELinux. Arrancar livecd de Linux desde la red:

Esta es la parte en donde cargaremos un par de livecd de linux desde el servidor TFTP.

Para esto dependiendo de la distribución elegida necesitaremos de un servidor NFS funcionando y con la carpeta que contiene los archivos necesarios exportada.

He estado haciendo algunos experimentos y al parecer todos los livecd de Ubuntu necesitan de un servidor NFS instalado. System Rescue CD puede bootear desde el mismo servidor TFTP.

Si nunca han hecho esto, puede que les interese esta guía o googlear un poco.

En mi caso tengo exportado /tftproot con estas opciones en /etc/export:

/tftproot  192.168.0.0/255.255.254.0(async,no_subtree_check,rw)

Una vez que hayan exportado /tftproot con NFS solo resta poner en funcionamiento pxelinux:

Son necesarios 2 archivos que también instaló syslinux en su momento, pxelinux.0 y menu.c32. Los copiamos a nuestro /tftproot:

cp  /usr/share/syslinux/menu.c32 /tftproot

cp  /usr/share/syslinux/pxelinux.0 /tftproot

Creamos el archivo de configuración de PXELinux:

mkdir /tftproot/pxelinux.cfg

touch  /tftproot/pxelinux.cfg/default

Si queremos un menú colorido agregamos además un archivo graphics.conf:

touch /tftproot/pxelinux.cfg/graphics.conf

Y le agregamos dentro:

menu color tabmsg 37;40 #80ffffff #00000000
menu color hotsel 30;47 #40000000 #20ffffff
menu color sel 30;47 #40000000 #20ffffff
menu color scrollbar 30;47 #40000000 #20ffffff
MENU MASTER PASSWD tupassword
MENU WIDTH 80
MENU MARGIN 22
MENU PASSWORDMARGIN 26
MENU ROWS 6
MENU TABMSGROW 15
MENU CMDLINEROW 15
MENU ENDROW 24
MENU PASSWORDROW 12
MENU TIMEOUTROW 13
MENU VSHIFT 6
MENU PASSPROMPT Ingrese Password:
NOESCAPE 0
ALLOWOPTIONS 1

Toda la sección que menciona el password y la opción ALLOWOPTIONS son para permitir la edición al vuelo del menú (pero protegido por una contraseña). Es útil dejarlo habilitado mientras se están haciendo las pruebas iniciales para poder jugar con las opciones antes de arrancar cada imagen de CD.

Se ingresa al modo edición del menú de pxelinux presionando la tecla TAB.

Agregamos primero las opciones por defecto al menú de pxelinux dentro del archivo  /tftproot/pxelinux.cfg/default:

default menu.c32
prompt 0

menu title Menu para arrancar imagenes de Linux
menu INCLUDE pxelinux.cfg/graphics.conf

Arrancar cualquier versión de Ubuntu:

label xubuntu
menu label XUbuntu 9
kernel /xubuntu/vmlinuz
append initrd=/xubuntu/initrd.gz file=/xubuntu/xubuntu.seed boot=casper verbose netboot=nfs nfsroot=192.168.1.1:/tftproot —

Explicación:

He creado dentro de mi /tftproot un directorio de nombre xubuntu y dentro del mismo un segundo directorio de nombre casper.

 

Dentro del directorio xubuntu he copiado desde el ISO del livecd de Xubuntu los siguientes archivos:

  • casper/initrd.gz => /tftproot/xubuntu/
  • casper/vmlinuz => /tftproot/xubuntu/
  • casper/filesystem.squash fs => /tftproot/xubuntu/casper/
  • preseed/xubuntu.seed => /tftproot/xubuntu

Que traducido en comandos sería:

mkdir -p /mnt/tftproot/xubuntu/casper

sudo mount -t  iso9660 -o loop mi_imagen_de_xubuntu.iso /mnt/cdrom

cp /mnt/cdrom/casper/initrd.gz  /tftproot/xubuntu/

cp /mnt/cdrom/casper/vmlinuz /tftproot/xubuntu/

cp /mnt/cdrom/casper/filesystem.squashfs /tftproot/xubuntu/casper

cp /mnt/cdrom/preseed/xubuntu.preseed /tftproot/xubuntu/

Dentro de la línea append la opción nfsroot=/192.168.1.1:/tftproot especifica el número de IP del servidor que está exportando por NFS todo el contenido del directorio.

Arrancando System Rescue CD desde la red:

label srcd
menu label System Rescue CD
kernel /srcd/rescuecd
append initrd=/srcd/initram.igz netboot=tftp://192.168.1.1/srcd/sysrcd.dat

Si se entendió el arranque de Ubuntu este no necesita mayores explicaciones. De nuevo, he montado el ISO y copiado el kernel, initrd y el archivo sysrcd.dat a un directorio de nombre srcd dentro de /tftproot, solo que en este caso, los tres archivos se sirven por tftp y no es necesario el uso de un servidor NFS.

Por último, solo resta generar una entrada en el menú de grub para que este cargue el menú de PXELinux:

title Menu para arranque de Linux usando PXELinux
pxe keep
chainloader –raw (pd)/pxelinux.0

Y eso es todo!. Pueden usar este método para arrancar sus imágenes de diskette, CD o DVD preferidas por la red, Jugando un poco con el livecd de la distribución que mas les guste pueden hacerla arrancar por la red también.

Si bien he simplificado bastante el proceso explicando como implementar todo en una sola PC de la red, no es necesario que esto sea así. Por ejemplo, en mi red dnsmasq corre sobre la pc que hace de router. El servidor TFTP corre sobre un fileserver y el servidor NFS sobre un segundo fileserver.

Es cuestión de ajustar las rutas para adecuarlas a sus necesidades concretas y listo.

Todas las pc y portátiles medianamente modernas permiten el arraque desde la red pero no todas traen la opción habilitada por defecto en su BIOS. Cada quien sabrá como habilitar dicha opción, que suele llamarse Network Boot o LAN Boot Rom.

Cualquier sugerencia, mejora o comentario al respecto es bienvenida.

Enjoy!

 

 

em

33 comentarios en “[howto] Arrancando desde la red, sin CD ni disco rígido.

  1. Pingback: News [howto] Arrancando desde la red, sin CD ni disco rígido. | Web 2.0 Designer

  2. Magistral su howto, maestro! Lo voy a mantener en marcadores por las dudas.
    Mientras tanto, sigo booteando con pendrives, que son cada vez mas faciles de armar.

  3. Hola.. Interesante tu post.
    Tengo una pregunta, si yo lo que quiero es instalar un windows 2000 (iso) desde la red, con esto me sirve?
    Agradezco tu ayuda

  4. Buenas:
    En la pagina official de proyecto http://diddy.boot-land.net/grub4dos/files/map.htm#hd32

    Indica claramente que no se pude acceder al contenido del cd emulado.

    Como has conseguido cargar el hirens boot cd ?
    En caso de que lo hayas conseguido, has arrancado alguna de las utilidades en el se encuentran?

    llevo semanas trabajando en esto y no lo consego, estaria muy agradecido si me ayudaras.

    Gracias!
    saludos.

    • Cargo el hirens boot cd sin problemas, puedo acceder a absolutamente todas las utilidades que contiene incluído su «Mini XP». Dentro del Mini XP este no puedo acceder al contenido del CD emulado pero no lo necesito para nada ya que teniendo el entorno cargado en la RAM y acceso a la red, dispongo de muchas herramientas en mi servidor.

      La sintaxis:

      title Hirens BOOT CD 9.8
      map –mem (pd)/iso/hirens.iso (0xFF)
      map –hook
      root (0xFF)
      chainloader (0xFF)

      Y para el mini XP:

      title Hirens MINI XP
      map –mem (pd)/iso/hbcd.iso (0xFF)
      map –hook
      root (0xFF)
      chainloader (0xFF)/HBCD/XPLOADER.BIN

      El resto, tal cual lo explico mas arriba.

      ¡Saludos!

  5. Pingback: [Nota Mental] Como compilar el último snapshot de aMSN desde la SVN en Ubuntu. « Maldito Nerd

  6. Buenas:
    En la pagina official de proyecto http://diddy.boot-land.net/grub4dos/files/map.htm#hd32

    Indica claramente que no se pude acceder al contenido del cd emulado.

    Como has conseguido cargar el hirens boot cd ?
    En caso de que lo hayas conseguido, has arrancado alguna de las utilidades que en el se encuentran?

    llevo semanas trabajando en esto y no lo consego, estaria muy agradecido si me ayudaras.

    Gracias!
    saludos.

    • perdona, tenia la sesion guardada con tu web, y se quedo el mensaje sin enviar, y pensé que no te habia llegado.

      Haré más pruebas y te comento.
      Muchas Gracias!

  7. Pingback: [Tip] Aumentar la cantidad de dispositivos loop en linux. « Maldito Nerd

  8. error 1: filename must be either an absolute pathname or blocklist
    me da ese error al intentar cargar cualquiera de las 2 opciones del hirens
    gracias.

  9. ya lo solucione, es q al copiar solo pone un (-) y son 2 (–), ejemplo:
    map –mem (pd)/iso/hbcd.iso (0xFF) y es :
    map –mem (pd)/iso/hbcd.iso (0xFF)
    Salu2 y gracias

    • me sale igual cual sea el error que tengo
      title Hirens BOOT CD 9.8
      map –mem (pd)/iso/Hirens.iso (0xFF)
      map –hook
      root (0xFF)
      chainloader (0xFF)

      Y para el mini XP:

      title Hirens MINI XP
      map –mem (pd)/iso/hbcd.iso (0xFF)
      map –hook
      root (0xFF)
      chainloader (0xFF)/HBCD/XPLOADER.BIN

  10. Una duda, y si quiero que el servidor no me haga de dhcp (porque tengo otro andando) como haria? porque con el dhcp-authoritative lo que hago es que el servidor se haga cargo de todo, no?

  11. Pingback: Ubuntu: el mejor de entre todos los Linux

  12. El tutorial estuvo excelente, pero no me funciona aun 🙁

    Hola hice todo el tutorial y no me recibe las peticiones el otro equipo, o sea, no registra ninguna señal de que hay un servidor dchp, no se si tenga que ver, pero estoy conectado a un modem router y el otro equipo también.

  13. MM te cuento amigo que ya resolvi el problema, al parecer tenia que colocar el mismo rango de direccion ip que usa el modem router.

    Otra vez gracias por el tutorial maldito nerd :P, me funciona perfectamente ahora 😀

  14. Por lo visto lo solucionaste en nada mas que 40 minutos, si bien vengo llegando tarde, me alegro que ye haya sido de utilidad. Si algún día volvés por el blog contame que aplicaciones estás booteando por la red, ¿Puede ser?

    ¡Saludos!

  15. Si amigo, pero vuelvo otra vez con un problema.

    Mi servidor dns no esta pasando los parámetros para resolver nombres, o sea, no hay salida para internet, todo funciona perfectamente locamente o sea para los demás equipos que se conectan a mi servidor dns, porque yo si navego bien y las paginas resuelve super rápido 😛

    Eh intentado ponerle directamente en el archivo resolv.conf, pero para el colmo el sistema operativo no me navega así, solo funciona si lo dejo en automático :S

    Espero algún consejo tuyo, porque ya he probado y probado y nada 🙁

  16. Disculpa pero no entiendo con exactitud cual es el problema, vos si navegas bien, ¿Eso implica que usas internet desde la PC que hace las veces de servidor de DNS?

    ¿El que hace las veces de servidor de DNS en tu red es además puerta de enlace?

    Explicame mejor como es la topología de tu red a ver si entiendo y puedo darte una mano.

    ¡Saludos!

  17. Si te pasare mi configuración del archivo dnsmasq.conf

    interface=eth0
    listen-address=127.0.0.1
    no-hosts
    domain=gateway.nautilus
    dhcp-range=172.16.1.34,172.16.1.100,255.255.255.0,16h
    dhcp-host=1c:65:9d:7f:db:37,172.16.1.34
    dhcp-boot=grldr
    enable-tftp
    tftp-root=/tftproot
    dhcp-authoritative
    cache-size=5000

    y así tengo el archivo resolv para dns

    nameserver 127.0.0.1

    Básicamente navego sin problemas en el servidor, o sea todo funciona bien local, pero las otras computadoras solo funcionan en modo red, mas no tienen acceso a internet, chequeo la config y la puerta de enlace resulta ser la maquina servidor.

    Y bien, ahí es donde estoy atrabancado.

    La topologia de red es estrella.

  18. El nameserver de tu servidor no puede ser nunca 127.0.0.1, debería ser el de tu proveedor de internet o cualquier otro de tu elección, para usar los de Google por ejemplo (sumamente recomendado), tipea como root en tu servidor:

    echo «nameserver 8.8.8.8» > /etc/resolv.conf

    Y después de eso probá liberar y renovar la dirección de IP de cualquiera de las PC clientes, con eso debería bastar.

    A ver si hay suerte.

  19. Gracias por la sugerencia

    Yo probé distintas formas antes de postear, desde editar solo los nameserver, hasta editar la configuración ip manualmente y nada. Se pone como los clientes que no quiere navegar a internet, solamente navegación local entre equipos.

    Haber si me das otra idea men.

  20. Entonces no estás entendiendo como funciona un servidor de nombres o no has hecho la prueba que te indico mas arriba o hay un firewall en tu red que no permite el tráfico saliente por el puerto 53 UDP.

    Como sea, si tu DNS server no funciona, usa el de Google como te indico mas arriba. Tu pc que hace las veces de servidor DNS/DHCP y tus PC clientes deberían poder funcionar en internet sin ningún problema usando cualquier servidor de nombres, propio o ajeno. Si no funciona, verifica que las reglas de iptables dejan pasar el tráfico de salida al 53 UDP.

    ¡Saludos!

  21. Si el servidor funciona perfectamente solo en mi equipo, si cacheo las paginas resuelven sin problemas, es como dices, entran tan rápido como si la pagina estuviera localmente alojada. Ahora yo habilite el puerto al firewall, porque me conecte con el a través de una minilaptop para ver si bootea por red y funciona perfectamente.

    Robe con el servidor de Google y nada 8.8.8.8.

    Bueno mañana seguire haciendo pruebas, porque me toca trabajar hoy, probare hacer las conexiones manualmente otra vez, y probare otra vez.

    Ah se me olvidaba, el servidor como te dije resuelve a los demas equipos, porque este le entrega las direcciones ip, que yo le establecí en el archivo de conf, pero el problema se presenta a la hora de resolver los nombres.

    Bueno ya te contare mañana.

    • AL día de hoy todavía lo tengo funcionando al sistema tal cual lo publiqué en su momento y con todo el software implicado actualizado a la última versión disponible así que sigue siendo valido, si.

      Suerte con eso, cualquier consulta me chiflás.

      ¡Saludos!

  22. Hola, muy buena la guía. Mi inquietud es la siguiente, si tengo 2 gb de ram, ¿No se puede usar el cd instalador de windows?, ¿solo tiene que ser live?, porque estuve probado con WINNER y solo tiene soporte para windows xp sp2.
    Hago reparación de pc y tengo una notebook sin lectora de cd, y por usb no va.

  23. hola, muy buen post, yo lo realice con éxito en algunas iso´s, . Ya se que es una pregunta reiterativa del post, pero no entendi la respuesta, yo estoy tratando de hacer un server con estas características, pero para realizar instalaciones de maquinas por red, osea que me botee por PXE me muestre un menú de las diferentes iso y i cuando elija una que empiece la instalación…. se puede hacer algo así? y con que software así lo investigo.
    Desde ya muchas gracias.
    Sebas

  24. Hola , yo quiero armar un sistema par aque maquinas remotas osea lejos se inicien con un CD boot y carguen xp y luego ejecuten un programa de música en esa pc, es como para hacer una rocola que usa la info remotamente,, nose si me explico,,, la maquina no tendrá nada, todo cargara desde una red VPN , Y ASI LOGRAR QUE ESAS MAQUINAS FUNCIONEN POR INTERNET SOLO CON UN CD-BOT DE WIN XP , Y TODA LA INFO ES CARGADA DESDE UN SERVIDOR.. ES UN BUEN PROYECTO.. SALUDOS GRACIAS

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Wordpress Hashcash needs javascript to work, but your browser has javascript disabled. Your comment will be queued in Akismet!