GNU/Linux >> Tutoriales Linux >  >> Linux

4 herramientas para construir sistemas Linux embebidos

Linux se está implementando en una variedad de dispositivos mucho más amplia de lo que Linus Torvalds anticipó cuando estaba trabajando en él en su dormitorio. La variedad de arquitecturas de chips compatibles es asombrosa y ha llevado a Linux a dispositivos grandes y pequeños; desde enormes mainframes de IBM hasta pequeños dispositivos no más grandes que sus puertos de conexión y todo lo demás. Se utiliza en centros de datos de grandes empresas, dispositivos de infraestructura de Internet y sistemas de desarrollo personal. También alimenta la electrónica de consumo, los teléfonos móviles y muchos dispositivos de Internet de las cosas.

Al crear software de Linux para dispositivos de clase empresarial y de escritorio, los desarrolladores suelen utilizar una distribución de escritorio como Ubuntu en sus máquinas de construcción para tener un entorno lo más parecido posible al entorno en el que se implementará el software. Herramientas como VirtualBox y Docker permiten una alineación aún mejor entre los entornos de desarrollo, prueba y producción.

¿Qué es un sistema integrado?

Wikipedia define un sistema integrado como:"Un sistema informático con una función dedicada dentro de un sistema mecánico o eléctrico más grande, a menudo con limitaciones informáticas en tiempo real".

Me parece bastante simple decir que un sistema integrado es una computadora que la mayoría de la gente no considera una computadora. Su función principal es servir como un dispositivo de algún tipo y no se considera una plataforma informática de propósito general.

Más recursos de Linux

  • Hoja de trucos de los comandos de Linux
  • Hoja de trucos de comandos avanzados de Linux
  • Curso en línea gratuito:Descripción general técnica de RHEL
  • Hoja de trucos de red de Linux
  • Hoja de trucos de SELinux
  • Hoja de trucos de los comandos comunes de Linux
  • ¿Qué son los contenedores de Linux?
  • Nuestros últimos artículos sobre Linux

El entorno de desarrollo en la programación de sistemas integrados suele ser muy diferente de los entornos de prueba y producción. Pueden usar diferentes arquitecturas de chips, pilas de software e incluso sistemas operativos. Los flujos de trabajo de desarrollo son muy diferentes para los desarrolladores integrados frente a los desarrolladores web y de escritorio. Por lo general, el resultado de la compilación consistirá en una imagen de software completa para el dispositivo de destino, incluidos el kernel, los controladores del dispositivo, las bibliotecas y el software de la aplicación (y, a veces, el gestor de arranque).

En este artículo, presentaré una encuesta de cuatro opciones comúnmente disponibles para construir sistemas Linux embebidos. Daré una idea de cómo es trabajar con cada uno y proporcionaré suficiente información para ayudar a los lectores a decidir qué herramienta utilizar para su diseño. No te enseñaré a usar ninguno de ellos; hay muchos recursos de aprendizaje en línea en profundidad una vez que haya reducido sus opciones. Ninguna opción es adecuada para todos los casos de uso y espero presentar suficientes detalles para dirigir su decisión.

Yocto

El proyecto Yocto se define como "un proyecto de colaboración de código abierto que proporciona plantillas, herramientas y métodos para ayudarlo a crear sistemas personalizados basados ​​en Linux para productos integrados, independientemente de la arquitectura del hardware". Es una colección de recetas, valores de configuración y dependencias que se utilizan para crear una imagen de tiempo de ejecución de Linux personalizada adaptada a sus necesidades específicas.

Divulgación completa:la mayor parte de mi trabajo en Linux integrado se ha centrado en el proyecto Yocto, y mi conocimiento y preferencia por este sistema probablemente serán evidentes.

Yocto usa Openembedded como su sistema de compilación. Técnicamente, los dos son proyectos separados; en la práctica, sin embargo, los usuarios no necesitan entender la distinción, y los nombres de los proyectos se usan indistintamente.

