This article holds frequently asked questions (FAQ) about Torizon and TorizonCore.
You are encouraged to search for your topic of interest in the Torizon related articles.
Browse the sub-sections below after your topics of interest.
Torizon is an open-source software platform that simplifies the development and maintenance of embedded Linux software.
You can see a general overview at the Torizon page on our main website and a technical overview at TorizonCore Technical Overview.
Torizon is a new Linux-based software platform that simplifies the process of developing and maintaining embedded software. It allows you to configure the system for your use case quickly and easily, so you can focus on application development instead of Linux builds.
Check out the Torizon page on the Toradex website to learn more.
TorizonCore came out of a need to ease our customers into Embedded Linux, allowing them to focus on application development by using containers and shipping a binary operating system based on Yocto/OpenEmbedded which is completely open-source. We’re including ease-of-use technology such as Integrated Development Environment (IDE) support, allowing a customer to do development and debugging without leaving the comfort of their IDE.
Furthermore, even though Torizon is built by Toradex with Yocto, we expect that you can use it right away, as a binary distribution, therefore making your life easier since you don't need to learn Yocto, which has a steep learning curve.
You can learn more about the technical details on TorizonCore Technical Overview.
Here are some examples of offerings that are part of the Torizon ecosystem: - Torizon OTA: the project is currently under Toradex Labs, comprising a full CI/CD infrastructure, a cloud-hosted dashboard to expose features for our customers among other components, and relies on the native OTA support on the device provided by the TorizonCore OS. - Partner Demo Containers: container images that make it possible to use partner technologies easily on Torizon, running on TorizonCore. - Visual Studio Extension For Torizon: enables a developer-friendly migration path for Windows and Windows CE application developers. - Visual Studio Code Extension for Torizon: support one of the most popular IDEs of the moment. With a large ecosystem and several tools, this is a great way to get started for an awesome development experience.
TorizonCore is 100% Linux-based, using Yocto Project/OpenEmbedded as a base, adding container support, an OTA update client, OSTree, and several other key technologies.
Refer to the Software page on our developer center.
Torizon is focused on providing an experience to our customers they are used to and developing integration with IDEs we all know and love. We’ve started with the Visual Studio Extension For Torizon and the Visual Studio Code Extension for Torizon and will be working on expanding support to all of the most popular use-cases. Please let us know your development workflow!
Learn more about how to use our extensions in the Torizon documentation, especially in the section Application Development
You will find all the information in the Torizon documentation. The useful icons will indicate which articles have information about Visual Studio and Visual Studio Code.
Our IDE Extensions make API calls to an open-source back-end named Moses. If you work for an IDE team, this back-end allows you to add support to your IDE.
Containers allow you to focus on just building your application as quickly and efficiently as possible by utilizing 3rd party pre-built containers and not having to worry about incompatibilities with libraries or dependencies.
Containers actually utilize user-mode virtualization to isolate processes but share the same kernel, allowing performance to match native applications. There is some storage/memory overhead, however, with some library duplication when using different versions.
If you use multiple containers, complexity may sound a bit complex in the beginning, but we believe that the multiple benefits brought up by containerization are paid off. Nevertheless, in the last instance, you can use a single container fully privileged to package all your applications with full access to the system, thus eliminating this complexity.
An image is a read-only, stateless template, whereas a container is a running instance of it. More than one container can be run from the same image. For comprehensive information, go through the Docker documentation. For instance, in the Docker overview, there is a section that defines what are images and containers.
You can run almost any container on Torizon, as long as the processor architecture matches the container architecture was built for. You can find the list of Toradex and partner containers in the List of Container Images for Torizon.
There is no straightforward answer to this question since it depends on the programming language, hardware dependencies, and possibly many other factors.
If you have an existing headless .NET, C/C++ or Python application, start from the templates provided in our Visual Studio Code Extension for Torizon. WE even have a dedicated article with tips and tricks for C/C++ named How to Import a C/C++ Application to Torizon.
There are many other resources for GUI applications such as Qt Debian Container for Torizon, How to Build a GUI with ASP.NET Core and Blazor for TorizonCore and more under the Torizon documentation.
You can also run your own language, application, database, and much more inside containers very easily. Refer to the Torizon documentation as a comprehensive starting point.
The full-featured image is rather large taking up most of the space on the raw NAND-based modules. As such it is not recommended to experiment with containers on these devices since there isn't much space for containers as is. In the future, we hope to slim down the footprint.
Just like when building regular applications, a container built on an x86 machine will work only on x86 targets, the same is true for Arm and other computer architectures.
Note: There is also a distinction between Armv7 (32 bit) and Armv8 (64 bit).
Preliminary tests show that it's possible, though you're encouraged to use the 64-bit version whenever possible.
The Debian Containers for Torizon are containers based on the official Debian container, maintained by Toradex. They overcome several challenges of running containers on embedded systems, such as granular hardware access and compatibility with the host OS, making your development experience much easier and safer, granted that you follow the Torizon Best Practices Guide.
We don't use the tag
latest. We always use tags with versions that follow the semantic versioning. Learn more about it in the article TorizonCore Containers Tags and Versioning.
This question is related to your use case. We recommend that you start with Run and Manage Containers with Portainer and the Command-line on Torizon and the Torizon Best Practices Guide. You must also consider Using Multiple Containers with TorizonCore. If you need to access hardware features, check our list of Hardware Access articles.
You can Store Docker Data on an External Storage Device (USB/SD Card). The OS will still be installed in the internal flash of the SoM, which is expected to be more reliable.
As of TorizonCore 5, investigations led us to find out that when multiple containers start, there is a RAM peak independent of the containers. If the free RAM limit of the SoM is reached, the kernel watchdog will reboot the system. Furthermore, if all containers are configured with a restart policy such as
restart=unless-stopped, it may lead to a reboot loop.
The maximum number of containers depends on the hardware. At the time of the report, on Verdin iMX8M Mini DualLite 1GB WB V1.1B the maximum was 7 containers, and on a Colibri iMX8 QuadXPlus 2GB WB IT the maximum was 18 containers.
To overcome that limitation, you may control startup order, make sure to not use a Docker restart policy and edit the
docker-compose systemd service to restart the containers following the control startup order in case a reboot happens. Make sure to extensively test and validate such tweaks.
Another possibility is to rework 2 or more containers to fit in a single container, thus reducing the total number of containers on startup.
TorizonCore is completely free to all of our customers and we encourage modifications by publishing all of our source code.
All of the source code needed to build TorizonCore is publicly available and licensed under a free modifiable license. Some components such as GPU drivers may be binary only but this is outside of Toradex control. We strive to open source all components we can and will continue to support upstreaming our changes into mainline anytime we can.
You can find the source-code in our GitHub. In addition, comprehensive documentation about how to Build TorizonCore With Yocto and BSP efforts to mainline, among several other topics, can be found on our developer website.
TorizonCore is built from Yocto Project/OpenEmbedded and utilizes over 200 open source projects which all have licensing that falls under the Open Source Initiative guidelines. The only proprietary pieces we include are from the SoC vendor and we actively work to find OSS alternatives.
Torizon OTA is an integrated over-the-air update system that works out-of-the-box with TorizonCore. It is part of the Torizon platform and it is the recommended method for over-the-air updates with TorizonCore. Learn more in Torizon OTA.
Torizon OTA provides both complimentary and paid services. If you have an interest in learning more about Torizon OTA pricing and plans, please contact us.
This service is available in the paid plans. If you have an interest in learning more about Torizon OTA pricing and plans, please contact us.
Torizon OTA is new and growing fast, just like its documentation. Make sure to:
Torizon OTA makes use of OSTree and Aktualizr, which are deployed by default on the target. You can use other OTA systems in two ways:
OSTree is a way to check and store filesystem changes in a git-like filesystem, allowing the customer to do atomic updates in their rootfs. When updates do occur, only the delta between the difference is sent to the target, which makes updating much quicker and using much less data than other approaches as A/B partition.
Learn more about it in our article about OSTree.
TorizonCore has a built-in client updater, called Aktualizr, which allows someone to push updates using a Uptane-compatible backend, such as HERE or our own OTA solution. It relies on OSTree to execute the updates.
Learn more about it on Torizon OTA.
You have to use the TorizonCore Builder Tool to add or update the registry credentials to your devices, thus making it scalable to deploy them to several devices without manually logging-in. It is described in details in the article Using Private Registries With Torizon OTA.
TorizonCore is built upon our foundational work that is done by our BSP team who handles the majority of our driver work. It means that TorizonCore is built on top of the Toradex BSP Layers and Reference Images for Yocto Project.
TorizonCore is focused on providing ease-of-use and the best out-of-the-box experience without requiring the customer to have extensive Yocto Project/OpenEmbedded knowledge.
TorizonCore is built on top of our Yocto BSP layers, therefore it cannot work without them. One of the great advantages is that you don't have to build and maintain it by yourself.
If you have strong Yocto Project/OpenEmbedded skills or fall into some corner-cases where customization at the OS level is inevitable (e.g. fast boot), then you must either: - Build your own customized version of TorizonCore, if you still want to benefit from its components and ecosystem. - Opt to go with the traditional Yocto approach to build your own Yocto image.
In a nutshell, ultra-summarized sentence, TorizonCore’s focus is to not require the customer to have extensive Yocto Project/OpenEmbedded experience to build applications. Leveraging our container support and IDE integration, you can quickly go to market with your embedded solution.
If you are deeply skilled with Yocto Project/OpenEmbedded and need to fully customize your OS experience, the value of TorizonCore is less of an impact. Often this happens for a corner-case not covered by TorizonCore, such as a fast-boot system or the use of a raw NAND-based SoM.
Keep in mind that we left the Torizon ecosystem out of this comparison, meaning that by not using TorizonCore, you also lose some of the benefits provided by the Torizon ecosystem, such as OTA.
The primary purpose of Device Tree in Linux is to provide a way to describe non-discoverable hardware. TorizonCore utilizes Device Tree files to define a set of hardware and allows you to customize it to your exact specifications.
To learn more, read our article about Device Tree Overlays that focuses on TorizonCore, and our generic article about Device Tree Customization.
In our context, in a very summarized way, Mainline is the tip of the Linux kernel maintained directly by Linus Torvalds. Downstream are modified releases of specific versions of the mainline maintained by someone else, usually hardware vendors.
We strive to use the mainline kernel whenever possible with TorizonCore. We work with our SoC vendors to open up as much source code as possible and upstream their drivers, removing as many proprietary drivers as possible - as you can glimpse on BSP efforts to mainline. Nevertheless, when it is not possible to follow the mainline for various reasons, we make sure that the downstream version offered by the SoC vendor works well on our SoMs. You can easily see it by looking at our Linux BSP releases and our commit history in our downstream Linux kernel.
In our i.MX6-based Debian containers we are using the Armada X.org DDX driver which seems to have worked fine in our tests but, it might show stability issues.
In summary, we document how you can run graphics accelerated containers, for instance on Debian Containers for Torizon. Since our Linux distribution uses Wayland/Weston + XWayland, from then on, it is all about developing your compatible application, using your framework of choice.
Our out-of-the-box experience includes Wayland, Chromium, and Portainer, which is a web-based tool to manage containers. You can easily customize our pre-built containers or add your own.
We have examples documenting how to run a Graphical User Interface on TorizonCore using several different technologies like Qt, Crank, and TotalCross.
Keep an eye on the list of Torizon related articles, or subscribe to our updates in the footer of the developer website. We plan to document how to use other technologies to build and run a GUI app on TorizonCore.
If you choose to use the Debian Containers for Torizon, which we recommend, then you can Remote Access the TorizonCore GUI Using VNC or RDP.
We have documented how to access devices and interfaces through the container isolation layer from the Host OS, allowing the customer to control exactly what their application can use and keep it as secure as possible.
Search for your use-case in the list of Torizon related articles, more specifically in the Hardware Access section. If you didn't find what you need, post a question in our community.
Make sure to clear the U-Boot environment by using
env default -a && env save. If resetting the U-Boot environment does not help, use
setenv tdxargs loglevel=7 to enable kernel debug messages. Also
setenv tdxargs "loglevel=7 earlycon" can help to initialize a console during very early boot and thus see debug output in case the kernel crashes very early during boot.
There is an open Docker bug that affects Windows machines in which the date inside the containers may not be correctly synced with the host PC.
You may experience weird issues due to that, such as
apt-get failing due to security certificates dates not matching, or wrong dates in logs.
The only solution at the moment is to restart the Docker daemon on your host machine.
Configure Build Environment for Torizon Containers on your PC.
Set the default Python interpreter as explained on Python Development and Debugging on TorizonCore Using Visual Studio Code.
If you have recently installed Docker and WSL 2 on Windows, and your Windows machine has a wrong date/time, you may face a similar error. See below a sample error output from the Docker build:
> [2/13] RUN apt-get update && apt-get install -y --no-install-recommends python3 python3-setuptools python3-influxdb python3-dev wait-for-it python3-pip && apt-get clean && apt-get autoremove && rm -rf /var/lib/apt/lists/*: #5 0.643 Get:1 http://deb.debian.org/debian buster InRelease [121 kB] #5 0.644 Get:2 http://security.debian.org/debian-security buster/updates InRelease [65.4 kB] #5 0.722 Get:3 http://deb.debian.org/debian buster-updates InRelease [51.9 kB] #5 1.085 Get:4 https://feeds.toradex.com/debian/testing buster InRelease [8943 B] #5 2.340 Get:5 http://deb.debian.org/debian buster/main arm64 Packages [7736 kB] #5 7.500 Get:6 https://feeds.toradex.com/debian/testing buster/main arm64 Packages [91.1 kB] #5 7.842 Reading package lists... #5 10.37 E: Release file for http://deb.debian.org/debian/dists/buster-updates/InRelease is not valid yet (invalid for another 3h 55min 49s). Updates for this repository will not be applied. #5 10.37 E: Release file for http://security.debian.org/debian-security/dists/buster/updates/InRelease is not valid yet (invalid for another 5h 55min 55s). Updates for this repository will not be applied. ------ failed to solve with frontend dockerfile.v0: failed to build LLB: executor failed running [/bin/sh -c apt-get update && apt-get install -y --no-install-recommends python3 python3-setuptools python3-influxdb python3-dev wait-for-it python3-pip && apt-get clean && apt-get autoremove && rm -rf /var/lib/apt/lists/*]: runc did not terminate sucessfully
Adjust your PC date/time and run the following in the PowerShell with admin privileges to force WSL 2 to reload the kernel:
$ wsl --shutdown
Please refer to the How to use the Real Time Clock in Linux article and learn how to use
hwclock to solve this problem.
When you try to run several containers on memory-limited devices, you may end up in a situation where even the kernel cannot handle it. With command (free, top, etc.), available memory can be checked. If running low on available memory, a CMA area size should be decreased. Please refer to the Contiguous Memory Allocator - CMA article and learn how to set/modify CMA area size with TorizonCore Builder via setting the kernel command line arguments to solve this problem.