¿Existe una distribución de Linux que ejecute fácilmente "estilo incrustado" en una Raspberry Pi? [cerrado]


9

Necesito una distribución de Linux que me dé lo siguiente:

  • Ejecutar en una Raspberry Pi
  • Puede sobrevivir de manera confiable a la pérdida de energía (como a través de un sistema de archivos de solo lectura)

He podido buscar documentación sobre cómo cambiar una distribución de Linux normal al modo de solo lectura. Tenía la esperanza de que ya hubiera una distribución construida y diseñada para ejecutarse en un entorno integrado.

No necesito muchos paquetes o controladores, solo lo suficiente para que el Pi funcione con USB / Ethernet. No necesito ninguna interfaz GUI ni nada, solo se ejecutará un servicio personalizado integrado en C.

¿Alguien sabe de una distribución que encajaría?


Dado que esto es para una aplicación incrustada, dos cosas rápidas que quizás desee tener en cuenta. Primero, si decide seguir la ruta de Linux, considere usar un kernel en tiempo real para asegurarse de que su sistema pueda responder lo suficientemente rápido. En segundo lugar, es posible que también desee configurar el temporizador de vigilancia para que tome medidas en caso de cualquier bucle / error de software.
Avance el

Salida raspberrypi.stackexchange.com pero creo que esta pregunta es fuera de tema allí también, ya que es una pregunta de tipo comercial,
Kevin Panko

Respuestas:


3

La mayoría de los sistemas integrados utilizan un kernel personalizado. Una herramienta para facilitar eso es Buildroot , un conjunto de scripts para construir la cadena de herramientas GNU gcc, la biblioteca uClibc en lugar de la libc (enorme) GNU, el kernel de Linux, BusyBox y otras utilidades / paquetes para el sistema de archivos raíz de una placa incrustada. El RaspberryPi es un tablero relativamente nuevo, por lo que su soporte en Buildroot todavía está en desarrollo, pero aparentemente hay un proyecto , otro proyecto y el trabajo de un individuo . Probablemente habrá más a medida que aumente la fabricación de RP y mejore la distribución.

Usando Buildroot, podría construir un núcleo Linux y un sistema de archivos raíz exactamente como lo describió en su pregunta. Dependiendo de la velocidad de su conexión a Internet y las capacidades de su PC de desarrollo, puede tener los binarios en 1 a 4 horas o más. La desventaja es que los binarios resultantes no se prueban ni se garantiza que se inicien y ejecuten correctamente. Una consola del sistema es obligatoria para depurar la secuencia de arranque. Vea mi respuesta para ¿Cómo puedo acceder a mi mini-pc (RaspberryPi / MK802 / Mele A1000 / VIA APC) a través de ethernet / wifi sin tener Monitor? Pero dado que el RaspberryPi fue diseñado para ser indestructible , este inconveniente no debería ser un impedimento para construir su kernel personalizado y RFS.

Con respecto a "sobrevivir a la pérdida de energía": la selección adecuada del sistema de archivos generalmente puede aliviar esta preocupación. La capa de dispositivo MTD más un sistema de archivos de registro en diario (por ejemplo, jffs2) ha demostrado ser bastante robusto por experiencia. Para una protección casi absoluta, hay initramfs que usa ramfs(no un disco RAM de tamaño fijo) sin cambio a un sistema de archivos R / W.

Apéndice