El resultado de la compilación de un proyecto Yocto consiste en términos generales en tres componentes:

  • Binarios de tiempo de ejecución de destino: Estos incluyen el cargador de arranque, el kernel, los módulos del kernel, la imagen del sistema de archivos raíz. y cualquier otro archivo auxiliar necesario para implementar Linux en la plataforma de destino.
  • Feed del paquete: Esta es la colección de paquetes de software disponibles para ser instalados en su destino. Puede seleccionar el formato del paquete (por ejemplo, deb, rpm, ipk) según sus necesidades. Algunos de ellos pueden estar preinstalados en los binarios de tiempo de ejecución de destino; sin embargo, es posible crear paquetes para instalarlos en un sistema implementado.
  • SDK de destino: Estas son la colección de bibliotecas y archivos de encabezado que representan el software instalado en su objetivo. Los desarrolladores de aplicaciones los utilizan cuando construyen su código para garantizar que estén vinculados con las bibliotecas apropiadas

Ventajas

El proyecto Yocto es ampliamente utilizado en la industria y cuenta con el respaldo de muchas empresas influyentes. Además, tiene una comunidad de desarrolladores y un ecosistema grandes y vibrantes que contribuyen a ello. La combinación de entusiastas del código abierto y patrocinadores corporativos ayuda a impulsar el proyecto Yocto.

Hay muchas opciones para obtener soporte con Yocto. Hay libros y otros materiales de capacitación si desea hacerlo usted mismo. Muchos ingenieros con experiencia en Yocto están disponibles si desea contratar expertos. Y muchas organizaciones comerciales ofrecen productos basados ​​en Yocto llave en mano o implementación y personalización basadas en servicios para su diseño.

El proyecto Yocto se expande fácilmente a través de capas, que se pueden publicar de forma independiente para agregar funcionalidad adicional, a plataformas de destino que no están disponibles en las versiones del proyecto o para almacenar personalizaciones exclusivas de su sistema. Se pueden agregar capas a su configuración para agregar características únicas que no están incluidas específicamente en los lanzamientos de stock; por ejemplo, la capa "meta-navegador" contiene recetas para navegadores web, que pueden construirse fácilmente para su sistema. Debido a que se mantienen de forma independiente, las capas pueden tener un programa de publicación diferente (ajustado a la velocidad de desarrollo de las capas) que las versiones estándar de Yocto.

Podría decirse que Yocto tiene el soporte de dispositivo más amplio de cualquiera de las opciones discutidas en este artículo. Debido al soporte de muchos fabricantes de placas y semiconductores, es probable que Yocto sea compatible con cualquier plataforma de destino que elija. Las versiones directas de Yocto admiten solo unas pocas placas (para permitir ciclos de prueba y lanzamiento adecuados), sin embargo, un modelo de trabajo estándar es usar capas de soporte de placa externas.

Finalmente, Yocto es extremadamente flexible y personalizable. Las personalizaciones para su aplicación específica se pueden almacenar en una capa para encapsulación y aislamiento. Las personalizaciones exclusivas de una capa de entidades generalmente se almacenan como parte de la propia capa, lo que permite aplicar la misma configuración simultáneamente a varias configuraciones del sistema. Yocto también proporciona una prioridad de capa bien definida y capacidad de anulación. Esto le permite definir el orden en que se aplican las capas y se buscan metadatos. También le permite anular la configuración en capas con mayor prioridad; por ejemplo, se agregarán muchas personalizaciones a las recetas existentes en sus capas privadas, con el orden controlado con precisión por las prioridades.

Desventajas

La mayor desventaja del proyecto Yocto es la curva de aprendizaje. Se necesita mucho tiempo y esfuerzo para aprender el sistema y comprenderlo realmente. Dependiendo de sus necesidades, esto puede ser una inversión demasiado grande en tecnologías y competencias que no son fundamentales para su aplicación. En tales casos, trabajar con uno de los proveedores comerciales puede ser una buena opción.

Los tiempos de compilación y los recursos de desarrollo son bastante altos para las compilaciones de proyectos de Yocto. La cantidad de paquetes que deben construirse, incluida la cadena de herramientas, el kernel y todos los componentes de tiempo de ejecución de destino, es significativa. Las estaciones de trabajo de desarrollo para los desarrolladores de Yocto tienden a ser sistemas grandes. No se recomienda utilizar un portátil compacto. Esto se puede mitigar mediante el uso de servidores de compilación basados ​​en la nube disponibles de muchos proveedores. Además, Yocto tiene un mecanismo de almacenamiento en caché integrado que le permite reutilizar componentes construidos previamente cuando determina que los parámetros para construir un paquete en particular no han cambiado.

