2. NanoBSD “Howto”

2.1. El diseño de NanoBSD

Una vez que la imagen está en el medio puede arrancar NanoBSD. El medio de almacenamiento se divide por omisión en tres partes:

Estas particiones se montan normalmente en modo de sólo lectura.

Los directorios /etc y /var son discos md(4) (malloc).

La partición de los ficheros de configuración permanece bajo el directorio /cfg. Este directorio contiene ficheros que usa el directorio /etc y se monta en modo de sólo lectura inmediatamente después del arranque; por lo tanto, es necesario que los ficheros que se modifiquen en /etc se copien en /cfg si se desea que los cambios perduren después del reinicio del sistema.

Ejemplo 1. Cómo hacer cambios persistentes en /etc/resolv.conf

# vi /etc/resolv.conf
[...]
# mount /cfg
# cp /etc/resolv.conf /cfg
# umount /cfg

Nota: La partición que contiene el directorio /cfg debería montarse únicamente en el arranque y mientras se sobreescriben los ficheros de configuración.

No es buena idea montar siempre el directorio /cfg, especialmente si el sistema NanoBSD se ejecuta en un dispositivo de almacenamiento masivo que pueda verse afectado negativamente por un número elevado de escrituras en la partición (i.e. cuando el sistema de ficheros sincroniza los datos con el sistema de discos).

2.2. Cómo generar una imagen de NanoBSD

Una imagen de NanoBSD se genera usando el sencillo script de shell nanobsd.sh, ubicado en el directorio /usr/src/tools/tools/nanobsd. El script crea una imagen que se deberá copiar al medio de almacenamiento mediante la utilidad dd(1).

Los comandos necesarios para generar una imagen de NanoBSD son:

# cd /usr/src/tools/tools/nanobsd (1)
# sh nanobsd.sh (2)
# cd /usr/obj/nanobsd.full (3)
# dd if=_.disk.full of=/dev/da0 bs=64k (4)
(1)
Cambia el directorio actual por el directorio base del script de generación de NanoBSD.
(2)
Comienza el proceso de generación.
(3)
Cambia el directorio actual por el directorio donde se encuentra la imagen generada.
(4)
Instala NanoBSD dentro del medio de almacenamiento.

2.3. Personalización de una imagen de NanoBSD

Esta es probablemente la característica más importante y más interesante de NanoBSD. Tambié es donde usted pasará la mayor parte del tiempo cuando esté desarrollando con NanoBSD.

La invocación del siguiente comando forzará al script nanobsd.sh a leer su configuración desde el fichero mi-configuracion.nano ubicado en el directorio actual:

# sh nanobsd.sh -c mi-configuracion.nano

La personalización se hace de dos maneras:

2.3.1. Opciones de configuración

Por medio de ajustes de configuración es posible configurar las opciones que se pasan a las fases buildworld e installworld del proceso de generación de NanoBSD. Mediante estas opciones puede reducirse el tamaño del sistema de manera que pueda incluso encajar en algo tan pequeño como un dispositivo de 64MB. Es posible recortar FreeBSD incluso más, hasta que consista únicamente en el kernel y dos o tres ficheros de “userland”.

El fichero de configuración está compuesto por opciones de configuración que sobreescriben los valores por omisión. Las directivas más importantes son:

  • NANO_NAME : Nombre de la generación que estamos ejecutando (se usa para dar nombres a los directorios donde encontraremos el resultado del proceso).

  • NANO_SRC : Ruta al código fuente que se usará para generar la imagen.

  • NANO_KERNEL : Nombre del fichero de configuración del kernel que se usará para generar el kernel.

  • CONF_BUILD : Opciones que se pasan a la fase buildworld.

  • CONF_INSTALL : Opciones que se pasan a la fase installworld.

  • CONF_WORLD : Opciones que se pasan tanto a buildworld como a installworld.

  • FlashDevice : Define el tipo de medio de almacenamiento que se usará. Para más información consulte el fichero FlashDevice.sub.

2.3.2. Funciones personalizadas

Puede ajustar NanoBSD de forma muy precisa mediante el uso de funciones de shell en el fichero de configuración. En el siguiente ejemplo vemos un modelo básico de función personalizada.

cust_foo () (
    echo "bar=topless" > \
      ${NANO_WORLDDIR}/etc/foo
)
customize_cmd cust_foo

A continuación vemos un ejemplo más útil de función personalizada, que cambia el tamaño por omisión del directorio /etc de 5MB a 30MB:

cust_etc_size () (
    cd ${NANO_WORLDDIR}/conf
    echo 30000 > default/etc/md_size
)
customize_cmd cust_etc_size

Hay unas pocas funciones de personalización predefinidas listas para su uso:

  • cust_comconsole : Deshabilita getty(8) en los dispositivos VGA (los nodos de dispositivo /dev/tty*) y habilita el uso del puerto serie COM1 para que sea la consola del sistema.

  • cust_allow_ssh_root : Permite a root acceder a través de sshd(8).

  • cust_install_files : Instala ficheros de configuración desde el directorio nanobsd/files, que contiene scripts útiles para la administración del sistema.

