                 FreeBSD y las unidades de estado solido (SSD)

  John Kozubik

       <john@kozubik.com>
     

   Revision: 74683b1030

   Copyright (c) 2001, 2009 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.

   Copyright

   Redistribution and use in source (XML DocBook) and 'compiled' forms (XML,
   HTML, PDF, PostScript, RTF and so forth) with or without modification, are
   permitted provided that the following conditions are met:

    1. Redistributions of source code (XML DocBook) must retain the above
       copyright notice, this list of conditions and the following disclaimer
       as the first lines of this file unmodified.

    2. Redistributions in compiled form (transformed to other DTDs, converted
       to PDF, PostScript, RTF and other formats) must reproduce the above
       copyright notice, this list of conditions and the following disclaimer
       in the documentation and/or other materials provided with the
       distribution.

  Importante:

   THIS DOCUMENTATION IS PROVIDED BY THE FREEBSD DOCUMENTATION PROJECT "AS
   IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
   THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FREEBSD DOCUMENTATION
   PROJECT BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

   Last modified on 2019-06-16 22:20:04 +0000 by Sergio Carlavilla Delgado.
   Resumen

   Este articulo trata sobre el uso de discos de estado solido en FreeBSD
   para crear sistemas embebidos.

   Los sistemas embebidos tienen la ventaja de una mayor estabilidad por la
   falta de partes moviles (discos duros). Sin embargo, se debe tener en
   cuenta que generalmente el espacio disponible para el sistema y la
   durabilidad del medio de almacenamiento son menores.

   Los temas especificos que se abordaran incluyen los tipos y atributos de
   los dispositivos de estado solido adecuados para su uso como disco en
   FreeBSD, las opciones del kernel que son interesantes para dicho entorno,
   los mecanismos de rc.initdiskless que automatizan el inicio de dichos
   sistemas, la necesidad de sistemas de archivos de solo lectura y hacer
   sistemas de archivos desde cero. El articulo concluira con algunas
   estrategias generales para entornos pequenos y de solo lectura de FreeBSD.

   [ Split HTML / Single HTML ]

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

   Tabla de contenidos

   1. Dispositivos de disco de estado solido

   2. Opciones del kernel

   3. El subsistema rc y los sistemas de archivos de solo lectura

   4. Construyendo un sistema de archivos desde cero

   5. Estrategias para entornos pequenos y de solo lectura

1. Dispositivos de disco de estado solido

   El alcance de este articulo se limitara a dispositivos de estado solido
   basados en memoria flash. La memoria flash es una memoria de estado solido
   (sin partes moviles) que no es volatil (la memoria mantiene los datos
   incluso despues de que se hayan desconectado todas las fuentes de
   alimentacion). La memoria flash puede soportar un enorme impacto fisico y
   es bastante rapida (las soluciones de memoria flash que se tratan en este
   articulo son un poco mas lentas que un disco duro EIDE en operaciones de
   escritura y mucho mas rapidos en operaciones de lectura). Un aspecto muy
   importante de la memoria flash, cuyas repercusiones se trataran mas
   adelante, es que cada sector tiene una capacidad de reescritura limitada.
   Solo puede escribir, borrar y volver a escribir en un sector de la memoria
   flash varias veces antes de que quede permanentemente inutilizable. Aunque
   muchos productos de memoria flash mapean automaticamente los bloques
   defectuosos y algunos incluso distribuyen las operaciones de escritura de
   manera uniforme en toda la unidad, la verdad es que hay un limite en la
   cantidad de escrituras que se pueden hacer al dispositivo. Las unidades
   mas competitivas tienen entre 1.000.000 y 10.000.000 millones de
   escrituras por sector en sus especificaciones. Esta cifra varia debido a
   la temperatura del ambiente.

   Especificamente, discutiremos las unidades flash compactas compatibles con
   ATA, las cuales son bastante populares como medios de almacenamiento para
   camaras digitales. Es de particular interes el hecho de que se conecten
   directamente al bus IDE y sean compatibles con el conjunto de comandos
   ATA. Por lo tanto, con un adaptador muy simple y de bajo coste, estos
   dispositivos se pueden conectar directamente al bus IDE en un ordenador.
   Una vez implementado de esta forma, los sistemas operativos como FreeBSD
   ven el dispositivo como un disco duro normal (aunque sea pequeno).

   Existen otras soluciones de disco de estado solido, pero su coste,
   opacidad y su relativa dificultad de uso los colocan mas alla del alcance
   de este articulo.

