--- authors: - author: 'Daniel Gerzo' copyright: '2006 The FreeBSD Documentation Project' description: 'Este documento proporciona información sobre las herramientas NanoBSD, las cuales pueden ser usadas para crear imágenes de FreeBSD para aplicaciones embebidas, adecuadas para su uso en una memoria USB, tarjeta de memoria, u otro medio de almacenamiento.' tags: ["nanobsd", "guide", "embedded", "FreeBSD"] title: 'Introducción a NanoBSD' trademarks: ["freebsd", "general"] --- = Introducción a NanoBSD :doctype: article :toc: macro :toclevels: 1 :icons: font :sectnums: :sectnumlevels: 6 :source-highlighter: rouge :experimental: :images-path: articles/nanobsd/ ifdef::env-beastie[] ifdef::backend-html5[] include::shared/authors.adoc[] include::shared/mirrors.adoc[] include::shared/releases.adoc[] include::shared/attributes/attributes-{{% lang %}}.adoc[] include::shared/{{% lang %}}/teams.adoc[] include::shared/{{% lang %}}/mailing-lists.adoc[] include::shared/{{% lang %}}/urls.adoc[] :imagesdir: ../../../images/{images-path} endif::[] ifdef::backend-pdf,backend-epub3[] include::../../../../shared/asciidoctor.adoc[] endif::[] endif::[] ifndef::env-beastie[] include::../../../../../shared/asciidoctor.adoc[] endif::[] [.abstract-title] Resumen Este documento proporciona información sobre las herramientas NanoBSD, las cuales pueden ser usadas para crear imágenes de FreeBSD para aplicaciones embebidas, adecuadas para su uso en una memoria USB, tarjeta de memoria, u otro medio de almacenamiento. ''' toc::[] [[intro]] == Introducción a NanoBSD NanoBSD es una herramienta desarrollada por {phk} y mantenida ahora por {imp}. La herramienta crea una imagen para aplicaciones embebidas, adecuada para su uso en una memoria USB, tarjeta de memoria, u otro medio de almacenamiento. Puede usarse para crear imágenes de instalación especializadas, diseñadas para instalar y mantener sistemas comúnmente llamados "aparatos de computación" (computer appliances). 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 funcionalidades 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 se pierde funcionalidad - Si es posible hacer algo con FreeBSD, es posible hacer lo mismo con NanoBSD, excepto si las funciones específicas fueron explícitamente eliminadas de la imagen de NanoBSD cuando fue creada. * El sistema es de sólo lectura en tiempo de ejecución, por lo tanto es seguro quitar el cable de alimentación. No hay necesidad de correr man:fsck[8] después de un apagado abrupto del sistema. * 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 está presente en el medio, es posible arrancar NanoBSD. El medio de almacenamiento está dividido por defecto en tres partes: * Dos particiones de imagen: `code#1` y `code#2`. * La partición del archivo de configuración, que se puede montar 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 malloc (malloc disks) man:md[4]. 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 lo tanto, 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. .Haciendo Cambios Persistentes en [.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 en 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 construye usando el sencillo script [.filename]#nanobsd.sh# que puede encontrarse en el directorio [.filename]#/usr/src/tools/tools/nanobsd#. Este script crea una imagen que se puede copiar al medio de almacenamiento utilizando la herramienta man:dd[1]. Los comandos necesarios para construir una imagen 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 <.> .... <.> Cambia el directorio actual por el directorio base del script de construcción de NanoBSD. <.> Comienza el proceso de compilación. <.> Cambia el directorio actual por el lugar donde se encuentran las imágenes compiladas. <.> Instala NanoBSD en el medio de almacenamiento. ==== Opciones al Construir una Imagen de NanoBSD Cuando se construye una imagen de NanoBSD, se pueden pasar varias opciones a [.filename]#nanobsd.sh# en la línea de comando. Estas opciones pueden tener un impacto significativo en el proceso de construcción. Algunas opciones tienen propósitos de verbosidad: * `-h`: imprime un resumen de la página de ayuda. * `-q`: hace que la salida sea más silenciosa. * `-v`: hace que la salida sea más verbosa Otras opciones se pueden usar para restringir el proceso de construcción. A veces no es necesario reconstruir todo desde las fuentes, especialmente si ya se ha construido una imagen y sólo se han hecho pequeños cambios. * `-k`: no construir el kernel * `-w`: no construir world * `-b`: no construir ni el kernel ni world * `-i`: no construir una imagen de disco. Como no se creará un fichero, no será posible copiarlo con man:dd[1] al medio de almacenamiento. * `-f`: no construir una imagen de disco de la primera partición (útil para actualizaciones) * `-n`: añade `-DNO_CLEAN` a `buildworld`, `buildkernel`. También se guardan todos los ficheros que se hayan construido en una ejecución previa. Se puede usar un fichero de configuración para ajustar cuantos elementos como se quiera. Cárgalo con `-c` Las últimas opciones son: * `-K`: no instalar un kernel. Una imagen de disco sin un kernel no será capaz de realizar una secuencia normal de arranque. ==== El Proceso Completo de Creación de Imágenes El proceso completo de creación de imágenes tiene muchos pasos. Los pasos exactos dependerán de las opciones escogidas cuando se inicia el script. Asumiendo que el script se ejecuta sin opciones particulares, esto es lo que pasará. . `run_early_customize`: comandos que se definen en un fichero de configuración que se ha proporcionado. . `clean_build`: Simplemente limpia el entorno de construcción mediante el borrado de ficheros construidos previamente. . `make_conf_build`: Ensambla make.conf a partir de las variables `CONF_WORLD` y `CONF_BUILD`. . `build_world`: Construye world. . `build_kernel`: Construye los ficheros del kernel. . `clean_world`: Limpia el directorio de destino. . `make_conf_install`: Ensambla make.conf a partir de las variables `CONF_WORLD` y `CONF_INSTALL`. . `install_world`: Instala todos los ficheros construidos durante la fase `buildworld`. . `install_etc`: Instala los ficheros necesarios en el directorio [.filename]#/etc# basándose en el comando `make distribution`. . `setup_nanobsd_etc`: la primera configuración específica de NanoBSD tiene lugar en esta fase. Se crea [.filename]#/etc/diskless# y se define el sistema de ficheros raíz como sólo lectura. . `install_kernel`: se instalan los ficheros del kernel y los módulos. . `run_customize`: se llama a todas las rutinas personalizadas definidas por el usuario. . `setup_nanobsd`: se configura un esquema especial de directorios de configuración. [.filename]#/usr/local/etc# se mueve a [.filename]#/etc/local# y se crea un enlace simbólico de vuelta desde [.filename]#/etc/local# a [.filename]#/usr/local/etc#. . `prune_usr`: se eliminan los directorios vacíos de [.filename]#/usr#. . `run_late_customize`: en este punto se ejecutan los últimos scripts personalizados. . `fixup_before_diskimage`: Lista todos los ficheros instalados en un metalog. . `create_diskimage`: crea la imagen de disco real basada en los parámetros proporcionados sobre las geometrías del disco. . `last_orders`: no hace nada de momento. === Personalizar una Imagen de NanoBSD Esta es probablemente la característica más importante y más interesante de NanoBSD. Es también donde pasarás la mayor parte del tiempo cuando desarrolles con NanoBSD. Invocar el siguiente comando forzará a [.filename]#nanobsd.sh# a leer su configuración desde el archivo [.filename]#myconf.nano# situado 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 opciones de ajuste, es posible configurar opciones que se pasan tanto a la fase `buildworld` como a la fase `installworld` del proceso de construcción de NanoBSD, así como opciones internas pasadas al proceso principal de construcción de NanoBSD. Mediante estas opciones es posible hacer más pequeño el sistema de forma que quepa en tan solo 64 MB. Puedes utilizar las opciones de configuración para hacer FreeBSD incluso más pequeño hasta que consista sólo en el kernel y en dos o tres ficheros 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 construcción (utilizado para los nombres de los directorios de construcción). * `NANO_SRC` - Ruta al árbol de fuentes utilizado para construir la imagen. * `NANO_KERNEL` - Nombre del fichero de configuración del kernel utilizado para construir el kernel. * `CONF_BUILD` - Opciones pasadas a la fase de construcción `buildworld`. * `CONF_INSTALL` - Opciones pasadas a la fase de construcción `installworld`. * `CONF_WORLD` - Opciones pasadas a las fases de construcción `buildworld` e `installworld`. * `FlashDevice` - Define el tipo de medio a utilizar. Consulta [.filename]#FlashDevice.sub# para más detalles. Hay muchas más opciones de configuración que podrían ser relevantes dependiendo del tipo de NanoBSD que se desea. ===== Personalización General Hay tres etapas, por diseño, en las cuales es posible hacer cambios que afectan al proceso de construcción, simplemente estableciendo una variable en el fichero de configuración proporcionado: * `run_early_customize`: antes de que se haga cualquier otra cosa. * `run_customize`: después de que se hayan dispuesto todos los ficheros estándar * `run_late_customize`: al final del proceso, justo antes de que se cree la imagen definitiva de NanoBSD. Para personalizar una imagen de NanoBSD, en cualquiera de estos pasos, es mejor añadir un valor específico a la variable que corresponda. La variable `NANO_EARLY_CUSTOMIZE` se utiliza en el primer paso del proceso de construcción. En este momento no hay un ejemplo de lo que se puede hacer con esta variable, pero esto podría cambiar en el futuro. La variable `NANO_CUSTOMIZE` se utiliza después de que se hayan instalados los ficheros del kernel, world y configuración y de que los ficheros de etc se hayan configurado para que sean una instalación de NanoBSD. Así que es el paso correcto del proceso de construcción para ajustar las opciones de configuración y añadir paquetes como se hace en el ejemplo cust_nobeastie. La variable `NANO_LATE_CUSTOMIZE` se usa justo antes de que se cree la imagen de disco, así que es el último momento para poder cambiar algo. Recuerda que la rutina `setup_nanobsd` ya se ha ejecutado y que los directorios [.filename]#etc#, [.filename]#conf# and [.filename]#cfg# y subdirectorios ya se han modificado, así que no es el momento de cambiar nada. Más bien es posible añadir o eliminar ficheros específicos. ===== Opciones de Arranque También hay variables que pueden cambiar la forma en la que arranca una imagen de NanoBSD. Se pasan dos opciones a man:boot0cfg[8] para inicializar el sector de arranque de la imagen de disco: * `NANO_BOOT0CFG` * `NANO_BOOTLOADER` Con `NANO_BOOTLOADER` se puede escoger un fichero de bootloader. Las opciones posibles más habituales son [.filename]#boot0sio# y [.filename]#boot0# dependiendo de si el dispositivo tiene o no puerto serie. Es mejor evitar proporcionar un bootloader diferente, pero es posible. Para hacerlo, lo mejor es consultar el capítulo sobre el proceso de arranque en el extref:{handbook}boot[FreeBSD Handbook]. Con `NANO_BOOT0CFG` se puede modificar el proceso de arranque como por ejemplo seleccionar desde qué partición arrancará la imagen de NanoBSD. Es mejor consultar la página man:boot0cfg[8] antes de cambiar el valor por defecto de esta variable. Una opción que podría ser interesante cambiar es el tiempo de espera del procedimiento de arranque. Para ello, se puede cambiar la variable `NANO_BOOT0CFG` a `"-o packet -s 1 -m 3 -t 36"`. De este modo el proceso de arranque empezaría después de aproximadamente 2 segundos; porque es raro que se quiera esperar 10 segundos antes de arrancar. Está bien saber esto: la variable `NANO_BOOT2CFG` sólo se usa en la rutina `cust_comconsole` que se puede llamar en el paso `NANO_CUSTOMIZE` si el dispositivo tiene un puerto serie y toda la entrada y salida de la consola tiene que ir a través de él. Asegúrate de comprobar los parámetros relevantes del puerto serie ya que establecer un parámetro a un valor erróneo puede inhabilitar el puerto. ===== Creación de una Imagen de Disco Al final del proceso de arranque se encuentra la creación de la imagen de disco. Con este paso, el script de Nano BSD proporciona un fichero que puede ser copiado simplemente en el disco del dispositivo y que hará que arranque. Hay muchas variables que se tienen que configurar bien para que el script produzca una imagen de disco que sea utilizable. * La variable `NANO_DRIVE` tiene que establecerse al nombre de la unidad del medio en tiempo de ejecución. Normalmente, el valor por defecto `ada0`, que representa al primer dispositivo `IDE`/`ATA`/`SATA` en la unidad, se espera que sea correcto pero se podría usar un tipo diferente de almacenamiento - como una llave USB, en cuyo caso sería mejor usar da0. * La variable `NANO_MEDIASIZE` se tiene que establecer al tamaño (en sectores de 512 bytes) del medio de almacenamiento que se utilizará. Si lo estableces de forma incorrecta, es posible que la imagen de NanoBSD no arranque en absoluto y se mostrará un mensaje durante el arranque avisando de una geometría de disco incorrecta. * Los directorios [.filename]#/etc#, [.filename]#/var#, y [.filename]#/tmp# se reservan como discos(malloc) man:md[4] en el arranque; de forma que sus tamaños se pueden ajustar par satisfacer las necesidades del dispositivo. La variable `NANO_RAM_ETCSIZE` establece el tamaño de [.filename]#/etc#; y la variable `NANO_RAM_TMPVARSIZE` establece el tamaño de los directorios [.filename]#/var# y [.filename]#/tmp# puesto que [.filename]#/tmp# está enlazado simbólicamente a [.filename]#/var/tmp#. Por defecto, los tamaños de ambos discos malloc se establece a 20MB cada uno. Siempre se pueden cambiar, pero normalmente [.filename]#/etc# no crece demasiado por lo que 20MB es un buen puntor de partida, mientras que [.filename]#/var# y especialmente [.filename]#/tmp# pueden crecer mucho más si no ponemos cuidado. Para sistemas con limitaciones de memoria, se pueden escoger sistemas de ficheros más pequeños. * Como NanoBSD está diseñado principalmente para construir una imagen de un sistema para un aparato, se asume que el medio de almacenamiento será relativamente pequeño. Por esa razón, el sistema de ficheros que se establece está configurado para tener un tamaño de bloque pequeño (4Kb) y un tamaño de fragmento pequeño (512b). Las opciones de configuración del sistema de ficheros se pueden configurar mediante la variable `NANO_NEWFS`, pero la sintaxis debe respetar el formato del comando man:newfs[8] . El sistema de ficheros también tiene Soft Updates activado por defecto. Se puede leer sobre esto en el extref:{handbook}[FreeBSD Handbook]. * Los diferentes tamaños de partición se pueden establecer mediante el uso de `NANO_CODESIZE`, `NANO_CONFSIZE`, y `NANO_DATASIZE` como múltiplos de sectores de 512 bytes. `NANO_SIZE` define el tamaño de las dos primeras particiones: `code#1` and `code#2`. Tienen que ser suficientemente grandes para contener todos los ficheros que se producirán como resultado de los procesos `buildworld` y `buildkernel`. `NANO_CONFSIZE` define el tamaño de la partición de ficheros de configuración por lo que no tiene que ser muy grande; pero no la hagas tan pequeña que no pueda albergar los ficheros. Por último `NANO_DATASIZE` define el tamaño de una partición opcional, que se puede usar en el dispositivo. Por ejemplo, se puede utilizar la última partición para mantener en disco ficheros creados al vuelo. ==== Funciones Personalizadas Es posible afinar NanoBSD utilizando funciones del shell en el fichero de configuración. El siguiente ejemplo ilustra el modelo básico de las 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 consola del sistema. * `cust_allow_ssh_root` - Permite al usuario `root` hacer login vía man:sshd[8]. * `cust_install_files` - Instala ficheros desde el directorio [.filename]#nanobsd/Files#, el cual contiene algunos scripts útiles para la administración del sistema. ==== Agregando Paquetes Se pueden agregar paquetes a una imagen de NanoBSD para proporcionar funcionalidades específicas para el dispositivo. Para ello, o bien: * Añade `cust_pkgng` a la variable `NANO_CUSTOMIZE`, o * Añade el comando `'customize_cmd cust_pkgng'` en un fichero de configuración personalizado. Ambos métodos consiguen el mismo resultado: lanzar la rutina `cust_pkgng`. Esta rutina recorrerá el directorio `NANO_PACKAGE_DIR` para encontrar bien todos los paquetes o sólo la lista de paquetes de la variable `NANO_PACKAGE_LIST`. Cuando se instalan aplicaciones mediante pkg en un entorno FreeBSD estándar, es habitual que el proceso de instalación cree ficheros de configuración en el directorio [.filename]#/usr/local/etc#, y scripts de arranque en el directorio [.filename]#/usr/local/etc/rc.d#. De modo que después de que se hayan instalado los paquetes necesarios, necesitan ser configurados para que estén listos para usar. Para ello se tienen que instalar los ficheros de configuración necesarios en los directorios correctos. Esto se puede conseguir escribiendo rutinas dedicadas o se puede utilizar la rutina genérica `cust_install_files` para copiar los ficheros desde el directorio [.filename]#/usr/src/tools/tools/nanobsd/Files#. Para cada paquete normalmente se necesita añadir una línea (a veces varias) en [.filename]#/etc/rc.conf#. ==== Ejemplo de Archivo de Configuración Un ejemplo completo de un archivo de configuración para construir 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 .... Todas las opciones de construcción e instalación se pueden encontrar en la página del manual de man:src.conf[5], pero no todas las opciones se pueden o se deben usar cuando se construye una imagen de NanoBSD. Las opciones de construcción e instalación se deberían definir de acuerdo a las necesidades de la imagen que se está construyendo. Por ejemplo, el cliente y el servidor de ftp podrían no ser necesarios. Añadir `WITHOUT_FTP=TRUE` a un fichero de configuración en la sección `CONF_BUILD` evitará compilarlos. También, si el dispositivo NanoBSD no se va a usar para construir programas entonces es posible añadir `WITHOUT_BINUTILS=TRUE` en la sección `CONF_INSTALL`; pero no en la sección `CONF_BUILD` ya que serán usadas para construir la imagen de NanoBSD. Evitar compilar un conjunto de programas en particular - mediante una opción de compilación - acorta el tiempo total de construcción y reduce el tamaño necesario para la imagen de disco, mientras que no instalar dicho conjunto de programas no disminuye el tiempo total de construcción. === Actualizando NanoBSD El proceso de actualización de NanoBSD es relativamente simple: [.procedure] ==== . Construye una nueva imagen de NanoBSD de forma habitual. . Sube la imagen nueva a una partición sin usar en el dispositivo que esté ejecutando NanoBSD. + 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). . Reinicia y arranca el sistema desde la partición recién instalada. . Si todo termina correctamente, la actualización habrá finalizado. . Si algo sale mal, reinicia 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. Arregla los problemas de la nueva imagen y repite el proceso. ==== Para instalar una nueva imagen en un sistema que está ejecutando NanoBSD, es posible utilizar los scripts [.filename]#updatep1# o [.filename]#updatep2# que se encuentran en el directorio [.filename]#/root#, dependiendo de la partición desde la que se esté ejecutando el sistema actual. Dependiendo de los servicios disponibles en el host que ofrece la nueva imagen de NanoBSD y el tipo de transferencia preferido, es posible examinar uno de estos tres métodos: ==== Usar man:ftp[1] Si la velocidad de transferencia es una prioridad, utiliza este ejemplo: [source, shell] .... # ftp myhost get _.disk.image "| sh updatep1" .... ==== Usar man:ssh[1] Si prefieres una transferencia segura, considera usar este ejemplo: [source, shell] .... # ssh myhost cat _.disk.image.gz | zcat | sh updatep1 .... ==== Usar man:nc[1] Prueba este ejemplo si el host remoto no está ejecutando ni el servicio man:ftpd[8] ni el servicio man:sshd[8]: [.procedure] ==== . En primer lugar, abre un puerto TCP en el host que se encuentra sirviendo la imagen y haz que envíe la imagen al cliente: + [source, shell] .... myhost# nc -l 2222 < _.disk.image .... + [NOTE] ====== Asegúrate de que el puerto que usas no está bloqueado por ningún firewall para recibir conexiones entrantes desde el host NanoBSD. ====== . Conéctate al host que sirve la nueva imagen y ejecuta el script [.filename]#updatep1#: + [source, shell] .... # nc myhost 2222 | sh updatep1 .... ====