¿Usar un sistema de archivos raíz de solo lectura es una buena idea para la configuración integrada?

15

Se me ha asignado la tarea de ejecutar Linux como sistema operativo en un dispositivo integrado.

El objetivo tiene un procesador x86 y un dispositivo CompactFlash de 8 GB para almacenamiento.

He logrado usar buildroot para crear la imagen del kernel y las herramientas de compilación cruzada. Particioné el dispositivo CF en una pequeña partición FAT donde reside la imagen del núcleo, así como la syslinuxconfiguración de arranque y un ext3sistema de archivos donde descomprimí el sistema de archivos raíz generado por buildroot.

El sistema se inicia con éxito syslinuxconfigurando el directorio raíz en la partición CF ext3 donde se encuentra mi sistema de archivos buildroot.

Mi pregunta se centra en la necesidad de robustez frente a la pérdida de energía inmediata (y frecuente), ya que es crucial que el dispositivo arranque con éxito después de los cortes de energía. He leído que montar el sistema de archivos raíz como solo lectura es una forma de garantizar la integridad de los datos. ¿Es esta una forma sensata de proceder?

También he leído sobre la posibilidad de cargar el sistema de archivos raíz en la RAM para lograr lo mismo, pero aún no sé cómo hacerlo.

¿Existe una forma preferida de lograr este objetivo? De ser así, ¿cuál es la mejor manera de proceder?

matemático1975
fuente

Respuestas:

11

Nueva respuesta (2015-03-22)

( Nota: esta respuesta es más simple que la anterior, pero no es más segura. Mi primera respuesta es más sólida porque podría mantener los archivos de solo lectura mediante las opciones de montaje fs antes de las marcas de permiso. Por lo tanto, forzar la escritura de archivos sin permiso para escribir no funcionará en absoluto.)

Sí, en Debian , hay un paquete: fsprotect ( página de inicio ).

Utiliza aufs(de forma predeterminada, pero podría usar otra unionfsherramienta) para permitir cambios de sesión en vivo pero en RAM de forma predeterminada, por lo que todo se olvida al reiniciar.

Puede instalarlos ejecutando simplemente:

apt-get install fsprotect

Una vez hecho, del documento en línea:

Después de esto:

  • Edite /boot/grub/menu.lsto /etc/default/grub2o /etc/lilo.confy agregue " fsprotect=1G" a los parámetros del núcleo.
  • Modifique 1G según sea necesario.
  • Aplicar cambios (es decir, ejecutar update-grub)
  • Edite /etc/default/fsprotectsi desea proteger sistemas de archivos que no sean /.
  • reiniciar

También es posible que desee proteger con contraseña el gestor de arranque grub o prohibir cualquier cambio en él.

A partir de ahí, si algún archivo está protegido contra cambios, para muestra por

chmod ugo-w myfile

Si utiliza para la muestra vi myfilee intenta escribir en ella con el comando :w!, esto funcionará y su myfilecambio. Puede reiniciar para recuperar sin modificar myfile.

Eso ni siquiera es posible con mi siguiente primera solución:

Antigua (primera) respuesta:

Sí, es una solución fuerte, ¡pero poderosa!

Hacer r / o utilizable

Tienes que montar algunos directorios en rw , like /var, /etcy maybe /home. Esto podría hacerse usando aufs o unionfs . Me gusta esto de otra manera , usando /dev/shmy mount --bind:

cp -a /var /dev/shm/
mount --bind /dev/shm/var /var

Antes, podía mover todos los directorios que no tienen que cambiar en la operación normal en a static-var, que crear enlaces simbólicos en / var:

mkdir /static-var
mkdir /static-var/cache
mkdir /static-var/lib
mv /var/lib/dpkg /static-var/lib/dpkg
ln -s /static-var/lib/dpkg /var/lib/dpkg
mv /var/cache/apt /static-var/cache/apt
ln -s /static-var/cache/apt /var/cache/apt
... # an so on

Así que cuando vuelva a montar en el ro, copiando /varen /dev/shmno tomar demasiado espacio como la mayoría de los archivos se mueven a /static-vary sólo enlaces simbólicos se van a copiar en la memoria RAM.

