Manual de FreeBSD
Anterior | Capítulo 29. Networking avanzado | Siguiente

# 29.7. Ejecución sin disco duro

Actualizado por Jean-François Dockès. Reorganizado y ampliado por Alex Dupre.

Una máquina FreeBSD se puede arrancar a través de la red y operar sin que necesite poseer ningún disco, utilizando sistemas de ficheros de un servidor de NFS. No se necesita realizar ninguna modificación al sistema, salvo configurar determinados ficheros. Este tipo de sistemas se pueden configurar fácilmente puesto que FreeBSD dispone de todos los elementos necesarios:

- Existen al menos dos formas de cargar el núcleo del sistema operativo a través de la red:

  - PXE: El sistema de Intel® conocido como Preboot Execution Environment. Se trata de una especie de arranque inteligente a partir de una memoria de sólo lectura (ROM) que se encuentra en algunas placas bases y tarjetas de red. Se puede obtener más información en pxeboot(8).

  - El port etherboot (`net/etherboot`) genera código de sólo lectura (código ROM) que se puede utilizar para arrancar máquinas a través de la red. Dicho código se puede instalar en una memoria de arranque tipo PROM en algunas tarjetas de red o se puede cargar en una disquetera (o disco duro), y también en un sistema de ficheros MS-DOS® que esté en ejecución. Varias tarjetas de red soportan este mecanismo.

- Existe un script de ejemplo (`/usr/share/examples/diskless/clone_root`) que facilita la creación y el mantenimiento del sistema de ficheros raíz de la estación de trabajo en el servidor. La configuración de este script se debe retocar ligeramente pero sirve como punto de partida para comenzar rápidamente.

- Existen ficheros estándar de arranque bajo `/etc` que dan soporte al arranque de máquinas sin disco.

- El swapping, en caso de ser necesario, se puede realizar usando NFS y tambíen usando un disco duro local.

Existen varias formas de ejecutar una estación de trabajo sin discos. En el proceso se involucran distintos elementos y la mayoría se pueden adaptar a las necesidades del usuario. A continuación se describen variaciones sobre la configuración de un sistema sin discos, haciendo incapié en la simplicidad y compatibilidad con los scripts de arranque de FreeBSD. El sistema que vamos a describir tiene las siguientes características.

- Las estaciones de trabajo sin disco utilizan un sistema de ficheros `raíz` de sólo lectura y un sistema de ficheros compartido, también de sólo lectura, bajo `/usr`.

  El sistema de ficheros `raíz` es una copia del sistema raíz estandar de FreeBSD (normalmente del sistema raíz del servidor), donde se sobreescriben algunos archivos de configuración necesarios para la ejecución sin discos y para la configuración local específica de la máquina objetivo.

  Las partes del sistema de ficheros `raíz` que tiene que tener permisos de lectura y escritura se superponen con los sistemas de ficheros mfs(8) (FreeBSD 4.X) o md(4). Cualquier cambio que se produzca en dichas partes se perderá cuando se reinicie el sistema.

- El núcleo se transmite y se carga utilizando etherboot o bien PXE, dependiendo del hardware y los mecanismos que se soporten.

> AtenciónComo se ha comentado con anterioridad estos sistemas son inseguros. Se debe confinar dentro de una red protegida y el resto de las máquinas por defecto no deben confiar en estos métodos.

Toda la información que se presenta en esta sección se ha probado utilizando FreeBSD 4.9-RELEASE y 5.2.1-RELEASE. El texto se encuentra estructurado principalmente para utilización en sistemas 4.X. Se insertan notas para indicar cambios producidos en las versiones 5.X.

## 29.7.1. Conocimientos previos

Configurar estaciones de trabajo sin discos es una operación relativamente sencilla pero en la que pueden cometerse errores. Estos errores resultan algunas veces difíciles de diagnosticar debido a razones que vamos a exponer a continuación. Por ejemplo:

- Diferentes opciones de tiempo de compilación pueden determinar comportamientos distintos en tiempo de ejecución.

- Los mensajes de error a menudo resultan crípticos o incluso no existen.

