                             Introduccion a NanoBSD

  Daniel Gerzo

   Revision: 43126

   Copyright (c) 2006 The FreeBSD Documentation Project

   FreeBSD is a registered trademark of the FreeBSD Foundation.

   Many of the designations used by manufacturers and sellers to distinguish
   their products are claimed as trademarks. Where those designations appear
   in this document, and the FreeBSD Project was aware of the trademark
   claim, the designations have been followed by the "(TM)" or the "(R)"
   symbol.

   2013-11-07 por gabor.
   Resumen

   Este documento trata sobre NanoBSD. NanoBSD es una herramienta que permite
   crear imagenes del sistema FreeBSD para su uso en aplicaciones empotradas
   y listas para cargarse en una tarjeta Compact Flash (u otro medio de
   almacenamiento masivo).

   Traduccion de German Marcos <gri.msg@gmail.com>.

     ----------------------------------------------------------------------

   Tabla de contenidos

   1. Introduccion a NanoBSD

   2. NanoBSD "Howto"

   Indice

1. Introduccion a NanoBSD

   NanoBSD es una herramienta actualmente desarrollada por Poul-Henning Kamp.
   Crea una imagen del sistema FreeBSD para aplicaciones empotradas lista
   para su uso en una tarjeta Compact Flash (u otro medio de almacenamiento
   masivo).

   Puede utilizarse para generar imagenes instalables especiales; esta
   disenado pensando en una instalacion y mantenimiento faciles en sistemas
   conocidos como "sistemas empotrados". Los sistemas empotrados tienen
   hardware y software integrado en el producto, lo que significa que todas
   las aplicaciones estan preinstaladas. Estos dispositivos pueden conectarse
   a una red dada y comenzar a trabajar (casi) inmediatamente.

   Las caracteristicas de NanoBSD incluyen:

     * Los ports y paquetes funcionan como en FreeBSD: Cualquier aplicacion
       puede instalarse y usarse en una imagen de NanoBSD de la misma forma
       que en FreeBSD.

     * No se pierde funcionalidad: Si es posible hacer algo en FreeBSD es
       posible hacer lo mismo en NanoBSD, a menos que se haya eliminado
       explicitamente esa caracteristica o caracteristicas especiales al
       crear la imagen de NanoBSD.

     * Todo esta en modo de solo lectura durante el funcionamiento del
       sistema: Un apagado brusco es totalmente seguro. No es necesario
       ejecutar fsck(8) despues de que el sistema sufra un apagon.

     * Facil de generar y personalizar: Usando un solo script de shell y un
       fichero de configuracion pueden generarse imagenes reducidas y
       personalizadas que satisfagan cualquier necesidad.

2. NanoBSD "Howto"

  2.1. El diseno de NanoBSD

   Una vez que la imagen esta en el medio puede arrancar NanoBSD. El medio de
   almacenamiento se divide por omision en tres partes:

     * Dos particiones de la imagen: code#1 y code#2.

     * La particion que contiene los ficheros de configuracion, que puede
       montarse bajo /cfg durante el funcionamiento del sistema.

   Estas particiones se montan normalmente en modo de solo lectura.

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

   La particion de los ficheros de configuracion permanece bajo el directorio
   /cfg. Este directorio contiene ficheros que usa el directorio /etc y se
   monta en modo de solo lectura inmediatamente despues 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 despues del reinicio del
   sistema.

   Ejemplo 1. Como hacer cambios persistentes en /etc/resolv.conf

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

  Nota:

   La particion que contiene el directorio /cfg deberia montarse unicamente
   en el arranque y mientras se sobreescriben los ficheros de configuracion.

   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 numero elevado de escrituras en
   la particion (i.e. cuando el sistema de ficheros sincroniza los datos con
   el sistema de discos).

  2.2. Como 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 debera 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         
     generacion de NanoBSD.                                                   
   2 Comienza el proceso de generacion.                                       
   3 Cambia el directorio actual por el directorio donde se encuentra la      
     imagen generada.                                                         
   4 Instala NanoBSD dentro del medio de almacenamiento.                      

  2.3. Personalizacion de una imagen de NanoBSD

   Esta es probablemente la caracteristica mas importante y mas interesante
   de NanoBSD. Tambie es donde usted pasara la mayor parte del tiempo cuando
   este desarrollando con NanoBSD.

   La invocacion del siguiente comando forzara al script nanobsd.sh a leer su
   configuracion desde el fichero mi-configuracion.nano ubicado en el
   directorio actual:

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

   La personalizacion se hace de dos maneras:

     * Opciones de configuracion

     * Funciones personalizadas

    2.3.1. Opciones de configuracion

   Por medio de ajustes de configuracion es posible configurar las opciones
   que se pasan a las fases buildworld e installworld del proceso de
   generacion de NanoBSD. Mediante estas opciones puede reducirse el tamano
   del sistema de manera que pueda incluso encajar en algo tan pequeno como
   un dispositivo de 64MB. Es posible recortar FreeBSD incluso mas, hasta que
   consista unicamente en el kernel y dos o tres ficheros de "userland".

   El fichero de configuracion esta compuesto por opciones de configuracion
   que sobreescriben los valores por omision. Las directivas mas importantes
   son:

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

     * NANO_SRC : Ruta al codigo fuente que se usara para generar la imagen.

     * NANO_KERNEL : Nombre del fichero de configuracion del kernel que se
       usara 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 usara.
       Para mas informacion 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 configuracion. En el siguiente ejemplo vemos un
   modelo basico de funcion personalizada.

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

   A continuacion vemos un ejemplo mas util de funcion personalizada, que
   cambia el tamano por omision 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 personalizacion 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 traves de sshd(8).

     * cust_install_files : Instala ficheros de configuracion desde el
       directorio nanobsd/files, que contiene scripts utiles para la
       administracion del sistema.

    2.3.3. Como anadir paquetes

   Se pueden anadir paquetes a la imagen de NanoBSD usando una funcion
   personalizada. La siguiente funcion instalara 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 configuracion

   El siguiente es un ejemplo completo de fichero de configuracion 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. Como actualizar NanoBSD

   El proceso de actualizacion de NanoBSD es relativamente simple:

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

    2. Copiar la nueva imagen sobre la particion no utilizada del sistema
       empotrado que esta usando NanoBSD.

       La diferencia mas importante entre este paso y la instalacion 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 particion).

    3. Reiniciar y arrancar el sistema desde la particion que se acaba de
       instalar.

    4. Si todo va bien la actualizacion ha terminado.

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

   Para facilitar la instalacion de una imagen nueva en su sistema NanoBSD en
   funcionamiento dispone de los scripts updatep1 y updatep2, ubicados en el
   directorio /root. La eleccion de uno u otro script depende de que
   particion este ejecutando el sistema, la primera o la segunda.

   Dependiendo de los servicios disponibles en la maquina que va a servir la
   nueva imagen de NanoBSD y del tipo de transferencia de datos que prefiera
   uno de estos tres metodos le resultara mas 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 ejecutara
   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 maquina 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 maquina que sirve la
       imagen y enviela al cliente:

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

  Nota:

       Asegurese de que el puerto elegido no tenga bloqueadas las conexiones
       entrantes desde la maquina NanoBSD por ningun cortafuegos.

    2. Conectese a la maquina que va servir la nueva imagen y ejecute el
       script updatep1:

 # nc mi-maquina 2222 | sh updatep1

Indice

  N

   NanoBSD, Introduccion a NanoBSD