Recomendación

Usar el proyecto Yocto para su próximo diseño de Linux integrado es una buena elección. De las opciones presentadas aquí, es la más ampliamente aplicable, independientemente de su caso de uso objetivo. El amplio soporte de la industria, la comunidad activa y el amplio soporte de plataforma hacen de esta una buena opción para los diseñadores.

Raíz de compilación

El proyecto Buildroot se define como "una herramienta simple, eficiente y fácil de usar para generar sistemas Linux embebidos a través de la compilación cruzada". Comparte muchos de los mismos objetivos que el proyecto Yocto, sin embargo, se centra en la simplicidad y el minimalismo. En general, Buildroot deshabilitará todas las configuraciones opcionales de tiempo de compilación para todos los paquetes (con algunas excepciones notables), lo que dará como resultado el sistema más pequeño posible. Dependerá del diseñador del sistema habilitar las configuraciones que sean apropiadas para un dispositivo determinado.

Buildroot compila todos los componentes desde el origen, pero no admite la administración de paquetes en el destino. Como tal, a veces se denomina generador de firmware, ya que las imágenes se fijan en gran medida en el momento de la compilación. Las aplicaciones pueden actualizar el sistema de archivos de destino, pero no existe un mecanismo para instalar nuevos paquetes en un sistema en ejecución.

La salida de Buildroot consiste en términos generales en tres componentes:

  • La imagen del sistema de archivos raíz y cualquier otro archivo auxiliar necesario para implementar Linux en la plataforma de destino
  • El kernel, el cargador de arranque y los módulos del kernel apropiados para el hardware de destino
  • La cadena de herramientas utilizada para construir todos los binarios de destino.

Ventajas

El enfoque de Buildroot en la simplicidad significa que, en general, es más fácil de aprender que Yocto. El sistema de compilación central está escrito en Make y es lo suficientemente corto como para permitir que un desarrollador comprenda todo el sistema y, al mismo tiempo, es lo suficientemente ampliable para satisfacer las necesidades de los desarrolladores de Linux integrado. El núcleo de Buildroot generalmente solo maneja casos de uso comunes, pero se puede expandir a través de secuencias de comandos.

El sistema Buildroot utiliza Makefiles normales y el lenguaje Kconfig para su configuración. Kconfig fue desarrollado por la comunidad del kernel de Linux y se usa ampliamente en proyectos de código abierto, por lo que es familiar para muchos desarrolladores.

Debido al objetivo de diseño de deshabilitar todas las configuraciones de tiempo de compilación opcionales, Buildroot generalmente producirá las imágenes más pequeñas posibles utilizando la configuración lista para usar. Los tiempos de compilación y los recursos del host de compilación también serán menores, en general, que los del proyecto Yocto.

Desventajas

El enfoque en la simplicidad y las opciones de compilación habilitadas mínimas implican que es posible que deba realizar una personalización significativa para configurar una compilación Buildroot para su aplicación. Además, todas las opciones de configuración se almacenan en un solo archivo, lo que significa que si tiene varias plataformas de hardware, deberá realizar cada uno de los cambios de personalización para cada plataforma.

Cualquier cambio en el archivo de configuración del sistema requiere una reconstrucción completa de todos los paquetes. Esto se ve algo mitigado por los tamaños de imagen mínimos y los tiempos de compilación en comparación con Yocto, pero puede resultar en compilaciones largas mientras ajusta su configuración.

El almacenamiento en caché del estado del paquete intermedio no está habilitado de forma predeterminada y no es tan completo como la implementación de Yocto. Esto significa que, si bien la primera compilación puede ser más corta que una compilación Yocto equivalente, las compilaciones posteriores pueden requerir la reconstrucción de muchos componentes.

Recomendación

