<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Engineering at the Edge</title><link>https://torizon.github.io/blog/</link><description>Recent content on Engineering at the Edge</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Wed, 09 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://torizon.github.io/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Using squashfs for fast, encrypted Torizon Secure Offline Updates (Lockboxes)</title><link>https://torizon.github.io/blog/encrypted-lockboxes-with-squashfs-and-luks/</link><pubDate>Wed, 09 Sep 2026 00:00:00 +0000</pubDate><guid>https://torizon.github.io/blog/encrypted-lockboxes-with-squashfs-and-luks/</guid><description>&lt;p>&lt;a href="https://developer.toradex.com/torizon/torizon-platform/torizon-updates/secure-offline-updates/how-to-use-secure-offline-updates-with-torizoncore">Torizon Offline Updates&lt;/a> fire when a lockbox appears at a configured path. That works, but USB media is awkward in two ways:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Mount paths depend on the volume label&lt;/strong> (&lt;code>/media/&amp;lt;label&amp;gt;-…&lt;/code>), so update sticks need a pre-agreed label, or the lockbox won&amp;rsquo;t appear at the correct path.&lt;/li>
&lt;li>&lt;strong>OSTree lockboxes are many small files&lt;/strong>, which can perform poorly on removable media—especially older filesystems like FAT.&lt;/li>
&lt;/ol>
&lt;p>We can instead ship the lockbox as a single squashfs image with a fixed name. All we need to do is add a small systemd &lt;a href="https://www.freedesktop.org/software/systemd/man/latest/systemd.path.html">path unit&lt;/a> that finds it on any mounted USB volume and loop-mounts it to where Aktualizr already looks.&lt;/p></description></item><item><title>Hardening the software supply chain with a Yubikey: Torizon Cloud updates with zero trust and offline keys</title><link>https://torizon.github.io/blog/offline-hardware-bound-keys-signing-blog-post/</link><pubDate>Wed, 14 May 2025 00:00:00 +0000</pubDate><guid>https://torizon.github.io/blog/offline-hardware-bound-keys-signing-blog-post/</guid><description>&lt;p>Sometimes, when using security tools, there&amp;rsquo;s a gap between what you can do in principle, and what you can do in practice. This blog post is about my experience going zero-trust with my Torizon Cloud repository, the obstacles I faced along the way, and how I actually got everything working.&lt;/p>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>I&amp;rsquo;m a cybersecurity intern at Toradex. I&amp;rsquo;ve worked on TUF and Uptane during a residence at NYU Tandon in the Secure Systems Lab earlier, but that was only theoretical. Working at Toradex was my first interaction with a real-world Uptane implementation - so I thought I would see how it was to take an Uptane repository in Torizon, with online keys in Toradex custody, and update it so that the signing keys are completely offline, and stored on secure hardware where the actual private keys are completely impossible to extract.&lt;/p></description></item><item><title>How to Persist Application Data Across Torizon OS Updates</title><link>https://torizon.github.io/blog/how-to-persist-app-data-across-os-updates/</link><pubDate>Mon, 02 Dec 2024 00:00:00 +0000</pubDate><guid>https://torizon.github.io/blog/how-to-persist-app-data-across-os-updates/</guid><description>&lt;p>The Torizon OS is designed around the concept that different parties handle &lt;em>applications&lt;/em> and &lt;em>OS&lt;/em> development:&lt;/p>
&lt;ul>
&lt;li>Applications: you, as a Torizon customer, develop and update your application on your development cycle&lt;/li>
&lt;li>OS: we, the Torizon OS Team at Toradex, develop and update the base OS, releasing it every quarter&lt;/li>
&lt;/ul>
&lt;p>A question I sometimes get from customers is: how can I keep my application data when updating the base OS?&lt;/p>
&lt;h2 id="a-practical-answer">A Practical Answer&lt;/h2>
&lt;p>&lt;strong>You must store the application data somewhere under the &lt;code>/var&lt;/code> or the &lt;code>/etc&lt;/code> directory&lt;/strong>. OSTree, the file system management tool used for OS Updates, keeps the &lt;code>/var&lt;/code> directory intact during the updates. Also, OSTree only touches files under &lt;code>/etc&lt;/code> if they haven&amp;rsquo;t been modified outside its knowledge, known as a &lt;a href="https://ostreedev.github.io/ostree/atomic-upgrades/#assembling-a-new-deployment-directory">3-way merge&lt;/a>.&lt;/p></description></item><item><title>Embedded Software Testing: Practical Continuous Integration with Hardware in the Loop (Part 2)</title><link>https://torizon.github.io/blog/software-testing-the-hardware-software-interface-part-2/</link><pubDate>Sun, 03 Nov 2024 00:00:00 +0000</pubDate><guid>https://torizon.github.io/blog/software-testing-the-hardware-software-interface-part-2/</guid><description>&lt;p>This is the second installment in the embedded software testing series. This one will be about the architecture of a
system to test embedded software. I&amp;rsquo;ll give you a practical example of a test for an Embedded Device with integration to
a CI/CD system. We&amp;rsquo;ll briefly cover what is usually called a &amp;ldquo;dual-targeting&amp;rdquo; approach as well.&lt;/p>
&lt;h2 id="theory">Theory&lt;/h2>
&lt;p>In the previous installment we talked about the different levels of software testing, and the last one was &amp;ldquo;end-to-end
testing&amp;rdquo;, which is treating the Device Under Test (DUT) like a black box, poking it with a certain stimuli
(inputs), seeing how it reacts (output) and comparing with a known expected value.&lt;/p></description></item><item><title>Embedded Software Testing: the Hardware-Software Interface (Part 1)</title><link>https://torizon.github.io/blog/software-testing-the-hardware-software-interface-part-1/</link><pubDate>Wed, 14 Aug 2024 00:00:00 +0000</pubDate><guid>https://torizon.github.io/blog/software-testing-the-hardware-software-interface-part-1/</guid><description>&lt;p>This series of blogposts will deal with embedded software testing. I want to pass on to the reader the hard-earned
knowledge from around 5 years of working with embedded software testing.&lt;/p>
&lt;p>We&amp;rsquo;ll start with some definitions and then go through more practical aspects of software testing. Our focus here will
be Embedded Linux, but the concepts and the tooling can surely go beyond it, such as in the realm of microcontrollers.&lt;/p></description></item><item><title>Wait! My Container is Crashing Before Startup</title><link>https://torizon.github.io/blog/wait-my-container-is-crashing-before-startup/</link><pubDate>Thu, 08 Aug 2024 00:00:00 +0000</pubDate><guid>https://torizon.github.io/blog/wait-my-container-is-crashing-before-startup/</guid><description>&lt;p>When &lt;a href="https://developer.toradex.com/torizon/application-development/working-with-containers/using-multiple-containers-with-torizoncore/">using more than one container in a project&lt;/a>, a probable scenario developers are faced with is startup errors due to a lack of inter-container app synchronization.&lt;/p>
&lt;p>This often happens due to two reasons:&lt;/p>
&lt;ol>
&lt;li>Containers are started in parallel leading to race conditions.&lt;/li>
&lt;li>Even when starting one container after the other, containers don’t know when your application and its dependencies started.&lt;/li>
&lt;/ol>
&lt;p>Especially on Embedded Linux, which is the case of &lt;a href="https://www.torizon.io/">Torizon OS&lt;/a>, this is bad. These systems might be deployed to remote, hard-to-reach locations, and on-site maintenance may cost a lot.&lt;/p></description></item><item><title>Why bare-metal Debian (and Raspberry Pi OS) is not a good choice for most Embedded Systems</title><link>https://torizon.github.io/blog/why-bare-metal-debian-and-raspberry-pi-os-is-not-a-good-choice-for-most-embedded-systems/</link><pubDate>Mon, 01 Jul 2024 00:00:00 +0000</pubDate><guid>https://torizon.github.io/blog/why-bare-metal-debian-and-raspberry-pi-os-is-not-a-good-choice-for-most-embedded-systems/</guid><description>&lt;p>Quite a few embedded vendors nowadays ship Debian or some derivative by default, specially for the hobbyist sector, but I don&amp;rsquo;t think people realize that there isn&amp;rsquo;t an expectation that Debian will be their &lt;em>production&lt;/em> operating system, and when with &amp;lsquo;production&amp;rsquo; I don&amp;rsquo;t mean one or two devices: by all means, if that&amp;rsquo;s your scale, continue using Debian in pet machines instead, that&amp;rsquo;s very much fine.&lt;/p>
&lt;p>The real issue arises when you need real scale like multiple thousands of devices per year, which is the scale most SoM/SBC vendors are working with. Let&amp;rsquo;s go over some of the drawbacks you&amp;rsquo;ll have to deal with running Debian with those devices.&lt;/p></description></item><item><title>How does hardware acceleration work with containers?</title><link>https://torizon.github.io/blog/how-does-hardware-acceleration-work-with-containers/</link><pubDate>Wed, 05 Jun 2024 00:00:00 +0000</pubDate><guid>https://torizon.github.io/blog/how-does-hardware-acceleration-work-with-containers/</guid><description>&lt;p>At Toradex we build Torizon OS, which is a container-based embedded system. What do we mean by that? It means that the applications run in isolated environments called containers.&lt;/p>
&lt;p>This begs the question: how do we access hardware resources like GPIOs from inside the containers, or even worse, how do we get GPU acceleration inside the containers?&lt;/p>
&lt;h2 id="a-gpu-acceleration-primer">A GPU acceleration primer&lt;/h2>
&lt;p>To run GPU accelerated applications on Linux in general you need some components in the userspace and some other components in the kernel space. So when you have an application that needs hardware acceleration, you link against libraries that provide a graphics API such as OpenGL which will in turn talk to another library that issues the &lt;code>ioctl()&lt;/code> calls to the device descriptor created by the GPU driver.&lt;/p></description></item></channel></rss>