La mejor manera de hacer esto finamente es hacer un ciclo de energía completo, un día de trabajo completo y ejecutar finamente un comando como:

find / -type f -o -type f -mtime -1

Entonces verá qué archivos deben ubicarse en la partición de lectura-escritura.

Inicio sesión

Como en este host no existe memoria estática grabable, para almacenar el historial y otros registros, debe configurar un syslogservidor remoto .

echo >/etc/syslog.conf '*.* @mySyslogServer.localdomain'

De esta manera, si su sistema se rompe por algún motivo, todo lo anterior se registra.

Actualización

Cuando se ejecuta con algunos mount --binden uso, para realizar dicha actualización mientras el sistema está en uso (sin necesidad de ejecutar init 1, para reducir el tiempo de inactividad), la forma más sencilla es reconstruir una raíz limpia , capaz de realizar la actualización:

Después de volver a montar '/' en modo lectura-escritura :

mount -o remount,rw /

for mpnt in /{,proc,sys,dev{,/pts}};do
    mount --bind $mnpt /$mnt$mpnt;
    done

chroot /mnt

apt-get update && apt-get dist-upgrade

exit

umount /mnt/{dev{/pts,},proc,sys,}

sync
mount -o remount,ro /

Y ahora:

shutdown -r now
F. Hauri
fuente
Gracias por tu respuesta. No lo entiendo completamente ya que mis habilidades con Linux no son excelentes en este momento. Sin embargo, sigue siendo muy útil y me da algunas áreas más para investigar.
matemático1975
Respuesta editada! Nueva solución y diffs explicados!
F. Hauri
Esto no responde la pregunta, es una gran respuesta para un sistema basado en Debian, pero Buildroot no está basado en Debian.
LovesTha
@LovesTha ¡Mira la vieja (primera) respuesta ! Esto está menos basado en Debian y U podría entender el principio e implementar el mismo mecanismo para cualquier tipo de distribución / instalación. (incluso si la sección Actualización muestra los comandos de Debian, U podría hacer lo mismo para la actualización manual o cualquier otra actualización basada en distrib.)
F. Hauri
Su antigua respuesta sería una excelente respuesta a una pregunta genérica sobre la configuración de sistemas Linux de solo lectura. Una vez que haya terminado mi exploración de hacer que la lectura de nuestro buildroot sea de solo lectura, espero volver y dar una gran respuesta detallada sobre la pregunta específica aquí. Buildroot ya tiene los bits temporales de / var enlazados a / tmp, que es un tempfs. / etc no debería usarse como un espacio temporal para programas, por lo que no debería necesitar ser manejado especialmente.
LovesTha
3

Solo tengo experiencia usando un buildroot más reciente (2014-02). En esa versión puede deshabilitar 'volver a montar el sistema de archivos raíz de arranque de lectura y escritura' en el archivo de configuración con:

BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW no está configurado

Logré crear una imagen que solo usa su ext4 / partición como solo lectura para que desconectar el poder del sistema no dañe en absoluto. Funciona muy bien, por lo que si no necesita escribir en su sistema de archivos, tal vez esta sea una solución mucho más simple que la mencionada anteriormente (que parece más o menos aplicable a un sistema Debian en lo que se refiere a apt-get).

pila
fuente
Gracias por la respuesta, sin embargo, al final opté por una configuración initramfs con el montaje de solo un par de directorios con opción de sincronización en la unidad CF para la persistencia de datos. Esto me ha servido bastante bien por el momento.
matemático1975
Para agregar a esto: usando versiones anteriores de buildroot, verifique /etc/inittabsi /allí se vuelve a montar . Si es así, cámbielo a sus necesidades.
evnu
Esta respuesta es una parte importante de la 'forma de construir' para hacerlo. Se necesitarán muchos de los consejos en la respuesta aceptada para que los sistemas más complejos funcionen. Sin embargo, es probable que todo lo que deba hacerse sea configurar algunos enlaces simbólicos adicionales a / tmp (tempfs) y todo funcione.
LovesTha