Servidor de ficheros ******************** Comenzaremos por preparar el servidor con los ficheros necesarios para la descarga. Lo más aconsejable es montar tanto un servidor |TFTP| para descargar el |NBP| como un servidor |HTTP| para descargar el resto. .. _pxe-ficheros: Estructura ========== La estructura de ficheros en nuestro disco será esta: .. code-block:: none +-- /srv/tftp | +--- bios | | | +--- lpxelinux.0 | +--- syslinux | | | +--- ldlinux.c32 | +--- menu.c32 | +--- reboot.c32 | +--- ... otros módulos ... | +--- ssoo | | | + memtest86+.bin | + slitaz | | | | | +--- bzImage | | +--- rootfs.gz | | | + ... un directorio por cada sistema arrancable ... | | +--- cfg | | | +--- boot.php | +--- efi32 (misma estructura que bios) +--- efi64 (misma estrctura que bios) Esto es: * Un directorio :file:`/srv/tftp` que compartiremos mediante los servicios |TFTP| y |HTTP|. * Un subdirectio :file:`bios` en el que se almacenarán todos los ficheros que necesite :file:`syslinux` para hacer su labor. Estos ficheros son los apropiados cuando tenemos una |BIOS| y no una |UEFI|. * Los subdirectorios :file:`efi32` y :file:`efi64` contienen las versiones correspondientes de los ficheros de :program:`syslinux`. Téngase en cuenta que en estos dos casos el |NBP| no se llama :program:`lpxelinux.0` sino :program:`syslinux.efi`. * Un subdirectorio llamado :file:`cfg` que contendrá los ficheros de configuración de :program:`syslinux` que permitirán la selección del sistema. Los ficheros podemos obtenerlos de los siguientes paquetes: **syslinux-common** Contiene los módulos de :program:`syslinux` necesarios incluidos en los subdirectorios :file:`bios`, :file:`efi32` y :file:`efi64`. **pxelinux** Contiene el ejecutable :program:`lpxelinux.0` del subdirectorio :file:`bios`. **syslinux-efi** Contiene los ejecutables :program:`syslinux.efi` de los subdirectorios :file:`efi32` y :file:`efi64`. **memtest86+** Contiene el ejecutable :program:`memtest86+.bin`. En consecuencia:: # apt install syslinux-{common,efi} pxelinux memtest86+ Para crear la estructura de directorios podemos ejecutar:: # mkdir -p /srv/tftp/{{bios,efi32,efi64}/{syslinux,pxelinux.cfg},ssoo,cfg} Para incluir los ficheros que proporcionan estos paquetes en nuestra estructura, basta con hacer enlaces simbólicos. Por ejemplo:: # ln -s /usr/lib/PXELINUX/lpxelinux.0 /srv/tftp/bios/ Nuestra estrategia para las descargas es la siguiente: #. El cliente |PXE| descargará por |TFTP| el |NBP| correspondiente (:program:`lpxelinux.0` en arquitecturas con |BIOS|). .. _pxe-cambio-a-http: #. El |NBP| ya es capaz de descargar por |HTTP|, pero ello exige enviar al cliente la opción |DHCP| **210**, que en :program:`dnsmasq` se haría del siguiente modo:: dhcp-option-force=210,http://192.168.255.1/boot/bios/ o, mejor aún, encapsulándola en la opción **43**:: dhcp-option=encap:43,210,http://192.168.255.1/boot/bios/ #. A partir de ahora los módulos y las configuraciones se descargarán por |HTTP| y ya explicaremos :ref:`al llegar a él ` qué estrategia seguimos. .. warning:: Aunque la estructura se ha creado para poder soportar el arranque tanto desde |BIOS| como desde |UEFI| las explicaciones sobre el servicio |PXE| se ceñirán a dar soporte sólo a la primera arquitectura. Ahora bien, al final, como particularidad, se explicará como hacer que el servicio |PXE| sea capaz de :ref:`soportar las tres arquitecturas `. .. note:: Si decidimos prescindir de un servidor |HTTP| y realizar todas las descargas |TFTP| es obvio que necesitaremos incluir dentro de la estructura de directorios del servidor |TFTP| un fichero de configuración para :program:`syslinux`: .. code-block:: none +-- /srv/tftp | +--- bios | | | +--- lpxelinux.0 | +--- syslinux | | | | | +--- ... modulos ... | | | +--- pxelinux.cfg | | | +--- default | +--- ssoo (estructura referida más arriba) +--- efi32 (misma estructura que bios) +--- efi64 (misma estructura que bios) .. _pxe-tftp: |TFTP| ====== Habilitar el servicio es sumamente sencillo, si pensamos usar :program:`dnsmasq` en el :ref:`primer escenario ` (en el :ref:`segundo ` y :ref:`tercero ` es obligatorio su uso), porque incluye un servidor que puede habilitarse, simplemente, con:: enable-tftp tftp-root=/srv/tftp En cambio, si :ref:`en el primer escenario usamos el servidor del ISC ` tendremos que instalar un servidor aparte. El más simple es el que proporciona el paquete :deb:`tftpd`, pero tiene dos inconvenientes: * Sólo está preparado para usarse con :program:`inetd`. * No soporta descargas de más de 32MB, lo cual es un incoveniente si no pensamos montar un servidor |HTTP|. .. _atftpd: Por tanto, instalaremos :program:`atftp`:: # apt-get --no-install-recommends install atftpd para cuya configuración basta con editar el fichero de configuración :file:`/etc/default/atftpd` y evitar que se use :program:`inetd`:: USE_INETD=false Podremos ver, además, que la configuración ya viene preparada para compartir el contenido de :file:`/srv/tftp`, que es lo que pretendemos. .. _pxe-http: |HTTP| ====== .. note:: Utilizaremos :ref:`nginx ` como servidor |HTTP|. Al tratar los ficheros que serviremos, redefinimos el *directorio de trabajo* como:: http://192.168.255.1/boot/bios/ y esto requiere algunas puntualizaciomes. Mirando la estructura de ficheros, está claro que el directorio que queremos hacer accesible a través de |HTTP| es :file:`/srv/tftp`. Que este directorio sea accesible mediante la dirección :kbd:`http://192.168.255.1/boot/` es, sin embargo, discutible. Una solución alternativa sería hacer accesible el directorio a través de la dirección :kbd:`http://boot/`, pero tal cosa exigiría configurar un servidor |DNS| que permitiera resolver el nombre *boot.aula.ies* a la dirección |IP|. Seguiremos el camino preestablecido y en las particularidades veremos :ref:`cómo rematar la configuración haciendo uso de un nombre `. El fichero de configuración para :program:`nginx` es el siguiente: .. literalinclude:: files/nginx-pxe :emphasize-lines: 21 Un vistazo al fichero de configuración descubre nuestra industria: en principio, al cargar por segunda vez el |NBP| redefinimos el *directorio de trabajo* simplemente para cambiar de protocolo, pero nada más. Por tanto, éste seguirá buscando la configuración probando los mismos ficheros. La consecuencia es que volveríamos a leer el mismo :file:`pxelinux.cfg/default` y se entraría en un bucle infinito. Sin embargo, la línea resaltada captura la petición del fichero cuyo nombre coincide con la |MAC| de la tarjeta, que es anterior, y posibilita que se ejecute el script de |PHP| :file:`cfg/boot.php` haciéndole accesibles a través de los argumentos la propia |MAC| y la arquitectura de arranque. Como en el *script* se puede preguntar por la |IP| del cliente, podemos usar estos tres datos para particularizar la configuración. .. _pxe-http-estatica: Si **no** tenemos propósito de hacer configuraciones dinámicas, podemos simplificar un poco: .. literalinclude:: files/nginx-pxe-estatica :emphasize-lines: 24-26 Por último, quedaría escribir :file:`cfg/boot.php` o :file:`cfg/default` según el caso, pero eso lo dejaremos para :ref:`más adelante `. .. |PXE| replace:: :abbr:`PXE (Preboot eXecution Environment)` .. |NBP| replace:: :abbr:`NBP (Network Bootstrap Program)` .. |BIOS| replace:: :abbr:`BIOS (Basic Input/Output System)` .. |TFTP| replace:: :abbr:`TFTP (Trivial FTP)` .. |UEFI| replace:: :abbr:`UEFI (Unified Extensible Firmware Interface)` .. |PHP| replace:: :abbr:`PHP (PHP Hypertext Preprocessor)` .. |MAC| replace:: :abbr:`MAC (Media Access Control)`