---
title: FreeBSD y las unidades de estado sólido (SSD)
authors:
  - author: John Kozubik
    email: john@kozubik.com
copyright: 2001, 2009 The FreeBSD Documentation Project
releaseinfo: "$FreeBSD$" 
trademarks: ["freebsd", "general"]
---

= FreeBSD y las unidades de estado sólido (SSD)
: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 artículo trata sobre el uso de discos de estado sólido en FreeBSD para crear sistemas embebidos.

Los sistemas embebidos tienen la ventaja de una mayor estabilidad por la falta de partes móviles (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 específicos que se abordarán incluyen los tipos y atributos de los dispositivos de estado sólido adecuados para su uso como disco en FreeBSD, las opciones del kernel que son interesantes para dicho entorno, los mecanismos de [.filename]#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 artículo concluirá con algunas estrategias generales para entornos pequeños y de solo lectura de FreeBSD.

'''

toc::[]

[[intro]]
== Dispositivos de disco de estado sólido

El alcance de este artículo se limitará a dispositivos de estado sólido basados en memoria flash. La memoria flash es una memoria de estado sólido (sin partes móviles) que no es volátil (la memoria mantiene los datos incluso después de que se hayan desconectado todas las fuentes de alimentación). La memoria flash puede soportar un enorme impacto físico y es bastante rápida (las soluciones de memoria flash que se tratan en este artículo son un poco más lentas que un disco duro EIDE en operaciones de escritura y mucho más rápidos en operaciones de lectura). Un aspecto muy importante de la memoria flash, cuyas repercusiones se tratarán más 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 automáticamente los bloques defectuosos y algunos incluso distribuyen las operaciones de escritura de manera uniforme en toda la unidad, la verdad es que hay un límite en la cantidad de escrituras que se pueden hacer al dispositivo. Las unidades más competitivas tienen entre 1.000.000 y 10.000.000 millones de escrituras por sector en sus especificaciones. Esta cifra varía debido a la temperatura del ambiente.

Específicamente, discutiremos las unidades flash compactas compatibles con ATA, las cuales son bastante populares como medios de almacenamiento para cámaras digitales. Es de particular interés 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 pequeño).

Existen otras soluciones de disco de estado sólido, pero su coste, opacidad y su relativa dificultad de uso los colocan más allá del alcance de este artículo.

[[kernel]]
== Opciones del kernel

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

Todos los sistemas FreeBSD embebidos que utilizan memorias flash como disco para el sistema estarán interesados en utilizar discos y sistemas de archivos cargados en memoria. Debido al número limitado de escrituras que se pueden hacer en la memoria flash, el disco y los sistemas de archivos probablemente se montarán como de solo lectura. En este entorno, los sistemas de archivos como [.filename]#/tmp# y [.filename]#/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 crítico para una implementación exitosa de FreeBSD en dispositivos de estado sólido.

Asegúrese de que existen las siguientes líneas en el archivo de configuración del kernel:

[.programlisting]
....
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
....

[[ro-fs]]
== El subsistema `rc` y los sistemas de archivos de solo lectura

La inicialización posterior al arranque de un sistema FreeBSD embebido es controlada por [.filename]#/etc/rc.initdiskless#.

[.filename]#/etc/rc.d/var# monta [.filename]#/var# como sistema de archivos en memoria, crea una listado configurable de directorios en [.filename]#/var# con el comando man:mkdir[1] y cambia los modos en algunos de esos directorios. En la ejecución de [.filename]#/etc/rc.d/var#, otra variable de [.filename]#rc.conf# entra en juego: `varsize`. [.filename]#/etc/rc.d/var# crea una partición [.filename]#/var# basándose en el valor de la variable en [.filename]#rc.conf#:

[.programlisting]
....
varsize=8192
....

Recuerde que por defecto este valor está en sectores.

El hecho de que [.filename]#/var# sea un sistema de archivos de lectura y escritura es una distinción importante, ya que la partición [.filename]#/# (y cualquier otra partición que pueda tener en su medio flash) se debe montar como solo lectura. Recuerde que en la <<intro>> detallamos las limitaciones de la memoria flash, específicamente, 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 año. Un logging intenso o la creación y destrucción de archivos temporales puede hacer lo mismo. Por lo tanto, además de quitar la entrada `swap` de su [.filename]#/etc/fstab#, también debe cambiar el campo Options para cada sistema de archivos a `ro` de la siguiente forma:

[.programlisting]
....
# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/ad0s1a             /               ufs     ro              1       1
....

Algunas aplicaciones en el sistema comenzarán a fallar inmediatamente como resultado de este cambio. Por ejemplo, cron no se ejecutará correctamente al faltar las cron tabs en [.filename]#/var# creadas por [.filename]#/etc/rc.d/var#, además, syslog y dhcp encontrarán problemas como resultado de montar el sistema de archivos como solo lectura y la falta de elementos en [.filename]#/var# que ha creado [.filename]#/etc/rc.d/var#. Sin embargo, esto son solo problemas temporales y se tratan, junto con las soluciones para la ejecución de otros programas de uso común en la <<strategies>>.

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

[source,bash]
....
# /sbin/mount -uw partition
....

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

[source,bash]
....
# /sbin/mount -ur partition
....

== Construyendo un sistema de archivos desde cero

Como las tarjetas compact-flash compatibles con ATA son vistas por FreeBSD como discos duros IDE estándar, en teoría se podría instalar FreeBSD desde la red usando floppies kern y mfsroot o desde un CD.

Sin embargo, incluso una pequeña instalación de FreeBSD que utilice procedimientos normales de instalación puede producir un sistema con un tamaño superior a 200 megabytes. Como la mayoría de la gente utilizará dispositivos de memoria flash más pequeños (128 megabytes se consideran razonablemente grandes - 32 o incluso 16 megabytes son comunes), una instalación utilizando mecanismos normales no será posible - simplemente no hay suficiente espacio en el disco incluso para las instalaciones convencionales más pequeñas.

La forma más fácil de superar esta limitación de espacio es instalar FreeBSD utilizando medios convencionales en un disco duro normal. Una vez finalizada la instalación, reduzca el sistema operativo a un tamaño que se ajuste a su medio flash, y comprima el sistema de archivos completo en un fichero tar. Los siguientes pasos le guiarán en el proceso de preparación de una memoria flash para su sistema de archivos comprimido en un fichero tar. Recuerde que no estamos ejecutando una instalación normal, luego las operaciones como particionado, etiquetado, creación del sistema de archivos, etc. deben ejecutarse manualmente. Además de los disquetes kern y mfsroot, también necesitará usar el disquete fixit.

[.procedure]
====
. Particionando su dispositivo flash
+ 
Después de arrancar con los disquetes kern y mfsroot, seleccione `custom` en el menú de instalación. En el menú de instalación personalizado, seleccione `partition`. En el menú de particiones, debe borrar todas las particiones existentes mediante la tecla kbd:[d]. Después de eliminar todas las particiones existentes, cree una partición utilizando la tecla kbd:[c] y acepte el valor predeterminado para el tamaño de la partición. Cuando se le pregunte el tipo de partición, asegúrese de que el valor esté establecido en `165`. Ahora escriba la tabla de particiones en el disco presionando kbd:[w] (es una opción oculta en esta pantalla). Si está utilizando una tarjeta compact flash compatible con ATA, debe elegir el FreeBSD Boot Manager. Ahora presione kbd:[q] para salir del menú de partición. Verá de nuevo el menú del gestor de arranque - repita la opción hecha anteriormente.
. Creación de sistemas de archivos en su dispositivo de memoria flash
+ 
Salga del menú de instalación personalizado y, en el menú de instalación principal, elija la opción `fixit`. Después de entrar en el entorno de fixit, escriba el siguiente comando:
+
[source,bash]
....
# disklabel -e /dev/ad0c
....
+ 
En este punto, habrá accedido al editor vi guiado por el comando disklabel. A continuación, debe agregar una línea `a:` al final del archivo. La línea `a:` debería ser similar a la siguiente:
+
[.programlisting]
....
a:      123456  0       4.2BSD  0       0
....
+ 
Donde _123456_ es exactamente el mismo número que la entrada `c:`. Básicamente, está duplicando la línea `c:` como `a:`, asegúrese de que el fstype es `4.2BSD`. Guarde el archivo y ciérrelo.
+
[source,bash]
....
# disklabel -B -r /dev/ad0c
# newfs /dev/ad0a
....

. Colocando su sistema de archivos en el medio flash
+ 
Monte el medio flash recién preparado:
+
[source,bash]
....
# mount /dev/ad0a /flash
....
+ 
Coloque esta máquina en la red para poder transferir nuestro archivo tar y extraerlo en nuestro sistema de archivos del medio flash. Un ejemplo de cómo hacerlo es:
+
[source,bash]
....
# ifconfig xl0 192.168.0.10 netmask 255.255.255.0
# route add default 192.168.0.1
....
+ 
Ahora que la máquina está en la red, transfiera su archivo tar. Es posible que se enfrente a un pequeño dilema en este punto - si su memoria flash tiene por ejemplo 128 megabytes, y su archivo tar tiene más de 64 megabytes, no podrá tener el archivo tar en el medio de flash al mismo tiempo que realiza la descompresión - se quedará sin espacio. Una solución a este problema, si está utilizando FTP, es descomprimir el archivo mientras se transfiere por FTP. Si realiza la transferencia de esta forma, nunca tendrá el archivo tar y los contenidos en el disco al mismo tiempo:
+
[source,bash]
....
ftp> get tarfile.tar "| tar xvf -"
....
+ 
Si su archivo tar está comprimido en gzip, puede hacerlo de esta forma:
+
[source,bash]
....
ftp> get tarfile.tar "| zcat | tar xvf -"
....
+ 
Una vez que el contenido de su sistema de archivos comprimido por tar está en el sistema de archivos de la memoria flash, puede desmontar la memoria flash y reiniciar:
+
[source,bash]
....
# cd /
# umount /flash
# exit
....
+ 
Suponiendo que configuró correctamente su sistema de archivos cuando lo construyó 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 debería iniciar con éxito su sistema embebido FreeBSD.
====

[[strategies]]
== Estrategias para entornos pequeños y de solo lectura

En la <<ro-fs>>, se indicó que el sistema de archivos [.filename]#/var# construido por [.filename]#/etc/rc.d/var# y la presencia de un sistema de archivos raíz montado en modo solo lectura causa problemas con muchos paquetes de software utilizados en FreeBSD. En este artículo, se proporcionarán sugerencias para ejecutar con éxito cron, syslog, la instalación de ports y el servidor web Apache.

=== Cron

Tras el arranque, [.filename]#/var# será llenado con [.filename]#/etc/rc.d/var# usando la lista disponible en [.filename]#/etc/mtree/BSD.var.dist#, por lo que [.filename]#cron#, [.filename]#cron/tabs#, [.filename]#at# y algunos otros directorios estándar 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 [.filename]#/var# cargado en memoria desaparecerá y todas las cron tabs que tenga también desaparecerán. Por lo tanto, una solución sería crear las cron tabs para los usuarios que las necesiten; monte su sistema de archivos raíz [.filename]#/# como lectura-escritura y copie las cron tabs a un lugar seguro, como [.filename]#/etc/tabs#, a continuación, añada una entrada al final de [.filename]#/etc/rc.initdiskless# que copie estas crontabs a [.filename]#/var/cron/tabs# después de que el directorio se cree durante el inicio del sistema. Es posible que también deba añadir una entrada que cambie los modos y permisos en los directorios creados y en los archivos copiados con [.filename]#/etc/rc.initdiskless#.

=== Syslog

[.filename]#syslog.conf# especifica las ubicaciones de ciertos ficheros de log que hay en [.filename]#/var/log#. Estos archivos no son creados por [.filename]#/etc/rc.d/var# durante la inicialización del sistema. Por lo tanto, en algún lugar de [.filename]#/etc/rc.d/var#, justo después de la sección que crea los directorios en [.filename]#/var#, tendrá que añadir algo como esto:

[source,bash]
....
# touch /var/log/security /var/log/maillog /var/log/cron /var/log/messages
# chmod 0644 /var/log/*
....

=== Instalación de ports

Antes de analizar los cambios necesarios para utilizar con éxito el árbol de ports, es necesario recordar que su sistema de archivos en el medio flash es de solo lectura. Dado que es de solo lectura, necesitará montarlo temporalmente en modo lectura-escritura utilizando la sintaxis que se muestra en la <<ro-fs>>. 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 podrían acortar considerablemente su vida útil.

Para que sea posible entrar en el directorio de ports y ejecutar con éxito 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 instalación de un paquete, es apropiado suponer que también se puede usar un área en el medio flash para escribir la información del paquete.

Primero, cree el directorio para la base de datos de los paquetes. Normalmente se encuentra en [.filename]#/var/db/pkg#, pero no podemos colocarlo allí ya que desaparecerá cada vez que se inicie el sistema.

[source,bash]
....
# mkdir /etc/pkg
....

Ahora, agregue una línea al archivo [.filename]#/etc/rc.d/var# que enlace [.filename]#/etc/pkg# a [.filename]#/var/db/pkg#. Un ejemplo:

[source,bash]
....
# 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` funcionará, y la información del paquete se escribirá correctamente en [.filename]#/etc/pkg# (porque el sistema de archivos, en ese momento, estará montado en modo lectura-escritura) que siempre estará disponible para el sistema operativo como [.filename]#/var/db/pkg#.

=== Servidor Web Apache

[NOTE]
====
Los pasos de esta sección solo son necesarios si Apache está configurado para escribir su pid o registro log fuera de [.filename]#/var#. Por defecto, Apache guarda su archivo pid en [.filename]#/var/run/httpd.pid# y sus registros de log en [.filename]#/var/log#.
====

Se supone que Apache guarda sus archivos de logs en un directorio [.filename]#apache_log_dir# fuera de [.filename]#/var#. Cuando este directorio reside en un sistema de archivos de solo lectura, Apache no puede guardar ningún archivo de log y puede tener problemas para funcionar. Si es así, debe agregar un nuevo directorio al listado de directorios en [.filename]#/etc/rc.d/var# a crear en [.filename]#/var# y vincular [.filename]#apache_log_dir# a [.filename]#/var/log/apache#. También 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 crearán en [.filename]#/etc/rc.d/var#.

En segundo lugar, agregue estos comandos a [.filename]#/etc/rc.d/var# después de la sección de creación del directorio:

[source,bash]
....
# chmod 0774 /var/log/apache
# chown nobody:nobody /var/log/apache
....

Por último, elimine el directorio [.filename]#apache_log_dir# y reemplácelo por un enlace:

[source,bash]
....
# rm -rf apache_log_dir
# ln -s /var/log/apache apache_log_dir
....