2. Opciones del kernel

   Algunas opciones del kernel son de especial interes para aquellos que
   crean un sistema FreeBSD embebido.

   Todos los sistemas FreeBSD embebidos que utilizan memorias flash como
   disco para el sistema estaran interesados en utilizar discos y sistemas de
   archivos cargados en memoria. Debido al numero limitado de escrituras que
   se pueden hacer en la memoria flash, el disco y los sistemas de archivos
   probablemente se montaran como de solo lectura. En este entorno, los
   sistemas de archivos como /tmp y /var se montan como sistemas de archivos
   en memoria para permitir que el sistema cree registros y actualice los
   contadores y los archivos temporales. Los sistemas de archivos en memoria
   son un componente critico para una implementacion exitosa de FreeBSD en
   dispositivos de estado solido.

   Asegurese de que existen las siguientes lineas en el archivo de
   configuracion del kernel:

 options         MFS             # sistema de archivos de memoria
 options         MD_ROOT         # el dispositivo md puede ser usado potencialmente como dispositivo root
 pseudo-device   md              # disco de memoria

3. El subsistema rc y los sistemas de archivos de solo lectura

   La inicializacion posterior al arranque de un sistema FreeBSD embebido es
   controlada por /etc/rc.initdiskless.

   /etc/rc.d/var monta /var como sistema de archivos en memoria, crea una
   listado configurable de directorios en /var con el comando mkdir(1) y
   cambia los modos en algunos de esos directorios. En la ejecucion de
   /etc/rc.d/var, otra variable de rc.conf entra en juego: varsize.
   /etc/rc.d/var crea una particion /var basandose en el valor de la variable
   en rc.conf:

 varsize=8192

   Recuerde que por defecto este valor esta en sectores.

   El hecho de que /var sea un sistema de archivos de lectura y escritura es
   una distincion importante, ya que la particion / (y cualquier otra
   particion que pueda tener en su medio flash) se debe montar como solo
   lectura. Recuerde que en la Seccion 1, "Dispositivos de disco de estado
   solido" detallamos las limitaciones de la memoria flash, especificamente,
   la capacidad de escritura limitada. La importancia de no montar sistemas
   de archivos en medios flash de lectura-escritura, y la importancia de no
   usar swap, no es exagerada. Un archivo swap en un sistema concurrido puede
   deteriorar un medio flash en menos de un ano. Un logging intenso o la
   creacion y destruccion de archivos temporales puede hacer lo mismo. Por lo
   tanto, ademas de quitar la entrada swap de su /etc/fstab, tambien debe
   cambiar el campo Options para cada sistema de archivos a ro de la
   siguiente forma:

 # Device                Mountpoint      FStype  Options         Dump    Pass#
 /dev/ad0s1a             /               ufs     ro              1       1

   Algunas aplicaciones en el sistema comenzaran a fallar inmediatamente como
   resultado de este cambio. Por ejemplo, cron no se ejecutara correctamente
   al faltar las cron tabs en /var creadas por /etc/rc.d/var, ademas, syslog
   y dhcp encontraran problemas como resultado de montar el sistema de
   archivos como solo lectura y la falta de elementos en /var que ha creado
   /etc/rc.d/var. Sin embargo, esto son solo problemas temporales y se
   tratan, junto con las soluciones para la ejecucion de otros programas de
   uso comun en la Seccion 5, "Estrategias para entornos pequenos y de solo
   lectura".

   Una cosa importante a recordar es que un sistema de archivos que fue
   montado como solo lectura con /etc/fstab puede ser montado como
   lectura-escrita en cualquier momento ejecutando el comando:

 # /sbin/mount -uw partition

   y se puede cambiar de nuevo a solo lectura con el comando:

 # /sbin/mount -ur partition