Usar Buildroot para su próximo diseño de Linux integrado es una buena opción para la mayoría de las aplicaciones. Si su diseño requiere múltiples tipos de hardware u otras diferencias, es posible que desee reconsiderarlo debido a la complejidad de sincronizar múltiples configuraciones; sin embargo, para un sistema que consta de una sola configuración, es probable que Buildroot funcione bien para usted.

OpenWRT/LEDE

El proyecto OpenWRT se inició para desarrollar firmware personalizado para enrutadores de consumo. Muchos de los enrutadores de bajo costo disponibles en su minorista local son capaces de ejecutar un sistema Linux, pero tal vez no lo hagan de inmediato. Es posible que los fabricantes de estos enrutadores no proporcionen actualizaciones frecuentes para hacer frente a las nuevas amenazas e, incluso si lo hacen, los mecanismos para instalar imágenes actualizadas son difíciles y propensos a errores. El proyecto OpenWRT produce imágenes de firmware actualizadas para muchos dispositivos que han sido abandonados por sus fabricantes y da a estos dispositivos una nueva oportunidad de vida.

Los productos principales del proyecto OpenWRT son imágenes binarias para una gran cantidad de dispositivos comerciales. Existen repositorios de paquetes accesibles por red que permiten a los usuarios finales de dispositivos agregar nuevo software a sus sistemas. El sistema de compilación OpenWRT es un sistema de compilación de propósito general, que permite a los desarrolladores crear versiones personalizadas para cumplir con sus propios requisitos y agregar nuevos paquetes, pero su enfoque principal son los binarios de destino.

Ventajas

Si está buscando firmware de reemplazo para un dispositivo comercial, OpenWRT debería estar en su lista de opciones. Está bien mantenido y puede protegerlo de problemas que el firmware del fabricante no puede. También puede agregar funciones adicionales para que sus dispositivos sean más útiles.

Si su diseño integrado se centra en las redes, OpenWRT es una buena opción. Las aplicaciones de red son el caso de uso principal de OpenWRT, y es probable que encuentre muchos de esos paquetes de software disponibles en él.

Desventajas

OpenWRT impone importantes decisiones de política en su diseño (frente a Yocto y Buildroot). Si estas decisiones no cumplen con sus objetivos de diseño, es posible que deba realizar modificaciones no triviales.

Permitir actualizaciones basadas en paquetes en una flota de dispositivos implementados es difícil de administrar. Esto, por definición, da como resultado una carga de software diferente a la que probó su equipo de control de calidad. Además, es difícil garantizar instalaciones atómicas con la mayoría de los administradores de paquetes, y un ciclo de energía inoportuno puede dejar su dispositivo en un estado impredecible.

Recomendación

OpenWRT es una buena opción para proyectos de aficionados o para reutilizar hardware comercial. También es una buena opción para aplicaciones de red. Si necesita una personalización significativa de la configuración predeterminada, puede preferir Buildroot o Yocto.

Distribuciones de escritorio

Un enfoque común para diseñar sistemas Linux integrados es comenzar con una distribución de escritorio, como Debian o Red Hat, y eliminar los componentes innecesarios hasta que la imagen instalada se ajuste al espacio de su dispositivo de destino. Este es el enfoque adoptado por la popular distribución Raspbian para la plataforma Raspberry Pi.

Ventajas

La principal ventaja de este enfoque es la familiaridad. A menudo, los desarrolladores de Linux integrado también son usuarios de Linux de escritorio y están bien versados ​​​​en la distribución de su elección. El uso de un entorno similar en el destino puede permitir que los desarrolladores comiencen más rápidamente. Dependiendo de la distribución elegida, se pueden instalar muchas herramientas adicionales utilizando herramientas de empaquetado estándar como apt y yum.

Es posible conectar una pantalla y un teclado a su dispositivo de destino y hacer todo su desarrollo directamente allí. Para los desarrolladores nuevos en el espacio incrustado, es probable que este sea un entorno más familiar y elimina la necesidad de configurar y usar una complicada configuración de desarrollo cruzado.

La cantidad de paquetes disponibles para la mayoría de las distribuciones de escritorio es generalmente mayor que la disponible para los constructores específicos de incrustados discutidos anteriormente. Debido a la base de usuarios más grande y la variedad más amplia de casos de uso, es posible que pueda encontrar todos los paquetes de tiempo de ejecución que necesita para su aplicación ya creados y listos para usar.