Se se quieren resolver los posibles problemas que puedan surgir resulta muy útil conocer el funcionamiento conceptual del mecanismo.

Para que el arranque se produzca exitosamente se deben realizar varias operaciones:

- La máquina necesita obtener algunos parámetros iniciales, tales como su dirección IP, el fichero ejecutable, el nombre del servidor y la ruta raíz. Esto se realiza utilizando los protocolos DHCP o BOOTP. DHCP es una extensión compatible del protocolo BOOTP y utiliza los mismos números de puertos y los mismos formatos de paquete básicos.

  Es posible configurar un sistema de tal forma que utilice sólamente BOOTP. En el sistema base de FreeBSD se incluye el programa servidor bootpd(8).

  No obstante DHCP posee varias ventajas sobre BOOTP (archivos de configuración más limpios, posibilidad de ejecutar PXE, junto con otras características que no se relacionan directamente con el tema que estamos tratando tratando) por lo que principalmente se va a describir la configuración de DHCP, proporcionando ejemplos equivalentes en bootpd(8) siempre que sea posible. La configuración de ejemplo se basa en el paquete software de ISC DHCP (en el servidor de prueba se instaló la versión 3.0.1.r12).

- La máquina sin disco necesita transferir uno o varios programas a la memoria local. Para ello se usa TFTP o bien NFS. La elección entre ambos se produce mediante la configuración de la compilación que se produce en varios lugares. Una fuente de error típica aparece cuando se especifican ficheros con el protocolo incorrecto: TFTP normalmente transfiere todos los ficheros desde un único directorio del servidor, de modo que espera nombres de ficheros relativos a dicho directorio. Por otro lado NFS necesita recibir rutas de fichero absolutas.

- El kernel y los programas de arranque intermedios deben ser inicializados y ejecutados. Existen diferencias importantes en este área:

  - PXE carga pxeboot(8), una versión modificada de la tercera fase del cargador de arranque de FreeBSD. loader(8) obtiene la mayoría de los parámetros necesarios para arrancar el sistema y los deposita en variables de entorno del kernel antes de tranferir el control. En este caso es posible utilizar un un núcleo `GENERIC` .

  - etherboot carga directamente el directamente el núcleo con menos trabajo previo que el método anterior. Para ello se debe compilar un núcleo con ciertas opciones.

  PXE y etherboot funcionan muy bien en los sistemas 4.X. Dado que los núcleos de los sistemas 5.X permiten que el loader(8) realice más tareas, se prefiere usar PXE.

  Si su BIOS y su tarjeta de red soportan PXE lo normal es utilizarlo. No obstante se puede arrancar un sistema 5.X utilizando etherboot.

- Para acabar la tarea la máquina necesita acceder al sistema de ficheros. En todos los casos se utiliza NFS.

No olvide consultar diskless(8).

## 29.7.2. Instrucciones de configuración

### 29.7.2.1. Configuración utilizando ISC DHCP

El servidor ISC DHCP puede responder tanto a peticiones de BOOTP como a peticiones de DHCP.

ISC DHCP no forma parte de la versión 4.9 de FreeBSD por lo que se debe instalar el port `net/isc-dhcp3-server` o el paquete correspondiente. Por favor, consulte Capítulo 4 para obtener más información sobre los ports y los paquetes.