4. Construyendo un sistema de archivos desde cero

   Como las tarjetas compact-flash compatibles con ATA son vistas por FreeBSD
   como discos duros IDE estandar, en teoria se podria instalar FreeBSD desde
   la red usando floppies kern y mfsroot o desde un CD.

   Sin embargo, incluso una pequena instalacion de FreeBSD que utilice
   procedimientos normales de instalacion puede producir un sistema con un
   tamano superior a 200 megabytes. Como la mayoria de la gente utilizara
   dispositivos de memoria flash mas pequenos (128 megabytes se consideran
   razonablemente grandes - 32 o incluso 16 megabytes son comunes), una
   instalacion utilizando mecanismos normales no sera posible - simplemente
   no hay suficiente espacio en el disco incluso para las instalaciones
   convencionales mas pequenas.

   La forma mas facil de superar esta limitacion de espacio es instalar
   FreeBSD utilizando medios convencionales en un disco duro normal. Una vez
   finalizada la instalacion, reduzca el sistema operativo a un tamano que se
   ajuste a su medio flash, y comprima el sistema de archivos completo en un
   fichero tar. Los siguientes pasos le guiaran en el proceso de preparacion
   de una memoria flash para su sistema de archivos comprimido en un fichero
   tar. Recuerde que no estamos ejecutando una instalacion normal, luego las
   operaciones como particionado, etiquetado, creacion del sistema de
   archivos, etc. deben ejecutarse manualmente. Ademas de los disquetes kern
   y mfsroot, tambien necesitara usar el disquete fixit.

    1. Particionando su dispositivo flash

       Despues de arrancar con los disquetes kern y mfsroot, seleccione
       custom en el menu de instalacion. En el menu de instalacion
       personalizado, seleccione partition. En el menu de particiones, debe
       borrar todas las particiones existentes mediante la tecla d. Despues
       de eliminar todas las particiones existentes, cree una particion
       utilizando la tecla c y acepte el valor predeterminado para el tamano
       de la particion. Cuando se le pregunte el tipo de particion, asegurese
       de que el valor este establecido en 165. Ahora escriba la tabla de
       particiones en el disco presionando w (es una opcion oculta en esta
       pantalla). Si esta utilizando una tarjeta compact flash compatible con
       ATA, debe elegir el FreeBSD Boot Manager. Ahora presione q para salir
       del menu de particion. Vera de nuevo el menu del gestor de arranque -
       repita la opcion hecha anteriormente.

    2. Creacion de sistemas de archivos en su dispositivo de memoria flash

       Salga del menu de instalacion personalizado y, en el menu de
       instalacion principal, elija la opcion fixit. Despues de entrar en el
       entorno de fixit, escriba el siguiente comando:

 # disklabel -e /dev/ad0c

       En este punto, habra accedido al editor vi guiado por el comando
       disklabel. A continuacion, debe agregar una linea a: al final del
       archivo. La linea a: deberia ser similar a la siguiente:

 a:      123456  0       4.2BSD  0       0

       Donde 123456 es exactamente el mismo numero que la entrada c:.
       Basicamente, esta duplicando la linea c: como a:, asegurese de que el
       fstype es 4.2BSD. Guarde el archivo y cierrelo.

 # disklabel -B -r /dev/ad0c
 # newfs /dev/ad0a

    3. Colocando su sistema de archivos en el medio flash

       Monte el medio flash recien preparado:

 # mount /dev/ad0a /flash

       Coloque esta maquina en la red para poder transferir nuestro archivo
       tar y extraerlo en nuestro sistema de archivos del medio flash. Un
       ejemplo de como hacerlo es:

 # ifconfig xl0 192.168.0.10 netmask 255.255.255.0
 # route add default 192.168.0.1

       Ahora que la maquina esta en la red, transfiera su archivo tar. Es
       posible que se enfrente a un pequeno dilema en este punto - si su
       memoria flash tiene por ejemplo 128 megabytes, y su archivo tar tiene
       mas de 64 megabytes, no podra tener el archivo tar en el medio de
       flash al mismo tiempo que realiza la descompresion - se quedara sin
       espacio. Una solucion a este problema, si esta utilizando FTP, es
       descomprimir el archivo mientras se transfiere por FTP. Si realiza la
       transferencia de esta forma, nunca tendra el archivo tar y los
       contenidos en el disco al mismo tiempo:

 ftp> get tarfile.tar "| tar xvf -"

       Si su archivo tar esta comprimido en gzip, puede hacerlo de esta
       forma:

 ftp> get tarfile.tar "| zcat | tar xvf -"

       Una vez que el contenido de su sistema de archivos comprimido por tar
       esta en el sistema de archivos de la memoria flash, puede desmontar la
       memoria flash y reiniciar:

 # cd /
 # umount /flash
 # exit

       Suponiendo que configuro correctamente su sistema de archivos cuando
       lo construyo en su disco duro normal, (con sus sistemas de archivos
       montados en modo solo lectura, y con las opciones necesarias
       compiladas en el kernel) ahora se deberia iniciar con exito su sistema
       embebido FreeBSD.