2.3.3. Cómo añadir paquetes

Se pueden añadir paquetes a la imagen de NanoBSD usando una función personalizada. La siguiente función instalará todos los paquetes que se encuentren en /usr/src/tools/tools/nanobsd/packages:

install_packages () (
    mkdir -p ${NANO_WORLDDIR}/packages
    cp /usr/src/tools/tools/nanobsd/packages/* ${NANO_WORLDDIR}/packages
    chroot ${NANO_WORLDDIR} sh -c 'cd packages; pkg_add -v *;cd ..;'
    rm -rf ${NANO_WORLDDIR}/packages
)
customize_cmd install_packages

2.3.4. Ejemplo de fichero de configuración

El siguiente es un ejemplo completo de fichero de configuración para generar una imagen personalizada de NanoBSD:

NANO_NAME=custom
NANO_SRC=/usr/src
NANO_KERNEL=MYKERNEL
NANO_IMAGES=2

CONF_BUILD='
NO_KLDLOAD=YES
NO_NETGRAPH=YES
NO_PAM=YES
'

CONF_INSTALL='
NO_ACPI=YES
NO_BLUETOOTH=YES
NO_CVS=YES
NO_FORTRAN=YES
NO_HTML=YES
NO_LPR=YES
NO_MAN=YES
NO_SENDMAIL=YES
NO_SHAREDOCS=YES
NO_EXAMPLES=YES
NO_INSTALLLIB=YES
NO_CALENDAR=YES
NO_MISC=YES
NO_SHARE=YES
'

CONF_WORLD='
NO_BIND=YES
NO_MODULES=YES
NO_KERBEROS=YES
NO_GAMES=YES
NO_RESCUE=YES
NO_LOCALES=YES
NO_SYSCONS=YES
NO_INFO=YES
'

FlashDevice SanDisk 1G

cust_nobeastie() (
    touch ${NANO_WORLDDIR}/boot/loader.conf
    echo "beastie_disable=\"YES\"" >> ${NANO_WORLDDIR}/boot/loader.conf
)

customize_cmd cust_comconsole
customize_cmd cust_install_files
customize_cmd cust_allow_ssh_root
customize_cmd cust_nobeastie

2.4. Cómo actualizar NanoBSD

El proceso de actualización de NanoBSD es relativamente simple:

  1. Generar una nueva imagen de NanoBSD de la forma habitual.

  2. Copiar la nueva imagen sobre la partición no utilizada del sistema empotrado que está usando NanoBSD.

    La diferencia más importante entre este paso y la instalación inicial de NanoBSD es que ahora en lugar de usar el fichero _.disk.full (que contiene una imagen de todo el disco) se instala la imagen _.disk.image (que contiene una imagen de una sola partición).

  3. Reiniciar y arrancar el sistema desde la partición que se acaba de instalar.

  4. Si todo va bien la actualización ha terminado.

  5. Si algo va mal reinicie desde la partición anterior (que contiene la imagen vieja, pero que funciona) para recuperar el funcionamiento del sistema lo antes posible. Arregle los problemas de la nueva generación y repita el proceso.

Para facilitar la instalación de una imagen nueva en su sistema NanoBSD en funcionamiento dispone de los scripts updatep1 y updatep2, ubicados en el directorio /root. La elección de uno u otro script depende de qué partición esté ejecutando el sistema, la primera o la segunda.

Dependiendo de los servicios disponibles en la máquina que va a servir la nueva imagen de NanoBSD y del tipo de transferencia de datos que prefiera uno de estos tres métodos le resultará más o menos interesante:

2.4.1. Uso de ftp(1)

Si la prioridad es la velocidad de la transferencia use usted este ejemplo:

# ftp mi-maquina
get _.disk.image "| sh updatep1"

2.4.2. Uso de ssh(1)

Si la prioridad es la seguridad de la transferencia seguramente ejecutará algo muy parecido a lo siguiente:

# ssh mi-maquina cat _.disk.image.gz | zcat | sh updatep1

2.4.3. Uso de nc(1)

Si la máquina remota no dispone de servicios de ftp(1) ni de sshd(8) puede recurrir al siguiente ejemplo:

  1. Primero abra un puerto TCP de escucha en la máquina que sirve la imagen y envíela al cliente:

    mi-maquina# nc -l 2222 < _.disk.image
    

    Nota: Asegúrese de que el puerto elegido no tenga bloqueadas las conexiones entrantes desde la máquina NanoBSD por ningún cortafuegos.

  2. Conéctese a la máquina que va servir la nueva imagen y ejecute el script updatep1:

    # nc mi-maquina 2222 | sh updatep1
    

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>.