Una vez que ISC DHCP se encuentra instalado necesita un fichero de configuración para poder ejecutarse `/usr/local/etc/dhcpd.conf`). A continuación se muestra un ejemplo comentado, donde la máquina `margaux` utiliza etherboot y la máquina `corbieres` utiliza PXE:

    default-lease-time 600;
    max-lease-time 7200;
    authoritative;

    option domain-name "example.com";
    option domain-name-servers 192.168.4.1;
    option routers 192.168.4.1;

    subnet 192.168.4.0 netmask 255.255.255.0 {
      use-host-decl-names on;
      option subnet-mask 255.255.255.0;
      option broadcast-address 192.168.4.255;

      host margaux {
        hardware ethernet 01:23:45:67:89:ab;
        fixed-address margaux.example.com;
        next-server 192.168.4.4;
        filename "/data/misc/kernel.diskless";
        option root-path "192.168.4.4:/data/misc/diskless";
      }
      host corbieres {
        hardware ethernet 00:02:b3:27:62:df;
        fixed-address corbieres.example.com;
        next-server 192.168.4.4;
        filename "pxeboot";
        option root-path "192.168.4.4:/data/misc/diskless";
      }
    }

  Esta opción indica a dhcpd que envíe el valor que se encuentra en las declaraciones de `host` como el nombre de máquina para la máquina sin disco. Otra forma de hacer esto sería añadiendo una opción `option host-name `margaux`` dentro de las declaraciones de máquina.
  La directiva `next-server` selecciona el servidor de TFTP o de NFS que se debe utilizar para cargar el núcleo o el fichero cargador del núcleo (por defecto se utiliza la misma máquina que actúa como servidor de DHCP).
  La directiva `filename` define el archivo que etherboot o PXE cargará en el siguiente paso de ejecución. Debe especificarse de acuerdo con el método de transferencia seleccionado. Etherboot se puede compilar para que use NFS o TFTP. El sistema FreeBSD se configura por defecto para NFS. PXE utiliza TFTP por lo que se utiliza una ruta relativa para especificar el nombre del fichero (esto puede depender de la configuración del servidor de TFTP pero suele ser lo normal). Además PXE no carga el núcleo, lo hace `pxeboot`. Existen otras posibilidades interesantes, como cargar `pxeboot` desde el directorio `/boot` de una unidad de CD-ROM de FreeBSD (ya que pxeboot(8) puede cargar un núcleo `GENERIC` surge la posibilidad de utilizar PXE para arrancar desde una unidad de CD-ROM remota).
  La opción `root-path` define la ruta para el sistema de ficheros raíz utilizando la notación típica de NFS. Cuando se utiliza PXE, es posible dejar la dirección IP siempre y cuando no se active la opción del núcleo de BOOTP. El servidor NFS será en este caso el mismo que el servidor de TFTP.

### 29.7.2.2. Configuración utilizando BOOTP

A continuación se muestra la configuración equivalente utilizando bootpd (reducida a un único cliente). Esta configuración se debe situar en `/etc/bootptab`.

Por favor, recuerde que etherboot se debe compilar con la opción específica de `NO_DHCP_SUPPORT` para que pueda utilizar BOOTP y que PXE requiere DHCP. La única ventaja obvia de bootpd es que se encuentra disponible en el sistema base.

    .def100:\
      :hn:ht=1:sa=192.168.4.4:vm=rfc1048:\
      :sm=255.255.255.0:\
      :ds=192.168.4.1:\
      :gw=192.168.4.1:\
      :hd="/tftpboot":\
      :bf="/kernel.diskless":\
      :rp="192.168.4.4:/data/misc/diskless":

    margaux:ha=0123456789ab:tc=.def100

### 29.7.2.3. Preparación de un programa de arranque con Etherboot

La página web de Etherboot contiene una amplia documentación enfocada principalmente a los sistemas Linux pero en cualquier caso contiene información que puede resultar útil. En los siguientes párrafos se describe brevemente como se puede utilizar etherboot en un sistema FreeBSD.

Lo primero es instalar el port o paquete `net/etherboot`. El port de etherboot está en `/usr/ports/net/etherboot`. Si el árbol de ports está instalado en el sistema basta con ejecutar `make` en dicho directorio. Por favor, lea Capítulo 4 para saber más sobre los ports y los paquetes.

Se puede modificar la configuración de etherboot (por ejemplo, para que use TFTP en lugar de NFS) editando el fichero `Config` que se encuentra en el directorio fuente de etherboot.

Para nuestros propósitos se utilizará un disquete de arranque. Para utilizar otros métodos (PROM o un programa MS-DOS) por favor consulte la documentación de etherboot.

Para crear un disco de arranque se debe insertar un disco en la unidad de disquetes de la máquina donde se ha instalado etherboot, cambiar al directorio `src` dentro del árbol de directorios de etherboot y teclear:

    # gmake bin32/tipo_de_dispositivo.fd0

