---
title: Introducción a NanoBSD
authors:
  - author: Daniel Gerzo
copyright: 2006 The FreeBSD Documentation Project
releaseinfo: "$FreeBSD$" 
trademarks: ["freebsd", "general"]
---

= Introducción a NanoBSD
:doctype: article
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
:source-highlighter: rouge
:experimental:
:lang: es
:toc-title: Tabla de contenidos
:part-signifier: Parte
:chapter-signifier: Capítulo
:appendix-caption: Apéndice
:table-caption: Tabla
:figure-caption: Figura
:example-caption: Ejemplo

[.abstract-title]
Resumen

Este documento provee información acerca de la herramienta NanoBSD, la cual puede ser usada para crear imágenes del sistema de FreeBSD para aplicaciones embebidas, adecuadas para ser usadas en una tarjeta Compact Flash (o cualquier otro medio de almacenamiento masivo).

'''

toc::[]

[[intro]]
== Introducción a NanoBSD

NanoBSD es una herramienta actualmente desarrollada por Poul-Henning Kamp mailto:phk@FreeBSD.org[phk@FreeBSD.org]. Crea una imagen del sistema de FreeBSD para aplicaciones embebidas, adecuada para ser usada en una tarjeta Compact Flash (o cualquier otro medio de almacenamiento masivo).

Puede usarse para crear imágenes de instalación especializadas, diseñadas para instalar y mantener sistemas comúnmente llamados "aparatos de computación". Los aparatos de computación incluyen el hardware y software en el mismo producto, lo cual significa que todas las aplicaciones vienen preinstaladas. El aparato se conecta a una red existente y puede comenzar a funcionar (casi) de inmediato.

Las características de NanoBSD incluyen:

* Los ports y paquetes funcionan de la misma manera que en FreeBSD -- Cada aplicación puede ser instalada y usada en una imagen de NanoBSD, de la misma manera que en FreeBSD.
* No hay perdida de funcionalidad -- Si era posible hacer algo con FreeBSD, también será posible hacerlo con NanoBSD, a menos que esa característica específica haya sido eliminada de la imagen de NanoBSD cuando fue creada.
* Todo es de solo lectura en tiempo de ejecución -- Es seguro desconectar el cable del enchufe. No hay necesidad de ejecutar man:fsck[8] después de que el sistema se apague de una forma brusca.
* Es fácil de crear y personalizar -- Haciendo uso de un único script y solamente un archivo de configuración, es posible crear imágenes reducidas y personalizadas para satisfacer un conjunto arbitrario de requisitos.

[[howto]]
== NanoBSD paso a paso

[[design]]
=== El diseño de NanoBSD

Una vez que la imagen se encuentre presente en el medio es posible arrancar NanoBSD. El medio de almacenamiento masivo está dividido por defecto en tres partes:

* Dos particiones de la imagen: `code#1` y `code#2`.
* La partición del archivo de configuración, la cual puede ser montada bajo el directorio [.filename]#/cfg# en tiempo de ejecución.

Estas particiones normalmente se montan como solo lectura.

Los directorios [.filename]#/etc# y [.filename]#/var# son discos man:md[4] (malloc).

La partición del archivo de configuración reside en el directorio [.filename]#/cfg#. Contiene archivos para el directorio [.filename]#/etc# y se monta brevemente como una partición de solo lectura tras el arranque del sistema; por consiguiente, es necesaria para copiar archivos modificados desde [.filename]#/etc# de vuelta hacia el directorio [.filename]#/cfg# si se espera que los cambios persistan después de reiniciar el sistema.

.Hacer modificaciones persistentes de [.filename]#/etc/resolv.conf#
[example]
====

[source,shell]
....
# vi /etc/resolv.conf
[...]
# mount /cfg
# cp /etc/resolv.conf /cfg
# umount /cfg
....
====

[NOTE]
====
La partición que contiene [.filename]#/cfg# debería ser montada solo en el arranque y cuando se sustituyan las directivas de los archivos de configuración.

Mantener [.filename]#/cfg# montado todo el tiempo no es una buena idea, especialmente si el sistema NanoBSD se ejecuta en un medio de almacenamiento masivo que puede verse afectado negativamente por un alto número de escrituras a la partición (como cuando el sincronizador del sistema de archivos vuelca los datos hacia los discos del sistema).
====

=== Compilar una imagen de NanoBSD

Una imagen de NanoBSD se compila usando un simple shell script [.filename]#nanobsd.sh#, que se encuentra en el directorio [.filename]#/usr/src/tools/tools/nanobsd#. Este script crea una imagen, que puede ser copiada al medio de almacenamiento usando la utilidad man:dd[1].

Los comandos necesarios para compilar una imagen de NanoBSD son:

[source,shell]
....
# cd /usr/src/tools/tools/nanobsd <.>
# sh nanobsd.sh <.>
# cd /usr/obj/nanobsd.full <.>
# dd if=_.disk.full of=/dev/da0 bs=64k <.>
....

<.> Cambie el directorio actual al directorio base del script de compilación de NanoBSD.

<.> Comience el proceso de compilación.

<.> Cambie el directorio actual por el lugar donde se encuentren las imágenes compiladas.

<.> Instale NanoBSD en el medio de almacenamiento.

=== Personalizar una imagen de NanoBSD

Esta es probablemente la característica más importante y más interesante de NanoBSD. También es la que le llevará más tiempo cuando se encuentre desarrollando con NanoBSD.

Invocar el siguiente comando forzará a [.filename]#nanobsd.sh# a leer su configuración desde el archivo [.filename]#myconf.nano# localizado en el directorio actual:

[source,shell]
....
# sh nanobsd.sh -c myconf.nano
....

La personalización puede realizarse de dos formas:

* Opciones de configuración
* Funciones personalizadas

==== Opciones de configuración

Con las preferencias de configuración, es posible configurar las opciones pasadas a las etapas `buildworld` e `installworld` del proceso de compilación de NanoBSD, así como también opciones internas pasadas al proceso de compilación principal de NanoBSD. A través de estas opciones es posible reducir el sistema, para que pueda entrar en un espacio tan pequeño como 64MB. Puede utilizar estas opciones de configuración para reducir el tamaño de FreeBSD aún más, hasta que consista únicamente en el kernel y dos o tres archivos en espacio de usuario.

El archivo de configuración consiste en opciones de configuración que sobrescriben los valores por defecto. Las directivas más importantes son:

* `NANO_NAME` -- Nombre de la compilación (utilizada para crear los nombres de los directorios de trabajo).
* `NANO_SRC` -- Ruta al archivo fuente utilizada para compilar la imagen.
* `NANO_KERNEL` -- Nombre del archivo de configuración del kernel utilizado para compilar el kernel.
* `CONF_BUILD` -- Opciones pasadas a la etapa `buildworld` del proceso de compilación.
* `CONF_INSTALL` -- Opciones pasadas a la etapa `installworld` del proceso de compilación.
* `CONF_WORLD` -- Opciones pasadas a las etapas `buildworld` e `installworld` del proceso de compilación.
* `FlashDevice` -- Define el tipo de medio que se usará. Consulte [.filename]#FlashDevice.sub# para más detalles.

==== Funciones Personalizadas

Es posible configurar cada aspecto de NanoBSD utilizando funciones del shell en el archivo de configuración. El siguiente ejemplo ilustra el modelo básico de funciones personalizadas:

[.programlisting]
....
cust_foo () (
	echo "bar=baz" > \
		${NANO_WORLDDIR}/etc/foo
)
customize_cmd cust_foo
....

Un ejemplo más útil de una función de personalización es el siguiente, el cual cambia el tamaño por defecto del directorio [.filename]#/etc# de 5MB a 30MB:

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

Estas son algunas funciones de personalización incluidas por defecto y listas para ser usadas:

* `cust_comconsole` -- Deshabilita man:getty[8] en los dispositivos VGA (los nodos de dispositivo [.filename]#/dev/ttyv*#) y habilita el uso del puerto serie COM1 como la consola del sistema.
* `cust_allow_ssh_root` -- Permite que `root` se autentique mediante man:sshd[8].
* `cust_install_files` -- Instala archivos desde el directorio [.filename]#nanobsd/Files#, el cual contiene algunos scripts útiles para la administración del sistema.

==== Agregando paquetes

Pueden agregarse paquetes a la imagen de NanoBSD utilizando una función personalizada. La siguiente función instalará todos los paquetes situados en [.filename]#/usr/src/tools/tools/nanobsd/packages#:

[.programlisting]
....
install_packages () (
mkdir -p ${NANO_WORLDDIR}/packages
cp /usr/src/tools/tools/nanobsd/packages/* ${NANO_WORLDDIR}/packages
cp $(which pkg-static) ${NANO_WORLDDIR}/
chroot ${NANO_WORLDDIR} sh -c 'cd packages; /pkg-static add *;cd ..;'
rm -rf ${NANO_WORLDDIR}/packages ${NANO_WORLDDIR}/pkg-static
)
customize_cmd install_packages
....

==== Ejemplo de archivo de configuración

Un ejemplo completo de un archivo de configuración para crear una imagen personalizada de NanoBSD podría ser:

[.programlisting]
....
NANO_NAME=custom
NANO_SRC=/usr/src
NANO_KERNEL=MYKERNEL
NANO_IMAGES=2

CONF_BUILD='
WITHOUT_KLDLOAD=YES
WITHOUT_NETGRAPH=YES
WITHOUT_PAM=YES
'

CONF_INSTALL='
WITHOUT_ACPI=YES
WITHOUT_BLUETOOTH=YES
WITHOUT_FORTRAN=YES
WITHOUT_HTML=YES
WITHOUT_LPR=YES
WITHOUT_MAN=YES
WITHOUT_SENDMAIL=YES
WITHOUT_SHAREDOCS=YES
WITHOUT_EXAMPLES=YES
WITHOUT_INSTALLLIB=YES
WITHOUT_CALENDAR=YES
WITHOUT_MISC=YES
WITHOUT_SHARE=YES
'

CONF_WORLD='
WITHOUT_BIND=YES
WITHOUT_MODULES=YES
WITHOUT_KERBEROS=YES
WITHOUT_GAMES=YES
WITHOUT_RESCUE=YES
WITHOUT_LOCALES=YES
WITHOUT_SYSCONS=YES
WITHOUT_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
....

=== Actualizando NanoBSD

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

[.procedure]
====
. Compile una nueva imagen de NanoBSD, como de costumbre.
. Suba la nueva imagen a una partición sin usar de un aparato NanoBSD que se encuentre en ejecución.
+ 
La diferencia más importante entre este paso y la instalación inicial de NanoBSD es que ahora, en lugar de usar [.filename]#\_.disk.full# (que contiene la imagen completa del disco), se instala la imagen [.filename]#_.disk.image# (la cual contiene la imagen de una sola partición del sistema).
. Reinicie y arranque el sistema desde la partición recién instalada.
. Si todo terminó correctamente, la actualización habrá finalizado.
. Si algo sale mal, reinicie en la partición anterior (que contiene la antigua imagen que funciona correctamente), para restaurar la funcionalidad del sistema tan rápido como sea posible. Arregle los problemas de la nueva imagen y repita el proceso.
====

Para instalar la nueva imagen en el sistema NanoBSD actual, es posible usar los scripts [.filename]#updatep1# o [.filename]#updatep2# que se encuentran en el directorio [.filename]#/root#, dependiendo de la partición desde la que esté ejecutando el sistema actual.

Según que servicios que se encuentren disponibles en el huésped sirviendo la nueva imagen NanoBSD y el tipo de transferencia que se prefiera, es posible utilizar uno de estos tres métodos:

==== Usando man:ftp[1]

Si la velocidad de transferencia es una prioridad para usted, utilice este ejemplo:

[source,shell]
....
# ftp myhost
get _.disk.image "| sh updatep1"
....

==== Usando man:ssh[1]

Si prefiere una transferencia segura, considere usar este ejemplo:

[source,shell]
....
# ssh myhost cat _.disk.image.gz | zcat | sh updatep1
....

==== Usando man:nc[1]

Puede utilizar este ejemplo si el huésped remoto no está ejecutando los servicios man:ftpd[8] o man:sshd[8]:

[.procedure]
====
. En primer lugar, abra un puerto TCP en el huésped que se encuentra sirviendo la imagen y haga que envíe la imagen al cliente:
+
[source,shell]
....
myhost# nc -l 2222 < _.disk.image
....
+
[NOTE]
======
Asegúrese de que el puerto usado no esté bloqueado para recibir conexiones entrantes del huésped NanoBSD por el firewall.
======
. Conéctese al huésped sirviendo la nueva imagen y ejecute el script [.filename]#updatep1#:
+
[source,shell]
....
# nc myhost 2222 | sh updatep1
....
====
