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.
Como 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.
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).
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, Instalación de aplicaciones: «packages» y ports 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 | |
La directiva
| |
La directiva
| |
La opción
|
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
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, Instalación de aplicaciones: «packages» y ports 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.
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.
Si PXE o etherboot se encuentran configurados para utilizar TFTP se necesita activar tftpd en el servidor de ficheros:
Crear un directorio desde el cual el dæmon
tftpd servirá los
ficheros, por ejemplo /tftpboot
.
Añadir la siguiente línea a
/etc/inetd.conf
:
tftp dgram udp wait root /usr/libexec/tftpd tftpd -l -s /tftpboot
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
.
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.
Añadir lo siguiente a
/etc/rc.conf
:
nfs_server_enable="YES"
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 -romargaux corbieres
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`
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, Configuración del kernel de FreeBSD) y copiarlo al lugar especificado
en el archivo dhcpd.conf
.
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
.
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"
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.
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.
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.
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.
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:
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-size64000
; }
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
El tamaño del fichero dedicado a intercambio
se debe expresar en /etc/bootptab
en formato hexadecimal.
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.
En el servidor NFS añadir a
/etc/exports
la siguiente línea:
/volumenintercambiored
-maproot=0:10 -alldirsmargaux corbieres
A continuación indicar a
mountd que vuelva a leer el fichero
/etc/exports
como se ha indicado
anteriormente.
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
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
.
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).
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>.