`tipo_de_dispositivo` depende del tipo de tarjeta Ethernet que se encuentre instalada en la estación de trabajo sin disco. Consulte el fichero `NIC` en el mismo directorio para determinar cúal es el `tipo_de_dispositivo` que debe usted usar.

### 29.7.2.4. Arranque con PXE

Por defecto el cargador pxeboot(8) carga, valga la redundancia, el kernel vía NFS. El El cargador se puede compilar para que utilice TFTP en lugar de NFS especificando la opción `LOADER_TFTP_SUPPORT` dentro de `/etc/make.conf`. Observe los comentarios de `/etc/defaults/make.conf` (o de `/usr/share/examples/etc/make.conf` para sistemas 5.X) para saber más detalles.

Existen otras dos opciones de `make.conf` no documentadas que pueden ser útiles para arrancar una máquina sin disco a través del puerto serie: `BOOT_PXELDR_PROBE_KEYBOARD` y `BOOT_PXELDR_ALWAYS_SERIAL` (esta última sólo existe en FreeBSD 5.X).

Para utilizar PXE cuando arranca la máquina normalmente el usuario tiene que seleccionar la opción `Boot from network` dentro del menú de opciones de la BIOS o pulsar un tecla de función cuando la máquina se está inicializando.

### 29.7.2.5. Configuración de servidores de TFTP y de NFS

Si PXE o etherboot se encuentran configurados para utilizar TFTP se necesita activar tftpd en el servidor de ficheros:

1. Crear un directorio desde el cual el dæmon tftpd servirá los ficheros, por ejemplo `/tftpboot`.

2. Añadir la siguiente línea a `/etc/inetd.conf`:

       tftp   dgram   udp     wait    root    /usr/libexec/tftpd      tftpd -l -s /tftpboot

   > Nota: Parece que al menos algunas versiones de PXE utilizan la versión TCP de TFTP. En este caso se puede añadir una segunda línea, donde se reemplace `dgram udp` por `stream tcp`.