Desventajas

Es probable que el uso del destino como su entorno de desarrollo principal sea lento. La ejecución de herramientas de compilación es una operación que consume muchos recursos y, según la cantidad de código que esté compilando, puede afectar su rendimiento.

Con algunas excepciones, las distribuciones de escritorio no están diseñadas para adaptarse a sistemas de bajos recursos y puede ser difícil recortar adecuadamente las imágenes de destino. De manera similar, el flujo de trabajo esperado en un entorno de escritorio no es ideal para la mayoría de los diseños integrados. Conseguir un entorno reproducible de esta manera es difícil. Agregar y eliminar paquetes manualmente es propenso a errores. Esto se puede programar utilizando herramientas específicas de distribución, como debootstrap para sistemas basados ​​en Debian. Para mejorar aún más la reproducibilidad, puede utilizar una herramienta de gestión de la configuración, como CFEngine (que, para ser sincero, la realiza mi empleador, Mender.io). Sin embargo, aún está a merced del proveedor de distribución, quien actualizará los paquetes para satisfacer sus necesidades, no las suyas.

Recomendación

Tenga cuidado con este enfoque para un producto que planea llevar al mercado. Este es un buen modelo para aplicaciones de aficionados; sin embargo, para los productos que necesitan soporte, es probable que este enfoque sea problemático. Si bien puede obtener un comienzo más rápido, puede costarle tiempo y esfuerzo a largo plazo.

Otras consideraciones

Esta discusión se ha centrado en la funcionalidad de los sistemas de compilación, pero generalmente hay requisitos no funcionales que pueden afectar su decisión. Si ya seleccionó su sistema en chip (SoC) o placa, es probable que el proveedor dicte su elección. Si su proveedor proporciona un paquete de soporte de placa (BSP) para un sistema determinado, usarlo normalmente le ahorrará bastante tiempo, pero investigue la calidad del BSP para evitar problemas más adelante en su ciclo de desarrollo.

Si su presupuesto lo permite, puede considerar usar un proveedor comercial para su sistema operativo de destino. Hay empresas que proporcionarán una configuración validada y compatible de muchas de las opciones discutidas aquí y, a menos que tenga experiencia en sistemas integrados de compilación de Linux, esta es una buena opción y le permitirá concentrarse en su competencia principal.

Como alternativa, puede considerar la capacitación comercial para su personal de desarrollo. Es probable que esto sea más económico que un proveedor de sistema operativo comercial y le permitirá ser más autosuficiente. Esta es una forma rápida de superar la curva de aprendizaje de los conceptos básicos del sistema de compilación que elija.

Finalmente, es posible que ya tenga algunos desarrolladores con experiencia con uno o más de los sistemas. Si tiene ingenieros que tienen una preferencia, sin duda vale la pena tenerlo en cuenta al tomar su decisión.

Resumen

Hay muchas opciones disponibles para construir sistemas Linux embebidos, cada una con sus ventajas y desventajas. Es crucial priorizar esta parte de su diseño, ya que es extremadamente costoso cambiar de sistema más adelante en el proceso. Además de estas opciones, se están desarrollando nuevos sistemas todo el tiempo. Con suerte, esta discusión proporcionará algo de contexto para revisar los nuevos sistemas (y los que se mencionan aquí) y lo ayudará a tomar una decisión sólida para su próximo proyecto.


Linux
  1. Uso de AppImage para la administración de paquetes de Linux

  2. 4 herramientas de escaneo para el escritorio de Linux

  3. Las mejores herramientas de Linux para escritores

  4. Las 5 mejores herramientas de migración de datos para Linux

  5. 80 herramientas de monitoreo de Linux para administradores de sistemas

Las 12 mejores herramientas de copia de seguridad de código abierto para sistemas Linux

Algunas herramientas útiles para administradores de sistemas Linux

Herramientas de Linux:du vs df

Las 20 mejores herramientas de bioinformática para el sistema Linux

Los 15 mejores gestores de arranque de Linux para el hogar y sistemas integrados

Las 15 mejores herramientas de biología para el sistema Linux