5. Estrategias para entornos pequenos y de solo lectura

   En la Seccion 3, "El subsistema rc y los sistemas de archivos de solo
   lectura", se indico que el sistema de archivos /var construido por
   /etc/rc.d/var y la presencia de un sistema de archivos raiz montado en
   modo solo lectura causa problemas con muchos paquetes de software
   utilizados en FreeBSD. En este articulo, se proporcionaran sugerencias
   para ejecutar con exito cron, syslog, la instalacion de ports y el
   servidor web Apache.

  5.1. Cron

   Tras el arranque, /var sera llenado con /etc/rc.d/var usando la lista
   disponible en /etc/mtree/BSD.var.dist, por lo que cron, cron/tabs, at y
   algunos otros directorios estandar son creados.

   Sin embargo, esto no resuelve el problema de mantener las cron tabs entre
   los reinicios. Cuando el sistema se reinicie, el sistema de archivos /var
   cargado en memoria desaparecera y todas las cron tabs que tenga tambien
   desapareceran. Por lo tanto, una solucion seria crear las cron tabs para
   los usuarios que las necesiten; monte su sistema de archivos raiz / como
   lectura-escritura y copie las cron tabs a un lugar seguro, como /etc/tabs,
   a continuacion, anada una entrada al final de /etc/rc.initdiskless que
   copie estas crontabs a /var/cron/tabs despues de que el directorio se cree
   durante el inicio del sistema. Es posible que tambien deba anadir una
   entrada que cambie los modos y permisos en los directorios creados y en
   los archivos copiados con /etc/rc.initdiskless.

  5.2. Syslog

   syslog.conf especifica las ubicaciones de ciertos ficheros de log que hay
   en /var/log. Estos archivos no son creados por /etc/rc.d/var durante la
   inicializacion del sistema. Por lo tanto, en algun lugar de /etc/rc.d/var,
   justo despues de la seccion que crea los directorios en /var, tendra que
   anadir algo como esto:

 # touch /var/log/security /var/log/maillog /var/log/cron /var/log/messages
 # chmod 0644 /var/log/*

  5.3. Instalacion de ports

   Antes de analizar los cambios necesarios para utilizar con exito el arbol
   de ports, es necesario recordar que su sistema de archivos en el medio
   flash es de solo lectura. Dado que es de solo lectura, necesitara montarlo
   temporalmente en modo lectura-escritura utilizando la sintaxis que se
   muestra en la Seccion 3, "El subsistema rc y los sistemas de archivos de
   solo lectura". Siempre debe volver a montar estos sistemas de archivos en
   modo solo lectura cuando haya terminado cualquier mantenimiento - las
   escrituras innecesarias en el medio flash podrian acortar
   considerablemente su vida util.

   Para que sea posible entrar en el directorio de ports y ejecutar con exito
   el comando make install, debemos crear un directorio para los paquetes en
   un sistema de archivos que no se encuentre en la memoria para que mantenga
   nuestros paquetes durante los reinicios. Como es necesario montar sus
   sistemas de archivos en modo lectura-escritura para la instalacion de un
   paquete, es apropiado suponer que tambien se puede usar un area en el
   medio flash para escribir la informacion del paquete.

   Primero, cree el directorio para la base de datos de los paquetes.
   Normalmente se encuentra en /var/db/pkg, pero no podemos colocarlo alli ya
   que desaparecera cada vez que se inicie el sistema.

 # mkdir /etc/pkg

   Ahora, agregue una linea al archivo /etc/rc.d/var que enlace /etc/pkg a
   /var/db/pkg. Un ejemplo:

 # ln -s /etc/pkg /var/db/pkg

   Ahora, cada vez que monte su sistema de archivos en modo lectura-escritura
   e instale un paquete, el comando make install funcionara, y la informacion
   del paquete se escribira correctamente en /etc/pkg (porque el sistema de
   archivos, en ese momento, estara montado en modo lectura-escritura) que
   siempre estara disponible para el sistema operativo como /var/db/pkg.

  5.4. Servidor Web Apache

  Nota:

   Los pasos de esta seccion solo son necesarios si Apache esta configurado
   para escribir su pid o registro log fuera de /var. Por defecto, Apache
   guarda su archivo pid en /var/run/httpd.pid y sus registros de log en
   /var/log.

   Se supone que Apache guarda sus archivos de logs en un directorio
   apache_log_dir fuera de /var. Cuando este directorio reside en un sistema
   de archivos de solo lectura, Apache no puede guardar ningun archivo de log
   y puede tener problemas para funcionar. Si es asi, debe agregar un nuevo
   directorio al listado de directorios en /etc/rc.d/var a crear en /var y
   vincular apache_log_dir a /var/log/apache. Tambien es necesario establecer
   permisos y propietarios a este nuevo directorio.

   En primer lugar, agregue el directorio log/apache a la lista de
   directorios que se crearan en /etc/rc.d/var.

   En segundo lugar, agregue estos comandos a /etc/rc.d/var despues de la
   seccion de creacion del directorio:

 # chmod 0774 /var/log/apache
 # chown nobody:nobody /var/log/apache

   Por ultimo, elimine el directorio apache_log_dir y reemplacelo por un
   enlace:

 # rm -rf apache_log_dir
 # ln -s /var/log/apache apache_log_dir