3. Indicar a inetd que vuelva a leer su fichero de configuración:

       # kill -HUP `cat
                       /var/run/inetd.pid`

Se puede situar el directorio `tftpboot` en cualquier parte del servidor. Debe asegurarse de que la localización se encuentra correctamente configurada tanto en `inetd.conf` como en `dhcpd.conf`.

En todos los casos también resulta necesario activar el sistema de NFS y exportar los sistemas de ficheros adecuados, todo ello en el servidor de NFS.

1. Añadir lo siguiente a `/etc/rc.conf`:

       nfs_server_enable="YES"

2. Exportar el sistema de ficheros donde el directorio raíz sin disco se encuentra localizado añadiendo lo siguiente a `/etc/exports` (ajuste el punto de montaje de la unidad y sustituya `margaux corbieres` por el nombre de las estaciones de trabajo sin disco, según corresponda):

       /data/misc -alldirs -ro margaux corbieres

3. Indicar a mountd que vuelva a leer su archivo de configuración. Si en un primer paso se ha configurado la activación automática del sistema de NFS en `/etc/rc.conf` lo mejor es reiniciar para que los cambios surtan efecto.

       # kill -HUP `cat
                       /var/run/mountd.pid`

### 29.7.2.6. Construcción de un kernel sin disco

Si se utiliza etherboot, se necesita crear un archivo de configuración para el kernel de la máquina sin disco que posea las siguientes opciones (además de las opciones del núcleo habituales):

    options     BOOTP          # Use BOOTP to obtain IP address/hostname
    options     BOOTP_NFSROOT  # NFS mount root filesystem using BOOTP info

Puede resultar interesante utilizar además `BOOTP_NFSV3`, `BOOT_COMPAT` y `BOOTP_WIRED_TO` (consultar `LINT` en 4.X o `NOTES` en sistemas 5.X).

Los nombres de estas opciones son nombres históricos y ligeramente confusos ya que permiten un uso indistinto tanto de DHCP como de BOOTP dentro del núcleo (también resulta posible forzar la utilización única de o bien BOOTP o bien de DHCP).

Contruir el núcleo (vea Capítulo 8) y copiarlo al lugar especificado en el archivo `dhcpd.conf`.

> Nota: Cuando se utiliza PXE, la construcción del núcleo con las opciones anteriores no resulta ser algo estrictamente necesario (aunque se recomienda). Activar dichas opciones provoca un mayor tráfico de peticiones de DHCP durante el arranque del núcleo, lo que puede dar lugar a pequeñas inconsistencias entre los nuevos valores y los los valores recuperados por pxeboot(8) en casos muy específicos. La ventaja de utilizarlas consiste en que como un efecto colateral se configurará el nombre de la máquina. De otro modo tendríamos que configurar dicho nombre mediante otro método por ejemplo mediante la configuración específica de la máquina cliente a través del archivo `rc.conf`.

> Nota: Para que el núcleo se pueda cargar sin problemas con etherboot en sistemas 5.X dicho núcleo tiene que tener compilado el soporte para device hints. Para ello normalmente se especifica la siguiente opción dentro del fichero de configuración del núcleo (consulte los comentarios del fichero `NOTES`):

>     hints          "GENERIC.hints"

### 29.7.2.7. Preparación del sistema de ficheros raíz

Se debe crear un sistema de ficheros raíz en las estaciones de trabajo sin disco, concretamente en la localización especificada por `root-path` dentro de `dhcpd.conf`. Las siguientes secciones describen dos formas de hacer esto.

#### 29.7.2.7.1. Utilización del script `clone_root`

Este es el modo más rápido de crear un sistema de ficheros raíz, pero actulamente sólo se encuentra soportado en FreeBSD 4.X. El script de shell se encuentra en `/usr/share/examples/diskless/clone_root` y debe ser configurado al menos para ajustar el lugar donde se construirá el sistema de ficheros (concretamente la variable `DEST`).

Consulte los comentarios que se encuentran al comienzo del script para conocer cuales son las instrucciones que debe seguir. Allí se explica cómo se construye el sistema de ficheros base y como determinados ficheros se pueden sobreescribir de manera selectiva por versiones específicas para funcionar sin discos, para toda una subred o para una máquina individual. También allí se muestran ejemplos de los ficheros `/etc/fstab` y `/etc/rc.conf` para máquinas sin disco.

Los archivos `README` que se encuentran dentro de `/usr/share/examples/diskless` contienen mucha información de base, que junto con el resto de ejemplos dentro del directorio `diskless` sirven para documentar un método de configuración distinto del que se utiliza en `clone_root` y en los scripts del sistema de `/etc`, que resultan ser un tanto confusos. No obstante se pueden utilizar a modo de referencia, excepto si se prefiere utilizar el método que se describe en ellos, en cuyo caso se necesitará modificar y adaptar los scripts de forma adecuada.

#### 29.7.2.7.2. Utilización del procedimiento estándar de `make world`

Este método se puede utilizar tanto en FreeBSD 4.X o 5.X y se instalará un sistema completamente nuevo (no sólo el sistema de ficheros raíz) dentro de `DESTDIR`. Basta con ejecutar el siguiente script:

    #!/bin/sh
    export DESTDIR=/data/misc/diskless
    mkdir -p ${DESTDIR}
    cd /usr/src; make world && make kernel
    cd /usr/src/etc; make distribution

Una vez ejecutado puede ser necesario ajustar los ficheros `/etc/rc.conf` y `/etc/fstab` que se encuentran en `DESTDIR` de acuerdo con nuestras necesidades.

### 29.7.2.8. Configuración de la partición de intercambio

En caso de ser necesario se puede acceder a un fichero de intercambio (swap) a través del sistema NFS. Uno de los métodos típicamente utilizados para realizar esta tarea ha sido retirado de la distribución 5.X.

#### 29.7.2.8.1. NFS swap en sistemas FreeBSD 4.X

La ubicación del fichero de intercambio y su tamaño se puede especificar con las opciones FreeBSD-specific 128 y 129 de BOOTP/DHCP. A continuación se muestran varios ejemplos de ficheros de de configuración para ISC DHCP 3.0 o bootpd:

1. Añadir las siguientes líneas al fichero `dhcpd.conf`:

       # Global section
       option swap-path code 128 = string;
       option swap-size code 129 = integer 32;

       host margaux {
         ... # Standard lines, see above
         option swap-path "192.168.4.4:/netswapvolume/netswap";
         option swap-size 64000;
       }

   `swap-path` es la ruta al directorio donde se instalarán los archivos de intercambio. Cada Cada fichero se denomina `swap.`direccion-ip-del-cliente``.

   Versiones más antiguas de dhcpd usaban una sintáxis del estilo de `option option-128 "...`, lo cual ya no está soportado.

   `/etc/bootptab` normalmente utiliza la siguiente sintaxis:

       T128="192.168.4.4:/netswapvolume/netswap":T129=0000fa00

   > Nota: El tamaño del fichero dedicado a intercambio se debe expresar en `/etc/bootptab` en formato hexadecimal.