Una introducción de 30 diapositivas sobre las características de Buildroot está aquí.
Al final (# 27) se mencionan algunas herramientas similares y alternativas para construir sistemas embebidos.



1

Habiendo tenido un Seagate Dockstar con acceso a la consola, instalé Debian squeeze en él. Como punto de partida para que se ejecute en la raíz de solo lectura, utilicé este excelente artículo 1 de Jeff Doozan. La estrategia básica consiste en crear un script que, en cada arranque, monte los directorios de escritura necesarios como tmpfs. Cito el guión de Jeff 2 aquí (¡felicitaciones a Jeff!)

#!/bin/bash
DIRS="/tmp /var/log /var/run /var/lock /var/tmp /var/lib/urandom /var/lib/dhcp /etc/network/run"
for DIR in $DIRS; do
  echo "Mounting $DIR as tmpfs"
  mount -n -t tmpfs tmpfs $DIR
  if [ -d "$DIR-saved" ]; then
    echo "Restoring $DIR-saved to $DIR"
    tar -C "$DIR-saved" -cf - ./ | tar -C "$DIR" -xpf -
  fi
done

echo "nameserver 4.2.2.1" > /var/tmp/resolv.conf
touch /var/lib/dhcp/dhcpd.leases

exec /sbin/init

Guarde las líneas anteriores como un script llamado / sbin / init-ro en su rootfs objetivo y hágalo ejecutable.

chmod 755 /sbin/init-ro

Para usar este script durante el arranque, debe preparar un poco los rootfs del sistema (todo citado del script 2 de Jeff (adaptarse $ROOTa la ubicación real de sus rootfs montados).

# Configure dhcp-client to write resolv.conf to /tmp instead of /etc
sed -i 's/\/etc\/resolv.conf/\/var\/tmp\/resolv.conf/' $ROOT/sbin/dhclient-script > /dev/null 2>&1
rm $ROOT/etc/resolv.conf
ln -s /var/tmp/resolv.conf $ROOT/etc/resolv.conf


# make /etc/network/run/ a symlink to /tmp/network/
rm -rf $ROOT/etc/network/run
ln -s /var/tmp/network $ROOT/etc/network/run


# Fixes from http://wiki.debian.org/ReadonlyRoot

rm $ROOT/etc/blkid.tab  > /dev/null 2>&1
ln -s /dev/null $ROOT/etc/blkid.tab

rm $ROOT/etc/mtab  > /dev/null 2>&1
ln -s /proc/mounts $ROOT/etc/mtab

rm $ROOT/etc/rcS.d/S12udev-mtab

rm -rf $ROOT/var/log/*

Después de tener los rootfs preparados como anteriormente, puede montar los rootfs de solo lectura en / etc / fstab (reemplace ext2 con el sistema de archivos que está usando o simplemente use rootfs en su lugar).

/dev/root  /                 ext2  noatime,ro   0 1

Finalmente, debe agregar lo siguiente a los parámetros de su núcleo (es decir, en /boot/cmdline.txt en Raspi) para ejecutar el script antes del actual / sbin / init . (el siguiente es solo un ejemplo de los parámetros root y rootdelay . la parte importante que debe agregarse a la línea en cmdline.txt es init=/sbin/init-ro).

root=/dev/mmcblk0p2 rootdelay=2 init=/sbin/init-ro

Pero tenga en cuenta que para cualquier software que requiera acceso de escritura en los rootfs, debe montar las ubicaciones tmpfs apropiadas o escribir en el almacenamiento externo.


1

Con mis 2 centavos, es mucho más fácil (y mejor al final) hacer una batería de respaldo confiable para un Pi que vivir con un sistema operativo de solo lectura. Por supuesto, eso significaría que necesitará algunos conocimientos básicos de electrónica (y quiero decir BÁSICO; estamos hablando de 3-4 componentes). Este tipo hizo uno elegante con solo unos pocos más: /raspberrypi/1360/how-do-i-build-a-ups-like-battery-backup-system

Si haces esto, NO uses LiPo; NiCad es lo que quieres. LiPo no puede tomar constantes sobre la carga; has sido advertido.

Además, parece estar muy preocupado por algo que, en mi experiencia, es un problema muy menor. Golpeo mis cajas de Linux todo el tiempo y un apagado repentino no programado es algo normal cuando no puedo ser molestado. Si deshabilita los registros, rara vez recibirá quejas sobre hacerlo.

Para deshabilitar todos los registros, puede agregar la siguiente línea como la primera regla en /etc/rsyslog.conf:

*.* ~

Incluso cuando hay un problema, el 99.9999% de las veces (con esto me refiero a casi todas las veces en mi experiencia personal) ese problema se soluciona la próxima vez que se escanea el disco. Cuando eso sucede depende principalmente del clima, el sistema operativo se dio cuenta de lo que hizo (por extraño que parezca). Como un Pi usa tarjetas SD, me imagino que esto sucede aún menos en un Pi que en mi PC.


1

Si recuerdo correctamente, un sistema de archivos de solo lectura no 'asegurará' la tarjeta SD. Tengo 10 Pi funcionando para un cliente (tiempo de actividad actual de más de 80 días para la mitad de ellos) donde la potencia no es tan estable como cabría esperar / desear. Me tomó un tiempo encontrar fuentes de alimentación (cargadores baratos con una calificación de 3A y cargadores de iPad 'costosos' con una calificación de 2.3A) que en realidad podrían mantener el Pi funcionando durante más de un par de días, antes de eso tuve todo tipo de problemas de corrupción SD , incluso con uno que solo se usó como IIRC de solo lectura.

Mi problema está resuelto en su mayoría ahora (debido a los nuevos suministros), pero para futuros proyectos estoy buscando hacer un sistema de archivos raíz NFS. Ya hay muchos tutoriales sobre esto, en su mayoría resolviendo alrededor de las imágenes normales de Pi fs, pero es bastante fácil hacer un mínimo de debootstrap y cambiarlo a un sistema de archivos raíz de solo lectura a través de NFS. Combine esto con uboot para Pi y un script uboot inteligente, y su tarjeta SD contendrá solo unos pocos megas de firmware RPi, imagen uboot y script uboot.


0

He escuchado cosas buenas sobre Puppy Linux para esto. Aunque debo admitir que no lo he probado.

Se puede configurar para que no vuelva a escribir en la tarjeta SD.


-1

Hay cuatro imágenes disponibles en la página de descarga de raspberrypi.org :

  • Debian "wheezy"
  • Debian de flotación suave "sibilante"
  • Arch Linux ARM
  • QtonPi

Y aquí está el único que se lee solo de forma predeterminada (pero que se puede cambiar si es necesario):

Con suerte, uno de estos satisfará sus necesidades.


Ninguno de estos es de solo lectura de forma predeterminada.
Alex Chamberlain

@alex, buen punto.
Yedric

TinyCoreLinux agregado a la lista. Es de solo lectura por defecto.
avra
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.