2. En el servidor de ficheros NFS donde va a residir el fichero de swap se debe(n) crear dicho(s) fichero(s)

       # mkdir /volumenintercambiored/intercambiored
       # cd /volumenintercambiored/intercambiored
       # dd if=/dev/zero bs=1024 count=64000 of=swap.192.168.4.6
       # chmod 0600 swap.192.168.4.6

   `192.168.4.6` es la dirección IP del cliente sin disco.

3. En el servidor NFS añadir a `/etc/exports` la siguiente línea:

       /volumenintercambiored  -maproot=0:10 -alldirs margaux corbieres

   A continuación indicar a mountd que vuelva a leer el fichero `/etc/exports` como se ha indicado anteriormente.

#### 29.7.2.8.2. NFS swap en FreeBSD 5.X

El núcleo no soporta la activación del intercambio a través de NFS en tiempo de arranque. De esta forma la swap se debe activar mediante los scripts montando un sistema de ficheros de lectura-escritura y creando y activando el fichero de intercambio. Para crear un fichero de intercambio de un determinado tamaño se puede ejecutar lo siguiente:

    # dd if=/dev/zero of=/ruta/al/fichero/de/intercambio bs=1k count=1 oseek=100000

Para activar el intercambio se tiene que añadir la siguiente línea al fichero de configuración `rc.conf`:

    swapfile=/ruta/al/fichero/de/intercambio

### 29.7.2.9. Varios

#### 29.7.2.9.1. Ejecución con un `/usr` de sólo lectura

Si la estación de trabajo sin disco se configura para utilizar el sistema X-Window se tiene que ajustar el fichero de configuración de xdm debido a que dicho fichero sitúa por defecto el fichero de logs de errores en el directorio `/usr`.

#### 29.7.2.9.2. Uso de un servidor no-FreeBSD

Cuando el servidor del sistema de ficheros raíz no ejecuta FreeBSD se tiene que crear un sistema de ficheros raíz sobre una máquina FreeBSD para después copiarlo al servidor original mediante las órdenes `tar` o `cpio`.

En esta situación algunas veces surgen varios problemas relacionados con los dispositivos especiales que se encuentran en el directorio `/dev` debido a los diferentes tamaños de los enteros mayor/menor. Una solución para este problema consiste en exportar un directorio del servidor no-FreeBSD, montar este directorio en la máquina FreeBSD anterior y ejecutar `MAKEDEV` en dicha máquina para crear las entradas de dispositivo correctas (FreeBSD 5.0 y posteriores utilizan devfs(5) para ubicar nodos de dispositivos de forma transparente para el usuario de tal modo que la ejecución de `MAKEDEV` en estos sistemas no sirve para nada).

Anterior | Inicio | Siguiente
NFS | Subir | RDSI

Puede descargar éste y muchos otros documentos desde ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Si tiene dudas sobre FreeBSD consulte la documentación antes de escribir a la lista <questions@FreeBSD.org>.
Envíe sus preguntas sobre la documentación a <doc@FreeBSD.org>.