<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet type="text/xsl" href="/index.xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>./techtipsy</title><link>https://ounapuu.ee/categories/hardware/</link><description>Recent content on ./techtipsy, a blog written by Herman Õunapuu.</description><generator>Hugo -- gohugo.io</generator><language>en-GB</language><managingEditor>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</managingEditor><webMaster>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</webMaster><lastBuildDate>Mon, 22 Jun 2026 20:00:00 +0300</lastBuildDate><atom:link href="https://ounapuu.ee/categories/hardware/index.xml" rel="self" type="application/rss+xml"/><item><title>These cheap USB-to-HDMI adapters are terrible, and yet incredibly useful</title><link>https://ounapuu.ee/posts/2026/06/22/usb-hdmi-adapter/</link><pubDate>Mon, 22 Jun 2026 20:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2026/06/22/usb-hdmi-adapter/</guid><description>5 EUR well spent.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2026/06/22/usb-hdmi-adapter/media/cover_hu_78a49f0fc7b01c23.jpg" width="1200" height="630" alt="These cheap USB-to-HDMI adapters are terrible, and yet incredibly useful" /><p>In 2023, I ordered a cheap piece of crap USB to HDMI adapter. From time to time, I dabble with computers, but I don&rsquo;t
always have a convenient display at hand. Capture cards aren&rsquo;t anything new, but the good ones a bit expensive for a
hobbyist like myself.</p>
<p>The adapter sucks, and somehow it&rsquo;s been one of the most useful tools that I own.</p>
<p>The way that it works is also brilliant: the adapter acts like a webcam on your machine. This means that you can open
any app that can show webcam output, such as <a href="https://en.wikipedia.org/wiki/Cheese_%28software%29">Cheese</a>, and use your
laptop as a crappy portable display. It also works in VLC, but I&rsquo;ve had a much better and easier experience with Cheese.</p>
<p>Don&rsquo;t expect any crystal clear output or high refresh rates.</p>
<p>But it gets the job done. Quick UEFI settings tour, OS installation, or general troubleshooting, it&rsquo;s fantastic for those
use cases. I have had a few displays that are picky about display resolutions and things like outputting anything at
all, such as the LattePanda V1, and somehow this adapter makes it work quite reliably.</p>
<p>When I checked the price for the adapter I ordered, I found that somehow it has gotten cheaper. Don&rsquo;t see that happening
much lately.</p>









<figure class="center">
  <a href="/posts/2026/06/22/usb-hdmi-adapter/media/adapter.jpg">
    <img src="/posts/2026/06/22/usb-hdmi-adapter/media/adapter_hu_ff496c5d755c7d55.webp"
     width="850"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="Lattepanda IOTA connected to my laptop via the USB to HDMI adapter.">

  </a>
  <figcaption class="center">Lattepanda IOTA connected to my laptop via the USB to HDMI adapter.</figcaption>
</figure>

]]></content:encoded></item><item><title>The most unstable computer in my fleet is now the most critical one</title><link>https://ounapuu.ee/posts/2026/04/04/lattepanda/</link><pubDate>Sat, 04 Apr 2026 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2026/04/04/lattepanda/</guid><description>No way that this can go wrong. Not at all.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2026/04/04/lattepanda/media/cover_hu_73aa3329770b1e79.jpg" width="1200" height="630" alt="The most unstable computer in my fleet is now the most critical one" /><p>Remember <a href="/posts/2026/01/16/worst-media-server/">that failed experiment</a> where I ran Jellyfin off of a LattePanda V1?</p>
<p>Do you recall all the parts where I said what this single board computer <em><strong>cannot</strong></em> do?</p>
<p>Yeah, I remember.</p>
<p>Then I took it and put the two of the most critical services running on it: the blog you&rsquo;re reading right now, and my
Wireguard setup.</p>
<p>Trust me, it makes more sense with some context. The board is incapable of doing anything else other than serving
content from the eMMC module, and it has a functioning network port. It doesn&rsquo;t seem to crash in these scenarios.</p>
<p>When I try anything else with this board, especially things that include USB connectivity, things break. This makes the
board ideal for a light workload that needs to be up 24/7.</p>
<p>The biggest threat to my uptime is not internet connectivity or loss of power (although that did happen for the first
time in a year recently), it&rsquo;s me getting new ideas to try out on my setup, which results in downtime. This board is so
unreliable for trying those ideas out that it removes any and all temptation to <em>do</em> that, resulting in a computer that
has the highest chance of actually being up and running for a very long time.</p>
<p>To play things safe, I used an IKEA SJÖSS 20W USB-C power adapter that I got for 3 EUR, with a cheap USB-C to USB-A
adapter thrown into the mix. It looks janky, but the adapter outputs 5V 3A, which makes it the beefiest power adapter
that I have in my fleet for plain USB-A powered devices.</p>
<p>I then hit the board with some <code>stress</code> commands, including hitting the 2 GB of memory. It ran really well for days, no
issues at all.</p>









<figure class="center">
  <a href="/posts/2026/04/04/lattepanda/media/stressing-out.jpg">
    <img src="/posts/2026/04/04/lattepanda/media/stressing-out_hu_b4ea99889312878a.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="Less espresso, more Lattepanda, more stresso.">

  </a>
  <figcaption class="center">Less espresso, more Lattepanda, more stresso.</figcaption>
</figure>

<p>I also improved the cooling situation. I am now a proud owner of an assortment of M2, M2.5 and M3 screws and bits, and
equipped with a Makita cordless drill, I made some mounting holes into an old aluminium server heat sink. The drilling
was a complete hack job, everything was misaligned, but it was good enough. Certainly better than holding the board and
heat sink together with thin velcro strips. The cooling performance is completely adequate, the board hits a maximum of
65°C with the heat sink facing down. This is well below the point at which the board starts to throttle its CPU.</p>









<figure class="center">
  <a href="/posts/2026/04/04/lattepanda/media/side-view.jpg">
    <img src="/posts/2026/04/04/lattepanda/media/side-view_hu_62184c91343891eb.webp"
     width="1000"
     height="482"
     loading="lazy"
     decoding="async"
     alt="Two out of three chips have adequate cooling. Whoops.">

  </a>
  <figcaption class="center">Two out of three chips have adequate cooling. Whoops.</figcaption>
</figure>

<p>The theoretical maximum Wireguard throughput on this board is about 340 Mbps, measured using the
fantastic <a href="https://github.com/cyyself/wg-bench">wg-bench</a> solution.</p>
<p>Remember the part about the USB ports being flaky? Yeah. That didn&rsquo;t stop me from getting a USB Gigabit Ethernet
adapter to remove one of the main limitations of the LattePanda V1. Based off of vibe-recommendations by Claude, I got a
TP-Link UE300 for its alleged low power usage and its availability at a local computer store in Estonia. It seems to
work well enough, you can push gigabit speeds through it measured by <code>iperf3</code>, and the actual Wireguard performance that
I could push through it with an actual workload was at about 420 Mbit/s, higher than indicated by the benchmark, and
plenty fast for most workloads, especially in external networks that are usually slower than that.</p>









<figure class="center">
  <a href="/posts/2026/04/04/lattepanda/media/speed.png">
    <img src="/posts/2026/04/04/lattepanda/media/speed_hu_553c4ae4b61a3ad.webp"
     width="1000"
     height="439"
     loading="lazy"
     decoding="async"
     alt="iperf3 test results on LattePanda V1, with occasional CPU and memory stress tests thrown in.">

  </a>
  <figcaption class="center">iperf3 test results on LattePanda V1, with occasional CPU and memory stress tests thrown in.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2026/04/04/lattepanda/media/wireguard.png">
    <img src="/posts/2026/04/04/lattepanda/media/wireguard_hu_b67d71a1d5528ffb.webp"
     width="1000"
     height="439"
     loading="lazy"
     decoding="async"
     alt="Copying data from another Wireguard peer through the LattePanda V1.">

  </a>
  <figcaption class="center">Copying data from another Wireguard peer through the LattePanda V1.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2026/04/04/lattepanda/media/cables.jpg">
    <img src="/posts/2026/04/04/lattepanda/media/cables_hu_d0b5c96d42223007.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="Cable management is not my strength.">

  </a>
  <figcaption class="center">Cable management is not my strength.</figcaption>
</figure>

<p>A few hours after making that
change, <a href="https://news.ycombinator.com/item?id=47597159">a HN post put some mild load on the LattePanda V1,</a> what good
timing.</p>
<p>As of publishing this post, the blog has been running mostly off of the LattePanda V1 for over a month now, with that
gap in it being caused by contemplating getting that USB Ethernet adapter and temporarily running the blog and Wireguard
off of another mini PC during that time.</p>
<p>Did you notice?</p>
<h2 id="2026-july-update">
  <a class="heading-anchor" href="#2026-july-update">2026 July update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I was running out of room and network ports on my router, so I decided to stop this experiment. During all this time,
there were no issues with the LattePanda V1, except when I accidentally bumped into its power cable and made it go
offline. Oops.</p>
]]></content:encoded></item><item><title>Improving my focus by giving up my big monitor</title><link>https://ounapuu.ee/posts/2026/04/01/focus/</link><pubDate>Wed, 01 Apr 2026 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2026/04/01/focus/</guid><description>Thoughts on an experiment that I've been running for about a month.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2026/04/01/focus/media/cover_hu_c1548efdb0fb585f.jpg" width="1200" height="630" alt="Improving my focus by giving up my big monitor" /><p>Keeping my focus has been challenging. It&rsquo;s not a new phenomenon, and I suspect that there are contributing factors that
have lead to the unfocused state dominating. For example, I&rsquo;ve been that guy who wants to be on top of things, to be in
the loop, to respond to urgent issues. It feels fantastic to be in that firefighter role as it gives me the <em>feeling</em> of
having an impact, but it results in me being drained at the end of the day and often over-caffeinated.</p>
<p>One day I was doing work on my laptop on a couch because hitting 30 apparently means that sleeping slightly incorrectly
results in debilitating back pain. During that session, I was working on a larger task and making tons of tiny little
changes that needed to be done in order to release a new feature. I was finally in the zone again, and it felt
fantastic!</p>
<p>That&rsquo;s when I decided to start an experiment: can I improve my focus by giving up my big monitor?</p>
<h2 id="results">
  <a class="heading-anchor" href="#results">Results<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I&rsquo;ve done this type of &ldquo;experiment&rdquo; a few times in the past when the power has gone out and my super duper ergonomic
setup has become useless. No power, no USB-C dock, no monitor. It wasn&rsquo;t that fun and my eyes hated reading text off of
a laptop screen.</p>
<p>A few things have changed since then:</p>
<ul>
<li>GNOME has working fractional scaling that you can simply enable in display settings</li>
<li>ThinkPad displays have gotten better, with the picture being quite cromulent, and the 16:10 aspect ratio helps fit
more
on the screen</li>
<li>the nature of my work has changed and will keep changing in the near future</li>
</ul>
<p>Almost a month in, I&rsquo;ve had a pleasant experience with this experiment. I feel more focused. Yeah, that&rsquo;s it. Am I
actually more focused is up for debate, as I&rsquo;m not sure how to measure it objectively.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>Working off of a single screen forces me to focus at what&rsquo;s at hand. Alt-tabbing to a different app is quick, but just
enough to deter me from doing it in meetings or other focused tasks.</p>
<p>In my personal free time<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>, this has also resulted in computer use becoming more intentional. On a 34&quot; ultrawide
monitor, it was too easy to put YouTube running on the left side, and whatever else on the right. It was distracting and
resulted in time being wasted doing nothing. Interestingly enough, making computer use more intentional was a trick that
I tried when recovering from burnout, and it helped a lot.</p>
<p>As a side effect, the power consumption of my whole home office setup is significantly smaller, as I don&rsquo;t have to power
my ultrawide monitor. That made up most of the power consumption, with peaks of up to 100W.</p>









<figure class="center">
  <a href="/posts/2026/04/01/focus/media/power-usage.png">
    <img src="/posts/2026/04/01/focus/media/power-usage_hu_7c82f3fe132180ab.webp"
     width="1000"
     height="503"
     loading="lazy"
     decoding="async"
     alt="Note that this is for the whole desk setup, including one-off projects like stress testing desktop hardware.">

  </a>
  <figcaption class="center">Note that this is for the whole desk setup, including one-off projects like stress testing desktop hardware.</figcaption>
</figure>

<p>I also don&rsquo;t have to fight with <a href="https://jeffq.com/blog/the-ethernet-pause-frame/">my dock killing my whole network,</a> because there is no dock.</p>
<h2 id="how-to-do-it-well">
  <a class="heading-anchor" href="#how-to-do-it-well">How to do it well<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If you&rsquo;re just cleaning up your desk and plopping your laptop on there, you will likely have a bad time. The posture
will be off, and depending on your laptop, the keyboard and touchpad combination can prove to be an ergonomic nightmare.</p>
<p>At the very least, you should put your laptop up somewhere higher. Ideally, it should be using a stand that allows you
to use your favourite wireless keyboard and mouse below it. A simple laptop stand could get you most of the way there,
but the ideal solution is a freely adjustable monitor arm combined with a VESA-mounted laptop holder. This gives you the
freedom to place the laptop exactly as you&rsquo;d like while leaving the desk free for your peripherals.</p>









<figure class="center">
  <a href="/posts/2026/04/01/focus/media/cables.jpg">
    <img src="/posts/2026/04/01/focus/media/cables_hu_50901e94dabe631a.webp"
     width="751"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="All I ever need: power, and ethernet.">

  </a>
  <figcaption class="center">All I ever need: power, and ethernet.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2026/04/01/focus/media/cable-routing.jpg">
    <img src="/posts/2026/04/01/focus/media/cable-routing_hu_45c11ff7632d4f0d.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="Routes nicely and is out of the way.">

  </a>
  <figcaption class="center">Routes nicely and is out of the way.</figcaption>
</figure>

<p>Most monitor arm laptop holders have side arms that keep it in place, but I found them to be extremely annoying, so I
removed them by disassembling the holder and yanking out the side arms and springs. You may still need them if you are
using a very aggressive vertical angle, but I hated having to give up one USB-A port and blocking about 25% of the
exhaust fan also didn&rsquo;t seem like a good idea. Mounting the laptop with the springy side arms was also awkward.</p>
<p>If you&rsquo;re using a desktop and have a big display, then intentionally using a smaller and cheaper one for a while may
prove to be just as effective.</p>
<p>If you&rsquo;re using a laptop with a horrible display with poor viewing angles, glare and crappy resolution (which a lot of
older ThinkPads have), then you can still try this out, but I suspect that you&rsquo;ll not have a very good experience with
it due to this reason alone.</p>
<h2 id="exceptions-to-the-rule">
  <a class="heading-anchor" href="#exceptions-to-the-rule">Exceptions to the rule<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I still prefer to do my gaming sessions on a big screen. It&rsquo;s more immersive, and I can make out tiny details better,
such as spotting a car in the distance while driving in the oncoming lane in Need for Speed Most Wanted.</p>
<h2 id="conclusion">
  <a class="heading-anchor" href="#conclusion">Conclusion<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I&rsquo;m happy with this setup.</p>
<p>That&rsquo;s all I ever needed.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>go ahead, try to measure developer productivity objectively. Good luck!&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>that&rsquo;s what I call the time window between putting my son to sleep and midnight.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>Server room? No, I have a server pantry.</title><link>https://ounapuu.ee/posts/2026/03/11/server-pantry/</link><pubDate>Wed, 11 Mar 2026 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2026/03/11/server-pantry/</guid><description>Who needs AI data centers when you can have this?</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2026/03/11/server-pantry/media/cover_hu_37ffc79125a38881.jpg" width="1200" height="630" alt="Server room? No, I have a server pantry." /><p>The apartment that I live in right now has two small rooms with doors on them.</p>
<p>One of them is like a normal closet and that&rsquo;s where the ISP passive fiber optic line comes in.</p>
<p>The other one is a similarly sized room with a bunch of shelves and ventilation to keep things cool. A pantry,
basically.</p>
<p>I&rsquo;ve used the closet as a networking and home server spot for a while now, with a small dedicated shelf holding
everything. That shelf was a bit limiting, it could not accommodate all of my hardware that I wanted to play around
with, and the closet did not have very good ventilation, which resulted in the top half of the closet getting notably
warm during summer months. Not <em>too</em> warm, but warm enough to feel it when opening the closet.</p>
<p>One day I decided to realize an idea that had been in my mind ever since I
started <a href="/posts/2025/12/15/construction-vs-software/">renovating</a> this apartment: turn the pantry into a server room.</p>
<p>Meet the server pantry.</p>









<figure class="center">
  <a href="/posts/2026/03/11/server-pantry/media/vent-1.jpg">
    <img src="/posts/2026/03/11/server-pantry/media/vent-1_hu_730f40ee189b0b5b.webp"
     width="751"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="Vent from the pantry to the closet, where all the networking gear and power is.">

  </a>
  <figcaption class="center">Vent from the pantry to the closet, where all the networking gear and power is.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2026/03/11/server-pantry/media/vent-2.jpg">
    <img src="/posts/2026/03/11/server-pantry/media/vent-2_hu_51fc177be5661433.webp"
     width="751"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="Hello there.">

  </a>
  <figcaption class="center">Hello there.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2026/03/11/server-pantry/media/vent-3.jpg">
    <img src="/posts/2026/03/11/server-pantry/media/vent-3_hu_49ffe0faa0ae045b.webp"
     width="751"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="Power and network, installed by a professional tool.">

  </a>
  <figcaption class="center">Power and network, installed by a professional tool.</figcaption>
</figure>

<p>It&rsquo;s cool.</p>
<p>It&rsquo;s the furthest point in the apartment from the bed and my home office setup, so I can put incredibly noisy computers
in it.</p>
<p>It only has a few spiders.</p>









<figure class="center">
  <a href="/posts/2026/03/11/server-pantry/media/pantry-dankpad.jpg">
    <img src="/posts/2026/03/11/server-pantry/media/pantry-dankpad_hu_6ba2594216218238.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="ThinkPad T430 (the server) chilling in the pantry.">

  </a>
  <figcaption class="center">ThinkPad T430 (the server) chilling in the pantry.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2026/03/11/server-pantry/media/pantry-iota.jpg">
    <img src="/posts/2026/03/11/server-pantry/media/pantry-iota_hu_a4b96ecec163f97f.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="LattePanda IOTA, chilling in the pantry, below an IKEA Variera shelf thingy to fit more compute power on the shelf in
the near future.">

  </a>
  <figcaption class="center">LattePanda IOTA, chilling in the pantry, below an IKEA Variera shelf thingy to fit more compute power on the shelf in
the near future.</figcaption>
</figure>

<p>Due to the pantry being cool and dry, it makes for a good spot for hosting food and stuff. Adding &lt;100W of
heat output at the top of the room should not be an issue as hot air tends to rise, and if temperatures end up being an
issue, I can open one of the two vents that are directly connected to the outside to get some fresh and cool air in. The
temperature delta between the bottom and top of the pantry seems to be about 10°C, ranging from 6-16°C.</p>
<p>The impact of running things in a slightly chillier room is noticeable on the temperature sensors of the hardware that I
put in there. A PC with overkill CPU cooler on an Intel i5-10500 did report 16°C CPU core temperatures at one point when
idling, compared to 20-24°C when running in a cold corner in the living room. The LattePanda IOTA hit 30°C on the CPU
cores. Hard drives hover around 30-37°C, with a maximum of 40-44°C.</p>
<p>It&rsquo;s pretty cool.</p>









<figure class="center">
  <a href="/posts/2026/03/11/server-pantry/media/disco.jpg">
    <img src="/posts/2026/03/11/server-pantry/media/disco_hu_e5969bb832af63d7.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="Party hard.">

  </a>
  <figcaption class="center">Party hard.</figcaption>
</figure>

<h2 id="2026-june-update">
  <a class="heading-anchor" href="#2026-june-update">2026 June update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I&rsquo;ve now moved away from this concept due to Summer being a thing. Beer got too warm in there with 60-110 W of compute
equipment being in there.</p>
]]></content:encoded></item><item><title>I gave the MacBook Pro a try</title><link>https://ounapuu.ee/posts/2026/03/04/apfel/</link><pubDate>Wed, 04 Mar 2026 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2026/03/04/apfel/</guid><description>Dancing with the devil.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2026/03/04/apfel/media/cover_hu_5f1c1caf8eadf1a6.jpg" width="1200" height="630" alt="I gave the MacBook Pro a try" /><p>I got the opportunity to try out a MacBook Pro with the M3 Pro with 18GB RAM (not Pro).</p>
<p>I&rsquo;ve been rocking a <a href="/posts/2024/04/12/lenovo-p14s-gen4/">ThinkPad P14s gen 4</a>
and am reasonably happy with it, but after realizing that I am the only person in the whole company <em>not</em> on a MacBook,
and one was suddenly available for use, I set one up for work duties to see if I could ever like using one.</p>
<p>It&rsquo;s nice.</p>
<p>I&rsquo;ve used various flavours of Linux on the desktop since 2014, starting with Linux Mint. 2015 was the year I deleted the
Windows dual boot partition. Over those years, the experience on Linux and especially Fedora Linux has improved a lot,
and for some reason it&rsquo;s controversial to say that I love GNOME and its opinionated approach to building a cohesive and
yet functional desktop environment.</p>
<p>When transitioning over to macOS, I went in with an open mind. I won&rsquo;t heavily customise it, won&rsquo;t install Asahi Linux
on it, or make it do things it wasn&rsquo;t meant to do. This is an appliance, I will use it to get work done and that&rsquo;s it.</p>
<p>With this introduction out of the way, here are some observations I&rsquo;ve made about this experience so far.</p>
<h2 id="ergonomics">
  <a class="heading-anchor" href="#ergonomics">Ergonomics<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The first stumbling block was an expected one: all the shortcuts are wrong, and the Ctrl-Super-Alt friendship has been
replaced with these new weird ones. With a lot of trial and error, it is not that difficult to pick it up, but I still
stumble around with copy-paste, moving windows around, or operating my cursor effectively. It certainly doesn&rsquo;t help
that in terminal windows, Ctrl is still king, while elsewhere it&rsquo;s Cmd.</p>
<p>Mouse gestures are nice, and not that different from the GNOME experience.</p>
<p>macOS has window snapping by default, but only using the mouse. I had to install a specific program to enable window
moving and snapping with keyboard shortcuts <a href="https://rectangleapp.com/">(Rectangle)</a>, which is something I use heavily
in GNOME. Odd omission by Apple.</p>
<p>For my Logitech keyboard and mouse to do the right thing, I did have to install the Logitech Logi+ app, which is not
ideal, but is needed to have an acceptable experience using my MX series peripherals, especially the keyboard where it
needs to remap some keys for them to properly work in macOS.</p>
<p>I still haven&rsquo;t quite figured out why Page up/down and Home/End keys are not working as they should be. Also, give my
Delete key back!</p>
<p>Opening the laptop with Touch ID is a nice bonus, especially on public transport where I don&rsquo;t really want my neighbour
to see me typing in my password.</p>
<p>The macOS concept of showing open applications that don&rsquo;t have windows on them as open in the dock is a strange choice,
that has caused me to look for those phantom windows and is generally misleading.</p>
<p>Not being able to switch between open windows instead of applications echoes the same design choice that GNOME made, and
I&rsquo;m not a big fan of it here as well. But at least in GNOME you can remap the Alt+Tab shortcut to fix it.</p>
<h2 id="installing-stuff">
  <a class="heading-anchor" href="#installing-stuff">Installing stuff<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The default macOS application installation process of downloading a .dmg file, then opening it, then dragging an icon in
a window to the Applications folder feels super odd.</p>
<p>Luckily I was aware of the tool <code>brew</code> and have been using that heavily to get everything that I need installed, in a
Linux-y way.</p>
<h2 id="permissions">
  <a class="heading-anchor" href="#permissions">Permissions<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I appreciate the concern that macOS has about actions that I take on my laptop, but my god, the permission popups get
silly sometimes. When a CLI app is doing things and accessing data on my drive, I can randomly be presented with a
permissions pop-up, stealing my focus from writing a Slack message.</p>
<h2 id="day-to-day-work">
  <a class="heading-anchor" href="#day-to-day-work">Day to day work<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Video calls work really well, I can do my full stack engineer things, and overall things work, even if it is sometimes
slightly different.</p>
<p>The default Terminal app is not good, I&rsquo;m still not quite sure why it does not close the window when I exit it, that
&ldquo;Process exited&rdquo; message is not helpful.</p>
<h2 id="hardware">
  <a class="heading-anchor" href="#hardware">Hardware<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>No contest, the hardware on a MacBook Pro feels nice and premium compared to the ThinkPad P14s gen 4. The latter now
feels like a flexible plastic piece of crap.</p>
<p>The screen is beautiful and super smooth due to the higher refresh rate.</p>
<p>The MacBook does not flex when I hold it.</p>
<p>Battery life is phenomenal, the need to have a charger is legitimately not a concern in 90% of the situations I use a
MacBook in.</p>
<p>Keyboard is alright, good to type on, but layout is not my preference.</p>
<p>M3 Pro chip is fast as heck. 18 GB of memory is a solid downgrade from 32 GB, but so far it has not prevented me from
doing my work.</p>
<p>I have never heard the fan kick on, even when testing a lot of Go code in dozens of containers, pegging the CPU at 100%,
using a lot of memory, and causing a lot of disk writes. I thought that I once heard it, but no, that fan noise was
coming from a nearby ThinkPad.</p>
<p>The alumin<strong>i</strong>um case does have one downside: the MacBook Pro is incredibly slippery. I once put it in my backpack
and it made a loud <em><strong>thunk</strong></em> as it hit the table that the backpack was on. Whoops.</p>
<h2 id="external-displays">
  <a class="heading-anchor" href="#external-displays">External displays<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>macOS does not provide scaling options on my 3440x1440p ultra-wide monitor. Even GNOME has that, with fractional
scaling!</p>
<p>The two alternatives are to use a lower resolution (disgusting), or increase the text size across the OS so that I
don&rsquo;t suffer with my poor eyesight.</p>
<h2 id="apple-id-and-app-store">
  <a class="heading-anchor" href="#apple-id-and-app-store">Apple ID and App Store<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Never needed those. I like that. Having used an iPhone for a while, I sort of expected this to be a requirement, but no,
you can completely ignore those aspects of macOS and work with a local account. Even Windows 11 doesn&rsquo;t want to allow
that!</p>
<h2 id="language-switching">
  <a class="heading-anchor" href="#language-switching">Language switching<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Switching the keyboard language using the keyboard shortcut is broken about 50% of the time, which feels odd given that
it&rsquo;s something that just works on GNOME. This is quite critical for me since I shift between the Estonian and US
keyboard a lot when working, as the US layout has the brackets and all the other important characters in the right
places for programming and writing, while Estonian keyboard has all the Õ Ä Ö Ü-s that I need.</p>
<h2 id="the-day-it-fell-apart">
  <a class="heading-anchor" href="#the-day-it-fell-apart">The day it fell apart<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I upgraded to macOS 26.3 Tahoe on 23rd of February. SSH worked in the morning. Upgrade during lunch, come back, bam,
broken.</p>
<p>The SSH logins would halt at the part where public key authentication was taking place, the process just hung. I
confirmed that by adding <code>-vvv</code> into the SSH command.</p>
<p>With some vibe-debugging with Claude Code, I found that something with the SSH agent service had broken after the
upgrade. One reasonably simple fix was to put this in your <code>.zshrc</code>:</p>
<pre tabindex="0"><code>export SSH_AUTH_SOCK=$(mktemp -d)/agent.sock
ssh-agent -a &#34;$SSH_AUTH_SOCK&#34; &gt; /dev/null 2&gt;&amp;1
ssh-add --apple-use-keychain ~/.ssh/id_ed25519 2&gt;/dev/null
</code></pre><p>Then it works in the shell, but all other git integrations, such as all the repos I have cloned and am using via
IntelliJ IDEA, were still broken.</p>
<p>Claude suggested that I build my own SSH agent, and install that until this issue is fixed. That&rsquo;s when I decided to
stop.</p>
<p>macOS was supposed to just work, and not get into my way when doing work. This level of workaround is something I expect
from working with Linux, and even there it usually doesn&rsquo;t get that odd, I can roll back a version of a package easily,
or fix it by pulling in the latest development release of that particular package.</p>
<h2 id="conclusion">
  <a class="heading-anchor" href="#conclusion">Conclusion<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I went into this experiment with an open mind, no expectations, and I have to admit that a MacBook Pro with M3 Pro chip
is not bad at all, as long as it works.</p>
<p>Unfortunately it doesn&rsquo;t work for me right now. I might have gotten very unlucky with this issue and the timing, but
first impressions matter a lot. The hardware can be nice and feel nice, but if the software lets me down and stops me
from doing what&rsquo;s more important, then it makes the hardware useless.</p>
<p>It turns out that I like Linux and GNOME a lot. Things are simple, improvements are constant and iterative in nature, so
you don&rsquo;t usually notice it (with Wayland and Pipewire being rare exceptions), and you have more control when you need
to fix something. Making those one-off solutions like a DIY coding agent sandbox, or a backup script, or setting up
<a href="/posts/2022/07/09/btrbk-is-awesome/">snapshots</a> on my workstation are also super easy.</p>
<p>If <a href="https://asahilinux.org/">Asahi Linux</a> had 100% compatibility on all modern M-series MacBooks, then that would be a
killer combination.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>Until then, back to the ol&rsquo; reliable ThinkPad P14s gen 4 I go. I can live with fan noise, Bluetooth oddities and Wi-Fi
roaming issues, but not with something as basic as SSH not working one day.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>any kind billionaires want to bankroll the project? Oh wait, that&rsquo;s an oxymoron.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>the fan noise can actually be fixed quite easily by setting a lower temperature target on the Ryzen APU and tuning
the fan to only run at the lowest speed after a certain temperature threshold.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>BTRFS disk errors to fall asleep to</title><link>https://ounapuu.ee/posts/2026/02/15/btrfs/</link><pubDate>Sun, 15 Feb 2026 22:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2026/02/15/btrfs/</guid><description>Inspired by a true story.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2026/02/15/btrfs/media/cover_hu_6ec175dedffba3f0.jpg" width="1200" height="630" alt="BTRFS disk errors to fall asleep to" /><p>This is inspired by a dying Seagate Portable 4TB hard drive, and brought to you by 15 minutes of vibe engineering.</p>
<p><a href="/btrfs-disk-errors-to-fall-asleep-to/index.html">Enjoy.</a></p>
<p>Starting the RMA process on the Seagate website is one of the most difficult things I&rsquo;ve done lately, and half the links
there look like a legitimate phishing attempt.</p>









<figure class="center">
  <a href="/posts/2026/02/15/btrfs/media/lol.png">
    <img src="/posts/2026/02/15/btrfs/media/lol_hu_9382c15dfd593c89.webp"
     width="1000"
     height="340"
     loading="lazy"
     decoding="async"
     alt="lol.">

  </a>
  <figcaption class="center">lol.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2026/02/15/btrfs/media/lmao.png">
    <img src="/posts/2026/02/15/btrfs/media/lmao_hu_60043490600a4347.webp"
     width="1000"
     height="694"
     loading="lazy"
     decoding="async"
     alt="lmao.">

  </a>
  <figcaption class="center">lmao.</figcaption>
</figure>

<p>By the time I got the RMA created, I&rsquo;ve run out of time and energy to follow on with this process.</p>
<p>I guess it&rsquo;s a great way to make your RMA rates stay low, though!</p>
]]></content:encoded></item><item><title>Meet the Garbage PC</title><link>https://ounapuu.ee/posts/2026/02/02/garbage-time/</link><pubDate>Mon, 02 Feb 2026 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2026/02/02/garbage-time/</guid><description>It's garbage. Extremely good looking garbage, but garbage nevertheless.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2026/02/02/garbage-time/media/cover_hu_851cb952f1831142.jpg" width="1200" height="630" alt="Meet the Garbage PC" /><p>This is the Garbage PC.</p>









<figure class="center">
  <a href="/posts/2026/02/02/garbage-time/media/its-garbage-time.jpg">
    <img src="/posts/2026/02/02/garbage-time/media/its-garbage-time_hu_364928ad68f9442b.webp"
     width="751"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="It is made of garbage.">

  </a>
  <figcaption class="center">It is made of garbage.</figcaption>
</figure>

<p>Not too long ago, I received a half-broken Dell Inspiron N5110, sporting 6 GB of RAM, a dual core Intel i3-2110M, and an
unsupported NVIDIA GPU of some sort.</p>
<p>One of the hinges was loose from the case because it was screwed into plastic (common issue for these types of laptops),
the touchpad did not work, and to insert a drive into it, you had to disassemble the whole machine.</p>
<p>I&rsquo;m quite confident that I&rsquo;ve worked on this laptop model in a very distant past, around 2012-2013, and I remember it
well because during the disassembly plastic bits were falling off everywhere and the right hinge was broken in exactly
the
same way.</p>
<p>I&rsquo;ve always wanted to take a half-broken laptop and to mount it on some acrylic panels (plexiglass) using brass
standoffs. I <em><strong>love</strong></em> how bare PCB-s look. They&rsquo;re just so damn cool, and I can&rsquo;t be the only one who thinks this
way, right?</p>
<p>I also get a good feeling out of taking trash/obsolete parts and making them useful once again.
This laptop was destined for the e-waste pile, which meant that it was a fantastic candidate to try this idea on.</p>
<p>The main constraint in this project was time. I&rsquo;m a parent, I have a job, and sometimes between all that I like to rest,
so the amount of available time for this project was about 8 hours spread across a month. I also lack proper tooling to
do a good job, so this was achieved using whatever I had available, mainly a cordless jigsaw and a hand drill. On the
upside, this means that if I can do it, then you can likely do it as well!</p>
<h2 id="disassembly-and-testing">
  <a class="heading-anchor" href="#disassembly-and-testing">Disassembly and testing<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This laptop turned out to be a total pain to work on.</p>
<p>During initial testing, it was very clear that the laptop needed a good thermal paste and pads replacement, as it tried
to overheat playing casual videos off of YouTube.</p>
<p>After I disassembled the laptop to bare essentials and put it together as a test run for the &ldquo;mount it on acrylic panel&rdquo;
idea, the extension board containing two USB ports and the Ethernet port just stopped working. I probably broke
something, but annoying nevertheless. On the positive side, the overall size of the build was smaller as a result of
this happy little accident.</p>









<figure class="center">
  <a href="/posts/2026/02/02/garbage-time/media/disassembly.jpg">
    <img src="/posts/2026/02/02/garbage-time/media/disassembly_hu_78ddd76790fbf6bf.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="The motherboard with the extension board.">

  </a>
  <figcaption class="center">The motherboard with the extension board.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2026/02/02/garbage-time/media/disassembly-ssd.jpg">
    <img src="/posts/2026/02/02/garbage-time/media/disassembly-ssd_hu_3caf459da565070c.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="SSD, now mounted.">

  </a>
  <figcaption class="center">SSD, now mounted.</figcaption>
</figure>

<p>Using this laptop via the HDMI output only also turned out to be an unnecessary headache. LibreELEC did not play well
with it, often resulting in a blank screen, and on Fedora Workstation 43, there was a &ldquo;ghost&rdquo; display somewhere that
always showed up on the display settings view. So did the internal display, even when it was disconnected.</p>









<figure class="center">
  <a href="/posts/2026/02/02/garbage-time/media/testing-libreelec.jpg">
    <img src="/posts/2026/02/02/garbage-time/media/testing-libreelec_hu_a5bc1bb7bc054468.webp"
     width="751"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="LibreELEC was fine, if the internal display was connected, but it didn&#39;t support the USB WiFi dongle I was using.">

  </a>
  <figcaption class="center">LibreELEC was fine, if the internal display was connected, but it didn&#39;t support the USB WiFi dongle I was using.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2026/02/02/garbage-time/media/ghost-displays.jpg">
    <img src="/posts/2026/02/02/garbage-time/media/ghost-displays_hu_b45c6533147b83f5.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="At this time, only two displays were actually connected.">

  </a>
  <figcaption class="center">At this time, only two displays were actually connected.</figcaption>
</figure>

<p>This caused an issue when trying to get Fedora installed on this machine, as the installation UI would be placed on a
screen that
was <em>not</em> the HDMI output one that I was actually using. This issue can be mitigated similar
to <a href="/posts/2023/02/28/lattepanda-v1/">my LattePanda V1 adventure</a> by disabling video outputs completely. For this
laptop, I modified kernel parameters via <code>/etc/default/grub</code> and added the following kernel parameters:</p>
<pre tabindex="0"><code>video=VGA-1:d video=LVDS-1:d video=VGA-2:d
</code></pre>








<figure class="center">
  <a href="/posts/2026/02/02/garbage-time/media/kernel-params.jpg">
    <img src="/posts/2026/02/02/garbage-time/media/kernel-params_hu_884e677133983942.webp"
     width="1000"
     height="353"
     loading="lazy"
     decoding="async"
     alt="How to ensure that only HDMI output is actually connected from the perspective from the OS.">

  </a>
  <figcaption class="center">How to ensure that only HDMI output is actually connected from the perspective from the OS.</figcaption>
</figure>

<p>Yes, it&rsquo;s possible to modify the display setup on your desktop environment of choice to disable certain outputs that
way, but using kernel parameters ensures that if you change monitors, you won&rsquo;t have to do that all over again.</p>
<p>To make this whole build even more garbage-tier, I used an 256GB SATA SSD with 5 known bad blocks.</p>
<h2 id="the-build">
  <a class="heading-anchor" href="#the-build">The build<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I sourced a large 4mm thick plexiglass panel from a hardware store, as that seemed to be the most accessible place where
I can get one. In Estonia, these types of panels are often sold in the gardening sections of general hardware stores.</p>
<p>For attaching the motherboard to the board, I sourced an assortment of M2.5 brass standoffs and screws, and multiple
sets in case I need more of a specific height (turned out to be a good call on my part). I chose M2.5 because the laptop
used screws of that size, and this size is common in the world of Raspberry Pi and other SBC-s, which can be handy for
any future <del>dumb ideas</del> experiments.</p>
<p>To mark the positions on the plexiglass, I put the motherboard assembly on it, marked some good spots with an awl <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>,
and then drilled holes using a hand drill and 2.5mm drill bit.</p>









<figure class="center">
  <a href="/posts/2026/02/02/garbage-time/media/build-1.jpg">
    <img src="/posts/2026/02/02/garbage-time/media/build-1_hu_71b731da1502508c.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="Marking the spots for the standoffs.">

  </a>
  <figcaption class="center">Marking the spots for the standoffs.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2026/02/02/garbage-time/media/build-0.jpg">
    <img src="/posts/2026/02/02/garbage-time/media/build-0_hu_2e24aa7c9f563aca.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="The drilling station.">

  </a>
  <figcaption class="center">The drilling station.</figcaption>
</figure>

<p>I also sourced heat inserts so that I can melt them into the plexiglass assembly, but those didn&rsquo;t work out very well. I
used my Pinecil soldering iron to push these in to the 2mm pre-drilled holes that I set up for these, but I had
alignment issues and the threads ended up getting gunked up by the melted remains of the plexiglass, so I could not
screw any brass standoffs in there.</p>
<p>I tried to be very careful with getting the drill holes to line up, and it went mostly alright. My recommendation here
is to be precise, and don&rsquo;t screw everything tight before you&rsquo;ve got screws and standoffs lined up for all planned
holes, otherwise you lose the option of wiggling things a bit to get them to line up.</p>









<figure class="center">
  <a href="/posts/2026/02/02/garbage-time/media/build-2.jpg">
    <img src="/posts/2026/02/02/garbage-time/media/build-2_hu_ff6530350c6ce602.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="First standoffs installed!">

  </a>
  <figcaption class="center">First standoffs installed!</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2026/02/02/garbage-time/media/build-3.jpg">
    <img src="/posts/2026/02/02/garbage-time/media/build-3_hu_ce7550ca0f7f3766.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="It&#39;s all coming together.">

  </a>
  <figcaption class="center">It&#39;s all coming together.</figcaption>
</figure>

<p>The standoffs and screws were screwed on tight enough to keep things in place, but not <em>too</em> tight to avoid cracking.</p>









<figure class="center">
  <a href="/posts/2026/02/02/garbage-time/media/build-4.jpg">
    <img src="/posts/2026/02/02/garbage-time/media/build-4_hu_f56c085ce05afe6c.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="The laptop motherboard, installed on the plexiglass. This was genuinely exciting!">

  </a>
  <figcaption class="center">The laptop motherboard, installed on the plexiglass. This was genuinely exciting!</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2026/02/02/garbage-time/media/build-5.jpg">
    <img src="/posts/2026/02/02/garbage-time/media/build-5_hu_e1fd01e432a6006a.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="Another angle.">

  </a>
  <figcaption class="center">Another angle.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2026/02/02/garbage-time/media/build-6.jpg">
    <img src="/posts/2026/02/02/garbage-time/media/build-6_hu_cf8db5a3dd0cffc7.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="The parts look so cool under this panel! Almost makes you forget that you&#39;re working with 15 year old parts.">

  </a>
  <figcaption class="center">The parts look so cool under this panel! Almost makes you forget that you&#39;re working with 15 year old parts.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2026/02/02/garbage-time/media/build-7.jpg">
    <img src="/posts/2026/02/02/garbage-time/media/build-7_hu_a62b98850cc83adb.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="Really lucked out with the height of the standoffs, accommodating the power jack PCB was no issue at all.">

  </a>
  <figcaption class="center">Really lucked out with the height of the standoffs, accommodating the power jack PCB was no issue at all.</figcaption>
</figure>

<p>For the other panel, I cut out a similarily sized plexiglass panel, marked the holes again, and repeated the process.
Since I was using a cordless jigsaw, I positioned the new piece so that the flat side of the plexiglass panel that I
bought lined up with the other straight end on the existing assembly, because I will never get a good straight cut with
a freehanded jigsaw. That worked out well enough.</p>
<p>For the power button, I reused the small PCB that contains the power button and power LED-s from the original case. To
house that, I drilled a small hole with 1cm diameter to slip the ribbon cable in, and I used small pieces of 3M VHB
double-sided tape<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> to secure it to the panel.</p>









<figure class="center">
  <a href="/posts/2026/02/02/garbage-time/media/power-button.jpg">
    <img src="/posts/2026/02/02/garbage-time/media/power-button_hu_c30b19e1af3f5d4d.webp"
     width="751"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="Not the best solution, but it works well enough.">

  </a>
  <figcaption class="center">Not the best solution, but it works well enough.</figcaption>
</figure>

<p>And there you have it, the garbage PC. The shine of the plexiglass does a fantastic job of bringing out the beauty of
the motherboard and all its components. Standoffs leave plenty of room for the machine to breathe.</p>
<p>Since the extension board is missing, this build relies heavily on one USB port and one eSATA port that also supports
USB connectivity. WiFi, Bluetooth, keyboard/mouse, it&rsquo;s all over USB 2.0 ports.</p>









<figure class="center">
  <a href="/posts/2026/02/02/garbage-time/media/garbage-0.jpg">
    <img src="/posts/2026/02/02/garbage-time/media/garbage-0_hu_8bef081e22471e52.webp"
     width="751"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="The Garbage PC.">

  </a>
  <figcaption class="center">The Garbage PC.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2026/02/02/garbage-time/media/garbage-1.jpg">
    <img src="/posts/2026/02/02/garbage-time/media/garbage-1_hu_660d7f7386f5159f.webp"
     width="751"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="The Garbage PC, in use.">

  </a>
  <figcaption class="center">The Garbage PC, in use.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2026/02/02/garbage-time/media/garbage-2.jpg">
    <img src="/posts/2026/02/02/garbage-time/media/garbage-2_hu_c57a4e4c36b6764.webp"
     width="1000"
     height="801"
     loading="lazy"
     decoding="async"
     alt="The white LED-s on the bottom of the motherboard and on the power button look quite nice in darker environments.">

  </a>
  <figcaption class="center">The white LED-s on the bottom of the motherboard and on the power button look quite nice in darker environments.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2026/02/02/garbage-time/media/garbage-3.jpg">
    <img src="/posts/2026/02/02/garbage-time/media/garbage-3_hu_c4a6f4f9d8be13f6.webp"
     width="1000"
     height="842"
     loading="lazy"
     decoding="async"
     alt="It&#39;s booting Linux!">

  </a>
  <figcaption class="center">It&#39;s booting Linux!</figcaption>
</figure>

<p>One thing that I have yet to do is to add a base to the build so that it does not tip over that easily. Double-sided
tape plus a wooden trim piece might do the trick.</p>
<h2 id="the-experience">
  <a class="heading-anchor" href="#the-experience">The experience<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This build is using parts that are about 15 years old. For context, that was when dubstep was popular, it was cool to
hate on Justin Bieber, rage comics and bad memes were a thing, and the news in Europe were worried about Greece going
bankrupt or something.</p>
<p>That does mean that the performance on this machine is not great.</p>









<figure class="center">
  <a href="/posts/2026/02/02/garbage-time/media/garbage-4.jpg">
    <img src="/posts/2026/02/02/garbage-time/media/garbage-4_hu_fed7647b93b2abe3.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="The performance is... garbage.">

  </a>
  <figcaption class="center">The performance is... garbage.</figcaption>
</figure>

<p>The machine still runs warm, but not nearly as hot as before. In its stock form and before any thermal paste
replacements, it ran about 85+°C, but now it doesn&rsquo;t seem to ever hit 70°C.</p>
<p>As a basic desktop PC, assuming that you&rsquo;re not trying to run a 1440p or 4K display, the experience feels completely
usable!</p>
<p>If you&rsquo;re thinking about setting this up as a media player PC, then you&rsquo;re limited to H.264 playback. H.265 was just too
much for this machine. If you use Kodi with Jellyfin, then it is luckily possible to enforce transcoding content to
H.264, ensuring a smooth experience on the client side.</p>
<h2 id="other-notes">
  <a class="heading-anchor" href="#other-notes">Other notes<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I wish that this laptop supported a &ldquo;power on with AC attach&rdquo; type feature that turns the laptop on once the power
adapter is connected, that would&rsquo;ve made it more useful as a crappy little home server. If you don&rsquo;t mind extended
downtime during a power outage, then it can still do that job well enough, but it&rsquo;s just something I was slightly
annoyed with.</p>
<p>The board has a small SATA port that can be converted to a normal SATA port, plus an eSATA port, making it perfectly
plausible to add two drives to this and to totally turn it into a home server.</p>
<p>I tried running Windows 11 on it once, but I tried to do that with the official installer and didn&rsquo;t get past the &ldquo;lol
your hardware is too old&rdquo; view. I know that you can remove that limitation, but given the 6GB of RAM and Windows 11
being awful with using resources, it was probably for the best to give up here.</p>
<p>The fan is audible when doing things. I did in fact take it apart and added some silicon oil inside the center to give
it a fighting chance and it did improve the acoustics, but it&rsquo;s something to keep in mind if you&rsquo;re doing similar
projects with these old laptops. There does seem to be a way to control the fan by writing values to <code>dell_smm</code> kernel
module controls in <code>/sys/class/hwmon/</code>, and if you overwrite the <code>pwm</code> value often enough, like in a 0.1 second loop,
then you can definitely overpower the BIOS fan control on this board. The control does not seem to be fine-tuned, it&rsquo;s
either off, on, or full speed, but at least you can get <em>some</em> control over the fan speed if you really need to.
Alternatively, you can slap a huge heat sink on the CPU and GPU if you want to, and you should be getting away with it.</p>
<p>The CPU throttles heavily once you hit 80°C while playing back video, so that seems to be the soft temperature ceiling
for this laptop.</p>
<h2 id="conclusion">
  <a class="heading-anchor" href="#conclusion">Conclusion<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Overall, I&rsquo;m happy I did this project. There were <em><strong>way</strong></em> more obstacles and challenges associated with this project
that I expected, but the end result looks cool, so that makes it worth it in my view. It was also a good trial run to
work with plexiglass and brass standoffs, and I will very likely do something cooler in the future based on this
experience.</p>
<p>I hope that this inspires more people to reuse older hardware instead of just throwing it into the e-waste pile,
especially with new computer parts sometimes experiencing price spikes due to the economy doing weird things.</p>
<p>If you&rsquo;ve built something similar, then do share a link to it (ideally in blog post format) and I will happily link to
it here!</p>
<h2 id="2026-02-22-update">
  <a class="heading-anchor" href="#2026-02-22-update">2026-02-22 update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>There was something missing from the garbage PC.</p>
<p>A garbage OS.</p>
<p>So I went ahead, connected the internal display temporarily, and installed Windows 10 on it. The included activation key
did not work on it.</p>
<p>The GPU is confirmed to be a NVIDIA GT 525M. Latest supported drivers are version 391.xx, and had to be downloaded
manually.</p>
<p>Unless you use higher resolutions like 3440x1440p, the experience is not bad at all, actually, and Kodi does a superb
job playing back videos, even in H.265 format.</p>
<p>I hate to say it, but installing a legacy OS over Linux seems to be the best way forward for this particular combination
of Dell and NVIDIA horribleness. Just don&rsquo;t open any shady links on the internet with it, or connect it to the internet
at all.</p>
<p>Microsoft seems to allow you to get security updates on it for a year for free, but only if you sign up with a Microsoft
account, otherwise it&rsquo;s paid. Sneaky. Still not falling for it.</p>









<figure class="center">
  <a href="/posts/2026/02/02/garbage-time/media/garbage-os.jpg">
    <img src="/posts/2026/02/02/garbage-time/media/garbage-os_hu_2966f872d9df6fef.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="Installing Windows 10.">

  </a>
  <figcaption class="center">Installing Windows 10.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2026/02/02/garbage-time/media/garbage-os-installed.jpg">
    <img src="/posts/2026/02/02/garbage-time/media/garbage-os-installed_hu_61d7da27cc509df4.webp"
     width="1000"
     height="826"
     loading="lazy"
     decoding="async"
     alt="Well, it works.">

  </a>
  <figcaption class="center">Well, it works.</figcaption>
</figure>

<h2 id="2026-june-update">
  <a class="heading-anchor" href="#2026-june-update">2026 June update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The lack of a connected internal display was a real limiting factor in making this setup useful, so I attached it.</p>
<p>This display has some of the most horrific viewing angles of any display that I&rsquo;ve used in the past decade, so I&rsquo;ll
probably have to add some adjustable hinges to it to make using it bearable. Alternatively, I&rsquo;m considering getting the
cheapest possible monitor arm that&rsquo;s freely adjustable and attaching it there to turn this into the crappiest iMac-like
experience that you can get.</p>









<figure class="center">
  <a href="/posts/2026/02/02/garbage-time/media/garbage-v2.jpg">
    <img src="/posts/2026/02/02/garbage-time/media/garbage-v2_hu_36b77dd4f9ae695e.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="Garbage time, now with a screen.">

  </a>
  <figcaption class="center">Garbage time, now with a screen.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2026/02/02/garbage-time/media/garbage-v2-tape.jpg">
    <img src="/posts/2026/02/02/garbage-time/media/garbage-v2-tape_hu_ffe160d9526e889f.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="I used a modest amount of 3M VHB double-sided tape, mainly on top of screws and edges of the display.">

  </a>
  <figcaption class="center">I used a modest amount of 3M VHB double-sided tape, mainly on top of screws and edges of the display.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2026/02/02/garbage-time/media/garbage-gaming.jpg">
    <img src="/posts/2026/02/02/garbage-time/media/garbage-gaming_hu_9a794ac67441469e.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="GRID (2007) runs. Not well, but well enough to have some fun with it.">

  </a>
  <figcaption class="center">GRID (2007) runs. Not well, but well enough to have some fun with it.</figcaption>
</figure>

<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>this is the first time I actually have referred to this tool in English. What a weird word.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>it&rsquo;s good, but it smells like microplastics and cancer.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>I built the worst Jellyfin media server</title><link>https://ounapuu.ee/posts/2026/01/16/worst-media-server/</link><pubDate>Fri, 16 Jan 2026 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2026/01/16/worst-media-server/</guid><description>This experiment is brought to you by absurd memory prices.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2026/01/16/worst-media-server/media/cover_hu_dd22e2bc1424d67c.jpg" width="1200" height="630" alt="I built the worst Jellyfin media server" /><p>LattePanda V1. <a href="/posts/2023/02/28/lattepanda-v1/">It&rsquo;s been a while, huh?</a></p>
<p>I had it as a backup server <a href="/posts/2023/06/10/how-i-blew-up-my-backup-server/">(which I blew up)</a>.</p>
<p>Then it got promoted to&hellip; <a href="/posts/2024/12/11/wireguard-backup-fleet/">a backup server.</a> But
then <a href="/posts/2024/12/11/wireguard-backup-fleet/media/lattepanda-psu-failure.png">its PSU blew up.</a></p>
<p>Then it was waiting for some cool ideas at <a href="https://kaurpalang.com/">a potato enthusiast.</a></p>
<p>Now it&rsquo;s back in my hands.</p>
<p><a href="/posts/2025/11/18/lattepanda-iota/">Unlike its modern counterpart,</a> the LattePanda V1 is a flawed single board
computer.</p>
<p>It&rsquo;s slow.</p>
<p>It&rsquo;s unstable if you connect power hungry USB devices to it.</p>
<p>It needs some cooling, but I&rsquo;m too cheap to buy a properly designed heat sink for it.</p>
<p>It has display quirks.</p>
<p>It only has a slow 100 Mbps Ethernet link.</p>
<p>It only seems to work reliably on one side. Not even joking, the &ldquo;heat sink down&rdquo; configuration is the only one that
works for me.</p>
<p><a href="https://libreelec.tv/">LibreELEC</a> failed to play back any videos on it properly. The videos would play for 10 seconds,
and then it would hang, no matter the encoding or hardware acceleration settings.</p>
<p>With hardware prices being wonky again, I decided to give this board a last chance of being useful. If new hardware is
absurdly expensive, then it makes perfect sense to use what you have, no matter how slow or crummy it might be. Reduce,
reuse, and only <em>then</em> recycle.</p>
<p>That&rsquo;s when I decided to run a Jellyfin server off of it. Transcoding is out of the question, but serving media files
over the network should still be quick enough, right?</p>
<p>For this experiment, I
used <a href="/posts/2025/10/06/datablocks-white-label-drives/">one of the 18 TB hard drives that I&rsquo;ve covered earlier.</a>
Just the single one, no redundancy here. This one drive is probably about 10x the cost of the LattePanda V1 itself,
making it a perfectly reasonable choice.</p>
<p>For ease of troubleshooting, debugging and guaranteed eventual reinstallation, I put Fedora Server on an 128 GB USB 3.0
flash drive by Samsung. <a href="/posts/2024/12/02/linux-on-usb/">Risky move, I know,</a> but as you might have noticed, this whole
build is everything <em>but</em> reasonable. That left the eMMC storage as the perfect candidate for storing cache and service
related files.</p>
<p>Cooling is solved by a random server heat sink slapped on the bottom of the LattePanda, with a few critical
components like the CPU making contact with thick and soft thermal pads. The whole thing is fastened using velcro strips
that I cut to a thin size in the middle so that I can route it between the components on the PCB and within the heat
sink fins. The edges of the heat sink are covered with some painters&rsquo; tape that I had around to avoid shorting anything
out on the board, because those parts on the board contain all sorts of metal bits and pins that have power going
through them. I&rsquo;m actually quite happy with that mount!</p>









<figure class="center">
  <a href="/posts/2026/01/16/worst-media-server/media/lattepanda-temps.png">
    <img src="/posts/2026/01/16/worst-media-server/media/lattepanda-temps_hu_84c5210842d31066.webp"
     width="1000"
     height="683"
     loading="lazy"
     decoding="async"
     alt="All things considered, the janky cooling setup is holding up very well. The 100 degree peaks are sensor/measurement
errors.">

  </a>
  <figcaption class="center">All things considered, the janky cooling setup is holding up very well. The 100 degree peaks are sensor/measurement
errors.</figcaption>
</figure>

<p>I&rsquo;ve been experimenting with Podman again after Docker kept doing weird things with the v29 release, and I&rsquo;ve been happy
with the results, so that&rsquo;s what I used on the LattePanda V1 as well. I slapped Jellyfin on it, threw in some test files
and gave it a go.</p>
<p>Navigating the UI feels a bit slow at times, but it&rsquo;s not really noticeable on an LG smart TV with a really laggy user
interface.</p>
<p>Actual video playback that requires no transcoding works quite well, at least for smaller media sizes.</p>
<p>Technically, you can do transcoding on this and even utilize the tiny little integrated GPU in it, but the results are
not usable. With smaller files it might be usable, but in one test I saw 7-8 FPS transcoding speeds and the server
struggling to keep up, with CPU usage locked at 100%.</p>
<p>If we ignore all the downsides, then the LattePanda V1 can actually be a usable media server. Serving files off of a big
drive does not require a lot of resources, and for that the LattePanda V1 is a solid choice. It also uses only a few
watts of power on its own, so you can keep it on 24/7 guilt-free. In this build, the hard drive itself is actually the
most power hungry component by a long shot (about 2/3 of the total power budget).</p>
<p>The 2 GB of memory is <em>juuuuuuuust</em> enough for this setup.</p>









<figure class="center">
  <a href="/posts/2026/01/16/worst-media-server/media/lattepanda-memory-usage.png">
    <img src="/posts/2026/01/16/worst-media-server/media/lattepanda-memory-usage_hu_ad0b4de22af0ece1.webp"
     width="1000"
     height="683"
     loading="lazy"
     decoding="async"
     alt="Totally usable.">

  </a>
  <figcaption class="center">Totally usable.</figcaption>
</figure>

<p>As of writing this post, it has been running for about a week, and it&rsquo;s been fine. I intend to keep it running in a
drawer for as long as possible just to see what will die first.</p>
<p>Will it be the eMMC storage?</p>
<p>The USB flash drive holding the operating system?</p>
<p>The expensive hard drive?</p>
<p>The power supply?</p>
<p>The thin velcro strips holding the cooling together?</p>
<p>My patience?</p>
<p>Don&rsquo;t worry, I have backups. <em>Well</em>, backups of the important bits. I&rsquo;m ready to lose
data <a href="/posts/2026/01/14/raid0/">again.</a></p>
<h2 id="2026-01-22-update">
  <a class="heading-anchor" href="#2026-01-22-update">2026-01-22 update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Okay, it was <em>too</em> bad of an idea.</p>
<p>The LattePanda V1 would occasionally just&hellip; stop.</p>









<figure class="center">
  <a href="/posts/2026/01/16/worst-media-server/media/lattepanda-is-kill.png">
    <img src="/posts/2026/01/16/worst-media-server/media/lattepanda-is-kill_hu_26193b745dd0bf59.webp"
     width="1000"
     height="507"
     loading="lazy"
     decoding="async"
     alt="Oops, it died.">

  </a>
  <figcaption class="center">Oops, it died.</figcaption>
</figure>

<p>From what I gathered by accident, it&rsquo;s likely that the USB port containing the operating system would flake out and
result in the system not being able to run any tools that are not in memory. I tried to move the installation to the
eMMC drive, but after failing multiple times due to the display not working, or the system deciding to shut down
randomly, I gave up on it. For now.</p>
<p>Guess I&rsquo;ll have to use it in a solar-powered website project. ¯\_(ツ)_/¯</p>
]]></content:encoded></item><item><title>Running cheap and crappy USB hard drives in RAID0 is indeed a very terrible idea</title><link>https://ounapuu.ee/posts/2026/01/14/raid0/</link><pubDate>Wed, 14 Jan 2026 10:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2026/01/14/raid0/</guid><description>I know, shocker.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2026/01/14/raid0/media/cover_hu_4c078f678ba01857.jpg" width="1200" height="630" alt="Running cheap and crappy USB hard drives in RAID0 is indeed a very terrible idea" /><p>Some of my dumb experiments result in interesting findings and unexpected successes.</p>
<p>Some end up with very predictable failures.</p>
<p>What happens when you have two <a href="/posts/2020/08/22/disk-is-ok/">crappy</a> USB hard drives running <code>btrfs</code><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> in <code>raid0</code>
mode?
Nothing, until something goes wrong on one of the drives.</p>
<p>Here&rsquo;s what it looks like:</p>
<pre tabindex="0"><code>[188574.681476] BTRFS error (device dm-1): bdev /dev/dm-0 errs: wr 0, rd 0, flush 0, corrupt 5114512, gen 0
[188574.681479] BTRFS warning (device dm-1): csum failed root 719 ino 1133 off 175546368 csum 0x899d8def expected csum 0x6bd987b6 mirror 1
[188574.681481] BTRFS error (device dm-1): bdev /dev/dm-0 errs: wr 0, rd 0, flush 0, corrupt 5114513, gen 0
[188574.681484] BTRFS warning (device dm-1): csum failed root 719 ino 1133 off 175550464 csum 0xab3e9209 expected csum 0xb9ea310f mirror 1
[188574.681486] BTRFS error (device dm-1): bdev /dev/dm-0 errs: wr 0, rd 0, flush 0, corrupt 5114514, gen 0
[188574.681489] BTRFS warning (device dm-1): csum failed root 719 ino 1133 off 175554560 csum 0xc2f14e0c expected csum 0x503c7709 mirror 1
[188574.681491] BTRFS error (device dm-1): bdev /dev/dm-0 errs: wr 0, rd 0, flush 0, corrupt 5114515, gen 0
[188574.681494] BTRFS warning (device dm-1): csum failed root 719 ino 1133 off 175558656 csum 0x6ae8a7c9 expected csum 0xb4c26691 mirror 1
[188574.681496] BTRFS error (device dm-1): bdev /dev/dm-0 errs: wr 0, rd 0, flush 0, corrupt 5114516, gen 0
[188574.681498] BTRFS warning (device dm-1): csum failed root 719 ino 1133 off 175562752 csum 0x97db9766 expected csum 0xbe2e8040 mirror 1
[188574.681500] BTRFS error (device dm-1): bdev /dev/dm-0 errs: wr 0, rd 0, flush 0, corrupt 5114517, gen 0
[188574.681503] BTRFS warning (device dm-1): csum failed root 719 ino 1133 off 175566848 csum 0x86568469 expected csum 0x863fbb4a mirror 1
[188574.681505] BTRFS error (device dm-1): bdev /dev/dm-0 errs: wr 0, rd 0, flush 0, corrupt 5114518, gen 0
[189615.784048] BTRFS warning (device dm-1): csum failed root 719 ino 1181 off 23457792 csum 0xb19058fa expected csum 0x5d11a400 mirror 1
[189615.784086] BTRFS error (device dm-1): bdev /dev/dm-0 errs: wr 0, rd 0, flush 0, corrupt 5114519, gen 0
[189615.784119] BTRFS warning (device dm-1): csum failed root 719 ino 1181 off 23461888 csum 0x256ea900 expected csum 0xabd1eafb mirror 1
[189615.784133] BTRFS error (device dm-1): bdev /dev/dm-0 errs: wr 0, rd 0, flush 0, corrupt 5114520, gen 0
[189615.784153] BTRFS warning (device dm-1): csum failed root 719 ino 1181 off 23465984 csum 0x7b10000b expected csum 0x647fd7bf mirror 1
[189615.784165] BTRFS error (device dm-1): bdev /dev/dm-0 errs: wr 0, rd 0, flush 0, corrupt 5114521, gen 0
[189615.784178] BTRFS warning (device dm-1): csum failed root 719 ino 1181 off 23470080 csum 0xef791959 expected csum 0x175f7adc mirror 1
</code></pre><p>But in a way, this setup worked exactly as expected.</p>
<p>If you want to have a lot of storage on the cheap, or simply care about performance, or both, then running disks in
RAID0 mode is a very sensible thing to do. I used it mainly for having a place where I can store a bunch of data
temporarily, such a full disk images or data that I can easily replace.</p>
<p>Now I can test that theory out!</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I feel like I need to point out that this is not the fault of <code>btrfs</code>. When you instruct a file system to provide
zero redundancy, then that is what you will get.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>Oops, I accidentally built a Steam Machine</title><link>https://ounapuu.ee/posts/2025/12/01/steam-machine/</link><pubDate>Mon, 01 Dec 2025 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/12/01/steam-machine/</guid><description>I was longing for a Steam Deck that had more oomph. Guess Valve felt that way, too.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/12/01/steam-machine/media/cover_hu_1163f60b6daf33d9.jpg" width="1200" height="630" alt="Oops, I accidentally built a Steam Machine" /><p><a href="/posts/2024/06/02/steam-deck/">I like the Steam Deck.</a> It&rsquo;s what convinced me that gaming on Linux is actually viable
now.</p>
<p>But after playing through games like God of War Ragnarök<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>, I felt like I needed an upgrade. I love playing with the
Steam Deck, but what I love more is playing without having to worry about playing around with graphics settings a lot.
Great story and gameplay can only hide the fact that you&rsquo;re running at 720p 30Hz on a big screen for a little bit.</p>
<p>I also get to play relatively rarely, so I might as well make it a better, more enjoyable experience. Quality vs
quantity.</p>
<h2 id="the-specs">
  <a class="heading-anchor" href="#the-specs">The specs<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I went on a look-out for a used PC with roughly these requirements:</p>
<ul>
<li>any modern 6-core CPU or better
<ul>
<li>includes both Intel and AMD as the CPU does not matter much here<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></li>
</ul>
</li>
<li>an AMD GPU that can do 1080p/4K gaming, depending on the game
<ul>
<li>NVIDIA was out of the question due to lack of support on SteamOS</li>
<li>Intel GPUs are a risk that I was not willing to take right now</li>
</ul>
</li>
<li>16+GB RAM</li>
<li>has to support an NVMe drive
<ul>
<li>using the SteamOS recovery image method is dependent on this</li>
</ul>
</li>
<li>acceptable case, PSU and cooling setup
<ul>
<li>if it does not burn the house down and makes the machine cool and quiet, then I&rsquo;m fine with anything</li>
</ul>
</li>
</ul>
<p>The AMD GPU being a hard requirement turned out to be an interesting challenge. I wasn&rsquo;t looking into putting together a
custom build, but was rather going for a setup that works and that I can customize according to my specific needs. Turns
out that most of the PC-s out there on the market are all based around NVIDIA GPU-s, and AMD builds of this range are
relatively rare, with a guesstimate of the ratio being roughly 10 NVIDIA-based machines to 1 AMD-based machine. The good
side of this is that the selection process was made way simpler as I got to choose between 3-4 options in the end.</p>
<p>During my search I also saw some machines that I would call absolute overkill, and I <em>almost</em> got one in a bidding war,
but eventually I found a more sensible option. It also included a monitor, keyboard, mouse and three SSD-s that I didn&rsquo;t
really need, but the PC itself was decent.</p>
<p>Here&rsquo;s what I landed on:</p>
<ul>
<li>Intel i5-10500
<ul>
<li>6 cores 12 threads at a reasonable speed (4.2 GHz in real-life use)</li>
</ul>
</li>
<li>adequate Cooler Master CPU cooler that does a lot of RGB if needed</li>
<li>16 GB DDR4 RAM @ 2666 MT/s
<ul>
<li>I soon upgraded this to 32 GB because my brother had some leftover modules from his own memory upgrade</li>
<li>I forced the modules to run at 3200 MT/s. It&rsquo;s memtest-stable so good enough for me.</li>
</ul>
</li>
<li>AMD RX 6600XT with 8GB VRAM
<ul>
<li>some might scoff at the VRAM amount, but coming from a Steam Deck where 16GB was shared between CPU <em>and</em> GPU,
this is plenty!</li>
</ul>
</li>
<li>512GB NVMe SSD</li>
<li>three 256GB SATA SSD-s
<ul>
<li>previous owner put them in as RAID0, which is clever and works well as a game library</li>
</ul>
</li>
<li>some Gigabyte motherboard that works
<ul>
<li>it really doesn&rsquo;t matter here</li>
</ul>
</li>
<li>some Fractal Design case, possibly a Define-series one
<ul>
<li>all I know is that it&rsquo;s huuuuuuuuuge</li>
</ul>
</li>
</ul>









<figure class="center">
  <a href="/posts/2025/12/01/steam-machine/media/internals.jpg">
    <img src="/posts/2025/12/01/steam-machine/media/internals_hu_bf4c78ee5ba4e1f5.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="The inside look into the build.">

  </a>
  <figcaption class="center">The inside look into the build.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/12/01/steam-machine/media/rgb.jpg">
    <img src="/posts/2025/12/01/steam-machine/media/rgb_hu_7d50a9a9017e9a2e.webp"
     width="751"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="The RGB glow doubles as a night light.">

  </a>
  <figcaption class="center">The RGB glow doubles as a night light.</figcaption>
</figure>

<p>All-in-all, it cost me 365 EUR in Estonia in October 2025, and so far I&rsquo;ve made about 25 EUR back from the SSD sales
alone, with some items still up for sale. It&rsquo;s not as portable as a Steam Deck, but it&rsquo;s cheaper even if we account for
the cost of the game controller and cables/accessories/adapters that you usually need.</p>
<h2 id="the-setup">
  <a class="heading-anchor" href="#the-setup">The setup<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Regarding the operating system choice, I tried both SteamOS from the Steam Deck recovery image,
and <a href="https://bazzite.gg/">Bazzite</a>. Both work fine and in the default couch gaming mode you won&rsquo;t notice a difference,
but I ended up defaulting to SteamOS because I had my setup and configuration changes tuned around that. The SteamOS
recovery image approach does assume that you have an NVMe drive available, so if you lack one, you&rsquo;re better off trying
Bazzite as that can be installed on any drive.</p>
<p>I replaced the NVMe SSD with a cheap 128GB one and utilized the bigger drive
in <a href="/posts/2025/11/18/lattepanda-iota/">the LattePanda IOTA setup</a> that now serves as my home server.</p>
<p>As a game library drive, I took a 1TB Samsung SSD that I had around, which roughly matches the storage that I had
available on my Steam Deck that I ended up modding with a 1TB M.2 2230 SSD. With games like God of War Ragnarök taking
up around <strong><em>176GB</em></strong>, it&rsquo;s not going to be the most luxurious arrangement, but for now it&rsquo;s okay.</p>
<p>The Fractal case that it came up with was one that is fully metal, with sound dampening material present on the side
panels. It&rsquo;s a bit banged up, but still a pretty nice experience if you have the room for storing one in your setup. The
case had one flaw that I stumbled upon: the power button on the Fractal case liked to get stuck, which seems to be a
common issue with that model. I fixed that with a random power button that I sourced from a local electronic parts
supplier for a few euros and that works really well now, with the additional bonus of it being <em>slightly</em> more
cat-proof.</p>
<p>The default fan curves on the motherboard were a bit too aggressive, so I had to slightly tune them down, and now the
machine is quiet while doing a great job with keeping the internals cool. You can hear a subtle whirring when you&rsquo;re in
the same room with it, but during gaming it stays at reasonable volumes and is not noticeable. Certainly quieter than a
Steam Deck would be.</p>
<h2 id="the-gaming-experience">
  <a class="heading-anchor" href="#the-gaming-experience">The gaming experience<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The AMD GPU is a low/midrange model, but it gets the job done in 1080p gaming, and with a lot of titles it can do 4K
with ease. In God of War Ragnarök I stuck with 1080p and cranked the settings, but with games like Need for Speed Hot
Pursuit Remastered, I pushed the resolution to 4K with high/ultra settings, and it runs smoothly at 60Hz.</p>
<p>This setup also taught me that <em><strong>Linux supports HDR now</strong></em>, which was news to me! My tech setup usually lags behind the
state of the art, mostly because I don&rsquo;t really see a need to upgrade to the latest and greatest thing out there if the
current one works well enough, but this was a really nice surprise. My TV has a crappy HDR implementation, so I don&rsquo;t
get the full HDR experience, but it&rsquo;s nice to see the TV show that HDR logo when I start up the machine.</p>
<p>Regarding the gaming experience, I&rsquo;ve only noticed a few sore spots.</p>
<p>For whatever reason, the Need for Speed (2015) just does not start up on anything but an actual Steam Deck. It just
doesn&rsquo;t work here. I can&rsquo;t be arsed to investigate this yet, the wonky physics in this game are perhaps not worth that
effort.</p>
<p>It&rsquo;s also clear that the choice of an Intel CPU is generally fine, but in God of War Ragnarök it was running <em>too</em> well,
so the CPU kept dropping down to lower clock speeds, which then made the game performance inconsistent. Finding that
this was the issue was actually quite straightforward: when I first loaded the game, the shader compilation was taking
place in the background and even though the CPU was at a constant 100% usage, the game ran quite smoothly. It only
started stuttering after that was done, and the integrated <code>mangohud</code> setup helped confirm the issue as its most
detailed preset shows the frame time and CPU clock speed graphs really well.</p>
<p>Since this is just a Linux box, then you can of course run a few commands to fix it.<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup></p>
<p>Here&rsquo;s how I fixed it.</p>
<p>Create a desktop entry at <code>/home/deck/.local/bin/its-gaming-time.desktop</code> with the contents:</p>
<pre tabindex="0"><code>[Desktop Entry]
Name=Gaming Time!
Exec=/home/deck/.local/bin/its-gaming-time
Comment=
Icon=
Type=Application
Terminal=true
</code></pre><p>Create a file <code>/home/deck/.local/bin/its-gaming-time</code> with the contents:</p>
<pre tabindex="0"><code>#!/bin/bash
# Set performance mode
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

# Set min_perf_pct to 100 (forces min freq = max freq)
echo 100 | sudo tee /sys/devices/system/cpu/intel_pstate/min_perf_pct
</code></pre><p>Don&rsquo;t forget to mark the script as executable with <code>chmod +x /home/deck/.local/bin/its-gaming-time</code>.</p>
<p>Note that the script above does require that you have set up passwordless <code>sudo</code> on the SteamOS installation.
This can be configured in <code>/etc/sudoers.d/wheel</code>, just make sure that the line starting with <code>%wheel</code> looks like this:</p>
<pre tabindex="0"><code>%wheel ALL=(ALL) NOPASSWD: ALL
</code></pre><p>With all that set up, in desktop mode, right-click on the desktop shortcut, &ldquo;Add to Steam&rdquo;, and now you can run this
script any time in Steam gaming mode, even while a game is running!</p>
<p>All-in-all, I&rsquo;m very satisfied with the experience that a cheap gaming PC box provides with SteamOS. The installation is
painless, my wireless controllers just work, and aside from a few rare exceptions, my games run really well.</p>
<p>It&rsquo;s also way easier on my eyes and with the 4K resolution I can actually see oncoming cars better in games like Need
for Speed Hot Pursuit Remastered.<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup></p>
<h2 id="the-gabecube">
  <a class="heading-anchor" href="#the-gabecube">The GabeCube<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Less than three weeks after buying that gaming
PC, <a href="https://store.steampowered.com/sale/steammachine">the Steam Machine was officially announced.</a></p>
<p>The <strong><em>rumored</em></strong> specs suggesting a 6 core/12 thread CPU, 16GB DDR5 RAM, and a custom 8GB VRAM AMD GPU that seems
to be roughly comparable to an AMD RX 6600XT-ish level of performance.</p>
<p>It seems that I have accidentally built a Steam Machine. Oops.</p>
<p>Of course, the specs and final performance are not public at the time of writing, and the Steam Machine has many
benefits (better SteamOS compatibility, good WiFi, smaller size, likely more efficient and quiet), but it&rsquo;s still
interesting how close I got with my setup and selection criteria.</p>
<p>I was slightly disappointed that I got this machine right before that announcement, but then I reminded myself of the
fact that I can enjoy games on the big screen <em><strong>right now,</strong></em> and the Steam Machine is scheduled for a release in Q1
2026, which can be as late as 31st of March 2026.</p>
<p>And hey, when the Steam Machine <em>does</em> come out and I decide to get one, the current gaming desktop will make for a very
good home server candidate with all the room that it has available, and all the six SATA ports on the motherboard
sure look tempting. I&rsquo;m pretty sure that the Fractal case also allows something crazy like 17+ hard drives installed in
it.</p>
<p>This approach of building my own Steam Machine of sorts did lead to me selling my Steam Deck. Better to have someone
else enjoy it than having it sit in a box until its battery dies. That also serves as a major sign of confidence for
this big box that makes my sparse downtime sessions more fun.</p>
<p>If you have a machine with a modern AMD GPU, then give SteamOS a try, you might be surprised at how well it works. Even
a laptop with an AMD APU can do it, as long as you temper your expectations regarding the image quality.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>it&rsquo;s a banger, try it if you&rsquo;re into the story, or you just want to indiscriminately smash and kill.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>this is called <em>foreshadowing</em>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>some might see it as &ldquo;ugh, Linux moment&rdquo; type of thing, but I see it as freedom to fix issues that you would
otherwise be unable to even diagnose and address. Power to the players!&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p>you can probably tell that I had a blast replaying that game for the 5th time recently. It&rsquo;s not even the best NFS
game, and yet I love playing it over and over again.&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>LattePanda IOTA review: how does it perform as a home server?</title><link>https://ounapuu.ee/posts/2025/11/18/lattepanda-iota/</link><pubDate>Tue, 18 Nov 2025 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/11/18/lattepanda-iota/</guid><description>I received a review sample of the LattePanda IOTA, here's what I did to it.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/11/18/lattepanda-iota/media/cover_hu_ee50a0b402f18b9b.jpg" width="1200" height="630" alt="LattePanda IOTA review: how does it perform as a home server?" /><p><em><strong>Disclosure:</strong></em> the review sample was provided by <a href="https://www.dfrobot.com/">DFRobot, the makers of LattePanda.</a> I am
allowed to keep the review sample indefinitely, no money exchanged hands, and as always, this post covers my own
thoughts and views on the product.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p><a href="/posts/2023/02/28/lattepanda-v1/">In 2023, I happened to find a LattePanda V1 for sale at a good price.</a> Given the
then-poor availability of affordable Raspberry Pi units, I got one for testing and finding potential use cases for it in
my setup. However, it was just a little bit too weak for any practical uses in 2023, with its CPU and USB connectivity
being just slow enough to be of less use, and the networking being capped at 100 Mbit/s.</p>
<p>In 2025, we have the spiritual successor to it: <a href="https://www.lattepanda.com/lattepanda-iota">the LattePanda IOTA.</a>
It keeps the same form factor, but the connectivity and raw power have all received a significant jump, with the CPU
performance rivalling my current home server, <a href="/posts/2024/10/16/third-times-the-charm/">the trusty ThinkPad T430.</a></p>
<p>The marketing materials list all sorts of sensible use cases for it. I&rsquo;m sure that it works fine for those, but I&rsquo;m only
interested in one thing: how close does this board get to
being <a href="/posts/2025/03/07/perfect-home-server/">the perfect home server?</a></p>
<blockquote>
<p>The perfect home server uses very little power, offers plenty of affordable storage and provides a lot of performance
when it’s actually being relied upon.</p>
</blockquote>
<blockquote>
<p>In my case, low power means less than 5 W while idling, 10+ TB of redundant storage for data resilience and integrity
concerns, and performance means about 4 modern CPU cores’ worth (low-to-midrange desktop CPU performance).</p>
</blockquote>
<h2 id="the-model-and-accessories">
  <a class="heading-anchor" href="#the-model-and-accessories">The model and accessories<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The model I&rsquo;m reviewing is the 8GB RAM/64GB eMMC one, with a Windows 11 installation on it (not activated).</p>









<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/lattepanda-0.jpg">
    <img src="/posts/2025/11/18/lattepanda-iota/media/lattepanda-0_hu_c45484277466acf6.webp"
     width="1000"
     height="774"
     loading="lazy"
     decoding="async"
     alt="The LattePanda IOTA.">

  </a>
  <figcaption class="center">The LattePanda IOTA.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/lattepanda-1.jpg">
    <img src="/posts/2025/11/18/lattepanda-iota/media/lattepanda-1_hu_d3a2ee51a8a3f4c3.webp"
     width="1000"
     height="686"
     loading="lazy"
     decoding="async"
     alt="My wife said that the logo for the LattePanda is cute. I agree.">

  </a>
  <figcaption class="center">My wife said that the logo for the LattePanda is cute. I agree.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/lattepanda-2.jpg">
    <img src="/posts/2025/11/18/lattepanda-iota/media/lattepanda-2_hu_cae36972b32803a8.webp"
     width="1000"
     height="556"
     loading="lazy"
     decoding="async"
     alt="Side view, including the PCIe x1 connector.">

  </a>
  <figcaption class="center">Side view, including the PCIe x1 connector.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/lattepanda-3.jpg">
    <img src="/posts/2025/11/18/lattepanda-iota/media/lattepanda-3_hu_4b383f3738800b2.webp"
     width="1000"
     height="540"
     loading="lazy"
     decoding="async"
     alt="Side view, with GPIO connections prominent.">

  </a>
  <figcaption class="center">Side view, with GPIO connections prominent.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/lattepanda-4.jpg">
    <img src="/posts/2025/11/18/lattepanda-iota/media/lattepanda-4_hu_94feb7c0302ce393.webp"
     width="1000"
     height="626"
     loading="lazy"
     decoding="async"
     alt="Side view, including USB-C PD-compatible port, microSD card reader, a port forgotten by all smartphone makers, and
gigabit Ethernet.">

  </a>
  <figcaption class="center">Side view, including USB-C PD-compatible port, microSD card reader, a port forgotten by all smartphone makers, and
gigabit Ethernet.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/lattepanda-5.jpg">
    <img src="/posts/2025/11/18/lattepanda-iota/media/lattepanda-5_hu_449bf0ed42b37f87.webp"
     width="1000"
     height="661"
     loading="lazy"
     decoding="async"
     alt="Side view, including three USB 3 10 Gbps ports, and a full-sized HDMI port.">

  </a>
  <figcaption class="center">Side view, including three USB 3 10 Gbps ports, and a full-sized HDMI port.</figcaption>
</figure>

<p>Along with the review unit itself, I got sent the following accessories:</p>
<ul>
<li><a href="https://www.dfrobot.com/product-2987.html">active cooler</a></li>
<li><a href="https://www.dfrobot.com/product-2985.html">M.2 M-key expansion board</a></li>
<li><a href="https://www.dfrobot.com/product-2984.html">51W PoE expansion board</a></li>
<li><a href="https://www.dfrobot.com/product-2982.html">M.2 4G LTE expansion board</a></li>
<li><a href="https://www.dfrobot.com/product-2983.html">UPS expansion board</a></li>
</ul>
<p>The board was tested with a Lenovo 65W USB-C power adapter, because that&rsquo;s what I had available. Given the specs of the
board and the accessories, that should be plenty. As far as I know, USB power delivery seems to work fine and it&rsquo;s not
just a weird USB-C connector that requires specific voltages to work.</p>
<p>The M.2 NVMe SSD used in this review is a 512 GB Samsung PM9A1. I got that one from another PC that really didn&rsquo;t need a
boot drive that large.</p>
<p>Most of the testing was done with a fresh Fedora Server 43 installation, kernel version 6.17.7.</p>
<h2 id="the-hardware">
  <a class="heading-anchor" href="#the-hardware">The hardware<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I suggest looking at <a href="https://www.lattepanda.com/lattepanda-iota#spec">the spec sheet</a> if you&rsquo;re interested in all the
fine details and available configurations.</p>
<p>In short:</p>
<ul>
<li>CPU: Intel N150, 4 cores, 4 threads, up to 3.6 GHz</li>
<li>RAM: 8/16 GB (depending on model)</li>
<li>Onboard storage: 64/128GB eMMC (depending on model)</li>
<li>Networking: gigabit Ethernet port</li>
<li>Real-time clock: <em><strong>yes!</strong></em></li>
</ul>
<p>The overall connectivity has been improved with the new version of this board compared to the old board. The USB ports
are all fast 10 Gbit/s ones, and we have actual PCIe connectivity to play with, although the available bandwidth is
quite limited with a PCIe 3.0 x1 lane available on the port that both the M.2 M-key and PoE adapter connect to.</p>
<p>What caught my eye was the CPU performance I&rsquo;ve been proudly
running <a href="/posts/2024/10/16/third-times-the-charm/">an old ThinkPad T430</a> as a server for a while now, with some failed
attempts to find a more <a href="/posts/2023/10/09/zimaboard/">low-power</a>
and <a href="/posts/2025/06/06/thinkcentre-m900-tiny/">efficient</a>
solution.</p>
<p>The Intel N150 is now offering similar levels of performance, but in a much smaller power envelope.</p>
<p>When it comes to more specialized functionalities, such as GPIO and the RP2040 microcontroller, I don&rsquo;t currently have a
solid use case for them, so they won&rsquo;t be covered in this review. I might fancy giving them a go in the future though,
it would be nice to get some environmental sensors on it to monitor the temperature and humidity of the server room
(which is a closet).</p>
<p>Since I also don&rsquo;t have an 4G LTE modem available, I did not test the associated adapter.</p>
<h2 id="m2-m-key-adapter">
  <a class="heading-anchor" href="#m2-m-key-adapter">M.2 M-key adapter<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The way you can add expansion boards to the LattePanda IOTA is quite similar to how Raspberry Pi 5 and other similar
single board computers do it: you simply run a flexible cable to an adapter board, and bam, you have extra
connectivity!</p>
<p>With the M.2 M-key adapter kit, you get the adapter itself, some mounting screws and brass stand-offs, and a tiny little
flexible cable for the PCIe signal.</p>









<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/m2-adapter-0.jpg">
    <img src="/posts/2025/11/18/lattepanda-iota/media/m2-adapter-0_hu_db0b0dd1c31ad3b0.webp"
     width="1000"
     height="632"
     loading="lazy"
     decoding="async"
     alt="Packaging of the M.2 M-key adapter.">

  </a>
  <figcaption class="center">Packaging of the M.2 M-key adapter.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/m2-adapter-1.jpg">
    <img src="/posts/2025/11/18/lattepanda-iota/media/m2-adapter-1_hu_44b0dab8db46a0b8.webp"
     width="1000"
     height="556"
     loading="lazy"
     decoding="async"
     alt="The adapter itself.">

  </a>
  <figcaption class="center">The adapter itself.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/m2-adapter-2.jpg">
    <img src="/posts/2025/11/18/lattepanda-iota/media/m2-adapter-2_hu_4a68666849c39eb2.webp"
     width="1000"
     height="450"
     loading="lazy"
     decoding="async"
     alt="Bottom of the adapter (or top, depending on how you mount it).">

  </a>
  <figcaption class="center">Bottom of the adapter (or top, depending on how you mount it).</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/m2-adapter-installed-0.jpg">
    <img src="/posts/2025/11/18/lattepanda-iota/media/m2-adapter-installed-0_hu_b7a06679bf9193a6.webp"
     width="1000"
     height="785"
     loading="lazy"
     decoding="async"
     alt="Adapter installed to the SBC.">

  </a>
  <figcaption class="center">Adapter installed to the SBC.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/m2-adapter-installed-1.jpg">
    <img src="/posts/2025/11/18/lattepanda-iota/media/m2-adapter-installed-1_hu_37d9a777355bca8f.webp"
     width="1000"
     height="718"
     loading="lazy"
     decoding="async"
     alt="Adapter with an M.2 2280 NVMe SSD. This Western Digital SSD was used for some quick testing.">

  </a>
  <figcaption class="center">Adapter with an M.2 2280 NVMe SSD. This Western Digital SSD was used for some quick testing.</figcaption>
</figure>

<p>The link speed is PCIe 3.0, with one lane available. In theory, this means a maximum of 1 GB/s of throughput. In
practice and with this board and SSD combination, I got a maximum of ~810 MB/s. I expect some levels of losses with
these types of setups, so in my view this seems normal. For the test, I just did
a <code>dd if=/dev/nvme0n1 of=/dev/null bs=8M status=progress</code>. The SSD itself supports up to 4 lanes of PCIe connectivity so
that should not be a limiting factor here.</p>
<p>The lovely part about M.2 NVMe ports is that you can use it for a lot of off-label use cases.</p>
<p>Fancy some SATA ports? There&rsquo;s an <a href="https://www.dfrobot.com/product-2811.html">adapter</a> for that.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<p>Or a network card? Some fancy AI accelator thingy? Or a full-sized GPU? Anything will work (probably), as long as the
cables and adapters are high quality, and you provide extra power to the device through other means.</p>
<h2 id="poe-expansion-board">
  <a class="heading-anchor" href="#poe-expansion-board">PoE expansion board<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The only device on my network that is connected over PoE is currently an Ubiquiti Wi-Fi access point, and that is
unlikely to change in the near future because that would require a full replacement of my networking gear.<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup></p>
<p>However, I still gave this board a quick go, and I&rsquo;m happy to report that it also works as an additional standalone
Ethernet port. The Ethernet controller seems to be similar or the same as on the main board, and it shows up as a
separate networking device. Both are Realtek
NIC-s (<code>Realtek Semiconductor Co., Ltd. RTL8111/8168/8211/8411 PCI Express Gigabit Ethernet Controller</code>), and they work
with the <code>r8169</code> driver. Realtek has a spotty compatibility story overall on Linux from what I&rsquo;ve read, but this one
seems to work fine on Fedora Server 43.</p>









<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/poe-0.jpg">
    <img src="/posts/2025/11/18/lattepanda-iota/media/poe-0_hu_228bfca3cc169a2d.webp"
     width="1000"
     height="746"
     loading="lazy"
     decoding="async"
     alt="PoE adapter.">

  </a>
  <figcaption class="center">PoE adapter.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/poe-1.jpg">
    <img src="/posts/2025/11/18/lattepanda-iota/media/poe-1_hu_7365b2a8e90261be.webp"
     width="1000"
     height="780"
     loading="lazy"
     decoding="async"
     alt="PoE adapter, other side.">

  </a>
  <figcaption class="center">PoE adapter, other side.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/poe-2.jpg">
    <img src="/posts/2025/11/18/lattepanda-iota/media/poe-2_hu_f73e8ff578bc9f0d.webp"
     width="1000"
     height="816"
     loading="lazy"
     decoding="async"
     alt="PoE adapter, installed.">

  </a>
  <figcaption class="center">PoE adapter, installed.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/poe-3.png">
    <img src="/posts/2025/11/18/lattepanda-iota/media/poe-3_hu_7ab3c58ff5a4560.webp"
     width="1000"
     height="551"
     loading="lazy"
     decoding="async"
     alt="Detected network interfaces on Fedora Server 43. Both work!">

  </a>
  <figcaption class="center">Detected network interfaces on Fedora Server 43. Both work!</figcaption>
</figure>

<p>I was very close to pulling the trigger and turning it into a beefy router so that I can finally move my Wireguard
networks on the router as my current one cannot do more than 20 Mbit/s of Wireguard traffic, but I didn&rsquo;t end up going
through with that idea because of how well the SBC did in other areas.</p>
<h2 id="ups-expansion-board">
  <a class="heading-anchor" href="#ups-expansion-board">UPS expansion board<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>As some of you might know, I&rsquo;m a fan
of <a href="/posts/2025/08/18/cheap-power-banks-suck/">playing with fir-</a> 18650 Li-ion battery cells, and I&rsquo;m
hoping to one day build a <a href="https://solar.lowtechmagazine.com/">solar-powered server of my own</a> (of which there
are <a href="https://louwrentius.com/i-made-my-blog-solar-powered-then-things-escalated.html">many</a> <a href="https://dri.es/my-solar-powered-and-self-hosted-website">examples</a>).</p>
<p>I took some spare 18650 cells that came from an old ThinkPad battery, made sure that the voltages are more-or-less
the same, and threw them on the board.</p>









<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/ups-0.jpg">
    <img src="/posts/2025/11/18/lattepanda-iota/media/ups-0_hu_866496dcf875ef62.webp"
     width="1000"
     height="809"
     loading="lazy"
     decoding="async"
     alt="UPS adapter.">

  </a>
  <figcaption class="center">UPS adapter.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/ups-1.jpg">
    <img src="/posts/2025/11/18/lattepanda-iota/media/ups-1_hu_7e7014640b9e0ab1.webp"
     width="1000"
     height="728"
     loading="lazy"
     decoding="async"
     alt="UPS adapter, other side.">

  </a>
  <figcaption class="center">UPS adapter, other side.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/ups-2.jpg">
    <img src="/posts/2025/11/18/lattepanda-iota/media/ups-2_hu_fca2886a8254bb77.webp"
     width="1000"
     height="886"
     loading="lazy"
     decoding="async"
     alt="UPS adapter, installed on the board.">

  </a>
  <figcaption class="center">UPS adapter, installed on the board.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/ups-3.jpg">
    <img src="/posts/2025/11/18/lattepanda-iota/media/ups-3_hu_5f85831f1acaa04.webp"
     width="1000"
     height="893"
     loading="lazy"
     decoding="async"
     alt="UPS adapter, running off of batteries.">

  </a>
  <figcaption class="center">UPS adapter, running off of batteries.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/ups-4.jpg">
    <img src="/posts/2025/11/18/lattepanda-iota/media/ups-4_hu_7f9dc3c2894a962a.webp"
     width="1000"
     height="851"
     loading="lazy"
     decoding="async"
     alt="UPS adapter, charging.">

  </a>
  <figcaption class="center">UPS adapter, charging.</figcaption>
</figure>

<p>Connecting the UPS board with the standoffs was fine, but the cable connecting it
with the SBC was finicky. I triple-checked that the connector was the right way, but had to still use an uncomfortable
amount of force to connect it all up. The battery cells themselves sit snugly on the board, and unless you drop the
board, they should not fall out on their own. You&rsquo;d still want to build a case around it if you&rsquo;re going to actually put
it to use in rough environments.</p>
<p>The manual for the UPS board emphasizes that it only works on Windows 10/11, and sadly that seems to be the case, the
UPS does not seem to show up as an USB-listed device, and tools like <a href="https://networkupstools.org/">NUT</a> did not find
anything to monitor with a quick 5-minute investigation.</p>
<p>The UPS board also has an interesting selection of switches that you can use to adjust the behaviour of the board, like
automatically turning the board on when power comes back on, and setting an 80% battery charge limit. The first one was
not really necessary to use, the board would follow whatever setting you have enabled on the SBC itself. I configured
mine via UEFI settings to automatically turn on with a power adapter connected, and that worked here as well.</p>
<p>The run time of your LattePanda IOTA with the UPS expansion board will heavily depend on your workloads and quality of
your battery cells. Mine were used cells, and then I hit the board with <code>stress -c 4</code> to create some load on it. It ran
for over an hour like that, and then I got bored and wanted to proceed with testing other accessories. The marketing
materials mention up to 8 hours of runtime, and I suspect that with good Li-ion cells and workloads where you idle most
of the time, it will likely be achievable.</p>
<p>The board seems to trigger a hard shutdown on Linux because the host OS is not aware of a battery being connected. Not
that catastrophic for most modern filesystems and database engines, but something to consider in your own workloads in
case they are Linux-based.</p>
<p>The UPS board seems to handle power connection and disconnection events well enough, it did not do anything weird when
repeatedly plugging and unplugging the USB-C cable.<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup></p>
<p>Based on the readings from a wall outlet energy meter, the board uses up to 20W when charging the cells. It&rsquo;s possible
for the board to pull more than that with a maximum CPU load and connected peripherals, so I wonder if that may be an
issue with more intense usage scenarios.</p>
<p>During charging and discharging cycles, even under heavy loads, the battery cells did not get hot and were at best warm
to touch.</p>
<h2 id="ethernet">
  <a class="heading-anchor" href="#ethernet">Ethernet<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>It&rsquo;s gigabit.</p>
<p>Fine for my use case given that I still live in 2006 and only have devices that support gigabit Ethernet
speeds at best (excluding the Ubiquiti Wi-Fi AP), but certainly less
than <a href="https://www.zimaspace.com/products/single-board2-server#specs">some competing products.</a></p>
<h2 id="emmc-and-usb-storage">
  <a class="heading-anchor" href="#emmc-and-usb-storage">eMMC and USB storage<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Compared to the LattePanda V1, the USB port performance is actually decent for my use case. I can connect up to three
USB-connected storage devices to the board, so that&rsquo;s exactly what I did.</p>
<p>I set up three different USB-connected devices:</p>
<ul>
<li>USB hard drive (Seagate Basic)</li>
<li>USB SATA SSD (Samsung QVO 4TB in ICY BOX USB-SATA adapter)</li>
<li>USB NVMe SSD (512 GB Samsung PM9A1 with some random cheap USB to M.2 NVMe adapter)</li>
</ul>
<p>For each device (including on-board eMMC device), I ran
a <code>while true; do dd if=/dev/X of=/dev/null bs=8M status=progress; sleep 5; done</code>, which puts a sequential
read workload on all the drives in an infinite loop.</p>
<p>After about 72 TB of data read in less than 24 hours, I checked the kernel logs and there were no stability issues
whatsoever. The NVMe SSD started throttling due to heat, which was expected with that cheap adapter.</p>









<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/storage-stress-test.png">
    <img src="/posts/2025/11/18/lattepanda-iota/media/storage-stress-test_hu_fe28dcd9ae42d4a9.webp"
     width="1000"
     height="437"
     loading="lazy"
     decoding="async"
     alt="Results of the storage stress test.">

  </a>
  <figcaption class="center">Results of the storage stress test.</figcaption>
</figure>

<p>Assuming no issues with any cables and adapters, the USB ports seem to be solid enough for running storage devices off
of. Yes, <a href="/posts/2025/06/06/thinkcentre-m900-tiny/#2025-06-08-update">it can be a horrible idea in some use cases,</a> but
at the same time my ThinkPad T430 has been excellent with USB-based storage, and that&rsquo;s with one of the USB ports being
coffee-stained!</p>
<p>The eMMC chip is also more performant compared to the previous iteration, with sequential read speeds averaging around
316 MB/s, writes around 175 MB/s, and average read latency being around 0.15 ms. Certainly good enough for a boot drive.</p>
<h2 id="display-connectivity">
  <a class="heading-anchor" href="#display-connectivity">Display connectivity<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The LattePanda V1 struggled with larger displays, and when I gave it a go during this review, it would not properly
display an image on my 3440x1440p monitor.</p>
<p>The LattePanda IOTA just did it, at 60 Hz. On Fedora Workstation and GNOME, the experience was smooth. Once you start
doing things in the browser, like video playback, the situation is less optimal, but as a makeshift desktop PC it is
alright for most low/mid-range activities.</p>









<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/display-output.jpg">
    <img src="/posts/2025/11/18/lattepanda-iota/media/display-output_hu_b30923cd36a81fa0.webp"
     width="1000"
     height="712"
     loading="lazy"
     decoding="async"
     alt="The display output working as intended on Windows 11.">

  </a>
  <figcaption class="center">The display output working as intended on Windows 11.</figcaption>
</figure>

<h2 id="windows-compatibility">
  <a class="heading-anchor" href="#windows-compatibility">Windows compatibility<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The board came with a Windows 11 installation (not activated). As is tradition with Windows, the initial impressions are
horrible, update processes running in the background made the active cooler go wild and the device felt sluggish.</p>
<p>But after that process is done, the experience is not bad at all if you look past the OS being Windows.</p>
<p>I did not do a thorough investigation and I suggest formatting the device boot drive either way when receiving it, but
the Windows 11 installation looked clean enough, with no obvious bloatware.</p>









<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/windows-experience.jpg">
    <img src="/posts/2025/11/18/lattepanda-iota/media/windows-experience_hu_bd5f1e67dc619872.webp"
     width="1000"
     height="760"
     loading="lazy"
     decoding="async"
     alt="The typical Windows experience.">

  </a>
  <figcaption class="center">The typical Windows experience.</figcaption>
</figure>

<h2 id="linux-compatibility">
  <a class="heading-anchor" href="#linux-compatibility">Linux compatibility<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The LattePanda V1 had some quirks. The performance was iffy, and you had to specify a Linux kernel parameter on first
boot so that Fedora Linux does not confuse the optional display interface to be an always-connected primary display.</p>
<p>The previous version also didn&rsquo;t include a real-time clock (RTC) by default, which meant that it was impossible to
schedule some systemd timers as the time would always jump on boot years ahead on distros like Fedora Server. I got
stuck in a reboot loop with a scheduled reboot job that way, was not fun to recover from.</p>
<p>With the LattePanda IOTA, I have not observed any weird oddities and quirks with it. Even the kernel logs don&rsquo;t show
anything that&rsquo;s problematic, and the RTC is handy to have around as that helps avoid the issue mentioned above.</p>
<h2 id="active-cooler">
  <a class="heading-anchor" href="#active-cooler">Active cooler<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>With the LattePanda V1, the cooler was not strictly required, but strongly recommended if you were going to use the
board with moderate to high sustained loads. My solution was to slap an inappropriately sized heat sink to it with a
thermal pad and zip ties and/or velcro strips, which looked horrible, because it was.</p>
<p>With the LattePanda IOTA, the cooler is now a <em><strong>mandatory</strong></em> part of the assembly. It can be fitted with
either
a <a href="https://www.dfrobot.com/product-2988.html">passive cooler</a>, <a href="https://www.dfrobot.com/product-2992.html">a case with passive cooling</a>,
or an <a href="https://www.dfrobot.com/product-2987.html">active cooler</a>.</p>









<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/active-cooler-0.jpg">
    <img src="/posts/2025/11/18/lattepanda-iota/media/active-cooler-0_hu_c12676e55237e93e.webp"
     width="1000"
     height="537"
     loading="lazy"
     decoding="async"
     alt="LattePanda IOTA next to the active cooler.">

  </a>
  <figcaption class="center">LattePanda IOTA next to the active cooler.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/active-cooler-1.jpg">
    <img src="/posts/2025/11/18/lattepanda-iota/media/active-cooler-1_hu_7ff1b540440bb8f8.webp"
     width="1000"
     height="703"
     loading="lazy"
     decoding="async"
     alt="The bottom of the active cooler.">

  </a>
  <figcaption class="center">The bottom of the active cooler.</figcaption>
</figure>

<p>The active cooler does a good job of keeping the board cool, but it does get super loud at higher loads. The default fan
curve is very primitive, with the fan changing it speeds in big and sudden increments. Bursty workloads certainly <em>feel</em>
bursty with this fan. You will not want to be in the same room with this active cooler.</p>
<p>The sound profile is very similar to a thin and light laptop, and the fan has a <em><strong>very</strong></em> strong high-pitched whine to
it.</p>
<p><a href="/posts/2025/11/18/lattepanda-iota/media/active-cooler.mp3">Here&rsquo;s an audio recording of the noise under heavy load if you&rsquo;re interested (MP3 file). Recorded using a Google Pixel 8a.</a></p>
<p>You can mitigate the active cooler noise issue by reducing the CPU clock speed by setting a lower power limit in UEFI
settings, or on Linux, setting a lower CPU performance ceiling using <code>intel_pstate</code> driver <code>max_perf_pct</code> option once on
boot. This comes at the obvious cost of some raw performance, but given that CPU power scales non-linearly, you may not
even notice it that much.</p>
<p>If you are sensitive to fan noise, then do get the passive cooler and slap a Noctua fan on it, it will likely be a much
better experience with both the cooling performance and noise levels.</p>
<p>Oh, and fun fact: I got so carried away with testing that <strong>I actually forgot to remove the plastic film on the larger
thermal pad</strong> that cools supporting components.</p>
<p><em><strong>And then I did about 24 hours of stress testing with that arrangement.</strong></em></p>
<p>I can confirm that the design of the board is idiot-proof, as I did not actually notice any severe throttling or thermal
issues with that mistake. You can actually see the plastic film being present in a few photos of the board in this
review. I still can&rsquo;t believe that after all these years I ended up making <em><strong>that one mistake</strong></em> that you usually see
online in tech support gore posts.</p>
<h2 id="power-consumption">
  <a class="heading-anchor" href="#power-consumption">Power consumption<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The idle power consumption of the LattePanda IOTA seems to be around 4.0W, which is more than the Raspberry Pi 5 8GB
with its power
consumption <a href="https://www.jeffgeerling.com/blog/2024/new-2gb-pi-5-has-33-smaller-die-30-idle-power-savings">being around 3.2W.</a>
Slightly higher compared to that, but lower than most x86 mini PC-s with idle power consumption typically in the range
of 6-14W.</p>
<p>During the disk read speed stress test, I saw a maximum of 24.4W pulled from the wall.</p>
<p>With the disk read stress test and a full CPU stress test, I saw a peak of 36.3W, with it quickly dropping down as the
CPU settled down at a lower clock speed.</p>
<h2 id="home-server">
  <a class="heading-anchor" href="#home-server">Home server<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This board came surprisingly close to my perfect home server criteria that I had outlined earlier this year.</p>
<p>Less than 5W when idling? Check.</p>
<p>10+ TB of redundant storage? <a href="/posts/2025/10/06/datablocks-white-label-drives/">Check.</a></p>
<p>4 modern cores&rsquo; worth of CPU performance? Check.</p>
<p>Enough performance during bursty workloads? So far, yes.</p>
<p>I then installed a fresh copy of Fedora Server 43 and moved all my home server workloads to it. The eMMC storage is used
as a boot drive, <code>journald</code> writes are disabled, workloads requiring good latency and speed are on the 512GB NVMe SSD,
and bulk storage is connected via two existing USB-SATA adapters taken from one of those WD Elements/MyBook external
hard drive enclosures.</p>
<p>Then it just worked. No issues.<sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup></p>









<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/home-server.jpg">
    <img src="/posts/2025/11/18/lattepanda-iota/media/home-server_hu_5194e24434b1f066.webp"
     width="1000"
     height="749"
     loading="lazy"
     decoding="async"
     alt="The LattePanda IOTA next to two 18TB hard drives, running as a home server.">

  </a>
  <figcaption class="center">The LattePanda IOTA next to two 18TB hard drives, running as a home server.</figcaption>
</figure>

<p>The drop in the overall power consumption of my whole home server and networking stack was also immediately noticeable.</p>









<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/power-consumption.png">
    <img src="/posts/2025/11/18/lattepanda-iota/media/power-consumption_hu_6fcbbf1adf7484c5.webp"
     width="1000"
     height="656"
     loading="lazy"
     decoding="async"
     alt="Solid 10W drop in normal use.">

  </a>
  <figcaption class="center">Solid 10W drop in normal use.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/cpu.png">
    <img src="/posts/2025/11/18/lattepanda-iota/media/cpu_hu_9717d24be3191575.webp"
     width="1000"
     height="657"
     loading="lazy"
     decoding="async"
     alt="CPU usage on the ThinkPad T430 vs the LattePanda IOTA (the gap is the server migration). Same workloads in both.">

  </a>
  <figcaption class="center">CPU usage on the ThinkPad T430 vs the LattePanda IOTA (the gap is the server migration). Same workloads in both.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/memory.png">
    <img src="/posts/2025/11/18/lattepanda-iota/media/memory_hu_b7f4eeeb01b4598c.webp"
     width="1000"
     height="657"
     loading="lazy"
     decoding="async"
     alt="Memory consumption, ThinkPad T430 (16GB DDR3) vs LattePanda IOTA (8GB DDR5).">

  </a>
  <figcaption class="center">Memory consumption, ThinkPad T430 (16GB DDR3) vs LattePanda IOTA (8GB DDR5).</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/11/18/lattepanda-iota/media/temps.png">
    <img src="/posts/2025/11/18/lattepanda-iota/media/temps_hu_a0a2f6525ea35be8.webp"
     width="1000"
     height="442"
     loading="lazy"
     decoding="async"
     alt="Temperature readings, ThinkPad T430 vs LattePanda IOTA with the active cooler.">

  </a>
  <figcaption class="center">Temperature readings, ThinkPad T430 vs LattePanda IOTA with the active cooler.</figcaption>
</figure>

<p>Here are my observations of the CPU performance and behaviour after hitting it with an all-core CPU load:</p>
<ul>
<li>2.9 GHz for a short time period (10-15 seconds), with CPU hovering around 80°C</li>
<li>2.2-2.3 GHz after that, with the CPU dropping to around 70°C</li>
</ul>
<p>I have seen the CPU hit around 3.6 GHz with a single core load while there is nothing running in the background, but
during my normal home server operations the cores are doing enough work across all 4 cores, so that doesn&rsquo;t happen all
that often, and 2.9 GHz is the ceiling for single core performance.</p>
<p>The only limiting factor so far has been the 8 GB of memory on my review unit, but on the bright side that limitation
forced me to review the memory usage of some of the jobs that I run on my home server, which ended up with me finding a
few resource hogs and then fixing them all up. Now I can run about 30 Docker containers of various resource consumption
on a single board computer, and with less than 4GB of RAM used. I set up an 8GB swap file on the SSD, just in case.</p>
<p>Thanks to the relatively small boot drive, I also learned that even if you move the Docker <code>data-root</code> folder to another
location, <code>containerd</code> will still clutter up your boot drive, so you&rsquo;ll have to change that path in
its <code>/etc/containerd/config.toml</code> file <code>root</code> setting.</p>
<p>I&rsquo;m genuinely impressed with how well the LattePanda IOTA runs as a home server. The board isn&rsquo;t really designed with
that use case in mind, and I suspect that the Intel N150 might be doing most of the heavy lifting here, but still, very
impressive!</p>
<p><strong>Is it the perfect home server?</strong> No, but it&rsquo;s pretty damn close to my definition of it.</p>
<h2 id="uefi-settings-tour">
  <a class="heading-anchor" href="#uefi-settings-tour">UEFI settings tour<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>For those interested in what options are available on the board via its UEFI settings, here are some screenshots of the
settings.<sup id="fnref:6"><a href="#fn:6" class="footnote-ref" role="doc-noteref">6</a></sup></p>
<ul>
<li><a href="/posts/2025/11/18/lattepanda-iota/media/uefi-0.jpg">Main view</a></li>
<li><a href="/posts/2025/11/18/lattepanda-iota/media/uefi-1.jpg">Advanced</a></li>
<li><a href="/posts/2025/11/18/lattepanda-iota/media/uefi-2.jpg">Advanced -&gt; ACPI</a></li>
<li><a href="/posts/2025/11/18/lattepanda-iota/media/uefi-3.jpg">Advanced -&gt; CPU configuration</a></li>
<li><a href="/posts/2025/11/18/lattepanda-iota/media/uefi-4.jpg">Advanced -&gt; Super IO configuration</a></li>
<li><a href="/posts/2025/11/18/lattepanda-iota/media/uefi-5.jpg">Advanced -&gt; Serial port 1 configuration</a></li>
<li><a href="/posts/2025/11/18/lattepanda-iota/media/uefi-6.jpg">Advanced -&gt; SMART Fan Control</a></li>
<li><a href="/posts/2025/11/18/lattepanda-iota/media/uefi-7.jpg">Advanced -&gt; Trusted Computing</a></li>
<li><a href="/posts/2025/11/18/lattepanda-iota/media/uefi-8.jpg">Advanced -&gt; NVMe configuration</a> (no device connected at time of screenshot, oops)</li>
<li><a href="/posts/2025/11/18/lattepanda-iota/media/uefi-9.jpg">Advanced -&gt; Power configuration</a></li>
<li><a href="/posts/2025/11/18/lattepanda-iota/media/uefi-10.jpg">Advanced -&gt; USB configuration</a></li>
<li><a href="/posts/2025/11/18/lattepanda-iota/media/uefi-11.jpg">Advanced -&gt; Serial Port console redirection</a></li>
<li><a href="/posts/2025/11/18/lattepanda-iota/media/uefi-12.jpg">Advanced -&gt; SDIO configuration</a></li>
<li><a href="/posts/2025/11/18/lattepanda-iota/media/uefi-13.jpg">Advanced -&gt; Realtek PCIe Ethernet controller</a></li>
<li><a href="/posts/2025/11/18/lattepanda-iota/media/uefi-14.jpg">Chipset</a></li>
<li><a href="/posts/2025/11/18/lattepanda-iota/media/uefi-15.jpg">Chipset -&gt; System Agent (SA) configuration</a></li>
<li><a href="/posts/2025/11/18/lattepanda-iota/media/uefi-16.jpg">Chipset -&gt; Device configuration</a></li>
<li><a href="/posts/2025/11/18/lattepanda-iota/media/uefi-17.jpg">Security</a></li>
<li><a href="/posts/2025/11/18/lattepanda-iota/media/uefi-18.jpg">Security -&gt; Secure Boot</a></li>
<li><a href="/posts/2025/11/18/lattepanda-iota/media/uefi-19.jpg">Boot</a></li>
<li><a href="/posts/2025/11/18/lattepanda-iota/media/uefi-20.jpg">Save &amp; Exit</a></li>
</ul>
<h2 id="conclusion">
  <a class="heading-anchor" href="#conclusion">Conclusion<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If the LattePanda IOTA with its adapters fits your project requirements, you&rsquo;re aware of its limitations, and the
price is right, then I believe it&rsquo;s a solid choice for your next project. My testing didn&rsquo;t immediately break it, even
when I forgot to remove the plastic film on one of the thermal pads.</p>
<p>The current pricing of it and its accessories seem to be roughly in the ballpark of the Raspberry Pi 5 8GB (based on
prices in Estonia). Boards like <a href="https://shop.zimaspace.com/products/zimaboard2-single-board-server">the Zimaboard 2</a>
<strong><em>(have not tested it myself)</em></strong> are more expensive, but they&rsquo;re also catering to a slightly different audience and
have better specs, like 2.5G Ethernet ports and SATA ports with power delivery suitable for running two 3.5&quot; hard drives
straight from the board.</p>
<p>It&rsquo;s hard to beat the bargain that you can get from a used mini PC or NAS, but it won&rsquo;t come with the charm, low power
consumption and bragging rights that a single board computer gets you, especially if you&rsquo;re using it for an off-label
use case like I am.<sup id="fnref:7"><a href="#fn:7" class="footnote-ref" role="doc-noteref">7</a></sup></p>
<p>In the meantime, I&rsquo;ll keep rocking it as a home server. In case something noteworthy happens, I&rsquo;ll update this post,
which is brought to you by the very same LattePanda IOTA at the time of publishing.</p>
<h2 id="2025-12-12-update">
  <a class="heading-anchor" href="#2025-12-12-update">2025-12-12 update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>About a month after switching my home server workloads to it, the LattePanda IOTA is still rock solid. No issues with
USB HDD stability as well.</p>
<p>The only complaint that carries over from the review is the fact that the active cooler is still way too loud. I&rsquo;m
seriously considering getting the passive cooler for it to shut it up. I can hear it from the bedroom while the IOTA is
in a closet on the other side of the apartment!</p>
<p>I also played around with Intel RAPL settings, which allow you to control the power budget of the CPU on the fly.</p>
<p>The power limit is 10W by default, and short term power limit is 20W. You can control it via these toggles:</p>
<pre tabindex="0"><code>/sys/class/powercap/intel-rapl/intel-rapl:0/constraint_0_power_limit_uw
/sys/class/powercap/intel-rapl/intel-rapl:0/constraint_1_power_limit_uw
</code></pre><p>Get current values:</p>
<pre tabindex="0"><code>cat /sys/class/powercap/intel-rapl/intel-rapl:0/constraint_0_power_limit_uw
cat /sys/class/powercap/intel-rapl/intel-rapl:0/constraint_1_power_limit_uw
</code></pre><p>Set a new limit of 8W to both:</p>
<pre tabindex="0"><code>echo 8000000 &gt; /sys/class/powercap/intel-rapl/intel-rapl:0/constraint_0_power_limit_uw
echo 8000000 &gt; /sys/class/powercap/intel-rapl/intel-rapl:0/constraint_1_power_limit_uw
</code></pre><p>These reset every boot, so you should probably set a one-shot systemd unit to call these early in the boot cycle.</p>
<p>The LattePanda IOTA is the most exciting yet boring addition to my setup. It just works.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>this also marks the first time that I&rsquo;ve been sent a review sample throughout the course of running this blog!&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>do note that with most M.2 PCIe-&gt;SATA adapters, the controller of the adapter determines how good of an experience
you will have. With some, I&rsquo;ve read that the controllers may not handle some failure scenarios well, one device having
issues may throw off the whole controller, and now you have a bigger mess.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>the earliest PC motherboard with a gigabit Ethernet connection that I&rsquo;ve personally used was manufactured in 2006.
That&rsquo;s how long gigabit Ethernet has been around for in the consumer space.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p>say that 10 times in a row!&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:5">
<p>I know, that usually does not happen on this blog.&#160;<a href="#fnref:5" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:6">
<p>being <a href="/posts/2025/02/17/influencer/">a prolific open source influencer</a> does not bring in as much money as you&rsquo;d
think, so I haven&rsquo;t bought a proper capture device yet.&#160;<a href="#fnref:6" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:7">
<p>no, but seriously, I cannot be the only one who has a strange affection towards SBC-s with their bare PCB-s.
I can&rsquo;t tell a capacitor from a resistor, but the boards are just so damn cool, right?&#160;<a href="#fnref:7" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>./project2038: can I keep the Orange Pi Zero running until 2038 and beyond?</title><link>https://ounapuu.ee/posts/2025/10/20/project2038/</link><pubDate>Mon, 20 Oct 2025 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/10/20/project2038/</guid><description>Only one way to find out!</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/10/20/project2038/media/cover_hu_b330c3c2c479a395.jpg" width="1200" height="630" alt="./project2038: can I keep the Orange Pi Zero running until 2038 and beyond?" /><p><em>Start of experiment: September 2025</em></p>
<p><em>Post last updated: October 2025</em></p>
<p><a href="https://project2038.ounapuu.ee/">Check the live status of my Orange Pi Zero here!</a></p>
<p>I love the <a href="https://www.armbian.com/orange-pi-zero/">Orange Pi Zero.</a> It&rsquo;s tiny, uses very little power and it&rsquo;s just
neat! It&rsquo;s also the subject of <a href="/posts/2020/07/23/the-little-wifi-ap-that-could/">the very first post on my blog,</a> which
makes it a bit special.</p>
<p>Unfortunately I haven&rsquo;t really found a good use case for it, given that its performance is quite limited and the CPU is
a 32-bit ARM CPU with 4 relatively weak cores, which rules out using it as a Docker container host due to the
architectural limitations.</p>
<p>The board is currently not doing much, but I&rsquo;ll figure out a use case for it.</p>
<p>The board also has a few quirks at the moment that I&rsquo;ve worked around. For example, rebooting seems to be broken, and
it&rsquo;s unlikely to get fixed any time soon. I resolved it by simply not rebooting it<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>, at least not on a regular
schedule, anyway. I&rsquo;m hoping that any short-term power outages at home will take care of the need to reboot it.</p>
<p>It also runs quite hot in its stock Armbian configuration, which I worked around by running <code>powertop --auto-tune</code> on
startup as that forces the CPU to always run at its slowest clock speed (480 MHz). Without it, I found that this board
can run its CPU at 105°C, and it does have a thermal shutdown feature.</p>
<p>This board has been featured in a few previous posts as well, and even then it was quite underpowered:</p>
<ul>
<li><a href="/posts/2020/07/23/the-little-wifi-ap-that-could/">the little Wi-Fi AP that could</a></li>
<li><a href="/posts/2021/03/20/whacky-setups-1/">seedbox on a wall</a></li>
<li><a href="/posts/2021/02/27/database-optimization-adventures-on-low-end-hardware/">database optimization adventures on low-end hardware</a></li>
</ul>
<p>Now that I have it set up, will it be able to survive
to <a href="https://en.wikipedia.org/wiki/Year_2038_problem">year 2038 and beyond?</a> Only time will tell.</p>
<p>Which issue will we run into first? Plausible options based on my previous experience:</p>
<ul>
<li>the cheap 8GB SD card craps out</li>
<li>component on the board dies from heat-related issues</li>
<li>the USB power supply dies
<ul>
<li>it&rsquo;s currently running off of an IKEA extension cord that has two USB-A ports, so hopefully not</li>
</ul>
</li>
<li>board loses Armbian support completely (currently under community maintenance status)</li>
</ul>
<p>The board is currently running the latest version of Armbian, and I might occasionally refresh its version from time to
time.</p>
<p><a href="https://www.armbian.com/donate/">If you like Armbian, then please support them!</a> They&rsquo;re doing great work with keeping
all sorts of SBC-s up and running with usable versions of Debian and Ubuntu Linux.</p>
<h2 id="2025-10-20-update">
  <a class="heading-anchor" href="#2025-10-20-update">2025-10-20 update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>What are the chances that the day I make this project
public, <a href="https://aws.amazon.com/message/101925/">AWS suffers a massive outage?</a>
Poetic in a way. And yes, my website and the Orange Pi Zero were fully operational.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>the first time in my career that the solution ended up being &ldquo;have you tried <em><strong>not</strong></em> turning it off and on
again?&rdquo;&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>Comparing the power consumption of a 30 year old refrigerator to a brand new one</title><link>https://ounapuu.ee/posts/2025/10/14/fridge-power-consumption/</link><pubDate>Tue, 14 Oct 2025 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/10/14/fridge-power-consumption/</guid><description>Having a home server and a few smart plugs leads to interesting data points like this one. Well, interesting to me, at least.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/10/14/fridge-power-consumption/media/cover_hu_c10a0f2e1329e560.jpg" width="1200" height="630" alt="Comparing the power consumption of a 30 year old refrigerator to a brand new one" /><p>Our apartment came with a refrigerator. It was alright, it made things cold, it kept them cold. It was also
incredibly noisy, and no matter how much I fiddled with its settings, the compressor was always running and any ice
cream left in the deep freeze part got rock solid.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>When I hooked up <a href="/posts/2024/05/02/smartplugs/">one of my smart plugs</a> to it, I soon learned why: one of the two compressors was
running all the time. This lead to a huge block of ice forming on the back
of the main compartment, and the deep freeze section icing up really quickly. I suspect that the thermostat may have
been busted and contributed to the issue, but after trying to repair a dishwasher, getting cut about 10 times on my
hands and losing, I had zero interest in attempting another home appliance repair on my own.</p>
<p>The refrigerator was the UPO Jääkarhu (<em>jääkarhu</em> means polar bear in Finnish), and the manual that the previous owner
had still kept around had July 1995 on it, meaning that the refrigerator was about the same age as I am: 30 years old.
Not bad at all for a home appliance!</p>









<figure class="center">
  <a href="/posts/2025/10/14/fridge-power-consumption/media/refrigerator.jpg">
    <img src="/posts/2025/10/14/fridge-power-consumption/media/refrigerator_hu_956de92cb4f3e17d.webp"
     width="647"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="Behold, the UPO Jääkarhu!">

  </a>
  <figcaption class="center">Behold, the UPO Jääkarhu!</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/10/14/fridge-power-consumption/media/manual.jpg">
    <img src="/posts/2025/10/14/fridge-power-consumption/media/manual_hu_53f4af67bd2f2487.webp"
     width="732"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="The manual that came with the refrigerator.">

  </a>
  <figcaption class="center">The manual that came with the refrigerator.</figcaption>
</figure>

<p>I shopped around for a new refrigerator and got a decent one that&rsquo;s about the same size, except newer. I won&rsquo;t mention
the brand here because they didn&rsquo;t pay me anything and this post really isn&rsquo;t a refrigerator review, but it was in the
low-to-midrange class, sporting a &ldquo;no frost&rdquo; feature, and could be bought for about 369 EUR in Estonia in the summer of
2025. Based on some napkin math, I assumed that within a few years, the electricity savings will cover the upfront
cost of buying the new refrigerator, assuming that it doesn&rsquo;t break down.</p>
<p>After letting it run for a while, I had some <em><strong>data!</strong></em></p>
<p>Turns out that the old one consumed <strong>3.7x</strong> more electricity compared to the new one.</p>
<p>Here are some typical daily power consumption numbers:</p>
<ul>
<li>old refrigerator: <strong>2.6 kWh</strong></li>
<li>new refrigerator: <strong>0.7 kWh</strong></li>
</ul>









<figure class="center">
  <a href="/posts/2025/10/14/fridge-power-consumption/media/old-fridge-daily.png">
    <img src="/posts/2025/10/14/fridge-power-consumption/media/old-fridge-daily_hu_23e52ba435fe7f10.webp"
     width="1000"
     height="457"
     loading="lazy"
     decoding="async"
     alt="Daily power consumption of the old fridge, in kilowatt-hours (kWh).">

  </a>
  <figcaption class="center">Daily power consumption of the old fridge, in kilowatt-hours (kWh).</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/10/14/fridge-power-consumption/media/new-fridge-daily.png">
    <img src="/posts/2025/10/14/fridge-power-consumption/media/new-fridge-daily_hu_27c3472be5b7956c.webp"
     width="1000"
     height="457"
     loading="lazy"
     decoding="async"
     alt="Daily power consumption of the new fridge, in kilowatt-hours (kWh).">

  </a>
  <figcaption class="center">Daily power consumption of the new fridge, in kilowatt-hours (kWh).</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/10/14/fridge-power-consumption/media/old-fridge-active.png">
    <img src="/posts/2025/10/14/fridge-power-consumption/media/old-fridge-active_hu_a0e3adc6d0b4295d.webp"
     width="1000"
     height="457"
     loading="lazy"
     decoding="async"
     alt="You can really see one of the two compressors constantly running on this one.">

  </a>
  <figcaption class="center">You can really see one of the two compressors constantly running on this one.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/10/14/fridge-power-consumption/media/new-fridge-active.png">
    <img src="/posts/2025/10/14/fridge-power-consumption/media/new-fridge-active_hu_36632025d4af4b2a.webp"
     width="1000"
     height="457"
     loading="lazy"
     decoding="async"
     alt="On the new fridge, we actually have moments where the compressor shuts off, which is great for the power consumption and
also my ears.">

  </a>
  <figcaption class="center">On the new fridge, we actually have moments where the compressor shuts off, which is great for the power consumption and
also my ears.</figcaption>
</figure>

<p>The difference is more noticeable if we zoom out a bit.</p>









<figure class="center">
  <a href="/posts/2025/10/14/fridge-power-consumption/media/comparison-daily.png">
    <img src="/posts/2025/10/14/fridge-power-consumption/media/comparison-daily_hu_3afee7154e3a6a95.webp"
     width="1000"
     height="457"
     loading="lazy"
     decoding="async"
     alt="Old vs new fridge daily power consumption, in kilowatt-hours (kWh).">

  </a>
  <figcaption class="center">Old vs new fridge daily power consumption, in kilowatt-hours (kWh).</figcaption>
</figure>

<p>Moving from ~78 kWh to ~21 kWh consumed each month is nice. Around the time we replaced the refrigerator, we
also got a working dishwasher, and with those two combined I saw a solid 10-20% decrease in the overall power usage of
the whole apartment. We went from using 334 kWh in June to 268 kWh in July, 298 kWh in August and 279 kWh in September.</p>
<p>Remember that napkin math I made earlier? If we assume about 57 kWh savings per month, and an average electricity price
of 17 cents per kWh (based on actual rates during August 2025), it will take about 38 months or a bit over 3 years for
the new refrigerator to pay off in the most pessimistic scenario. The pay-off will likely be larger if we account for
energy prices usually rising during winter.</p>
<p>Don&rsquo;t worry about the old refrigerator, we gave it away to a person who needed one for their new home in the short term
as a stopgap until they get further with renovation work. Even got some good chocolate for that!</p>
<p>The only point of concern with this change is that I don&rsquo;t really trust the new refrigerator to last as long as the old
one. The previous one was good for 30 years if you look past the whole ice buildup, heat and noise, but with the new one
I suspect that it&rsquo;s not going to last as long.</p>
<p><a href="https://arstechnica.com/gadgets/2025/09/samsung-forces-ads-onto-fridges-is-a-bad-sign-for-other-appliances/">At least my new refrigerator doesn&rsquo;t have a Wi-Fi-connected screen on it!</a></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>honestly, I miss that a lot, the ice cream was colder for longer, I ate it in smaller bites and savored it more.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>Testing two 18 TB white label SATA hard drives from datablocks.dev</title><link>https://ounapuu.ee/posts/2025/10/06/datablocks-white-label-drives/</link><pubDate>Mon, 06 Oct 2025 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/10/06/datablocks-white-label-drives/</guid><description>It has been 0 days since the last change to my home server.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/10/06/datablocks-white-label-drives/media/cover_hu_62398be5795c9b74.jpg" width="1200" height="630" alt="Testing two 18 TB white label SATA hard drives from datablocks.dev" /><p>This post is <em><strong>NOT</strong></em> sponsored, the products were bought with my hard-earned money.</p>
<p>I&rsquo;ve been running a full SSD storage setup for a few years in my home server and I&rsquo;ve been happy with it, except for the
storage anxiety that I get with running small pools of fast storage, which is why I started looking at how the hard
drive market is doing.</p>
<p>Half of tech YouTube has been sponsored by companies like ServerPartDeals, so they were one of the first
places I looked at, but they seem to only operate within the US and the shipping+taxes destroy any price advantages from
ordering there to Estonia (which is in Europe).</p>
<p>At some point I stumbled upon <a href="https://datablocks.dev/">datablocks.dev</a>, which seems to operate within a similar niche,
but in Europe and on a much smaller scale. What caught my eye were their white label hard drive offerings. Their website
has a good explanation on
the <a href="https://datablocks.dev/blogs/news/white-label-vs-recertified-drives">differences between recertified and white label hard drives.</a>
In short: white label drives have no branding, have no or very low number of power-on hours, may have small scratches or
dents, but are in all other aspects completely functional and usable.</p>
<p>White label drives also have a price advantage compared to branded recertified drives. Here&rsquo;s one example with 18 TB
drives, the recertified one is 16.7% more expensive compared to the white label one, and the only obvious difference
seems to be the sticker on the drive. I highly suspect that the white label one is also manufactured by Seagate based on
the physical similarities.</p>









<figure class="center">
  <a href="/posts/2025/10/06/datablocks-white-label-drives/media/pricing.png">
    <img src="/posts/2025/10/06/datablocks-white-label-drives/media/pricing_hu_557f72882995374.webp"
     width="711"
     height="673"
     loading="lazy"
     decoding="async"
     alt="The price difference between a recertified and a white label drive.">

  </a>
  <figcaption class="center">The price difference between a recertified and a white label drive.</figcaption>
</figure>

<p>I took some time to think things over and compared the pricing of various drives. The drives were all competitively
priced between each other, with the price per terabyte hovering around 13 EUR/TB, so it didn&rsquo;t matter much which drive
size you picked, you&rsquo;d still get a pretty solid deal. It was also a better deal compared to using an WD Elements/My Book
drive of the same size.</p>
<p>I decided to go with two 18 TB hard drives. I considered buying the 20 TB or 22 TB capacities, but decided to go with 18
TB because it&rsquo;s the largest single hard drive that I can easily and quickly buy a replacement for in the form of a WD
Elements/My Book drive.</p>
<p>The stock on <code>datablocks.dev</code> is quite volatile, the drives are in stock when new batches arrive, but they can also
quickly go out of stock. I saw this live with the 22 TB hard drives, one day there are 35 left, the next day there can
be 7 left, and then only one lone drive.</p>
<p>At the time of writing, the 18 TB model that I bought is out of stock, so my choice to go with a slightly smaller but
more easily replaceable one is validated.</p>
<p>For those that have followed my blog for a while will know that I&rsquo;m a huge fan of all-SSD server
builds, <a href="https://www.jeffgeerling.com/blog/2024/radxas-sata-hat-makes-compact-pi-5-nas">especially this one by Jeff Geerling that I still consider building from time to time.</a>
If I dislike noise, higher power usage and slower performance, then why did I get the hard drives? It&rsquo;s simple, really:
I now have an actual closet that I can stash my home server in, meaning that noise isn&rsquo;t that big of a worry, and as
long as my home server takes about the same amount of power as my refrigerator or dishwasher, then that&rsquo;s fine.
SSD prices still haven&rsquo;t gone down as much as I&rsquo;ve hoped over the years, so the all-SSD build ideas that I have are way
outside my budget.</p>
<p>The drives arrived in a reasonable time window. The packaging was adequate, although I was slightly concerned with the
cardboard box showing signs of something hitting it hard. The drives were packaged within sealed antistatic bags, and
with ample bubble wrap surrounding them.</p>









<figure class="center">
  <a href="/posts/2025/10/06/datablocks-white-label-drives/media/packaging-1.jpg">
    <img src="/posts/2025/10/06/datablocks-white-label-drives/media/packaging-1_hu_a9dba89172bc3c4.webp"
     width="751"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="The cardboard box with a slight dent.">

  </a>
  <figcaption class="center">The cardboard box with a slight dent.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/10/06/datablocks-white-label-drives/media/packaging-2.jpg">
    <img src="/posts/2025/10/06/datablocks-white-label-drives/media/packaging-2_hu_7dbb3525f71376b8.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="Plenty of paper inside to prevent the drives from flying around.">

  </a>
  <figcaption class="center">Plenty of paper inside to prevent the drives from flying around.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/10/06/datablocks-white-label-drives/media/packaging-3.jpg">
    <img src="/posts/2025/10/06/datablocks-white-label-drives/media/packaging-3_hu_391e44195be9b89b.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="Drives were wrapped in bubble wrap, with the drives themselves also separated with a few layers of it for maximum
protection.">

  </a>
  <figcaption class="center">Drives were wrapped in bubble wrap, with the drives themselves also separated with a few layers of it for maximum
protection.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/10/06/datablocks-white-label-drives/media/packaging-4.jpg">
    <img src="/posts/2025/10/06/datablocks-white-label-drives/media/packaging-4_hu_2f0b8482d4f6a778.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="Drives in anti-static bags.">

  </a>
  <figcaption class="center">Drives in anti-static bags.</figcaption>
</figure>

<p>Just as described, the drives did have slight scratches and very minor dents in them, but in all other aspects they
looked like new.</p>









<figure class="center">
  <a href="/posts/2025/10/06/datablocks-white-label-drives/media/drive-0.jpg">
    <img src="/posts/2025/10/06/datablocks-white-label-drives/media/drive-0_hu_d83039e15059e17b.webp"
     width="751"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="One of the hard drives. It does have slight dents and scratches, matching the description.">

  </a>
  <figcaption class="center">One of the hard drives. It does have slight dents and scratches, matching the description.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/10/06/datablocks-white-label-drives/media/drive-1.jpg">
    <img src="/posts/2025/10/06/datablocks-white-label-drives/media/drive-1_hu_ae9c6c9ec935f236.webp"
     width="751"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="The second drive had a more noticeable bump in it.">

  </a>
  <figcaption class="center">The second drive had a more noticeable bump in it.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/10/06/datablocks-white-label-drives/media/drive-backside.jpg">
    <img src="/posts/2025/10/06/datablocks-white-label-drives/media/drive-backside_hu_31c6dbfeabd631da.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="The backside of the drives.">

  </a>
  <figcaption class="center">The backside of the drives.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/10/06/datablocks-white-label-drives/media/drive-wd-adapter.jpg">
    <img src="/posts/2025/10/06/datablocks-white-label-drives/media/drive-wd-adapter_hu_12335c95ee248c0e.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="Those USB-SATA adapters from shucking are really darn handy now. Adapter courtesy of my brother-in-law.">

  </a>
  <figcaption class="center">Those USB-SATA adapters from shucking are really darn handy now. Adapter courtesy of my brother-in-law.</figcaption>
</figure>

<p>Before putting them to use, I formatted the drives using <code>badblocks</code>. It took a full 24 hours to do a full drive write.
The write performance peaked at 275 MB/s and slowed down to 123 MB/s at the end, which is expected.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>









<figure class="center">
  <a href="/posts/2025/10/06/datablocks-white-label-drives/media/performance.png">
    <img src="/posts/2025/10/06/datablocks-white-label-drives/media/performance_hu_9faa269c4173536c.webp"
     width="1000"
     height="300"
     loading="lazy"
     decoding="async"
     alt="The performance of the drive during the full drive format.">

  </a>
  <figcaption class="center">The performance of the drive during the full drive format.</figcaption>
</figure>

<p>I also had to choose a larger block size for <code>badblocks</code> because otherwise it could not handle the drive, resulting in
the command
being <code>badblocks -wsv -b 8192 /dev/sdX</code>.</p>









<figure class="center">
  <a href="/posts/2025/10/06/datablocks-white-label-drives/media/peak-performance.jpg">
    <img src="/posts/2025/10/06/datablocks-white-label-drives/media/peak-performance_hu_ce21ef2456c6c9b3.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="This is what peak jank looks like.">

  </a>
  <figcaption class="center">This is what peak jank looks like.</figcaption>
</figure>

<p>I unfortunately did not save the SMART data from the time I received the drives, but the contents were as expected,
there were no more than a few power on hours and other metrics were OK. Keep in mind that it&rsquo;s also possible to reset
SMART data on a drive so this information cannot be taken at face value.</p>
<p>The drives are noisy, as expected. They run at 7200 RPM and do the usual clicks and clacks that a normal hard drive
does. If this bothers you, <a href="/posts/2021/04/02/tech-tip-1/">use foam to fix it.</a> The soft side of a sponge can work
just as well.</p>
<p>With these drives <a href="/posts/2023/03/26/tiered-storage/">I&rsquo;ve now followed my own advice</a> and tiered my storage: two 1 TB
SSD-s for the things that benefit from good speed and latency (databases, containers), and 18 TB hard drives for
bulk storage, backups and less frequently used data. Coming from an all-SSD build, I expected the performance to drop in
day-to-day operations, but in most cases I cannot tell a difference. My family photos load just fine, media plays back
well, and backups take slightly longer, which isn&rsquo;t noticeable due to them running during the night. Only when I look at
the Prometheus node exporter graphs do I notice that sometimes the server is waiting behind the disks a bit more due to
higher <code>iowait</code>.</p>









<figure class="center">
  <a href="/posts/2025/10/06/datablocks-white-label-drives/media/iowait.png">
    <img src="/posts/2025/10/06/datablocks-white-label-drives/media/iowait_hu_62d2f4a247e6e5b1.webp"
     width="1000"
     height="452"
     loading="lazy"
     decoding="async"
     alt="During full backups or disk scrubs, the iowait is more prevalent on graphs (the red part), but that doesn&#39;t seem to
impact my other workloads in a significant way.">

  </a>
  <figcaption class="center">During full backups or disk scrubs, the iowait is more prevalent on graphs (the red part), but that doesn&#39;t seem to
impact my other workloads in a significant way.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/10/06/datablocks-white-label-drives/media/drives-in-use-0.jpg">
    <img src="/posts/2025/10/06/datablocks-white-label-drives/media/drives-in-use-0_hu_734ffb597eff0fec.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="The drives are connected via two WD Elements/My Book USB-SATA adapters, over USB 3.0, and stored right below my ThinkPad
T430, which is proudly running as my home server.">

  </a>
  <figcaption class="center">The drives are connected via two WD Elements/My Book USB-SATA adapters, over USB 3.0, and stored right below my ThinkPad
T430, which is proudly running as my home server.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/10/06/datablocks-white-label-drives/media/drives-in-use-1.jpg">
    <img src="/posts/2025/10/06/datablocks-white-label-drives/media/drives-in-use-1_hu_ed0078e342cbd321.webp"
     width="751"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="I added glue-on rubber feet on the stand to make sure the drives do not accidentally slip off anywhere. It does nothing
to reduce the noise, though, and I&#39;m convinced that it&#39;s actually making the noise worse.">

  </a>
  <figcaption class="center">I added glue-on rubber feet on the stand to make sure the drives do not accidentally slip off anywhere. It does nothing
to reduce the noise, though, and I&#39;m convinced that it&#39;s actually making the noise worse.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/10/06/datablocks-white-label-drives/media/home-server.jpg">
    <img src="/posts/2025/10/06/datablocks-white-label-drives/media/home-server_hu_116154110711149.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="I&#39;m not proud of the lack of cable management, but this setup works well. Given how often I get new ideas, it doesn&#39;t
make sense to organize this too much anyway.">

  </a>
  <figcaption class="center">I&#39;m not proud of the lack of cable management, but this setup works well. Given how often I get new ideas, it doesn&#39;t
make sense to organize this too much anyway.</figcaption>
</figure>

<p>The power usage did shoot up as a result, roughly 10-20 W. Not ideal, but my whole networking and home server setup is
idling at below 45 W, and I&rsquo;ve
had <a href="/posts/2021/03/17/server-setups-throughout-the-years/">less efficient home servers in the past,</a> so it&rsquo;s not that
big of a deal.</p>









<figure class="center">
  <a href="/posts/2025/10/06/datablocks-white-label-drives/media/setup-power-usage.png">
    <img src="/posts/2025/10/06/datablocks-white-label-drives/media/setup-power-usage_hu_39a1f182a81cdbb4.webp"
     width="1000"
     height="601"
     loading="lazy"
     decoding="async"
     alt="The power usage was elevated while I was formatting and copying files over to the new drives, but after that it&#39;s
stabilized to around 1.2 kWh per day.">

  </a>
  <figcaption class="center">The power usage was elevated while I was formatting and copying files over to the new drives, but after that it&#39;s
stabilized to around 1.2 kWh per day.</figcaption>
</figure>

<p>In this configuration, the drives run quite cool. During formatting on a hot day, I saw them go up to a maximum of 51°C,
but in general use they sit at around 38-42°C.</p>
<p>Overall, I&rsquo;m reasonably happy with the drives. I expect these to last me at least 5 years, and I&rsquo;m probably going to
switch one of the drives out a bit sooner to reduce the risk of a full drive pool failure. They&rsquo;ve made it the first 50
days, so that&rsquo;s good!</p>
<p>Oh, and here&rsquo;s the <code>smartctl -ax</code> output for the disks after running them for about two months:</p>
<ul>
<li><a href="/posts/2025/10/06/datablocks-white-label-drives/media/disk1.txt">disk 1</a></li>
<li><a href="/posts/2025/10/06/datablocks-white-label-drives/media/disk2.txt">disk 2</a></li>
</ul>
<h2 id="2026-02-13-update">
  <a class="heading-anchor" href="#2026-02-13-update">2026-02-13 update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>6 months later, and my drives are still doing well. <code>smartctl -ax</code> output:</p>
<ul>
<li><a href="/posts/2025/10/06/datablocks-white-label-drives/media/disk1-2026-02-13.txt">disk 1</a></li>
<li><a href="/posts/2025/10/06/datablocks-white-label-drives/media/disk2-2026-02-13.txt">disk 2</a></li>
</ul>
<p>In the meantime, what <em>did</em> die on me was a Seagate Portable 4TB drive that I used mainly for backups. :)</p>
<p>A Latvian blogger that I follow also had a pleasant experience with datablocks.dev,
and <a href="https://blog.kronis.dev/blog/buying-some-drives-from-datablocks">they wrote about it here.</a></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>hard drives are expected to be slower at the end of the drive because of their design, the platter rotates at 7200
RPM
but the end of the drive is located at the inner tracks of the platter, near the center of the spindle, which results in
a slower effective speed. Math is cool!&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>Samsung 870 QVO 4TB SATA SSD-s: how are they doing after 4 years of use?</title><link>https://ounapuu.ee/posts/2025/09/15/samsung-870-qvo/</link><pubDate>Mon, 15 Sep 2025 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/09/15/samsung-870-qvo/</guid><description>How much damage can a self-hosting enthusiast do to a quartet of Samsung SSD-s after 4 years?</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/09/15/samsung-870-qvo/media/cover_hu_94aa1fcf2fa11da1.jpg" width="1200" height="630" alt="Samsung 870 QVO 4TB SATA SSD-s: how are they doing after 4 years of use?" /><p>I&rsquo;ve been running four Samsung 870 QVO 4TB SATA SSD-s for a while now. They&rsquo;re old enough to be popping up on the
second-hand market, so I thought it would be good to provide a few additional data points for those thinking about
buying one.</p>
<p>Mine have mainly been used in a home server setting, with one also being used as a backup drive at times. I initially
got
these drives because I found the noise that hard drives generated to be unacceptably high in a small apartment. They&rsquo;re
also quite a bit faster than hard drives and use significantly less power.</p>
<p>The drives were manufactured in 2021, two in April, two in June.</p>
<p>Overall, I haven&rsquo;t seen many issues with the drives, and when I
did, <a href="https://www.phoronix.com/news/Samsung-860-870-More-Quirks">it was a Linux kernel issue.</a> These drives are still
performing at the expected speed and at during write-heavy workloads they only drop down to 140-170 MB/s, which is
considerably better than what the cheapest SATA SSD-s can do in the same scenario, those can go a low as 30 MB/s or even
worse.</p>
<p>I did notice that one of the drives reported 4 bad blocks over its lifetime, and oddly enough it&rsquo;s the drive with the
least amount of power-on hours.</p>
<p>The reported SSD lifetime is reported to be around 94%, with over 170+ TB of data written. At this point, the drives are
not even close to
the <a href="https://www.samsung.com/uk/memory-storage/sata-ssd/ssd-870-qvo-sata-3-2-5-inch-4tb-mz-77q4t0bw/">1440 TBW endurance limit that Samsung has published.</a></p>
<p>The price hasn&rsquo;t gone down as much as I&rsquo;ve hoped over the years. At the time I bought the drives, they were roughly 400
EUR a piece, and now they&rsquo;re selling for about 270 EUR a piece. It&rsquo;s still significantly cheaper, but back in 2021-2022
there was more optimism about SSD prices coming down over the years. For comparison, 4TB SSD-s from other manufacturers
and form factors (NVMe, SATA) start from about 190-200 EUR, however I am not fully confident that those perform at the
same level, at least under sustained writes.</p>
<p>For those curious, here&rsquo;s the full <code>smartctl -ax</code> output for all the individual drives.</p>
<ul>
<li><a href="/posts/2025/09/15/samsung-870-qvo/media/S5STNF0R405312K.txt">S5STNF0R405312K</a></li>
<li><a href="/posts/2025/09/15/samsung-870-qvo/media/S5STNF0R407424M.txt">S5STNF0R407424M</a></li>
<li><a href="/posts/2025/09/15/samsung-870-qvo/media/S5STNF0R614596K.txt">S5STNF0R614596K</a></li>
<li><a href="/posts/2025/09/15/samsung-870-qvo/media/S5STNF0R614601K.txt">S5STNF0R614601K</a></li>
</ul>
]]></content:encoded></item><item><title>Those cheap AliExpress 18650 Li-ion cell power bank enclosures suck, actually</title><link>https://ounapuu.ee/posts/2025/08/18/cheap-power-banks-suck/</link><pubDate>Mon, 18 Aug 2025 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/08/18/cheap-power-banks-suck/</guid><description>I tried out three different 18650 Li-ion battery bank enclosures that I ordered for very cheap and ended up throwing them all out, here's why.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/08/18/cheap-power-banks-suck/media/cover_hu_4d01c38f2acd893b.jpg" width="1200" height="630" alt="Those cheap AliExpress 18650 Li-ion cell power bank enclosures suck, actually" /><p>I had a few old ThinkPad batteries lying around. They were big, bulky and not holding much of a charge. Inside those
were standard 18650 Li-ion battery cells.</p>
<p>I have two <a href="/posts/2023/03/03/tomo-m4-powerbank/">TOMO M4 power banks</a> around, and they are fantastic for reusing these
old 18650 battery cells inside them. You can even mix and match cells without a worry because they are individually
addressed, meaning that any issues with battery charge levels and voltages differing between cells are not a concern.
Unfortunately the TOMO M4 lacks modern features, such as USB-C ports and USB-C PD outputs at higher voltages and
currents, which makes it less useful and convenient in 2025. I haven&rsquo;t found any newer designs from them as well that
are just as cool.</p>
<p>I still wanted to reuse those 18650 cells, so I went to AliExpress and bought some 18650 battery enclosures for testing.
One holds 8 cells, another one 10 cells, and the largest one could fit 20 cells inside it.</p>









<figure class="center">
  <a href="/posts/2025/08/18/cheap-power-banks-suck/media/back-0.jpg">
    <img src="/posts/2025/08/18/cheap-power-banks-suck/media/back-0_hu_2785a58d97b51729.webp"
     width="751"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="The backside of the first power bank enclosure.">

  </a>
  <figcaption class="center">The backside of the first power bank enclosure.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/08/18/cheap-power-banks-suck/media/back-1.jpg">
    <img src="/posts/2025/08/18/cheap-power-banks-suck/media/back-1_hu_c51ce1e0f817288c.webp"
     width="751"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="The backside of the other one.">

  </a>
  <figcaption class="center">The backside of the other one.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/08/18/cheap-power-banks-suck/media/ports.jpg">
    <img src="/posts/2025/08/18/cheap-power-banks-suck/media/ports_hu_258cf69aa09b3406.webp"
     width="980"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="The port selection. USB-C works as both an input and output port.">

  </a>
  <figcaption class="center">The port selection. USB-C works as both an input and output port.</figcaption>
</figure>

<p>Unfortunately, they all suck and are likely a huge fire hazard in the wrong hands.</p>
<p>For the 8-cell variant, I used newly bought 18650 Li-ion cells that were charged up to the same level. This battery
enclosure worked quite well, until it didn&rsquo;t. For whatever reason, the enclosure could not charge itself and other
devices at the same time.</p>
<p>With the 10-cell variant, I used two different batches of used 18650 Li-ion cells from old ThinkPad batteries, charging
them up first. That one worked fine, until it also failed in weird ways. It got quite hot during charging/discharging
cycles, and eventually the segment display that&rsquo;s responsible for displaying the charge level stopped showing certain
segments. At that point I lost trust in that enclosure, too.</p>
<p>I had the most fun with the 20-cell battery enclosure. My first fuck-up involved using two old battery cells with
different charge levels, which resulted in some magic smoke coming out of the PCB of the enclosure itself. Somehow that
didn&rsquo;t break the battery bank enclosure, so I crammed 20 charged up used and mixed 18650 Li-ion cells in it and started
charging and discharging it. The batteries got quite hot, likely around 50-70°C based on the temperature readings of my
hand.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> At that point I realized I was playing with fire and stopped.</p>
<p>The USB-C PD behaviour was different on all power banks. Some were fine with powering a ThinkPad laptop with the
appropriate cable, some were flaky with setting the power levels, and some were just useless with certain cable or
device combinations.</p>
<p>The battery banks rely on a very simple arrangement: the 18650 Li-ion cells are connected in parallel, and
the resulting 3.7-4.2V is then boosted up for the appropriate voltage on the control board. This carries risks: if you
insert two or more Li-ion cells with different voltages, then one will start charging the others to bring the cells to
the same voltage, and that can become uncontrolled and result in a cell overheating and/or exploding. It&rsquo;s also a
horrible idea to mix and match used cells of different capacities and wear levels as they will charge and discharge at
different rates.</p>
<p>In my experience, a cheap DIY power bank enclosure also carries the risk of attracting attention at an airport security
check. After learning how bad these can be, that is an entirely justified suspicion.</p>
<p>I ended up throwing all the battery bank enclosures out, the hardware failures and issues made me too concerned about
one of these starting a fire. I like controlled fires, but the uncontrolled ones are really not my cup of tea.</p>
<p>If you know of a 18650 Li-ion cell battery bank enclosure that works like the TOMO M4 but has modern features (USB-C
port, USB-PD, can charge laptops etc.) then please do reach out to me as I&rsquo;d love to test one out. You can find the
contact details below the post.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>50-55°C feels very hot to the touch, so it&rsquo;s a good rule of thumb (no pun intended) for determining the minimum
temperature of a hot surface by hand. Disclaimer: not physics advice.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>Lenovo ThinkCentre M900 Tiny: how does it fare as a home server?</title><link>https://ounapuu.ee/posts/2025/06/06/thinkcentre-m900-tiny/</link><pubDate>Fri, 06 Jun 2025 11:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/06/06/thinkcentre-m900-tiny/</guid><description>I was itching for a new project, so I got one.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/06/06/thinkcentre-m900-tiny/media/cover_hu_32af048ce8cd1fbc.jpg" width="1200" height="630" alt="Lenovo ThinkCentre M900 Tiny: how does it fare as a home server?" /><p>My evenings of absent-minded local auction site scrolling<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> paid off: I now own
a <a href="https://www.lenovo.com/gb/en/p/desktops/thinkcentre/m-series-tiny/m900-tiny/11tc1mtm900">Lenovo ThinkCentre M900 Tiny.</a></p>
<p>It&rsquo;s relatively old, being manufactured in 2016<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>, but it&rsquo;s tiny and has a lot of useful life left in it.</p>
<p><a href="https://www.servethehome.com/lenovo-thinkcentre-m900-tiny-project-tinyminimicro-guide/">It&rsquo;s also featured in the TinyMiniMicro series by ServeTheHome.</a></p>
<p>I managed to get it for 60 EUR plus about 4 EUR shipping, and it comes with solid specifications:</p>
<ul>
<li>CPU: Intel i5-6500T</li>
<li>RAM: 16GB DDR4</li>
<li>Storage: 256GB SSD</li>
<li>Power adapter included</li>
</ul>
<p>The price is good compared to similar auctions, but was it worth it?</p>
<p>Yes, yes it was.</p>
<p>I have been running <a href="/posts/2024/10/16/third-times-the-charm/">a ThinkPad T430 as a server for a while now,</a> since
October 2024. It served me well in that role and would&rsquo;ve served me for even longer if I wanted to, but I had an itch
for a project that didn&rsquo;t involve renovating an apartment.<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup></p>









<figure class="center">
  <a href="/posts/2025/06/06/thinkcentre-m900-tiny/media/testing-setup.jpg">
    <img src="/posts/2025/06/06/thinkcentre-m900-tiny/media/testing-setup_hu_ce25c7c29fee65a9.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="When you are in the middle of renovating your living room, but you really want to get on with the server migration.">

  </a>
  <figcaption class="center">When you are in the middle of renovating your living room, but you really want to get on with the server migration.</figcaption>
</figure>

<h2 id="power-usage">
  <a class="heading-anchor" href="#power-usage">Power usage<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>One of my main curiosities was around the power usage. Will this machine beat the laptop in terms of efficiency while
idling and running normal home server workloads? Yes, yes it does.</p>
<p>While booting into Windows 11 and calming down a bit, the lowest idle power numbers I saw were around 8 W. This
concludes the testing on Windows.</p>
<p>On Linux (Fedora Server 42), the idle power usage was around 6.5 W to 7 W. After running <code>powertop --auto-tune</code>, I ended
up getting that down to 6.1 W - 6.5 W. This is much lower compared to the numbers that ServeTheHome got, which were
around 11-13 W (120V circuit). My measurements are made in Europe, Estonia, where we have 240V circuits.</p>









<figure class="center">
  <a href="/posts/2025/06/06/thinkcentre-m900-tiny/media/idle-power-linux.jpg">
    <img src="/posts/2025/06/06/thinkcentre-m900-tiny/media/idle-power-linux_hu_b096580227905f71.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="Idle power from the wall on a clean Fedora Server 42 installation (fully headless).">

  </a>
  <figcaption class="center">Idle power from the wall on a clean Fedora Server 42 installation (fully headless).</figcaption>
</figure>

<p>You may be able to find machines where the power usage is even
lower. <a href="https://louwrentius.com/the-raspberry-pi-5-is-no-match-for-a-tini-mini-micro-pc.html">Louwrentius mada an idle power comparison on an HP EliteDesk Mini G3 800</a>
where they measured it at 4 W. That might also be due to other factors in play, or differences in measurement tooling.</p>
<p>During normal home server operation with 5 SATA SSD-s connected (4 of them with USB-SATA adapters), I have observed
power consumption being around 11-15 W, with peaks around 40 W.
On a pure CPU load with <code>stress -c 8</code>, I saw power consumption being around 32 W. Formatting the internal SATA SSD added
5 W to that figure.</p>









<figure class="center">
  <a href="/posts/2025/06/06/thinkcentre-m900-tiny/media/power-usage.png">
    <img src="/posts/2025/06/06/thinkcentre-m900-tiny/media/power-usage_hu_638aa8d89c25cfaf.webp"
     width="957"
     height="877"
     loading="lazy"
     decoding="async"
     alt="Daily power consumption of my whole home server infrastructure after installing the new server.">

  </a>
  <figcaption class="center">Daily power consumption of my whole home server infrastructure after installing the new server.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/06/06/thinkcentre-m900-tiny/media/power-usage-active.png">
    <img src="/posts/2025/06/06/thinkcentre-m900-tiny/media/power-usage-active_hu_55918f1fb48345fe.webp"
     width="957"
     height="877"
     loading="lazy"
     decoding="async"
     alt="More accurate power usage numbers over 14 days.">

  </a>
  <figcaption class="center">More accurate power usage numbers over 14 days.</figcaption>
</figure>

<h2 id="usb-storage-are-you-crazy">
  <a class="heading-anchor" href="#usb-storage-are-you-crazy">USB storage, are you crazy?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Yes. But hear me out.</p>
<p>Back in 2021, <a href="/posts/2021/02/08/things-learned-while-self-hosting/">I wrote about USB storage being a very bad idea,</a>
especially on <a href="https://btrfs.readthedocs.io/en/latest/index.html">BTRFS.</a></p>
<p>I&rsquo;ve learned a lot over the years, and BTRFS has received continuous improvements as well.
In <a href="/posts/2024/10/16/third-times-the-charm/">my ThinkPad T430 home server setup,</a> I had two USB-connected SSD-s running
in <em><strong>RAID0</strong></em> for over half a year, and it was completely fine unless you accidentally bumped into the SSD-s.</p>
<p>USB-connected storage <a href="https://knowyourmeme.com/memes/this-is-fine">is fine</a> under the right circumstances:</p>
<ul>
<li>the cables are not damaged</li>
<li>the cables are not at a weird angle or twisted
<ul>
<li>I actually had issues with this point, my very cool and nice cable management resulted in one disk having
connectivity issues, which I fixed by relieving stress on the cables and routing them differently</li>
</ul>
</li>
<li>the connected PC does not have chronic overheating issues</li>
<li>the whole setup is out of the reach of cats, dogs, children and
clumsy <a href="https://www.jeffgeerling.com/blog/2022/cosplaying-sysadmin">sysadmin cosplayers</a></li>
<li>the USB-SATA adapters pass through the device ID and S.M.A.R.T information to the host
<ul>
<li>the device ID part especially is key to avoiding issues with various filesystems (especially ZFS) and storage pool
setups</li>
<li><a href="https://icybox.de/product/externe_speicherloesungen/IB-223U3a-B">the ICY BOX IB-223U3a-B is a good option that I have personally been very happy with</a>,
and it&rsquo;s what I&rsquo;m using in this server build</li>
<li>a lot of adapters (mine included) don&rsquo;t support running SSD TRIM commands to the drives, which might be a concern
<ul>
<li>has not been an issue for over half a year with those ICY BOX adapters, but it&rsquo;s something to keep in mind</li>
</ul>
</li>
</ul>
</li>
<li>you are not using an SBC as the home server
<ul>
<li>even a Raspberry Pi 4 can barely handle one USB-powered SSD
<ul>
<li>not an issue if you use an externally powered drive, or an USB DAS</li>
</ul>
</li>
</ul>
</li>
</ul>









<figure class="center">
  <a href="/posts/2025/06/06/thinkcentre-m900-tiny/media/server-setup-v1-0.jpg">
    <img src="/posts/2025/06/06/thinkcentre-m900-tiny/media/server-setup-v1-0_hu_e535336c8ddf5c4a.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="The initial version of the new setup.">

  </a>
  <figcaption class="center">The initial version of the new setup.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/06/06/thinkcentre-m900-tiny/media/server-setup-v1-1.jpg">
    <img src="/posts/2025/06/06/thinkcentre-m900-tiny/media/server-setup-v1-1_hu_cc106245ab989434.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="I liked how the drives fit on top of the PC here.">

  </a>
  <figcaption class="center">I liked how the drives fit on top of the PC here.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/06/06/thinkcentre-m900-tiny/media/server-setup-v1-2.jpg">
    <img src="/posts/2025/06/06/thinkcentre-m900-tiny/media/server-setup-v1-2_hu_731027e3582a97e6.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="Another angle on the new setup.">

  </a>
  <figcaption class="center">Another angle on the new setup.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/06/06/thinkcentre-m900-tiny/media/server-setup-v1-3.jpg">
    <img src="/posts/2025/06/06/thinkcentre-m900-tiny/media/server-setup-v1-3_hu_49bebb6bec9f0435.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="Unfortunately, this mess of cables did not work out at all, with one drive being unstable.">

  </a>
  <figcaption class="center">Unfortunately, this mess of cables did not work out at all, with one drive being unstable.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/06/06/thinkcentre-m900-tiny/media/server-setup-v2-0.jpg">
    <img src="/posts/2025/06/06/thinkcentre-m900-tiny/media/server-setup-v2-0_hu_6685bd5f66709a2e.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="Second version of the setup. This one works very well.">

  </a>
  <figcaption class="center">Second version of the setup. This one works very well.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/06/06/thinkcentre-m900-tiny/media/server-setup-v2-1.jpg">
    <img src="/posts/2025/06/06/thinkcentre-m900-tiny/media/server-setup-v2-1_hu_4c0691d4a55c87f0.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="The cables are not that neatly organized, but there is much less stress on the connectors, ensuring a more stable
connection.">

  </a>
  <figcaption class="center">The cables are not that neatly organized, but there is much less stress on the connectors, ensuring a more stable
connection.</figcaption>
</figure>

<p>After a full BTRFS scrub and a few days of running, it seems fine. Plus it looks sick as hell with the identical drives
stacked on top. All that&rsquo;s missing are labels specifying which drive is which, but I&rsquo;m sure that I&rsquo;ll get to that
someday, hopefully before a drive failure happens.</p>
<p>In a way, this type of setup best represents what a novice home server enthusiast may end up with: a tiny,
power-efficient PC with a bunch of affordable drives connected.</p>
<h2 id="less-insane-storage-ideas-for-a-tiny-pc">
  <a class="heading-anchor" href="#less-insane-storage-ideas-for-a-tiny-pc">Less insane storage ideas for a tiny PC<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>There are alternative options for handling storage on a tiny 1 liter PC, but they have some downsides that I don&rsquo;t want
to be dealing with right now.</p>
<p>An USB DAS allows you to handle many drives with ease, but they are also damn expensive. If you pick wrong, you might
also end up with one
where the USB-SATA chip craps out under high load, which will momentarily drop all the drives, leaving you with a
massive headache to deal with. Cheaper USB-SATA docks are more prone to this, but I cannot confirm or deny if more
expensive options have the same issue. Running individual drives sidesteps this issue and moves any potential issues to
the host USB controller level.</p>
<p>There is also a distinct lack of solutions that are designed around 2.5&quot; drives only. Most of them are designed around
massive and power-hungry 3.5&quot; drives. I just want to run my 4 existing SATA SSD-s until they crap out completely.</p>
<p>An additional box that does stuff generally adds to the overall power consumption of the setup as well, which I am not a
big fan of. Lowering the power consumption of the setup was the whole point!</p>
<p>I can&rsquo;t rule out testing USB DAS solutions in the future as they do seem handy for adding storage to tiny PC-s and
laptops with ease, but for now I prefer going the individually connected drives route, especially because I don&rsquo;t feel
like replacing my existing drives, they still have about 94% SSD health in them after 3-4 years of use, and new drives
are <em>expensive</em>.</p>
<p>Or you could go full jank
and <a href="https://www.aliexpress.com/item/1005008295170254.html?spm=a2g0o.productlist.main.7.364fgMWRgMWR9z&amp;algo_pvid=4f0d33b6-081c-4883-8ce0-336041cc6652&amp;algo_exp_id=4f0d33b6-081c-4883-8ce0-336041cc6652-6&amp;pdp_ext_f=%7B%22order%22%3A%22116%22%2C%22eval%22%3A%221%22%7D&amp;pdp_npi=4%40dis%21EUR%2156.97%2119.37%21%21%21456.87%21155.34%21%40211b617b17491928533492865e9738%2112000044523063505%21sea%21EE%211639637618%21X&amp;curPageLogUid=uT89CAEm8INP&amp;utparam-url=scene%3Asearch%7Cquery_from%3A">use that one free NVMe slot in the tiny PC to add more SATA ports</a>
or <a href="https://www.aliexpress.com/item/1005008182661050.html?spm=a2g0o.productlist.main.7.3d7d259d5fHEIC&amp;algo_pvid=ff1d4e1e-74a8-4b65-955d-178a3eddcc71&amp;algo_exp_id=ff1d4e1e-74a8-4b65-955d-178a3eddcc71-6&amp;pdp_ext_f=%7B%22order%22%3A%2262%22%2C%22eval%22%3A%221%22%7D&amp;pdp_npi=4%40dis%21EUR%216.80%216.80%21%21%2154.52%2154.52%21%40211b61bb17491929092998623e03e6%2112000044142094508%21sea%21EE%211639637618%21X&amp;curPageLogUid=1ZzPPfnImgoi&amp;utparam-url=scene%3Asearch%7Cquery_from%3A">break out to other devices,</a>
such
as <a href="https://www.aliexpress.com/item/1005006533280553.html?spm=a2g0o.productlist.main.1.47a972a263M66x&amp;algo_pvid=02822dc1-fcb1-4b65-bb91-d022570c6388&amp;algo_exp_id=02822dc1-fcb1-4b65-bb91-d022570c6388-0&amp;pdp_ext_f=%7B%22order%22%3A%22175%22%2C%22eval%22%3A%221%22%7D&amp;pdp_npi=4%40dis%21EUR%2130.20%2128.98%21%21%21242.22%21232.43%21%40211b819117491929449653062e5f37%2112000037555851080%21sea%21EE%211639637618%21X&amp;curPageLogUid=J8ShoCWeAb85&amp;utparam-url=scene%3Asearch%7Cquery_from%3A">a PCIe HBA,</a>
and introduce a lot of clutter to the setup with an additional power supply, cables and
drives.</p>
<p>Or use 3.5&quot; external hard drives with separate power
adapters. <a href="/posts/2021/04/02/tech-tip-1/">It&rsquo;s what I actually tried out back in 2021,</a> but I had some major annoyances
with the noise.</p>
<h2 id="miscellaneous-notes">
  <a class="heading-anchor" href="#miscellaneous-notes">Miscellaneous notes<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Here are some notes on everything else that I&rsquo;ve noticed about this machine.</p>
<p>The PC is quite efficient as demonstrated by the power consumption numbers, and as a result it runs very cool, idling
around 30-35 °C in a ~22-24 °C environment. Under a heavy load, the CPU temperatures creep up to 65-70 °C, which is
perfectly acceptable. The fan does come on at higher load and it&rsquo;s definitely audible, but in my case it runs in a
ventilated closet, so I don&rsquo;t worry about that at all.</p>
<p>The CPU (Intel i5-6500T) is plenty fast for all sorts of home server workloads with its 4 CPU cores and clock speeds of
2.7-2.8 GHz under load.</p>
<p>The UEFI settings offered a few interesting options that I decided to change, the rest are set to default.</p>
<p>There is an option to enable an additional C-state for even better power savings.</p>









<figure class="center">
  <a href="/posts/2025/06/06/thinkcentre-m900-tiny/media/c-states.jpg">
    <img src="/posts/2025/06/06/thinkcentre-m900-tiny/media/c-states_hu_4279997e04c8a1c1.webp"
     width="1000"
     height="439"
     loading="lazy"
     decoding="async"
     alt="C-state options in UEFI settings.">

  </a>
  <figcaption class="center">C-state options in UEFI settings.</figcaption>
</figure>

<p>For home server workloads, it was nice to see the setting to allow you to boot the PC without a keyboard being attached,
found under &ldquo;Keyboardless operation&rdquo; setting. I guess that in some corporate environments disconnected keyboards are
such a common helpdesk issue that it necessitates having this option around.</p>









<figure class="center">
  <a href="/posts/2025/06/06/thinkcentre-m900-tiny/media/keyboardless-operation.jpg">
    <img src="/posts/2025/06/06/thinkcentre-m900-tiny/media/keyboardless-operation_hu_592446f591d2456f.webp"
     width="1000"
     height="427"
     loading="lazy"
     decoding="async"
     alt="Keyboardless operation setting, enabled by default.">

  </a>
  <figcaption class="center">Keyboardless operation setting, enabled by default.</figcaption>
</figure>

<h2 id="closing-thoughts">
  <a class="heading-anchor" href="#closing-thoughts">Closing thoughts<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I just like these tiny PC boxes a lot. They are tiny, fast and have a very solid construction, which makes them feel
very premium in your hands. They are also perfectly usable, extensible and can be an absolute bargain at the right
price.</p>
<p>With solid power consumption figures that
are <a href="https://www.jeffgeerling.com/blog/2024/new-2gb-pi-5-has-33-smaller-die-30-idle-power-savings">only a few watts off of a Raspberry Pi 5</a>,
it might make more sense to get a TinyMiniMicro machine for your next home server. I&rsquo;m definitely very happy with mine.</p>
<h2 id="2025-06-08-update">
  <a class="heading-anchor" href="#2025-06-08-update">2025-06-08 update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The USB storage idea was a bit <em>too</em> insane. I saw sporadic errors on random drives, suggesting that there is an issue
with the PC USB ports under long-term use. It wasn&rsquo;t noticeable at all until I explicitly looked at the kernel logs,
just to be safe. Good call on my part.</p>
<p>As a result, I have switched back to <a href="/posts/2024/10/16/third-times-the-charm/">my trusty ThinkPad T430.</a></p>
<p>Some logs that demonstrate the issues, collected using <code>journalctl -o short-precise -k -p 4</code>:</p>
<pre tabindex="0"><code>Jun 08 01:33:32.318310 lilnas kernel: usb 2-5: cmd cmplt err -2
Jun 08 01:33:32.318603 lilnas kernel: usb 2-5: cmd cmplt err -2
Jun 08 01:33:32.320109 lilnas kernel: I/O error, dev sdd, sector 1825796880 op 0x0:(READ) flags 0x80700 &gt;
Jun 08 01:33:32.320775 lilnas kernel: I/O error, dev sdd, sector 1825795856 op 0x0:(READ) flags 0x84700 &gt;
Jun 08 01:33:32.321444 lilnas kernel: I/O error, dev sdd, sector 1825794832 op 0x0:(READ) flags 0x84700 &gt;
Jun 08 01:33:32.322078 lilnas kernel: I/O error, dev sdd, sector 1825793808 op 0x0:(READ) flags 0x84700 &gt;
Jun 08 01:33:32.322746 lilnas kernel: I/O error, dev sdd, sector 1825792784 op 0x0:(READ) flags 0x84700 &gt;
Jun 08 01:33:32.323409 lilnas kernel: I/O error, dev sdd, sector 1825791760 op 0x0:(READ) flags 0x84700 &gt;
Jun 08 01:33:32.324049 lilnas kernel: I/O error, dev sdd, sector 1825790736 op 0x0:(READ) flags 0x84700 &gt;
Jun 08 01:33:32.324706 lilnas kernel: I/O error, dev sdd, sector 1825789712 op 0x0:(READ) flags 0x84700 &gt;
Jun 08 01:33:32.324736 lilnas kernel: btrfs_repair_io_failure: 982 callbacks suppressed
Jun 08 01:41:38.201307 lilnas kernel: usb 2-5: cmd cmplt err -2
Jun 08 01:41:38.201614 lilnas kernel: usb 2-5: cmd cmplt err -2
Jun 08 01:41:38.201892 lilnas kernel: usb 2-5: cmd cmplt err -2
Jun 08 01:41:38.202158 lilnas kernel: usb 2-5: cmd cmplt err -2
Jun 08 01:41:38.202529 lilnas kernel: usb 2-5: cmd cmplt err -2
Jun 08 01:41:38.202814 lilnas kernel: usb 2-5: cmd cmplt err -2
Jun 08 08:33:15.572984 lilnas kernel: usb 2-4: cmd cmplt err -2
</code></pre><div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>well, at least it beats doom-scrolling social media.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>yeah, I don&rsquo;t like being reminded of being old, too.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>there are a lot of similarities between construction/renovation work and software development, but that&rsquo;s a story
for another time.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>Fairphone Fairbuds XL review: admirable goals, awful product</title><link>https://ounapuu.ee/posts/2025/03/17/fairbuds-xl-review/</link><pubDate>Mon, 17 Mar 2025 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/03/17/fairbuds-xl-review/</guid><description>I gave the Fairphone Fairbuds XL a go to see how well they stack up in real life. Unfortunately, not that well.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/03/17/fairbuds-xl-review/media/cover_hu_c71edcb6616a7280.jpg" width="1200" height="630" alt="Fairphone Fairbuds XL review: admirable goals, awful product" /><p>I bought the <a href="https://shop.fairphone.com/fairbuds-xl">Fairphone Fairbuds XL</a> with my own money at a recent sale for
186.75 EUR, plus 15 EUR for shipping to Estonia. The normal price for these headphones is 239 EUR.</p>
<p>This post is <em><strong>not</strong></em> sponsored.</p>
<p>I admire what Fairphone wants to achieve, even going as far
as <a href="/posts/2024/03/06/fairphone5/">getting the Fairphone 5 as a replacement for my iPhone X.</a></p>
<p>Failing to repair my current headphones, I went ahead and decided to get the Fairphone Fairbuds XL as they also
advertise the active noise-cancelling feature, and I like the Fairphone brand.</p>
<p><strong>Disclaimer:</strong> this review is going to be entirely subjective and based on my opinions and experiences with other audio
products in the past. I also have tinnitus.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>I consulted <a href="https://www.rtings.com/headphones/reviews/fairphone/fairbuds-xl-wireless">rtings.com review</a> before
purchasing the product to get an idea about what to expect as a consumer.</p>









<figure class="center">
  <a href="/posts/2025/03/17/fairbuds-xl-review/media/headphones-folded.jpg">
    <img src="/posts/2025/03/17/fairbuds-xl-review/media/headphones-folded_hu_ed2fbb45ec3e7f37.webp"
     width="1000"
     height="750"
     loading="lazy"
     decoding="async"
     alt="Fairphone Fairbuds XL, folded">

  </a>
  <figcaption class="center">Fairphone Fairbuds XL, folded</figcaption>
</figure>

<h2 id="the-comparison-headphones">
  <a class="heading-anchor" href="#the-comparison-headphones">The comparison headphones<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The main point of comparison for this review is going to be
the <a href="https://www.sony.ee/electronics/headband-headphones/wh-1000xm3">Sony WH-1000XM3,</a> which are premium high-end
wireless Bluetooth headphones, with active noise-cancelling (before that feature broke). These headphones retailed at
a higher price during 2020 (about 300-400 EUR) so they are technically a tier above the Fairbuds XL, but given that its
successsor, the
WH-1000XM4, <a href="https://arvutitark.ee/arvutid-ja-lisad/heliseadmed/korvaklapid/wh-1000xm4-black-noise-canceling-1040441">can be bought for 239 EUR new</a>
(and often about 200-ish EUR on sale!), then it is a fair comparison in my view.</p>
<p>After I replaced the ear cushions on my Sony WH-1000XM3 headset, the active noise-cancelling feature started being flaky
(popping and loud noises occurring with NC on). No amount of cleaning or calibrating fixed it, and even the authorized
repair shop could not do anything about it. I
diagnosed the issue to be with the internal noise-cancelling microphones and found that these failing is a very common
issue for these headsets, even for newer versions of it.</p>
<p>I am unable to compare the active noise-cancelling performance side-by-side, but I can say that the NC performance on
the Sony
WH-1000XM3 was simply excellent when it <em>did</em> work, no doubt about it.</p>
<h2 id="the-fairphone-shop-experience">
  <a class="heading-anchor" href="#the-fairphone-shop-experience">The Fairphone shop experience<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The first issue I had with the product was actually buying it. For some reason, the form would not accept my legal name
which has letter &ldquo;Õ&rdquo; in it, a common vowel in Estonia. Knowing how poorly Javascript-based client-side validation can be
built, I pulled a <em>pro gamer move</em> and copy-pasted my name into the form, which bypassed the faulty check
altogether.</p>
<p>Similar issue occurred with the address field, as we also have the letter &ldquo;Ä&rdquo; ( and &ldquo;Ö&rdquo;, &ldquo;Ü&rdquo;, for that matter).</p>
<h2 id="the-name">
  <a class="heading-anchor" href="#the-name">The name<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I can understand why Fairphone went with the name &ldquo;Fairbuds XL&rdquo;, it kind of made sense
in <a href="https://shop.fairphone.com/audio">their audio product line,</a>
and <a href="https://www.apple.com/airpods-max/">Apple set a precedent with AirPods Max.</a></p>
<p>However, there is such a big missed opportunity here: they could&rsquo;ve called the product&hellip;</p>
<p><strong><em>Fairphones.</em></strong></p>
<p>Yes, it would cause <em>some</em> confusion
about <a href="https://shop.fairphone.com/smartphones">their other product line, which is the Fairphone</a>, but at least I would
find the name more amusing.</p>
<h2 id="packaging">
  <a class="heading-anchor" href="#packaging">Packaging<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The packaging for the headphones is quite similar to what you&rsquo;d get with the Fairphone 5: lots of cardboard and
seemingly no plastic or otherwise problematic materials.</p>









<figure class="center">
  <a href="/posts/2025/03/17/fairbuds-xl-review/media/packaging-0.jpg">
    <img src="/posts/2025/03/17/fairbuds-xl-review/media/packaging-0_hu_ec27a30119dff310.webp"
     width="750"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="The packaging.">

  </a>
  <figcaption class="center">The packaging.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/03/17/fairbuds-xl-review/media/packaging-1.jpg">
    <img src="/posts/2025/03/17/fairbuds-xl-review/media/packaging-1_hu_3c77298d678e7ded.webp"
     width="750"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="Change is on your head, perhaps?">

  </a>
  <figcaption class="center">Change is on your head, perhaps?</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/03/17/fairbuds-xl-review/media/packaging-2.jpg">
    <img src="/posts/2025/03/17/fairbuds-xl-review/media/packaging-2_hu_31db8665e1e66e1f.webp"
     width="750"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="The headphones rest securely in the cardboard box.">

  </a>
  <figcaption class="center">The headphones rest securely in the cardboard box.</figcaption>
</figure>

<p>Aside from the headphones themselves, you also get <a href="https://youtu.be/yVrVTsXhC1A">a nice egg bag,</a> meant to protect your
headphones when travelling with them.</p>









<figure class="center">
  <a href="/posts/2025/03/17/fairbuds-xl-review/media/egg-bag.jpg">
    <img src="/posts/2025/03/17/fairbuds-xl-review/media/egg-bag_hu_2b28735f92d9a5a1.webp"
     width="1000"
     height="750"
     loading="lazy"
     decoding="async"
     alt="Egg bag.">

  </a>
  <figcaption class="center">Egg bag.</figcaption>
</figure>

<p>It&rsquo;s okay, but nothing special, and it won&rsquo;t protect your headphones from physical damage should they fall or get
thrown around in a backpack. The Sony headphones come with a solid hardcase, which have done a fantastic job of
protecting the headphones over the last 4 years. Longevity of a device depends both on repairability and durability,
which is why a hard case would benefit the Fairbuds XL a lot.</p>
<h2 id="factory-defect">
  <a class="heading-anchor" href="#factory-defect">Factory defect<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>My experience with the Fairbuds XL were off to a rocky start.</p>
<p>I noticed that the USB-C cable that connects both sides of the headphones was inserted incorrectly. The headphones
worked fine, but you could feel the flat USB-C cable being twisted inside the headband. The fix to this was to carefully
push the headband back, disconnect the USB-C cable from the headphones, flip the cable around and reconnect it.</p>









<figure class="center">
  <a href="/posts/2025/03/17/fairbuds-xl-review/media/defect.jpg">
    <img src="/posts/2025/03/17/fairbuds-xl-review/media/defect_hu_f04ca5ae1612461a.webp"
     width="750"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="The USB-C cable being twisted inside the headphones.">

  </a>
  <figcaption class="center">The USB-C cable being twisted inside the headphones.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/03/17/fairbuds-xl-review/media/fixing-defect.jpg">
    <img src="/posts/2025/03/17/fairbuds-xl-review/media/fixing-defect_hu_6804b792abf7b278.webp"
     width="750"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="At least the repairability aspect came in handy.">

  </a>
  <figcaption class="center">At least the repairability aspect came in handy.</figcaption>
</figure>

<p>Not a good first impression, but at least the fix was simple enough.</p>
<h2 id="fit-and-feel">
  <a class="heading-anchor" href="#fit-and-feel">Fit and feel<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The Fairbuds XL are not as comfortable as the reference headphones. The ear cushions and headrest are quite hard and not
as soft as on the Sony WH-1000XM3. If you get the fit just right, then you probably won&rsquo;t have issues with wearing these
for a few hours at the time, but I found myself adjusting these often to stop them from hurting my ears and head even
during a short test.</p>
<p>The ear cups lack any kind of swiveling, which is likely contributing to the comparatively poor fit. Our ears are angled
ever-so-slightly forwards, and the Sony WH-1000XM3 feels so much better on the ears as a result of its swiveling aspect.</p>
<p>I also noticed that you can hear some components inside the headphones rattling when moving your head. This noise is
very noticeable even during music playback and you don&rsquo;t need to move your head a lot to hear that rattling. In my view,
<strong>this is a serious defect in the product.</strong></p>
<p>When the headphones are folded in, the USB-C cable gets bent in the process and gets forced against one of the ear
cushions. I suspect that within months or years of use, either the cable will fail or the ear cushion gets a permanent
imprint of the USB-C cable position.</p>









<figure class="center">
  <a href="/posts/2025/03/17/fairbuds-xl-review/media/possible-design-flaw.jpg">
    <img src="/posts/2025/03/17/fairbuds-xl-review/media/possible-design-flaw_hu_b4abcd7b1cc98861.webp"
     width="750"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="I&#39;m not sure the designers intended for this to happen.">

  </a>
  <figcaption class="center">I&#39;m not sure the designers intended for this to happen.</figcaption>
</figure>

<h2 id="the-sound">
  <a class="heading-anchor" href="#the-sound">The sound<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I&rsquo;m not impressed with the sound that the Fairbuds XL produce. They are not in the same class as the Sony WH-1000XM3,
with the default equalizer sounding incredibly bland. Most instruments and sounds are bland and not as clear. That&rsquo;s the
best I can describe it as.</p>









<figure class="center">
  <a href="/posts/2025/03/17/fairbuds-xl-review/media/marketing.png">
    <img src="/posts/2025/03/17/fairbuds-xl-review/media/marketing_hu_f9112dc39a9e6d93.webp"
     width="535"
     height="206"
     loading="lazy"
     decoding="async"
     alt="Premium sound? Not so sure about that.">

  </a>
  <figcaption class="center">Premium sound? Not so sure about that.</figcaption>
</figure>

<p><a href="https://play.google.com/store/apps/details?id=com.fairphone.android.fairbudsapp&amp;hl=en">The Fairbuds app</a> can be used to
tune the sound via the equalizer, and out of all the presets I&rsquo;ve found &ldquo;Boston&rdquo; to be the most pleasant one to use.
Unfortunately the UI does not show how the presets customize the values in the equalizer, which makes tweaking a preset
all that much harder.</p>
<p>Compared to the Sony WH-1000XM3, I miss the cripsy sound and the all-encompassing bass, it can really bring all the
satisfying details out. Given that I had used the Sony headphones for almost 5 years at this point may also just mean
that I had gotten used to how it sounds.</p>
<h2 id="active-noise-cancelling">
  <a class="heading-anchor" href="#active-noise-cancelling">Active noise-cancelling<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The active noise-cancelling performance is nowhere near the Sony WH-1000XM3-s. The effect is very minor, and you&rsquo;ll be
hearing  most of the surrounding sounds.</p>
<p>Touching the active noise-cancelling microphones on the sides of the headphones will also make a loud sound inside the
speaker,
and walking around in a room will result in the headphones making wind noises. Because of this, <strong>I consider the
active noise-cancelling functionality to be functionally broken.</strong></p>
<h2 id="microphone-quality">
  <a class="heading-anchor" href="#microphone-quality">Microphone quality<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I used the Fairbuds XL in a work call, and based on feedback from other attendees, the microphone quality over Bluetooth
can be categorized as barely passable, getting a solid 2 points out of 5.</p>
<p>To be fair, Bluetooth microphone quality is also not great on the Sony WH-1000XM3-s, but compared to the Fairphone
Fairbuds XL, they are still subjectively better.</p>
<h2 id="fairbuds-app">
  <a class="heading-anchor" href="#fairbuds-app">Fairbuds app<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The Fairbuds app is very simple, and you&rsquo;d mainly want to use it for setting the equalizer settings and upgrading the
firmware. The rest of the functionality seems to be a bunch of links to Fairphone articles and guides.</p>
<p>The first time I installed the app, it told me that a firmware upgrade version V90 is available. During the first
attempt, the progress bar stopped.</p>









<figure class="center">
  <a href="/posts/2025/03/17/fairbuds-xl-review/media/firmware-upgrade.png">
    <img src="/posts/2025/03/17/fairbuds-xl-review/media/firmware-upgrade_hu_e166c82c2415ff73.webp"
     width="453"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="It got stuck.">

  </a>
  <figcaption class="center">It got stuck.</figcaption>
</figure>

<p>Second attempt: it almost reached the end and did not complain about a firmware upgrade being available after that.</p>
<p>Third attempt came after I had reinstalled the app. And there it was, the version V90 update, again. This time it got
stuck at 1%.</p>
<p>I&rsquo;m probably still on the older version of the firmware, but I honestly can&rsquo;t tell.</p>
<h2 id="bluetooth-multi-device-connecting">
  <a class="heading-anchor" href="#bluetooth-multi-device-connecting">Bluetooth multi-device connecting<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This is a feature that I didn&rsquo;t know I needed in my life.</p>
<p>With the reference Sony WH-1000XM3-s, whenever I wanted to switch where I listen to music from, I had to disconnect from
my phone and then reconnect on the desktop, which was an annoying and manual process.</p>
<p>With the Fairbuds XL, I can connect the headphones to both my laptop and phone and play media wherever, the headphones
will switch to whichever device I&rsquo;m actually using! This, too, has its quirks, and there might be a small delay when
playing media on the other device, but I&rsquo;ve grown so accustomed to using this feature now and can&rsquo;t imagine myself going
back to using anything else.</p>
<p>This feature is not unique to the Fairbuds XL as other modern wireless headphones are also likely to boast this feature,
but this is the first time I&rsquo;ve had the opportunity to try this out myself. It&rsquo;s a tremendous quality of life
improvement for me.</p>
<p>However, this, too, is not perfect. If I have the headphones connected to my phone and laptop, and I change to headset
mode on the laptop for a meeting, then the playback on the phone will be butchered until I completely disconnect the
headphones from the laptop. This seems like a firmware issue to me.</p>
<h2 id="the-controls">
  <a class="heading-anchor" href="#the-controls">The controls<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The Fairbuds XL has one button and one joystick. The button controls the active noise-cancelling settings (NC on,
Ambient sound, NC off), plus the Bluetooth pairing mode.</p>
<p>The joystick is used to turn the device on, switch songs and control the volume, and likely some other settings that
relate to accepting calls and the like.</p>
<p>Coming from the Sony WH-1000XM3, I have to say that <em><strong>I absolutely LOVE having physical buttons again!</strong></em> It&rsquo;s so much
easier
to change the volume level, skip songs and start/stop playback with a physical button compared to the asinine touch
surface solution that Sony has going on.</p>
<p>The joystick is not perfect, skipping a song can be a little bit tricky due to how the joystick is positioned, you can&rsquo;t
always get a good handle due to your fingers hitting the rest of the headphone assembly. That&rsquo;s the only concern I have
with it. If the joystick was a little bit concave and larger, then that may make some of these actions easier for those
of us with modest/large thumbs.</p>
<p>The audio cue for skipping songs is a bit annoying and cannot seemingly be disabled. The sound effect resembles someone
hitting a golf ball with a very poor driver.</p>
<p>The ANC settings button is alright, but it&rsquo;s not possible to quickly cycle between the three modes, you will have to
fully listen to the nice lady speaking and then you can move on to the next setting. I wish that clicking the button in
rapid succession would skip through the modes faster.</p>
<h2 id="usb-c-port-functionality">
  <a class="heading-anchor" href="#usb-c-port-functionality">USB-C port functionality<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I was curious to see if the Fairbuds XL worked as normal headphones if I just connected them up to my PC using a USB-C
cable. To my surprise, they did! The audio quality was not as good as with Bluetooth, and the volume controls depended
on which virtual device you select in your operating system. The Sony WH-1000XM3 do not work like this, the USB-C port
is for charging only as far as I&rsquo;ve tested, but it does have an actual 3.5mm port for wired use.</p>
<p>When connected over Bluetooth and you connect a charging cable, the Fairbuds XL will pause momentarily and then continue
playback while charging the battery. This is incredibly handy for a wireless device, especially in situations where you
have an important meeting coming up and you&rsquo;re just about to run out of battery. The Sony WH-1000XM3 will simply
power off when you connect a charger cable, rendering them unusable while charging.</p>
<h2 id="annoying-issues">
  <a class="heading-anchor" href="#annoying-issues">Annoying issues<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>For some reason, whenever I charge my Fairbuds XL, they magically turn on again and I have to shut them off a second
time.</p>
<p>I&rsquo;m never quite sure if I&rsquo;ve managed to shut the headphones off. It does the jingle that indicates that it&rsquo;s powered
off, but then I come back to it later and I find that they&rsquo;re powered on again.</p>
<h2 id="customer-care-experience">
  <a class="heading-anchor" href="#customer-care-experience">Customer care experience<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I was so unhappy with the product that I tried out the refunding process for the Fairphone Fairbuds XL.</p>
<p>I ordered the Fairbuds XL on 2025-02-10 and I received them on 2025-02-14, shipped to Estonia. According
to <a href="https://www.fairphone.com/en/legal/fairphone-returns-policy/">Fairphone&rsquo;s own materials,</a>
I can return the headphones without any questions asked, assuming that my use of them matches what can be done at a
physical store.</p>
<blockquote>
<p>For Fairphone Products, including gift cards, you purchased on the Fairphone Webshop, you have a legal right to change
your mind within 14 days and receive a refund amounting to the purchase price of the products and the costs of
delivery
and return. You are entitled to cancel your purchase within fourteen (14) days from the day the products were
delivered
to you, without explanation and without any penalties.</p>
</blockquote>
<blockquote>
<p>In the case of a Cool-off, Fairphone may reduce the refund of the purchase price (including delivery costs) to reflect
any reduction in the value of the Products, if this has been caused by your handling them in a way which would not
normally be permitted in a shop. This means You are entitled to turn on and inspect Your purchased device to
familiarise
yourself with its properties and ensure that it is working correctly – comparable to the conditions that are permitted
within a shop.</p>
</blockquote>
<p>It took me almost 4 months to receive a refund from Fairphone, and even then it happened through a chargeback that I
initiated through my bank. During those 4 months, I also had to send the device back <em><strong>twice</strong></em> because of a processing
error on Fairphone&rsquo;s part. <a href="/posts/2025/06/17/fairphone-customer-care-experience/">I have detailed the full experience in this post.</a></p>
<p>Based on the experiences by others in the Fairphone community forum, it seems that unacceptably large delays in customer
service are the norm for Fairphone.</p>
<p>Fairphone, if you want to succeed as a company, you need to make sure that the one part of your company that&rsquo;s directly
interfacing with your actual paying customers needs to be appropriately staffed and resourced. A bad customer support
experience can turn off a brand evangelist overnight.</p>
<h2 id="closing-thoughts">
  <a class="heading-anchor" href="#closing-thoughts">Closing thoughts<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I want Fairphone to succeed in their mission, but products like these do not further the cause.</p>
<p>The feature set of the Fairbuds XL seems competent, and I&rsquo;m willing to give a pass on a few minor issues if the overall
experience is good, but the unimpressive sound profile, broken active noise-cancelling mode, multiple quality issues
and poor customer service mean that <strong>I can&rsquo;t in good conscience recommend the Fairphone Fairbuds XL,</strong> not even on
sale.</p>
<p>Perhaps less resources should be spent
on <a href="https://www.fairphone.com/en/2025/01/13/fairphones-next-chapter-starts-now/">rebranding</a> and more on engineering
good products.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Remember dubstep being a thing? Yeah, so do I. That, plus a little bit of mandatory military service can do a lot
of damage to hearing.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>I yearn for the perfect home server</title><link>https://ounapuu.ee/posts/2025/03/07/perfect-home-server/</link><pubDate>Fri, 07 Mar 2025 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/03/07/perfect-home-server/</guid><description>I've thought a lot about the performance, cost and power consumption trade-offs of home servers. Maybe too much.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/03/07/perfect-home-server/media/cover_hu_81094fb88b6730e7.jpg" width="1200" height="630" alt="I yearn for the perfect home server" /><p>I&rsquo;ve changed my home server setup a lot over the past
decade, <a href="/posts/2023/10/25/the-optimization-treadmill/">mainly because I keep changing the goals all the time.</a></p>
<p>I&rsquo;ve now realized why that keeps happening.</p>
<p>I want <em><strong>the perfect home server.</strong></em></p>
<p>What <em>is</em> the perfect home server? I&rsquo;d phrase it like this:</p>
<blockquote>
<p>The perfect home server uses very little power, offers plenty of affordable storage and provides a lot of performance
when it&rsquo;s actually being relied upon.</p>
</blockquote>
<p>In my case, low power means less than 5 W while idling, 10+ TB of redundant storage for data resilience and integrity
concerns, and performance means about 4 modern CPU cores&rsquo; worth (low-to-midrange desktop CPU performance). I seem to
only ever get one or two at most.</p>
<p>Low power usage? Your performance will likely suffer, and you can&rsquo;t run too many storage drives. You <em>can</em> run SSD-s,
but they are not affordable if you need higher capacities.</p>
<p>Lots of storage? Well, there goes the low power consumption goal, especially if you run 3.5&quot; hard drives.</p>
<p>Lots of performance? Lots of power consumed!</p>
<p>There&rsquo;s just something that annoys me whenever I do things on my home server and I have to wait longer than I should,
and yet I&rsquo;m
bothered <a href="/posts/2024/05/02/smartplugs/">when my monitoring tells me that my home server is using 50+ watts.</a><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>I keep an eye out for developments in the self-hosting and home server spaces with the hopes that I&rsquo;ll one day stumble
upon the holy grail, that one server that fits all my needs. <a href="/posts/2023/10/09/zimaboard/">I&rsquo;ve gotten close</a>, but
no matter what setup I have, there&rsquo;s always something that keeps bothering me.</p>
<p>I&rsquo;ve seen a few attempts at the perfect home server, covered by various tech reviewers, but they always have at least
one critical flaw. Sometimes the whole package is actually great, the functionality rocks, and then you find that the
hardware contains prototype-level solutions that result in the power consumption ballooning to over 30 W. Or the price
is over 1000 USD/EUR, not including the drives. Or it&rsquo;s only available in certain markets and the shipping and import
duties destroy its value proposition.</p>
<p>There is no affordable platform out there that provides great performance, flexibility and storage space, all while
being quiet and using very little power.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<p>Desktop PC-s repurposed as home servers can provide room for a lot of storage, and they are by design very flexible, but
the trade-off is the higher power consumption of the setup.</p>
<p><a href="https://www.jeffgeerling.com/blog/2024/radxas-sata-hat-makes-compact-pi-5-nas">Single board computers</a> use very little
power, but they can&rsquo;t provide a lot of performance and connecting storage to them gets tricky and is overall limited.
They can also get <a href="https://www.jeffgeerling.com/blog/2025/who-would-buy-raspberry-pi-120">surprisingly expensive.</a></p>
<p>NAS boxes provide a lot of storage space and are generally low power if you exclude the power consumption of hard
drives, but the cheaper ones are not that performant, and the performant ones cost almost as much as a high-end PC.</p>
<p><a href="/posts/2024/10/16/third-times-the-charm/">Laptops can be used as home servers,</a> they are quite efficient and
performant, but they lack the flexibility and storage options of desktop PC-s and NAS boxes. You can slap a USB-based
DAS to it to add storage, but I&rsquo;ve had poor experiences with these under high load, meaning that these approaches can&rsquo;t
be relied on if you care about your data and server stability.</p>
<p>Then there&rsquo;s the option of buying used versions of all of the above. Great bang for buck, but you&rsquo;re likely taking a hit
on the power efficiency part due to the simple fact that technology keeps evolving and getting more efficient.</p>
<p>I&rsquo;m still hopeful that one day a device exists that ticks all the boxes while also being priced affordably, but I&rsquo;m
afraid that it&rsquo;s just a pipe
dream. <a href="https://mattgadient.com/7-watts-idle-on-intel-12th-13th-gen-the-foundation-for-building-a-low-power-server-nas/">There are builds out there that fill in almost every need</a>,
but the parts list is very specific and the bulk of the power consumption wins come from using SSD-s instead of hard
drives, which makes it less affordable.</p>
<p>In the meantime I guess I&rsquo;ll keep rocking <a href="/posts/2024/10/16/third-times-the-charm/">my ThinkPad-as-a-server approach</a>
and praying that the USB-attached storage does not cause major issues.</p>









<figure class="center">
  <a href="/posts/2025/03/07/perfect-home-server/media/powerconsumption.png">
    <img src="/posts/2025/03/07/perfect-home-server/media/powerconsumption_hu_a7a2d57724d8abf2.webp"
     width="1000"
     height="693"
     loading="lazy"
     decoding="async"
     alt="My whole home server infrastructure power consumption, including the fiber converter box and the wireless router.">

  </a>
  <figcaption class="center">My whole home server infrastructure power consumption, including the fiber converter box and the wireless router.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/03/07/perfect-home-server/media/powerconsumption-per-day.png">
    <img src="/posts/2025/03/07/perfect-home-server/media/powerconsumption-per-day_hu_413132197591747d.webp"
     width="1000"
     height="693"
     loading="lazy"
     decoding="async"
     alt="On typical days I can see power consumption of around 0.7 kWh per day, resulting in 21 kWh used within a month.">

  </a>
  <figcaption class="center">On typical days I can see power consumption of around 0.7 kWh per day, resulting in 21 kWh used within a month.</figcaption>
</figure>

<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>perhaps it&rsquo;s an undiagnosed medical condition. <em>Homeserveritis?</em>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>if there <em>is</em> one, then let me know, you can find the contact details below!&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>IODD ST400 review: great idea, good product, terrible firmware</title><link>https://ounapuu.ee/posts/2025/02/14/iodd-st400-review/</link><pubDate>Fri, 14 Feb 2025 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/02/14/iodd-st400-review/</guid><description>I bought and tested a Ventoy-like device that allows you to boot all sorts of installation media and operating systems, all on one device.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/02/14/iodd-st400-review/media/cover_hu_1f7948de1c3907ae.jpg" width="1200" height="630" alt="IODD ST400 review: great idea, good product, terrible firmware" /><p>I&rsquo;ve written about <a href="/posts/2024/12/02/linux-on-usb/">abusing USB storage devices</a> in the past, with a passing mention
that I&rsquo;m too cheap to buy an <a href="https://www.iodd.shop/Home">IODD device.</a></p>
<p>Then I bought one.</p>
<p>I&rsquo;ve always liked the promise of tools like <a href="https://www.ventoy.net/en/index.html">Ventoy</a>: you only need to carry the
one storage device that boots anything you want.
Unfortunately <a href="https://github.com/ventoy/Ventoy/issues/2795">I still can&rsquo;t trust Ventoy,</a> so I&rsquo;m forced to look
elsewhere.</p>
<h2 id="the-hardware">
  <a class="heading-anchor" href="#the-hardware">The hardware<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I decided to get the <a href="https://www.iodd.shop/IODD-ST400-USB-30-External-Encrypted-Hard-Drive-Enclosure">IODD ST400</a> for
122 EUR (about 124 USD) off of Amazon Germany, since it was for some reason cheaper than getting it
from <a href="https://www.iodd.shop/">iodd.shop</a> directly.
SATA SSD-s are cheap and plentiful, so the ST400 made the most sense to me.</p>









<figure class="center">
  <a href="/posts/2025/02/14/iodd-st400-review/media/packaging-0.jpg">
    <img src="/posts/2025/02/14/iodd-st400-review/media/packaging-0_hu_a38c5ef0e565aef5.webp"
     width="750"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="The packaging of the IODD ST400.">

  </a>
  <figcaption class="center">The packaging of the IODD ST400.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/02/14/iodd-st400-review/media/packaging-1.jpg">
    <img src="/posts/2025/02/14/iodd-st400-review/media/packaging-1_hu_94aa2fba8b589ddd.webp"
     width="750"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="Find the typo.">

  </a>
  <figcaption class="center">Find the typo.</figcaption>
</figure>

<p>The device came with one USB cable, with type A and type C ends. The device itself has a USB type C port, which I like a
lot.</p>









<figure class="center">
  <a href="/posts/2025/02/14/iodd-st400-review/media/packaging-2.jpg">
    <img src="/posts/2025/02/14/iodd-st400-review/media/packaging-2_hu_844bc0af40879544.webp"
     width="750"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="Also comes with a small pouch to avoid scratching the device.">

  </a>
  <figcaption class="center">Also comes with a small pouch to avoid scratching the device.</figcaption>
</figure>

<p>The buttons are functional and clicky, but incredibly loud.</p>









<figure class="center">
  <a href="/posts/2025/02/14/iodd-st400-review/media/packaging-3.jpg">
    <img src="/posts/2025/02/14/iodd-st400-review/media/packaging-3_hu_2789b0689b1d8015.webp"
     width="1000"
     height="750"
     loading="lazy"
     decoding="async"
     alt="The IODD ST400 device itself.">

  </a>
  <figcaption class="center">The IODD ST400 device itself.</figcaption>
</figure>

<h2 id="setting-it-up">
  <a class="heading-anchor" href="#setting-it-up">Setting it up<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Before you get started with this device, I highly recommend glancing
over <a href="https://help.iodd.kr/">the official documentation.</a>
The text is poorly translated in some parts, but overall it gets the job done.</p>
<p>Inserting the SSD was reasonably simple, it slotted in well and would not move around
after assembling it. Getting the back cover off was tricky, but I&rsquo;d rather have that than have to deal with a loose back
cover that comes off when it shouldn&rsquo;t.</p>









<figure class="center">
  <a href="/posts/2025/02/14/iodd-st400-review/media/assembly-0.jpg">
    <img src="/posts/2025/02/14/iodd-st400-review/media/assembly-0_hu_830376f38f53242c.webp"
     width="750"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="Device with the back cover off.">

  </a>
  <figcaption class="center">Device with the back cover off.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/02/14/iodd-st400-review/media/assembly-1.jpg">
    <img src="/posts/2025/02/14/iodd-st400-review/media/assembly-1_hu_76134b91adfe1810.webp"
     width="1000"
     height="750"
     loading="lazy"
     decoding="async"
     alt="SSD pops right in.">

  </a>
  <figcaption class="center">SSD pops right in.</figcaption>
</figure>

<p>The most important step is the filesystem choice. You can choose between NTFS, FAT32 or exFAT. Due to the maximum file
size limitation of 4GB on FAT32, you will probably want to go with either NTFS or exFAT.</p>









<figure class="center">
  <a href="/posts/2025/02/14/iodd-st400-review/media/assembly-2.jpg">
    <img src="/posts/2025/02/14/iodd-st400-review/media/assembly-2_hu_44ccb0c98d170aa6.webp"
     width="1000"
     height="750"
     loading="lazy"
     decoding="async"
     alt="Error message that gets shown when you haven&#39;t formatted your drive yet.">

  </a>
  <figcaption class="center">Error message that gets shown when you haven&#39;t formatted your drive yet.</figcaption>
</figure>

<p>Once you have a filesystem on the SSD, you can start copying various installers and tools on it and mount them!</p>









<figure class="center">
  <a href="/posts/2025/02/14/iodd-st400-review/media/mounted.jpg">
    <img src="/posts/2025/02/14/iodd-st400-review/media/mounted_hu_b79db17d76a7d238.webp"
     width="1000"
     height="750"
     loading="lazy"
     decoding="async"
     alt="IODD ST400 with one virtual disk mounted.">

  </a>
  <figcaption class="center">IODD ST400 with one virtual disk mounted.</figcaption>
</figure>

<p>The interface is unintuitive. I had to keep the manual close when testing mine, but eventually I figured out
what I can and cannot do.</p>
<h2 id="device-emulation">
  <a class="heading-anchor" href="#device-emulation">Device emulation<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Whenever you connect the IODD device to a powered on PC, it will present itself as multiple devices:</p>
<ul>
<li>normal hard drive: the whole IODD filesystem is visible here, and you can also store other files and backups as well
if you want to</li>
<li>optical media drive: this is where your installation media (ISO files) will end up, read only</li>
<li>virtual drives (up to 3 at a time): VHD files that represent virtual hard drives, but are seen as actual storage
devices on the PC</li>
</ul>









<figure class="center">
  <a href="/posts/2025/02/14/iodd-st400-review/media/emulation-0.png">
    <img src="/posts/2025/02/14/iodd-st400-review/media/emulation-0_hu_da60cc958c3ed65.webp"
     width="234"
     height="241"
     loading="lazy"
     decoding="async"
     alt="Emulated disks, as shown by GNOME Disks.">

  </a>
  <figcaption class="center">Emulated disks, as shown by GNOME Disks.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/02/14/iodd-st400-review/media/emulation-1.jpg">
    <img src="/posts/2025/02/14/iodd-st400-review/media/emulation-1_hu_5c755245aadc4d9d.webp"
     width="1000"
     height="750"
     loading="lazy"
     decoding="async"
     alt="A ThinkPad P14s gen4 boot selection menu with the IODD device connected.">

  </a>
  <figcaption class="center">A ThinkPad P14s gen4 boot selection menu with the IODD device connected.</figcaption>
</figure>

<p>This combination of devices is incredibly handy. For example, you can boot an actual Fedora Linux installation as one of
the virtual drives, and make a backup of the files on the PC right to the IODD storage itself.</p>









<figure class="center">
  <a href="/posts/2025/02/14/iodd-st400-review/media/booted-fedora.jpg">
    <img src="/posts/2025/02/14/iodd-st400-review/media/booted-fedora_hu_2c654da45c0cd907.webp"
     width="1000"
     height="750"
     loading="lazy"
     decoding="async"
     alt="GNOME Disks, running off of a Fedora 41 installation from a virtual drive.">

  </a>
  <figcaption class="center">GNOME Disks, running off of a Fedora 41 installation from a virtual drive.</figcaption>
</figure>

<p>S.M.A.R.T information also seems to be passed through properly for the disk that&rsquo;s inside.</p>









<figure class="center">
  <a href="/posts/2025/02/14/iodd-st400-review/media/crystaldiskinfo.jpg">
    <img src="/posts/2025/02/14/iodd-st400-review/media/crystaldiskinfo_hu_67a9b36c46a0a6af.webp"
     width="1000"
     height="750"
     loading="lazy"
     decoding="async"
     alt="CrystalDiskInfo showing the details of the SSD that&#39;s inside the IODD device, on a portable Windows 11 emulated disk.">

  </a>
  <figcaption class="center">CrystalDiskInfo showing the details of the SSD that&#39;s inside the IODD device, on a portable Windows 11 emulated disk.</figcaption>
</figure>

<p>Tech tip: to automatically mount your current selection of virtual drives and ISO file at boot, hold down the &ldquo;9&rdquo; button
for about 3 seconds. The button also has an exit logo on it. Without this step, booting an ISO or virtual drive becomes
tricky as you&rsquo;ll have to both spam the &ldquo;select boot drive&rdquo; key on the PC while navigating the menus on the IODD device
to mount the ISO.</p>
<p>The performance is okay. The drive speeds are limited to SATA II speeds, which means that your read/write speeds cap out
at about 250 MB/s. Latency will depend a lot on the drive, but it stays mostly in the sub-millisecond range on my SSD.
The GNOME Disks benchmark does show a notable chunk of reads having a 5 millisecond latency. The drive does not seem to
exhibit any throttling under sustained loads, so at least it&rsquo;s better than a normal USB stick.</p>









<figure class="center">
  <a href="/posts/2025/02/14/iodd-st400-review/media/booted-benchmark.jpg">
    <img src="/posts/2025/02/14/iodd-st400-review/media/booted-benchmark_hu_be14b6054cbbcb0e.webp"
     width="1000"
     height="750"
     loading="lazy"
     decoding="async"
     alt="A quick disk benchmark while booting off of the drive itself.">

  </a>
  <figcaption class="center">A quick disk benchmark while booting off of the drive itself.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/02/14/iodd-st400-review/media/benchmark-unloaded.png">
    <img src="/posts/2025/02/14/iodd-st400-review/media/benchmark-unloaded_hu_6b1478f7147b256.webp"
     width="656"
     height="598"
     loading="lazy"
     decoding="async"
     alt="Benchmark results while not emulating any virtual drives.">

  </a>
  <figcaption class="center">Benchmark results while not emulating any virtual drives.</figcaption>
</figure>

<p>The speeds seem to be the same for all emulated devices, with latencies and speeds being within spitting distance.</p>









<figure class="center">
  <a href="/posts/2025/02/14/iodd-st400-review/media/benchmark-virtual-drive.png">
    <img src="/posts/2025/02/14/iodd-st400-review/media/benchmark-virtual-drive_hu_eeaba39f96a6583f.webp"
     width="656"
     height="598"
     loading="lazy"
     decoding="async"
     alt="Benchmark results for the emulated virtual optical drive.">

  </a>
  <figcaption class="center">Benchmark results for the emulated virtual optical drive.</figcaption>
</figure>

<h2 id="the-firmware-sucks-actually">
  <a class="heading-anchor" href="#the-firmware-sucks-actually">The firmware sucks, actually<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The IODD ST400 is a great idea that&rsquo;s been turned into a good product, but the firmware is terrible enough to <em>almost</em>
make me regret the purchase.</p>
<p>The choice of filesystems available (FAT32, NTFS, exFAT) is very Windows-centric, but at least it comes with the upside
of being supported on
most popular platforms, including Linux and Mac. Not great, not terrible.</p>
<p>The folder structure has some odd limitations. For example, you can only have 32 items within a folder. If you have more
of that, you have to use nested folders. This sounds like a hard cap written somewhere within the device firmware
itself. I&rsquo;m unlikely to hit such limits myself and it doesn&rsquo;t seem to affect the actual storage, just the device itself
isn&rsquo;t able to handle that many files within a directory listing.</p>
<p>The most annoying issue has turned out to be <em><strong>defragmentation.</strong></em></p>
<p>In <em><strong>2025!</strong></em></p>
<p>It&rsquo;s a known limitation
that&rsquo;s <a href="https://help.iodd.kr/troubleshooting/error-messages">handily documented on the IODD documentation.</a> On Windows,
you can fix it by using a disk defragmentation tool, which is really not recommended on an SSD. On Linux, I have not yet
found a way to do that, so I&rsquo;ve resorted to simply making a backup of the contents of the drive, formatting the disk,
and copying it all back again. This is a frustrating issue that only comes up when you try to use a virtual hard drive.
It would absolutely suck to hit this error while in the field.</p>









<figure class="center">
  <a href="/posts/2025/02/14/iodd-st400-review/media/i-hate-this-error-so-much.jpg">
    <img src="/posts/2025/02/14/iodd-st400-review/media/i-hate-this-error-so-much_hu_cbcee3f9c075e2f0.webp"
     width="726"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="The worst aspect of this device: the &#34;defrag&#34; error message.">

  </a>
  <figcaption class="center">The worst aspect of this device: the &#34;defrag&#34; error message.</figcaption>
</figure>

<p>The way virtual drives are handled is also less than ideal. You can only use fixed VHD files that are not sparse, which
seems to again be a limitation of the firmware.</p>
<p>Tech tip: if you&rsquo;re on Linux and want to convert a raw disk image (such as a disk copied with <code>dd</code>) to a VHD file, you
can use a command like this one:</p>
<pre tabindex="0"><code>qemu-img convert -f raw -O vpc -o subformat=fixed,force_size source.img target.vhd
</code></pre><p>The firmware really is the worst part of this device. What I would love to see is a device like IODD but with free and
open source firmware. Ventoy has proven that there is a market for a solution that makes juggling installation media
easy, but it can&rsquo;t emulate hardware devices. An IODD-like device can.</p>
<h2 id="encryption-and-other-features">
  <a class="heading-anchor" href="#encryption-and-other-features">Encryption and other features<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I didn&rsquo;t test those because I don&rsquo;t really need those features myself, I really don&rsquo;t need to protect my Linux
installers from prying eyes.</p>
<h2 id="conclusion">
  <a class="heading-anchor" href="#conclusion">Conclusion<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The IODD ST400 is a good device with a proven market, but the firmware makes me refrain from outright recommending it to
everyone, at least not at this price.</p>
<p>If it were to cost something like 30-50 EUR/USD, I would not mind the firmware issues at all.</p>
]]></content:encoded></item><item><title>What I've learned running Linux and Windows off of USB flash drives</title><link>https://ounapuu.ee/posts/2024/12/02/linux-on-usb/</link><pubDate>Mon, 02 Dec 2024 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2024/12/02/linux-on-usb/</guid><description>I took some USB flash drives I had around and put Windows and Linux on them, here's how it went.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2024/12/02/linux-on-usb/media/cover_hu_545a86df87185231.jpg" width="1200" height="630" alt="What I've learned running Linux and Windows off of USB flash drives" /><p>I&rsquo;ve recently made an effort to reduce the amount of tech stuff that I own. Lack of space, lack of time and the guilt
of storing perfectly functional hardware unused in a box were the main motivators.</p>
<p>This has resulted in experiments with my assortment of USB flash storage that I&rsquo;ve acquired over the years. They&rsquo;re too
old and cheap to be worth selling, so why not run them to the ground?</p>
<p>I&rsquo;ve always liked the idea of USB sticks. They&rsquo;re small and the good ones are actually surprisingly fast, especially
compared to hard drives. This is why I started installing operating systems on them.
It&rsquo;s really handy to have a USB stick around with a full operating system on it for testing purposes, and I&rsquo;m too cheap
to buy an <a href="https://www.iodd.shop/Home">IODD device.</a><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>What I&rsquo;ve learned is that Linux installed on a USB stick is a much nicer experience compared to a Windows To Go
installation, even on the cheaper and crappier ones.</p>
<h2 id="the-windows-experience">
  <a class="heading-anchor" href="#the-windows-experience">The Windows experience<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I&rsquo;ve used <a href="https://rufus.ie/en/">Rufus</a> for creating portable Windows installations in the past, mostly on portable
SSD-s.
These have come in handy when I&rsquo;ve had to update the firmware on certain PC-s or associated hardware, like USB-C
docks.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<p>Recently, I took a Samsung FIT 128GB USB 3.0 drive to see how well Windows can operate off of it.</p>
<p>It&rsquo;s horrible.</p>
<p>Windows will run, but the first time you boot it, you will have to wait for all sorts of driver and update
installations,
which puts a huge strain on the storage, making the whole experience borderline unusable. Once that process is
complete (multiple hours later), it&rsquo;s actually not that bad, until you receive yet another Windows update.</p>
<p>For a USB stick that you use only occasionally to troubleshoot hardware, Windows is a really poor choice. Even on a
proper portable SSD, it will still be relatively slow due to all that driver and update installation
taking place in the background.</p>
<p>Eventually, that installation will also probably brick itself in one way or another, and not even due to any storage
failures. Simply using the same disk on multiple machines will accrue configuration and driver cruft that likely results
in Windows giving up. It&rsquo;s just a guesstimate on my side, but I would not be surprised if it was true.</p>
<p>After a Windows update run completely fried one USB stick<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup> that I used for testing, I gave up on it.</p>
<h2 id="the-linux-experience">
  <a class="heading-anchor" href="#the-linux-experience">The Linux experience<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Most Linux distributions have supported a LiveCD/LiveUSB solution for at least 15+ years at this point. It&rsquo;s a neat
idea: your installation media also doubles as an emergency portable installation of that Linux distro, which you can use
to quickly test the functionality of a PC, repair an existing installation or install it on a new machine.</p>
<p>The downside of that solution is that the software on it cannot be changed. You can temporarily install new software or
update existing packages during that session, or have a separate writeable partition set aside on the USB stick for
storing any permanent changes, but it&rsquo;s a bit of a hassle to think about that nuance every time.</p>
<p>This is why I went ahead and installed Fedora Linux 40 on a Sandisk Ultra 16GB USB 3.0 flash drive <a href="/posts/2023/02/15/shrinkflation/">(the
one that is actually 16GB).</a>
The storage speed is still a bottleneck, but it&rsquo;s much less noticeable during normal use.</p>
<p>After the installation is done, you&rsquo;re simply using the system as-is. Opening programs will have a slightly longer
delay, but it&rsquo;s still a perfectly <a href="https://en.wiktionary.org/wiki/cromulent">cromulent</a> Linux experience.</p>
<p>A fresh installation of Fedora Workstation 40 uses only <strong>3.6GB</strong> of storage! On a 16GB USB flash drive, this leaves
plenty
of room for performing system updates and installing a small number of applications. If you choose the <code>btrfs</code>
filesystem during the installation (the default option), then the files will also be compressed to save even more space
and increase the effective storage bandwidth.<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup></p>









<figure class="center">
  <a href="/posts/2024/12/02/linux-on-usb/media/fedora-disk-usage.png">
    <img src="/posts/2024/12/02/linux-on-usb/media/fedora-disk-usage_hu_529947b4729ff43e.webp"
     width="684"
     height="264"
     loading="lazy"
     decoding="async"
     alt="Disk usage on a fresh Fedora Workstation 40 installation.">

  </a>
  <figcaption class="center">Disk usage on a fresh Fedora Workstation 40 installation.</figcaption>
</figure>

<p>You&rsquo;ll only notice that you&rsquo;re running off of a USB flash drive when installing new packages, performing system updates
or downloading large files. At least with Linux you have control over <em>when</em> you want to install the updates.</p>









<figure class="center">
  <a href="/posts/2024/12/02/linux-on-usb/media/fedora-update.png">
    <img src="/posts/2024/12/02/linux-on-usb/media/fedora-update_hu_3fe675a2983581f9.webp"
     width="870"
     height="599"
     loading="lazy"
     decoding="async"
     alt="It&#39;s not terribly fast, but it&#39;s not terrible!">

  </a>
  <figcaption class="center">It&#39;s not terribly fast, but it&#39;s not terrible!</figcaption>
</figure>

<p>Using <code>btrfs</code> also allows you to easily check the flash drive for any integrity issues. Simply
run <code>sudo btrfs scrub start -B /</code>
and you&rsquo;ll know soon enough if your flash drive is messing with your data.</p>
<h2 id="the-backerupper-usb-stick">
  <a class="heading-anchor" href="#the-backerupper-usb-stick">The <em>backerupper</em> USB stick<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>One actual use case that I have for a full Linux installation on a USB stick is the <em>backerupper</em> solution: a fully
featured Fedora Linux installation, stored on a small USB stick, and with limited access to networked storage.</p>
<p>Most people working in IT know the joys of working with hardware that family members and relatives own. Before doing any
destructive changes, it&rsquo;s always a good idea to make a full disk copy of the storage on the machine you&rsquo;re fixing. If
you screw up, you&rsquo;ll have a way of setting everything back just as it was before you did any work on it.
A full disk image will also mean that nothing will be left behind before you do a fresh installation.</p>
<p>I already have a home server with some spare storage, so using it as a target for any backups makes perfect sense to me.</p>
<p>This solution has already come in handy once when I had to deal with a 10-year-old laptop with a dying hard drive.<sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup></p>
<h2 id="crappy-storage-is-still-crappy">
  <a class="heading-anchor" href="#crappy-storage-is-still-crappy">Crappy storage is still crappy<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Don&rsquo;t expect any kind of longevity with USB sticks, the wear leveling and endurance is not on the level of proper
SSD-s. Linux is nicer to the USB stick regarding the wear and tear, but given enough time, the USB flash drive will
still fail.</p>
<p>I will still keep using USB flash sticks for this purpose. I have backups of the USB stick installations on my server,
so restoring it will simply mean getting another USB stick and writing the full disk image back to it.</p>
<p>USB sticks are also great for specialized solutions that don&rsquo;t do a lot of IO
operations. <a href="https://libreelec.tv/">LibreELEC</a>, a media-center oriented Linux distro, can be run off of a USB flash
drive without any major issues, since its storage demands are very small (unless you install a ton of plugins).</p>
<h2 id="conclusion">
  <a class="heading-anchor" href="#conclusion">Conclusion<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Linux and USB flash storage is a great option for making backups or having a working operating system available for
disaster recovery scenarios. Just mind the endurance of the flash storage, and don&rsquo;t use Windows.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I won&rsquo;t trust Ventoy <a href="https://github.com/ventoy/Ventoy/issues/2795">until they address this issue.</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Linux can also install firmware updates on some machines and hardware, but it&rsquo;s not a guaranteed success.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>only the third time that I&rsquo;ve actually fried a solid state flash storage device through write abuse in my life.
Flash is actually pretty good!&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p>compression allows us to push more data through a small pipe, be it a slow storage device or the network, at the
cost of additional CPU usage.&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:5">
<p>I utilized my sick tech skills to force a full rewrite of the disk to reduce the number of pending bad sectors,
and that made Windows happy enough to run on it once again with a fresh installation. It&rsquo;s a ticking time bomb, but the
user is well aware of it and just wants to have a working backup laptop around.&#160;<a href="#fnref:5" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>The best laptop is the one somebody else had</title><link>https://ounapuu.ee/posts/2024/11/01/the-best-laptop/</link><pubDate>Fri, 01 Nov 2024 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2024/11/01/the-best-laptop/</guid><description>The value of used business-grade laptops is unreasonably high, and I love it!</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2024/11/01/the-best-laptop/media/cover_hu_f1cdf304b9cdc2e2.jpg" width="1200" height="630" alt="The best laptop is the one somebody else had" /><p>In 2011, I was finishing 9th grade. As a gift, I got to choose a laptop in the
400 EUR range. I ended up picking
an <a href="https://www.laptopmag.com/reviews/laptops/asus-eee-pc-1201pn">ASUS Eee PC 1201PN.</a> It was new and the
first computer in my life that was 100% <em>mine</em>, but awfully slow for a lot of tasks.</p>
<p>It was <em><strong>so slow</strong></em> that I ended up giving Linux a go as a result. <em><strong>Linux!</strong></em> I didn&rsquo;t even know computing all that
well around that time!</p>
<p>A few years later, I bought a ThinkPad T60 off of someone I knew for about <strong>40 EUR</strong>. It was about 8 years old at that
point,
but it ran circles around the new laptop that I had in performance.</p>
<p>That&rsquo;s when I learned about the absurdly good price-to-performance ratio of used business-grade laptops, and the
crappiness of netbooks.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>Note that I keep repeating the phrase <em><strong>business-grade</strong></em> laptops. Think Lenovo ThinkPads, Dell Latitudes or HP
EliteBooks.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<p>That&rsquo;s the core of this whole idea. Consumer-grade
laptops are cheaper when bought new, but that is a result of a lot of compromises made in the build quality.
Business-grade laptops are used for work and need to be reliable for years, which means that they will last for a long
time.</p>
<h2 id="used-laptops-are-cheap">
  <a class="heading-anchor" href="#used-laptops-are-cheap">Used laptops are cheap<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I recently checked what the prices are for used laptops, mainly focusing on the 100-300 EUR range as I find that to
be the sweet spot for bargains.</p>
<p>For 195 EUR, I can get a ThinkPad X395, sporting an AMD Ryzen 5 3500U quad-core CPU, 16 GB of RAM and a 256GB NVMe SSD,
sold by a store that specializes in selling used hardware. You even get a 6-month warranty! That&rsquo;s crazy good value.</p>
<p>New business-grade laptops cost somewhere around 1000-2000+ EUR. They are generally faster and provide more memory and
storage, but in the best case scenario that performance difference will be 2-3x at best, while the price is 5-10+ times
higher. The math does <em>not</em> check out.</p>
<p>The price depreciation curve is also quite harsh on new laptops. You can pay 2000 EUR for a new laptop and only be able
to
sell it for 1000 EUR a year from now. Two years later? 500-700 EUR. The prices eventually settle at around the 5 year
mark, which also happens to align with the extended warranties expiring.</p>
<h2 id="used-laptops-reduce-stress">
  <a class="heading-anchor" href="#used-laptops-reduce-stress">Used laptops reduce stress<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>With used laptops, you don&rsquo;t have to worry about the wear-and-tear that much.</p>
<p>You accidentally drop your laptop on the floor? It might still be fine!</p>
<p>Your child picked off all the keycaps on the keyboard? No worries, replacements are easy to find!</p>
<p>Your lunch for the day ended up leaking all over the laptop, killing it completely? No problem, you can get a new one
and still end up paying less compared to a new laptop!</p>
<p>Buying used is no excuse to mistreat your hardware, but I personally love the lack of stress associated with trying
to keep a new and expensive object in pristine condition. The laptop already has some cosmetic damage on it, so
why worry?</p>
<h2 id="used-laptops-are-surprisingly-reliable">
  <a class="heading-anchor" href="#used-laptops-are-surprisingly-reliable">Used laptops are surprisingly reliable<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Reliability is often one of the top reasons why some people avoid buying used laptops. I attribute this to the
experiences
people have with used cars. You pay less, until you pay a lot more to get that hunk of junk fixed once it breaks down on
you.</p>
<p>I&rsquo;ve had the complete opposite experience with used business-grade laptops. The ones that make it to the used market
have gone through years of reliability testing, and those that don&rsquo;t make it were defective anyway. The
only areas to pay attention to is basic maintenance (remove dust, apply new thermal paste) and a potential battery
replacement,
which are quite simple to do on modern business-grade laptops. It&rsquo;s so easy
that <a href="https://greendice.com/repair-cafe-with-concise-and-students-from-kindluse-school/">even children and teenagers can do it</a>
with a little bit of guidance and supervision!</p>
<p>The reliability doesn&rsquo;t stop with the hardware. Buying used often means that you&rsquo;ll be buying a laptop that has received
all the software and firmware
fixes <a href="https://www.notebookcheck.net/Lenovo-statement-Thunderbolt-firmware-responsible-for-ThinkPad-USB-C-failures.451307.0.html">to all sorts of issues.</a>
Linux users will also have a much better time with used laptops since by that time most of the issues associated with
new hardware will have been fixed in the kernel.</p>
<p>You should avoid buying new <em>and</em> used <em>consumer-grade</em> laptops. I&rsquo;ve seen so many of those with missing pieces of
plastic and the
hinges breaking open the laptop case,
but rarely with business-grade laptops.</p>
<p>Used business-grade laptops are so reliable
that <a href="https://greendice.com/">some companies are even willing to rent and support those machines for a really low price.</a></p>
<h2 id="exceptions-to-the-rule">
  <a class="heading-anchor" href="#exceptions-to-the-rule">Exceptions to the rule<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>There will always be a place for new laptops.</p>
<p>Sometimes you <em>do</em> need the latest and greatest hardware for
CAD work, complex video editing or high-end gaming.</p>
<p>Some people find that a 30-second build of their software project taking 20 seconds is worth the productivity gain,
regardless of the higher price or increased environmental impact of buying new.</p>
<p>Some simply want to play around with the latest and greatest, for fun.</p>
<p>There will always be people who find the idea of used laptops off-putting, and companies do prefer to buy pallet-loads
of new laptops every few years.</p>
<p>On the bright side, this does mean that there will always be a supply of cheap used laptops available for the rest of
us.</p>
<h2 id="conclusion">
  <a class="heading-anchor" href="#conclusion">Conclusion<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If you ever need a laptop and your needs are not extremely specific, then give a used business-grade laptop a
try. It will be fine, I promise.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>no hard feelings to my mom, we both didn&rsquo;t know any better.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>note that there are certain models that are a ThinkPad in name only, under the hood it&rsquo;s still the same
crappy components you see in consumer-grade laptops. Thanks, Lenovo.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>ThinkPad as a server: third time's the charm</title><link>https://ounapuu.ee/posts/2024/10/16/third-times-the-charm/</link><pubDate>Wed, 16 Oct 2024 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2024/10/16/third-times-the-charm/</guid><description>Turns out that using stable and performant computers as a home server is way too boring for me.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2024/10/16/third-times-the-charm/media/cover_hu_89504c7029e38e7c.jpg" width="1200" height="630" alt="ThinkPad as a server: third time's the charm" /><p>This is a follow-up to my two previous attempts on this topic:</p>
<ul>
<li><a href="/posts/2022/05/10/thinkpad-as-a-home-server/">Can a laptop from 2012 be a viable home server?</a></li>
<li><a href="/posts/2023/01/27/thinkpad-as-server-followup/">ThinkPad as a server: the follow-up</a></li>
</ul>
<p>Since then, I&rsquo;ve had quite a few changes to my home server setup:</p>
<ul>
<li><a href="/posts/2023/09/07/ikea-powered-homelab/">I put my home server stuff on an IKEA pegboard</a></li>
<li><a href="/posts/2023/10/09/zimaboard/">I tried the Zimaboard</a></li>
<li><a href="/posts/2022/01/17/asrock-x300-future-of-desktops/">I switched back to the ASRock DeskMini</a></li>
<li><a href="/posts/2024/06/24/back-to-roots/">I got fiber again!</a></li>
</ul>
<p>Zimaboard was
great, <a href="/posts/2023/10/09/zimaboard/#2024-08-20-update">until the CPU became just a little bit too slow for my needs.</a></p>
<p>ASRock Deskmini X300 was great, until I learned that it&rsquo;s actually relatively bad at idle power usage due to lack of
lower sleep states.</p>
<p>Combined with my recent tech cleanup, I am now proudly running all of my services on a single home server, powered by
<a href="/posts/2022/01/09/why-i-went-back-to-using-a-thinkpad-from-2012/">my trusty ThinkPad T430.</a></p>
<p>The promise of USB-C <em>everything</em> was too good to pass up, so I stopped resisting.</p>
<p>Doesn&rsquo;t mean that I won&rsquo;t run hardware into the ground.</p>
<p>Compared to last two attempts, I&rsquo;ve made a couple of important changes to the setup.</p>
<p>There is a weekly <code>tlp recalibrate BAT0</code> job scheduled that completely drains the battery and charges it up again, which
should make sure that the laptop battery survives for a longer time.
The battery charge threshold is set to 80%.</p>
<p>I&rsquo;ve used a knock-off Honeywell PTM7950 thermal pad on the CPU. The cooling performance is comparable to using thermal
paste, but hopefully it doesn&rsquo;t drip out.</p>
<p>The whole setup is mounted to an IKEA pegboard using
a <a href="https://nillkin.org/accessories/nillkin-prodesk-adjustable-laptop-stand">Nillkin ProDesk laptop stand</a>
and a generous amount of zip ties. The combination of zip ties and the rubber feet on the stand result in the stand
barely moving once mounted. The laptop stand itself is very sturdy, and you&rsquo;ll have to use a lot of force to change its
angle.</p>
<p>The CPU uses less power compared to the previous one. The one in the server is
the <a href="https://ark.intel.com/content/www/us/en/ark/products/71670/intel-core-i7-3632qm-processor-6m-cache-up-to-3-20-ghz-bga.html">Intel i7-3632QM</a>,
a quad-core CPU with a 35W TDP.</p>
<p>I still have some scripts running to limit the CPU temperatures to 85°C, just to be on the safe side and avoid
overheating at all costs.</p>









<figure class="center">
  <a href="/posts/2024/10/16/third-times-the-charm/media/setup-1.jpg">
    <img src="/posts/2024/10/16/third-times-the-charm/media/setup-1_hu_6bfa23fe0219b7ab.webp"
     width="1000"
     height="750"
     loading="lazy"
     decoding="async"
     alt="Took me 20 minutes to migrate the server along with the drives, and 2 hours to get the zip tie mounting just right.">

  </a>
  <figcaption class="center">Took me 20 minutes to migrate the server along with the drives, and 2 hours to get the zip tie mounting just right.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/10/16/third-times-the-charm/media/setup-2.jpg">
    <img src="/posts/2024/10/16/third-times-the-charm/media/setup-2_hu_f3b73da4eba708e0.webp"
     width="1000"
     height="750"
     loading="lazy"
     decoding="async"
     alt="The small shelf attachment holds two external drives and the power adapter.">

  </a>
  <figcaption class="center">The small shelf attachment holds two external drives and the power adapter.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/10/16/third-times-the-charm/media/setup-3.jpg">
    <img src="/posts/2024/10/16/third-times-the-charm/media/setup-3_hu_b808797e960a9df9.webp"
     width="750"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="Another angle.">

  </a>
  <figcaption class="center">Another angle.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/10/16/third-times-the-charm/media/setup-4.jpg">
    <img src="/posts/2024/10/16/third-times-the-charm/media/setup-4_hu_cb7b9f9356456759.webp"
     width="750"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="Plenty of clearance for adequate cooling.">

  </a>
  <figcaption class="center">Plenty of clearance for adequate cooling.</figcaption>
</figure>

<p>The power consumption is improved on this setup:</p>
<ul>
<li>mean: 27 W</li>
<li>min: 23 W</li>
<li>max: 70 W</li>
</ul>
<p>Results on the DeskMini on a typical day:</p>
<ul>
<li>mean: 34.8 W</li>
<li>min: 28 W</li>
<li>max: 89 W</li>
</ul>
<p>All measurements include the power consumption of the UPS, fiber PON and the router, which is around 10 W.</p>
<p>And the performance is good enough.</p>
<p>I&rsquo;m happy with it.</p>
<p>It&rsquo;s also handy that I now have that one laptop that I can sticker bomb without feeling guilty about removing them later
on.</p>
<h2 id="2025-june-update">
  <a class="heading-anchor" href="#2025-june-update">2025 June update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I have been running the ThinkPad T430 as a home server for a long time now. In fact, it&rsquo;s one of the longest stints I&rsquo;ve
had with a specific home server setup. The battery recalibration was <a href="/posts/2025/05/15/home/">temporarily disabled</a>
because of it interfering with UPower configuration that I had in place for shutting down the laptop at a higher battery
percentage (40%), but in all other aspects it&rsquo;s doing fine, and after removing UPower, the battery recalibration works
again.</p>
<p>There was <a href="/posts/2025/06/06/thinkcentre-m900-tiny/">a short week-long experiment with a ThinkCentre M900 Tiny,</a> but
that got put on pause because the USB-connected drives were a bit flaky. The ThinkPad T430 has proven itself to be a
more stable server platform as a result.</p>
]]></content:encoded></item><item><title>My blog successfully survived a scheduled power outage</title><link>https://ounapuu.ee/posts/2024/09/14/look-ma-no-downtime/</link><pubDate>Sat, 14 Sep 2024 11:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2024/09/14/look-ma-no-downtime/</guid><description>Look, ma, no downtime!</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2024/09/14/look-ma-no-downtime/media/cover_hu_dde5899eab8fc073.jpg" width="1200" height="630" alt="My blog successfully survived a scheduled power outage" /><p>I had the opportunity to test the resiliency of my home server setup due to a scheduled power outage on 2024-09-13.</p>
<p>It was also Friday the 13th. <a href="https://youtu.be/39uoolmtjSA">I&rsquo;m not superstitious, but I&rsquo;m a little stitious.</a></p>
<p>My setup usually consists of the home server, a Wifi AP/router combo box, a converter box for the fiber line, and a
CyberPower UT850EG UPS.</p>
<p>The planned power outage was communicated a week in advance and was supposed to take up to two hours. It ended up taking
about 1 hour 20 minutes.</p>
<p>The CyberPower UPS is good for temporary loss of power and can probably run my whole networking and home server setup
for about 10-15 minutes, which is not enough. Luckily I have one of those Jackery power banks that can provide 230V
output
for a much longer time. During a trial run, I found that this Jackery box can sustain my homelab for about 4 hours
without
any issues.</p>
<p>At 11:02, the power went out and UPS did its thing and kept the setup alive. I then turned on the Jackery power bank,
connected the UPS to the 230 V power line and everything remained operational. I continued working on my laptop
as usual.</p>
<p>My blog and all the other services I run on my home server kept working.</p>









<figure class="center">
  <a href="/posts/2024/09/14/look-ma-no-downtime/media/grafana.png">
    <img src="/posts/2024/09/14/look-ma-no-downtime/media/grafana_hu_17ba41cf1c33bca.webp"
     width="1000"
     height="289"
     loading="lazy"
     decoding="async"
     alt="Great success!">

  </a>
  <figcaption class="center">Great success!</figcaption>
</figure>

<p>I hope to one day do something similar but on a bigger scale, involving solar panels and big batteries. Would be
wicked cool to keep a whole building running off of batteries during outages.</p>
]]></content:encoded></item><item><title>How to copy media off of an iPhone the hard way (using Linux)</title><link>https://ounapuu.ee/posts/2024/09/02/iphone-media-recovery/</link><pubDate>Mon, 02 Sep 2024 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2024/09/02/iphone-media-recovery/</guid><description>If your iPhone doesn't show any photos when connected to a PC, then this guide may help you out.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2024/09/02/iphone-media-recovery/media/cover_hu_e9b0badd6a9c5a39.jpg" width="1200" height="630" alt="How to copy media off of an iPhone the hard way (using Linux)" /><p>I helped a family member upgrade to a newer iPhone and make some room so that the internal storage does not run out.</p>
<p>They had <a href="https://nextcloud.com/">Nextcloud</a> installed on the current phone, but due to limitations of the Nextcloud iOS
app, the backups only take place if the app itself is open, meaning that we had hundreds of photos and videos that were
not yet backed up.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>The network was slow and I was in a time crunch, so I opted to copy the media off of the phone by connecting the iPhone
to my laptop over
a Lightning cable. After entering the PIN on the phone again and approving the connection, I could see the iPhone
in my file manager, but opening it would show nothing at all. This was very unusual as other iPhones I used in the past
just worked on my laptop.</p>









<figure class="center">
  <a href="/posts/2024/09/02/iphone-media-recovery/media/happypath.png">
    <img src="/posts/2024/09/02/iphone-media-recovery/media/happypath_hu_c02c82f42067017e.webp"
     width="482"
     height="378"
     loading="lazy"
     decoding="async"
     alt="This is what you&#39;d expect to see when connecting an iPhone to a PC.">

  </a>
  <figcaption class="center">This is what you&#39;d expect to see when connecting an iPhone to a PC.</figcaption>
</figure>

<p>Rebooting the phone and connecting it again did nothing. Different known good Lightning cables did not improve things,
either.
Even a separate Windows 10 machine could not see any images, so it wasn&rsquo;t a Linux thing.</p>
<p>Various Apple-related posts online were devoid of useful advice.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<p>I was not ready to give up just yet and I finally stumbled
upon <a href="https://askubuntu.com/a/1159559">this Ask Ubuntu answer</a>.
This had potential, so I gave it a go, and I&rsquo;m happy to report that it worked on my Fedora Linux machine!</p>
<p>These are the steps that I took. The commands need to be run in a terminal window.</p>
<p>Tested with Fedora Linux 40.</p>
<ul>
<li>install the necessary packages
<ul>
<li>on Fedora, run <code>sudo dnf install -y ifuse libimobiledevice libimobiledevice-utils</code></li>
</ul>
</li>
<li>connect your iPhone to your PC
<ul>
<li>if your phone is not yet paired, then run <code>idevicepair pair</code></li>
<li>if it&rsquo;s already paired, verify the connection by running <code>idevicepair validate</code></li>
</ul>
</li>
<li>mount your phone to an empty folder of your choice
<ul>
<li>if an empty folder does not exist, run <code>mkdir ~/my-iphone</code> (use any folder name that you want)</li>
<li>to mount the phone, run <code>ifuse ~/my-iphone</code></li>
</ul>
</li>
<li>you can now browse your media via your file manager or terminal by navigating to <code>~/my-iphone</code>
<ul>
<li>photos and videos taken by the camera will be in the <code>DCIM</code> folder</li>
<li>other folders, such as <code>Photos</code> and <code>Downloads</code> may also interest you</li>
<li>to make a full copy of your phone to a folder named <code>iphone-backup</code>, run <code>cp -r ~/my-iphone ~/iphone-backup</code></li>
<li>alternative way to create a full backup: <code>rsync -aAXv ~/my-iphone ~/iphone-backup</code></li>
</ul>
</li>
<li>once you&rsquo;re done, unmount the iPhone by running <code>umount ~/my-iphone</code></li>
<li>it is now safe to disconnect your iPhone from the PC</li>
</ul>









<figure class="center">
  <a href="/posts/2024/09/02/iphone-media-recovery/media/iphone-contents.png">
    <img src="/posts/2024/09/02/iphone-media-recovery/media/iphone-contents_hu_ab4faea4df55ae20.webp"
     width="556"
     height="515"
     loading="lazy"
     decoding="async"
     alt="The directory listing of an iPhone.">

  </a>
  <figcaption class="center">The directory listing of an iPhone.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/09/02/iphone-media-recovery/media/iphone-photos.png">
    <img src="/posts/2024/09/02/iphone-media-recovery/media/iphone-photos_hu_f0e63d72cd9690cb.webp"
     width="556"
     height="515"
     loading="lazy"
     decoding="async"
     alt="Photos are located under DCIM folder, nested into a bunch of subfolders.">

  </a>
  <figcaption class="center">Photos are located under DCIM folder, nested into a bunch of subfolders.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/09/02/iphone-media-recovery/media/iphone-transfer.png">
    <img src="/posts/2024/09/02/iphone-media-recovery/media/iphone-transfer_hu_a53310547121c017.webp"
     width="593"
     height="252"
     loading="lazy"
     decoding="async"
     alt="Ah yes, USB 2.0 speeds.">

  </a>
  <figcaption class="center">Ah yes, USB 2.0 speeds.</figcaption>
</figure>

<p>If you have copied everything over and want to make more space on your phone using this method, then you need to delete
files under
the <code>DCIM</code> folder <em><strong>and</strong></em> the cached thumbnails under the <code>PhotoData</code> folder. iOS seems to generate thumbnails for
the photos you take and even if you delete all the actual photos off of the device, then the photo thumbnails will still
show up in the Photos app and elsewhere. This confused the hell out of me after I deleted the backed up photos off the phone the first time.</p>









<figure class="center">
  <a href="/posts/2024/09/02/iphone-media-recovery/media/iphone-thumbnails.png">
    <img src="/posts/2024/09/02/iphone-media-recovery/media/iphone-thumbnails_hu_2ff5b8bcd23711f9.webp"
     width="800"
     height="235"
     loading="lazy"
     decoding="async"
     alt="Thumbnails are in a separate folder.">

  </a>
  <figcaption class="center">Thumbnails are in a separate folder.</figcaption>
</figure>

<p>Alternatively, you can just delete files from the Photos app on the phone itself to avoid this nuance.</p>
<p>Linux has its flaws, but at least it provides you with the power and tools needed to get you out of tricky situations.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I can&rsquo;t wait for <a href="https://immich.app/">Immich</a> to get a stable release&hellip;&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Apple and Microsoft related forums are <em>the worst</em> for getting an actual solution to your problem, which is in stark
contrast to FOSS/Linux related discussions.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>Running my ThinkPad T430 with an eGPU in 2024</title><link>https://ounapuu.ee/posts/2024/08/07/thinkpad-t430-egpu/</link><pubDate>Wed, 07 Aug 2024 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2024/08/07/thinkpad-t430-egpu/</guid><description>Not all experiments end up being successful.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2024/08/07/thinkpad-t430-egpu/media/cover_hu_7607aeacfc765e1e.jpg" width="1200" height="630" alt="Running my ThinkPad T430 with an eGPU in 2024" /><p>I probably shouldn&rsquo;t have written down <a href="/posts/2024/07/03/thinkpad-t430-egpu/">my notes on the eGPU setup I had years ago.</a></p>
<blockquote>
<p>I’d be lying if I wasn’t considering remaking this setup with everything I’ve learned 6 years later.</p>
</blockquote>
<p>Oops.</p>
<p>I got access to an allegedly-faulty AMD Radeon RX 480 and an NVIDIA GTX 1650 for free thanks to my friend, so I ordered
the EXP GDC Beast v8.5c, two sorts of 6/8pin power cables, and a 12V 12A DC power supply.</p>
<p>The idea was to take a ThinkPad T430, bolt a GPU to it, and use it as a stationary workstation until the laptop
dies or gets too slow for modern tasks. The resale value of the T430 is too low for me to justify selling it, and if there&rsquo;s anyone
out there who can run a T430 into the ground 5+ years from now, then it&rsquo;s probably going to be me.</p>
<p>Quick specs:</p>
<ul>
<li>CPU: Intel i7-3820QM</li>
<li>RAM: 16GB DDR3</li>
<li>Storage: 4TB Samsung 870 QVO</li>
</ul>
<p>Side-note: I also went ahead and replaced the thermal paste with a bootleg Honeywell PTM7950 phase-changing
thermal pad. It works just as well as fresh thermal paste, but hopefully it won&rsquo;t drip out if the laptop is running
up-right, in a vertical laptop stand.</p>









<figure class="center">
  <a href="/posts/2024/08/07/thinkpad-t430-egpu/media/egpu-adapter-1.jpg">
    <img src="/posts/2024/08/07/thinkpad-t430-egpu/media/egpu-adapter-1_hu_a8376f85c0f96b27.webp"
     width="800"
     height="600"
     loading="lazy"
     decoding="async"
     alt="Side-view of the EXP GDC Beast adapter.">

  </a>
  <figcaption class="center">Side-view of the EXP GDC Beast adapter.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/08/07/thinkpad-t430-egpu/media/egpu-adapter-2.jpg">
    <img src="/posts/2024/08/07/thinkpad-t430-egpu/media/egpu-adapter-2_hu_9646ac571f827866.webp"
     width="800"
     height="600"
     loading="lazy"
     decoding="async"
     alt="Top-down view.">

  </a>
  <figcaption class="center">Top-down view.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/08/07/thinkpad-t430-egpu/media/egpu-adapter-3.jpg">
    <img src="/posts/2024/08/07/thinkpad-t430-egpu/media/egpu-adapter-3_hu_45028255a3f303c.webp"
     width="800"
     height="600"
     loading="lazy"
     decoding="async"
     alt="Backside of the adapter, with the AMD RX 480 attached.">

  </a>
  <figcaption class="center">Backside of the adapter, with the AMD RX 480 attached.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/08/07/thinkpad-t430-egpu/media/egpu-closeup.jpg">
    <img src="/posts/2024/08/07/thinkpad-t430-egpu/media/egpu-closeup_hu_4a851ee24fa4d474.webp"
     width="800"
     height="600"
     loading="lazy"
     decoding="async"
     alt="The extra power cable was barely long enough to fit.">

  </a>
  <figcaption class="center">The extra power cable was barely long enough to fit.</figcaption>
</figure>

<h2 id="testing">
  <a class="heading-anchor" href="#testing">Testing<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>My testing with the GTX 1650 was brief, as the open source <code>nouveau</code> driver crashed on the Wayland desktop<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>, the proprietary
drivers under Fedora did not seem to work, and under Windows
the NVIDIA driver intentionally triggers the <code>error code 43</code> issue. <a href="https://egpu.io/forums/expresscard-mpcie-m-2-adapters/script-nvidia-error43-fixer/">A tweak exists for the Windows issue,</a> but
that didn&rsquo;t help much either.</p>
<p>The AMD Radeon RX 480 seems to work well out of the box on Windows 11, plug-and-play. However, it wasn&rsquo;t that stable,
but that could be related to the possibly faulty GPU itself or the power supply that can barely drive it under load.
Or the fact that Windows itself was running off of a 128GB Samsung USB 3.0 flash drive. Probably the latter, given that the
USB stick died as a result of this experiment.</p>









<figure class="center">
  <a href="/posts/2024/08/07/thinkpad-t430-egpu/media/egpu-win11.jpg">
    <img src="/posts/2024/08/07/thinkpad-t430-egpu/media/egpu-win11_hu_d6ea1e4bee937dd2.webp"
     width="800"
     height="600"
     loading="lazy"
     decoding="async"
     alt="Microsoft does not approve of this setup for at least 3 reasons.">

  </a>
  <figcaption class="center">Microsoft does not approve of this setup for at least 3 reasons.</figcaption>
</figure>

<p>On Fedora Linux 40, I discovered that eGPU-s aren&rsquo;t really plug and play. Sure, the image is there, but on my
ultrawide monitor I saw a whopping 11 frames per second! Turns out that by default GNOME on Wayland doesn&rsquo;t like
to use the eGPU as the main rendering device, even on more legitimate Thunderbolt-based eGPU setups.
It&rsquo;s a common enough problem that there exist <a href="https://github.com/hertg/egpu-switcher">multiple</a> <a href="https://github.com/ewagner12/all-ways-egpu">solutions</a> to this issue.</p>
<p>I didn&rsquo;t like any of them<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>, so I disabled the <code>i915</code> kernel driver responsible for driving the iGPU, which did the trick.
The 3440x1440p ultrawide monitor was being rendered by the eGPU and for the most part the experience was very smooth.</p>









<figure class="center">
  <a href="/posts/2024/08/07/thinkpad-t430-egpu/media/egpu-linux.jpg">
    <img src="/posts/2024/08/07/thinkpad-t430-egpu/media/egpu-linux_hu_3f10c6f9f7d8ff15.webp"
     width="800"
     height="600"
     loading="lazy"
     decoding="async"
     alt="It&#39;s booting Linux!">

  </a>
  <figcaption class="center">It&#39;s booting Linux!</figcaption>
</figure>

<p>The iGPU in the T430 can also run the ultrawide monitor at 60 Hz via the DisplayPort port on the dock, but it can&rsquo;t
run things at 60 FPS at all times because it&rsquo;s really, really weak.</p>
<p>The eGPU ran things much smoother, which made the whole setup feel more responsive
and great to use. It&rsquo;s not the fastest setup in the world, but the GUI running smoothly certainly makes it feel like one.</p>
<p>I didn&rsquo;t have a ton of games installed for testing, but I did give Minecraft a try, and it ran just fine. The CPU was
struggling when building new parts of the map, but the visuals were doing fine and I could see myself playing on this
setup for hours.</p>
<p>There were some things that weren&rsquo;t running smoothly even with the eGPU. For example, 1080p H.265 video playback was awfully
choppy. Using <code>radeontop</code> revealed around 80% GPU usage, so either the decoding engine is crap on this GPU, or the very limited
PCIe bandwidth and CPU-GPU data transferring is the culprit.</p>
<p>I also tested LibreELEC to see how it handles the eGPU and I&rsquo;m happy to report that it renders Kodi on it by default,
with the UI running very smoothly.</p>
<p>On Linux I also saw some stability issues and crashes, but those could also be down to the faulty GPU or the PSU
being underpowered. I can probably rule out the latter by limiting the GPU clock speeds, and <a href="https://wiki.archlinux.org/title/AMDGPU#Manually">the Arch wiki</a>
has some great instructions for that. Those toggles do work, but I noticed that GNOME can be a bit choppier when the GPU
switches between lower power states to higher ones.</p>
<p>The physical stability of this setup is questionable, especially if you use a bigger GPU. Most prefabricated cases
for this eGPU adapter assume that you&rsquo;re running it with an ATX/SFX PSU, so those are out of the question for me.
There exist some 3D printable designs out there, but they can sometimes be very specific to a particular setup or GPU,
so I&rsquo;d have to design my own.</p>









<figure class="center">
  <a href="/posts/2024/08/07/thinkpad-t430-egpu/media/egpu-setup-2.jpg">
    <img src="/posts/2024/08/07/thinkpad-t430-egpu/media/egpu-setup-2_hu_cd6d8588c5f6c78c.webp"
     width="800"
     height="600"
     loading="lazy"
     decoding="async"
     alt="Work in progress.">

  </a>
  <figcaption class="center">Work in progress.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/08/07/thinkpad-t430-egpu/media/egpu-setup-3.jpg">
    <img src="/posts/2024/08/07/thinkpad-t430-egpu/media/egpu-setup-3_hu_d7e920a5e3276e9.webp"
     width="800"
     height="600"
     loading="lazy"
     decoding="async"
     alt="I really like the look of the GPU, no need to worry about a case. Unless you have cats, which I do have. Uh-oh.">

  </a>
  <figcaption class="center">I really like the look of the GPU, no need to worry about a case. Unless you have cats, which I do have. Uh-oh.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/08/07/thinkpad-t430-egpu/media/egpu-setup-1.jpg">
    <img src="/posts/2024/08/07/thinkpad-t430-egpu/media/egpu-setup-1_hu_4c6b14621f6471a0.webp"
     width="800"
     height="600"
     loading="lazy"
     decoding="async"
     alt="The final setup.">

  </a>
  <figcaption class="center">The final setup.</figcaption>
</figure>

<p>The power consumption of this setup isn&rsquo;t great, unfortunately. Using a smart plug I measured the idle power of the
eGPU component to be about 20W. Typical desktop usage and video playback results in around 50W and peaks around 120-130W,
which is right on the limit of the shoddy PSU I&rsquo;m using.</p>
<p>If I had the choice to pick any GPU for this setup, then I&rsquo;d likely opt for a modern AMD GPU that didn&rsquo;t require additional
power via the 6/8 pin power connector as that option would likely be a lot more efficient while yielding similar performance.</p>
<p>I ended up disassembling the setup in the end, partly because I
misdiagnosed <a href="https://gitlab.freedesktop.org/mesa/mesa/-/issues/11566">a Mesa bug</a> to be a GPU issue,
and because the RX 480 really was acting weird from time to time, even with LibreELEC.</p>









<figure class="center">
  <a href="/posts/2024/08/07/thinkpad-t430-egpu/media/egpu-error.jpg">
    <img src="/posts/2024/08/07/thinkpad-t430-egpu/media/egpu-error_hu_680842c76ceb91fe.webp"
     width="800"
     height="600"
     loading="lazy"
     decoding="async"
     alt="That can&#39;t be good.">

  </a>
  <figcaption class="center">That can&#39;t be good.</figcaption>
</figure>

<p>Not all experiments end up being successful.</p>
<h2 id="conclusion">
  <a class="heading-anchor" href="#conclusion">Conclusion<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I think that these types of eGPU adapters are great even in 2024, but only for a small number of very specific use cases,
and with GPU-s that actually work.</p>
<p>If you already have an older laptop around, and a compatible spare GPU collecting dust, then this setup will make sense for
desktop or media playback machines, and perhaps gaming if your demands are not very high.</p>
<p>I don&rsquo;t suggest building this setup from scratch, it&rsquo;s probably not worth the money and hassle. Used gaming PC-s
that have similar specifications to this eGPU build, but with no funny PCIe bandwidth limitations, go for less than
200 EUR at this point.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><code>nouveau</code>? More like <code>novideo</code>, am I right?&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>not that they&rsquo;re bad, they are just made for a different type of setup.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>No HDMI port on the ThinkPad T430? No problem!</title><link>https://ounapuu.ee/posts/2024/07/08/thinkpad-t430-hdmi/</link><pubDate>Mon, 08 Jul 2024 13:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2024/07/08/thinkpad-t430-hdmi/</guid><description>Yes, you can fit a HDMI port in the ThinkPad T430, no crazy modifications required.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2024/07/08/thinkpad-t430-hdmi/media/cover_hu_4ddbd24444d473b3.jpg" width="1200" height="630" alt="No HDMI port on the ThinkPad T430? No problem!" /><p>The ThinkPad T430 has a few options for running it with an external display:</p>
<ul>
<li>VGA port, which is pretty much obsolete at this point</li>
<li>mini DisplayPort connector on the laptop itself</li>
<li>DVI or DisplayPort on a dock</li>
</ul>
<p>The mini DisplayPort port has annoyed me for as long as I&rsquo;ve had this machine.</p>
<p>Most places where I&rsquo;ve had to present something only offer an HDMI cable,
which means that I always have to carry a dongle around, and I keep forgetting
to bring one everywhere I happen to go.</p>
<p>Until now.</p>
<p>I have a few of these SATA HDD adapters that replace the optical drive on
the ThinkPad T430, and I discovered that my mini DisplayPort to HDMI adapter
can fit in one without a problem.</p>









<figure class="center">
  <a href="/posts/2024/07/08/thinkpad-t430-hdmi/media/adapter-out.jpg">
    <img src="/posts/2024/07/08/thinkpad-t430-hdmi/media/adapter-out_hu_1eee9bb795c46d67.webp"
     width="800"
     height="600"
     loading="lazy"
     decoding="async"
     alt="It&#39;s a snug fit so it doesn&#39;t fall out.">

  </a>
  <figcaption class="center">It&#39;s a snug fit so it doesn&#39;t fall out.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/07/08/thinkpad-t430-hdmi/media/adapter-closed.jpg">
    <img src="/posts/2024/07/08/thinkpad-t430-hdmi/media/adapter-closed_hu_c3b02f2f4bc02f66.webp"
     width="800"
     height="600"
     loading="lazy"
     decoding="async"
     alt="You&#39;d never know the adapter was in here.">

  </a>
  <figcaption class="center">You&#39;d never know the adapter was in here.</figcaption>
</figure>

<p>I don&rsquo;t currently have a need for a second SSD in my T430, so this &ldquo;mod&rdquo;
makes perfect sense to me.</p>
<p>I bet there is someone out there who is capable of routing an <em>actual</em> HDMI
port in place of this adapter. The existence of FHD mods for this laptop
suggests that this is possible. If you&rsquo;re <em>that</em> person and created that mod,
let me know.</p>
]]></content:encoded></item><item><title>About the time my ThinkPad T430 ran with an external GPU</title><link>https://ounapuu.ee/posts/2024/07/03/thinkpad-t430-egpu/</link><pubDate>Wed, 03 Jul 2024 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2024/07/03/thinkpad-t430-egpu/</guid><description>I had dumb ideas during my university days as well, but the budget was smaller.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2024/07/03/thinkpad-t430-egpu/media/cover_hu_edb0986a7ce4b00b.jpg" width="1200" height="630" alt="About the time my ThinkPad T430 ran with an external GPU" /><p>The ThinkPad T430 is not a remarkable laptop. It&rsquo;s thick, bulky and built like
a tank. I got mine in 2016 when the first university scholarship money dropped,
and it&rsquo;s still my backup laptop of choice.</p>
<p>Around 2017 I did something every reasonable poor computer science student
would do: I got an eGPU adapter for it to play some games. I never ended up
playing many games, but I loved tinkering with and testing this setup a lot.</p>
<p>These are my notes on the setup that I used to have. The notes used to be on
Reddit, but after yet another user-hostile change<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> I deleted my account
and all the content associated with it.</p>
<h2 id="the-specs">
  <a class="heading-anchor" href="#the-specs">The specs<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The ThinkPad T430 that I used had a CPU swap at one point, running an Intel
i7-3820QM. This upgrade doubled the CPU performance on the laptop compared
to the dual-core CPU that was in it before. This change was critical because
it opened the door to running lots of modern games at reasonable performance.</p>
<p>The eGPU adapter I ran with was the EXP GDC Beast v8.4, using the ExpressCard34
connector. This adapter turned the ExpressCard34 slot into a PCIe 2.0 x1 slot.
It&rsquo;s not really hotpluggable, but using this connector instead of something
like the internal Wi-Fi adapter slot made this setup much more portable. Done
gaming? Shut down, disconnect the ExpressCard cable and you&rsquo;re good to go!</p>
<p>This adapter is also a good example of connector reuse. The other end of the
ExpressCard plug is an HDMI port. Video signals require good quality cables, and
so does PCI Express.</p>









<figure class="center">
  <a href="/posts/2024/07/03/thinkpad-t430-egpu/media/egpu-connector.jpg">
    <img src="/posts/2024/07/03/thinkpad-t430-egpu/media/egpu-connector_hu_bcf4ea89c1948520.webp"
     width="800"
     height="600"
     loading="lazy"
     decoding="async"
     alt="Close-up of the ExpressCard34 connector.">

  </a>
  <figcaption class="center">Close-up of the ExpressCard34 connector.</figcaption>
</figure>

<p>The eGPU was once powered by a simple ATX PSU with the jumper wire set on the
24-pin connector, but eventually I bought a Dell DA-2 power supply. The adapter
has a power connector designed specifically for that pinout and it made the setup
a lot cleaner.</p>









<figure class="center">
  <a href="/posts/2024/07/03/thinkpad-t430-egpu/media/egpu-atx.jpg">
    <img src="/posts/2024/07/03/thinkpad-t430-egpu/media/egpu-atx_hu_c7488d9aa2981290.webp"
     width="800"
     height="600"
     loading="lazy"
     decoding="async"
     alt="The setup with an ATX PSU.">

  </a>
  <figcaption class="center">The setup with an ATX PSU.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/07/03/thinkpad-t430-egpu/media/egpu-psu.jpg">
    <img src="/posts/2024/07/03/thinkpad-t430-egpu/media/egpu-psu_hu_367576f51290bf0e.webp"
     width="800"
     height="600"
     loading="lazy"
     decoding="async"
     alt="The setup with a Dell DA-2 PSU. Much cleaner, isn&#39;t it?">

  </a>
  <figcaption class="center">The setup with a Dell DA-2 PSU. Much cleaner, isn&#39;t it?</figcaption>
</figure>

<p>At one point I got a fully metal case for the eGPU. It made the setup a lot cleaner
and the risk of the GPU tipping over while turned on was also substantially reduced.</p>









<figure class="center">
  <a href="/posts/2024/07/03/thinkpad-t430-egpu/media/egpu-case.jpg">
    <img src="/posts/2024/07/03/thinkpad-t430-egpu/media/egpu-case_hu_aaa43de0ce81aed3.webp"
     width="800"
     height="600"
     loading="lazy"
     decoding="async"
     alt="The case had no right to be this good for a janky setup.">

  </a>
  <figcaption class="center">The case had no right to be this good for a janky setup.</figcaption>
</figure>

<p>I tested a few GPU-s:</p>
<ul>
<li>AMD Radeon HD 6870</li>
<li>nVidia GTX 950</li>
<li>nVidia GTX 1080</li>
<li>AMD Radeon RX 480</li>
</ul>
<p>The HD 6870 was an old card back in 2017, and it did not run great at all with
this eGPU adapter. It was buggy and the performance sucked.</p>
<p>Loaner GPU-s, such as the RX 480 and GTX 1080 were much better experiences, as
long as you output the video signal to an external display right from the GPU.</p>
<p>The nVidia GTX 950 was the card I ran with for the longest time in this setup.
It worked well with this setup and had decent gaming performance.</p>









<figure class="center">
  <a href="/posts/2024/07/03/thinkpad-t430-egpu/media/gpuz-info.jpg">
    <img src="/posts/2024/07/03/thinkpad-t430-egpu/media/gpuz-info_hu_e074ca0f223b64ac.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="GPU-z info while the GPU is idle. Note that the PCIe link speed is set to gen 1.1 under &#34;Bus Interface&#34;.">

  </a>
  <figcaption class="center">GPU-z info while the GPU is idle. Note that the PCIe link speed is set to gen 1.1 under &#34;Bus Interface&#34;.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/07/03/thinkpad-t430-egpu/media/gpuz-linkspeed.jpg">
    <img src="/posts/2024/07/03/thinkpad-t430-egpu/media/gpuz-linkspeed_hu_c99b51ff47cc1c11.webp"
     width="800"
     height="600"
     loading="lazy"
     decoding="async"
     alt="When the GPU is under load, the PCIe connection switches to PCIe 2.0.">

  </a>
  <figcaption class="center">When the GPU is under load, the PCIe connection switches to PCIe 2.0.</figcaption>
</figure>

<h2 id="egpu-tech-tips">
  <a class="heading-anchor" href="#egpu-tech-tips">eGPU tech tips<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>You will want to use an eGPU adapter with an external monitor for the best performance.
The PCIe bandwidth is very limited in a setup like this. Using the internal
display of the laptop will mean that the final rendered image will have to be
sent back from the eGPU to the CPU. 1x PCIe 2.0 lane is about 500 MB/s of bandwidth.
Sending 60+ frames in the native resolution (1600x900) will eat it all up.
The higher the resolution on the internal display, the fewer frames you&rsquo;ll get.</p>
<p>I tested out these two scenarios in CSGO. The internal display yielded about 61 FPS
while an external display would result in 100-180+ FPS.</p>
<p>The PCIe link bandwidth was not actually that noticeable in a lot of games, such
as GTA V, Rocket League and Dirt 3.</p>
<p>In some games, such as Dirt Rally (2015), it did not matter what settings
you went with, something about the game made it run poorly no matter what
graphics settings you went with. In cases like that you might as well cap the
framerate to something tolerable like 30 FPS and crank the graphics settings up.</p>
<h2 id="vfio-on-a-laptop">
  <a class="heading-anchor" href="#vfio-on-a-laptop">VFIO on a laptop???<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This setup was also around the time when I first learned about <a href="https://youtu.be/16dbAUrtMX4">the magical world
of VFIO and GPU passthrough.</a></p>
<p>The logical continuation of that discovery was to try it out on my laptop, and
to my surprise it actually worked. I could pass the eGPU to a VM and play GTA V
on it!</p>
<p>This setup ran on Antergos OS, a flavor of Arch Linux. <a href="https://en.wikipedia.org/wiki/Antergos">It&rsquo;s been so long since then that the flavor
of Arch Linux is now discontinued.</a><sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>









<figure class="center">
  <a href="/posts/2024/07/03/thinkpad-t430-egpu/media/egpu-vfio.jpg">
    <img src="/posts/2024/07/03/thinkpad-t430-egpu/media/egpu-vfio_hu_b6f5e698500d56ab.webp"
     width="800"
     height="600"
     loading="lazy"
     decoding="async"
     alt="Antergos OS on the host, Windows 10 on the guest VM running Furmark.">

  </a>
  <figcaption class="center">Antergos OS on the host, Windows 10 on the guest VM running Furmark.</figcaption>
</figure>

<p>The laptop was ideal for this purpose as well. You have the integrated GPU, display,
keyboard and mouse for the host system, and you can pass USB devices and the eGPU
to the VM.</p>
<p>There were the usual VFIO tricks that I had to try out to avoid the dreaded
<code>error code 43</code> issue, but after that it was smooth sailing.</p>
<p>The performance was very similar to what I saw on the host system.</p>
<p><a href="/posts/2024/07/03/thinkpad-t430-egpu/media/egpu.webm">Here&rsquo;s a clip of me recording this setup while playing GTA V.</a> Smartphone cameras have
come a long way since then.</p>
<h2 id="expresscard-egpu-s-in-2024">
  <a class="heading-anchor" href="#expresscard-egpu-s-in-2024">ExpressCard eGPU-s in 2024?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>What got me started with writing down my notes were <a href="https://youtu.be/390FuyadPIw">some YouTube videos that were
made on this topic recently.</a></p>
<p>A pimped-out ThinkPad T430 can still be a perfectly serviceable computer in 2024,
and an eGPU will completely sidestep the problem of the weak integrated GPU.</p>
<p>The T430 is not powerful enough to natively run a 3440x1440 ultrawide monitor at
60 Hz. It is even struggling to do it at 30 Hz. An eGPU adapter with a modern
low-power GPU, such as the AMD Radeon RX 6400, could solve this issue nicely and
give the ThinkPad T430 a new lease of life.</p>
<p>I&rsquo;d be lying if I wasn&rsquo;t considering remaking this setup with everything I&rsquo;ve
learned 6 years later. GPU pricing sucks, though.<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>
They still sell these eGPU kits in various forms, however the price has doubled
or even tripled over the years.</p>
<p>If you&rsquo;re interested in building a similar setup, then do check out <a href="https://egpu.io/">egpu.io</a>.
With an M.2 or Thunderbolt connector you can build a much more capable eGPU setup.</p>
<p><a href="https://www.youtube.com/watch?v=SH9RUpK4SsM">If you can get a PCI Express signal out of a computer, then you can probably
rig a GPU up to it.</a> Unless you&rsquo;re
Jeff Geerling, in which case you might need to <a href="https://www.jeffgeerling.com/blog/2023/external-gpus-working-on-raspberry-pi-5">recompile the kernel a few times.</a></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>guess which one.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>validates my view that it&rsquo;s still a good idea to stick to the big distros
that these short-lived Linux distros are based off of.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>I&rsquo;ve survived two cryptocurrency mining hype cycles, and now we are in an
LLM bubble. Great.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>How to save an old printer from the e-waste pile with a Raspberry Pi</title><link>https://ounapuu.ee/posts/2024/06/12/save-old-printer/</link><pubDate>Wed, 12 Jun 2024 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2024/06/12/save-old-printer/</guid><description>Turning a 15-year-old Canon PIXMA MP250 printer into a network printer was much easier than I initially thought.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2024/06/12/save-old-printer/media/cover_hu_8b18de1695374b7c.jpg" width="1200" height="630" alt="How to save an old printer from the e-waste pile with a Raspberry Pi" /><p>A family member has a Canon PIXMA MP250 printer, originally released in 2009.
It has been a very reliable piece of hardware, especially for a printer.</p>
<p>Then came Windows 10. The printer would not work out of the box with it and
the official drivers got stuck during installation. Fiddling with the printer
in device manager, trying to install drivers via Windows Update and stars
aligning
got the printer to work again.</p>
<p>Then came Windows 11. Nothing I did could get it working now, and the printer
is not even officially supported by Canon on this version of Windows.</p>
<p>This printer works out of the box on any mainstream Linux distribution, and
the family member had been using the printer with Ubuntu for years,
but <a href="https://www.id.ee/en/article/install-id-software/">a certain piece
of important software in Estonia</a>
was not working properly a lot of the time, which triggered a switch to Windows.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>Quick searches online suggested that I could turn this printer into a network
printer, as long as I had some patience and a spare computer.</p>
<p>The idea is simple: take a spare computer, hook it up to the printer, install
CUPS on it, configure it and you&rsquo;re good to go!</p>
<p>I initially tested this setup with a Zimaboard running Fedora Server, but the
final solution used an old Raspberry Pi B+ running the latest version of
Raspberry Pi OS.</p>
<h2 id="how-to-set-it-up">
  <a class="heading-anchor" href="#how-to-set-it-up">How to set it up<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The steps will be similar with other pieces of hardware and Linux distributions,
you may just need to adjust a few commands and package names.</p>
<p>The steps are roughly based on these two guides:</p>
<ul>
<li><a href="https://m-hussainul-islam.medium.com/setting-up-network-printer-with-raspberry-pi-and-cups-d5a18e91b1f3">Setting up Network Printer with Raspberry Pi and CUPS</a></li>
<li><a href="https://pimylifeup.com/raspberry-pi-print-server/">Raspberry Pi Print Server: Setup a Network Printer</a></li>
</ul>
<p>If you&rsquo;re following along with a Raspberry Pi, set up your OS first. A minimal
installation with no graphical interface will be just fine.</p>
<p>Next, install <a href="https://www.cups.org/">CUPS</a> and optionally the right printer
drivers for your printer. The Canon PIXMA MP250 requires the
package <code>printer-driver-gutenprint</code>.</p>
<pre tabindex="0"><code>sudo apt install -y cups printer-driver-gutenprint
</code></pre><p>Make sure that CUPS is running.</p>
<pre tabindex="0"><code>sudo systemctl enable --now cups.service
</code></pre><p>Next, allow your user to manage printing. In this example, the username is <code>pi</code>.</p>
<pre tabindex="0"><code>sudo usermod -a -G lpadmin pi
</code></pre><p>Next, make sure that CUPS allows connections from other machines in your
network, and then restart it.</p>
<pre tabindex="0"><code>sudo cupsctl --remote-any
sudo systemctl restart cups
</code></pre><p>Find out the IP address of the Pi and navigate to it in your browser.
It will look something like <code>https://192.168.0.49:631</code>. The browser will likely
warn you about a self-signed certificate. It&rsquo;s safe to proceed.</p>
<p>If you haven&rsquo;t already connected your printer to the Raspberry Pi via USB, then
do so now.</p>
<p>Use the graphical interface to add a new printer under the <code>Administration</code>
section.
You&rsquo;ll need to enter the username and password for your user here. It&rsquo;s the same
user we used earlier, so in this example it&rsquo;s <code>pi</code>.</p>
<p>If you can&rsquo;t find your printer model listed in the <code>Add printer</code> view, then you
are probably missing the proper driver package, or your printer simply isn&rsquo;t
supported.</p>









<figure class="center">
  <a href="/posts/2024/06/12/save-old-printer/media/add-printer.png">
    <img src="/posts/2024/06/12/save-old-printer/media/add-printer_hu_6f3d551a1ca09828.webp"
     width="800"
     height="780"
     loading="lazy"
     decoding="async"
     alt="You should be able to find your printer in this view.">

  </a>
  <figcaption class="center">You should be able to find your printer in this view.</figcaption>
</figure>

<p>After adding your printer, you can use the CUPS web interface to print a test
page.</p>
<p>If that worked, then you should now be able to use any other device on the
network
to print!</p>
<p>On Linux and Windows, open the settings section that handles printing, and add a
new printer.
This networked printer should appear automagically, no additional configuration
required.</p>
<p>I also did testing using a Fairphone 5 running Android 13, and an iPhone X
running iOS 16. In both
cases the printing just worked.</p>









<figure class="center">
  <a href="/posts/2024/06/12/save-old-printer/media/test-page-windows.jpg">
    <img src="/posts/2024/06/12/save-old-printer/media/test-page-windows_hu_1a44a0e7cfd60776.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Test page printed using Windows 11.">

  </a>
  <figcaption class="center">Test page printed using Windows 11.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/06/12/save-old-printer/media/test-page-fedora.jpg">
    <img src="/posts/2024/06/12/save-old-printer/media/test-page-fedora_hu_686fc992f2a4cbdf.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Test page printed using Fedora. Yes, most of the colors in the colored ink
cassette have run out.">

  </a>
  <figcaption class="center">Test page printed using Fedora. Yes, most of the colors in the colored ink
cassette have run out.</figcaption>
</figure>

<p>I&rsquo;ve used the scanning functionality of this particular printer on Linux and it
has worked, however I forgot to test this out using this setup. I&rsquo;ll try to
test that out once I get the chance to try the printer out again.</p>
<h2 id="hardware-tech-tips">
  <a class="heading-anchor" href="#hardware-tech-tips">Hardware tech tips<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I first ran this setup with a Zimaboard to test the idea out. It worked very
well,
but as a simple print server it is a bit overkill.</p>
<p>I then replaced it with a Raspberry Pi B+, and while the printing works, I
discovered that a single ARM CPU core is apparently a limiting factor during
printing. A simple test page print pegged the CPU at 100%, and that&rsquo;s with the
700-&gt;1000 MHz overclock applied.</p>









<figure class="center">
  <a href="/posts/2024/06/12/save-old-printer/media/cups-high-cpu.png">
    <img src="/posts/2024/06/12/save-old-printer/media/cups-high-cpu_hu_dd8b775751f19ff5.webp"
     width="800"
     height="435"
     loading="lazy"
     decoding="async"
     alt="Raspberry Pi B&#43; struggling during printing.">

  </a>
  <figcaption class="center">Raspberry Pi B&#43; struggling during printing.</figcaption>
</figure>

<p>If you don&rsquo;t mind a slower printing speed, then any Raspberry Pi will be
absolutely OK.
More performant versions of Raspberry Pi will likely fare even better.</p>
<p>If you already have a small home server running, then you may want to hook the
printer up to that and set up the printer there. It&rsquo;s already running 24/7, so
it would be a perfect match.</p>
<p>One useful aspect of this setup is that you can queue up print jobs even when
the printer itself is powered off. Once you turn it on, the print jobs will
start, assuming that you have enough paper and ink.</p>
<p>Free open source software prolongs the useful life of hardware once again.
<a href="https://www.canalys.com/insights/end-of-windows-10-support-could-turn-240-million-pcs-into-e-waste">See y&rsquo;all in October 2025!</a></p>
<h2 id="2024-06-15-update">
  <a class="heading-anchor" href="#2024-06-15-update">2024-06-15 update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This post got featured on:</p>
<ul>
<li><a href="https://www.xda-developers.com/raspberry-pi-unsupported-printer-on-windows/">XDA Developers</a></li>
<li><a href="https://www.hackster.io/news/herman-ounapuu-brings-an-abandoned-printer-back-from-the-brink-with-a-raspberry-pi-90701ccb1ab9">hackster.io</a></li>
<li><a href="https://hackaday.com/2024/06/13/raspberry-pi-saves-printer-from-junk-pile/">Hackaday</a></li>
<li><a href="https://news.ycombinator.com/item?id=40657753">Hacker News</a></li>
</ul>
<p><a href="https://ubuntu.social/@till/112616367405119050">And even the leader of OpenPrinting, Till Kamppeter, chimed in!</a>
They also held a talk about <a href="https://fosdem.org/2024/schedule/event/fosdem-2024-1930-openprinting-we-make-printing-just-work-/">OpenPrinting at FOSDEM 2024.</a></p>
<p>Regarding scanning, seems like there&rsquo;s a separate project for that called <a href="http://www.sane-project.org/">SANE - Scanner Access Now Easy.</a></p>
<p><a href="https://openprinting.github.io/">Find out more about OpenPrinting here.</a></p>
<h2 id="2024-11-14-update">
  <a class="heading-anchor" href="#2024-11-14-update">2024-11-14 update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>A reader shared with me the <a href="https://github.com/kenyapcomau/p910nd">p910nd</a> project that can be used for a similar
purpose. I have not yet tried this myself.</p>
<p>There&rsquo;s even
an <a href="https://openwrt.org/docs/guide-user/services/print_server/p910ndprinterserver">OpenWRT page that describes its use on a router!</a></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>that might be about to change as there is an <a href="https://flathub.org/apps/ee.ria.qdigidoc4">unofficial Flatpak version</a> out there.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>They make USB-C cables with displays now!</title><link>https://ounapuu.ee/posts/2024/06/05/usb-c-cables/</link><pubDate>Wed, 05 Jun 2024 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2024/06/05/usb-c-cables/</guid><description>How to turn something as ordinary as an USB-C cable into something that a lot of nerds will want to buy.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2024/06/05/usb-c-cables/media/cover_hu_aa135222711e00a0.jpg" width="1200" height="630" alt="They make USB-C cables with displays now!" /><p>I&rsquo;ve reached a point in my setup where most of the devices that I use are
based around the coveted USB-C port. This meant that I had a valid reason to get
a few extra because I didn&rsquo;t yet have a stockpile of good USB-C cables.</p>
<p>That&rsquo;s when I found out that there exist cables that have little screens on them
that show the power consumption of the connected device. This is a great little
addition
to <a href="/posts/2024/05/02/smartplugs/">my power consumption monitoring addiction.</a>
It&rsquo;s also a simple way to understand if your device is charging at the speed
that you expect it to.</p>
<p>The cable I ordered cost 6.72 EUR. It is a bit stiff and hard to work with,
probably due to its supposed USB 4 support requiring actually good cabling and
shielding. It works well enough for an USB-C dock with a DisplayPort
connection that&rsquo;s running a 3440x1440 display at 60 Hz.</p>
<p>It&rsquo;s too early to give a definitive answer about the longevity of the cable.</p>
<p>You should be able to find these types of cables with a search query like &ldquo;USB 4
Cable with LED Display&rdquo;.</p>
<p>The paranoid side of me suspects that a cable like this one would be an ideal
place to hide a malicious chip. That&rsquo;s the only downside that I can think of.</p>
<p>If you&rsquo;re interested in going more in depth with measuring the power consumption
over USB, then you might want to look at other options.
<a href="https://github.com/fqueze/usb-power-profiling?tab=readme-ov-file#power-meters-known-to-work">This GitHub repository lists a few examples of these types of measuring devices.</a></p>
]]></content:encoded></item><item><title>ThinkPad T40: it can still run modern Linux, for now</title><link>https://ounapuu.ee/posts/2024/05/24/thinkpad-t40/</link><pubDate>Fri, 24 May 2024 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2024/05/24/thinkpad-t40/</guid><description>Not bad for a laptop originally released in 2003.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2024/05/24/thinkpad-t40/media/cover_hu_8db5f66bd4f9d1cd.jpg" width="1200" height="630" alt="ThinkPad T40: it can still run modern Linux, for now" /><p>I recently busted out my old ThinkPad T40, the last of the OG IBM ThinkPads.</p>
<p>I picked it up some time around my university days because I liked collecting
ThinkPads at the time, and it was a nice complement to my existing ThinkPad T60
and T430.</p>









<figure class="center">
  <a href="/posts/2024/05/24/thinkpad-t40/media/old-vs-new.jpg">
    <img src="/posts/2024/05/24/thinkpad-t40/media/old-vs-new_hu_ba2f2078cac7a2c3.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="20 years difference, but they still look similar. ">

  </a>
  <figcaption class="center">20 years difference, but they still look similar. </figcaption>
</figure>

<p>The battery is dead, but everything else still works. Checking a few online
listings,
I&rsquo;m surprised that I can still find batteries sold for this model. Probably old stock
that&rsquo;s been sitting around in a warehouse slowly discharging to death, but hey,
you might get lucky!</p>
<p>I also learned that I had
replaced the internal IDE hard drive with a 16 GB mSATA SSD via an adapter at
one point. I don&rsquo;t think they even sell SSD-s that small nowadays, but the size
feels age-appropriate.</p>
<p>I had already installed a flavor of Linux on this, but had completely forgotten
the password.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> This was a good excuse to wipe it and see if I can install a
modern mainstream Linux distro on it.</p>
<p>I went with Debian 12 (Bookworm). It&rsquo;s the newest Debian release, and unlike
many other distros, <a href="https://www.debian.org/distrib/netinst">they still offer 32-bit installers.</a></p>









<figure class="center">
  <a href="/posts/2024/05/24/thinkpad-t40/media/debian-install.jpg">
    <img src="/posts/2024/05/24/thinkpad-t40/media/debian-install_hu_713e76cda7f87c0c.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Modern Linux on an ancient laptop.">

  </a>
  <figcaption class="center">Modern Linux on an ancient laptop.</figcaption>
</figure>

<p>It had been a while since I had last installed Debian via the terminal user
interface.
The experience felt surprisingly snappy.</p>









<figure class="center">
  <a href="/posts/2024/05/24/thinkpad-t40/media/debian-wip.jpg">
    <img src="/posts/2024/05/24/thinkpad-t40/media/debian-wip_hu_257e194361a44b84.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="It&#39;s probably been 5&#43; years since I last installed Debian on a machine. What a throwback!">

  </a>
  <figcaption class="center">It&#39;s probably been 5&#43; years since I last installed Debian on a machine. What a throwback!</figcaption>
</figure>

<p>I went with the good old XFCE desktop environment. It strikes a good balance of
being lightweight, simple and usable.</p>
<p>Things were great until I started up Firefox. It works, but man, is it slow. All
the years of browser complexity have caught up with this laptop and made the web
barely usable.</p>
<p>It does pass the <em>techtipsy</em> test.</p>









<figure class="center">
  <a href="/posts/2024/05/24/thinkpad-t40/media/techtipsy.jpg">
    <img src="/posts/2024/05/24/thinkpad-t40/media/techtipsy_hu_6d8c1bd6ce6d177f.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Insert joke about recursion.">

  </a>
  <figcaption class="center">Insert joke about recursion.</figcaption>
</figure>

<p>This will likely be the last time this laptop runs a modern OS. 32-bit CPU-s
are losing support both in x86 and ARM ecosystems,
and <a href="https://en.wikipedia.org/wiki/Year_2038_problem">the year 2038</a> is not that
far away any more.</p>
<p>So long, and thanks for all the fish!</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>note to future self: the username is <code>thinkpad</code>, and the password
is <code>thinkpad</code>.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>The hidden media play/pause/stop keys on the Lenovo ThinkPad L390 Yoga</title><link>https://ounapuu.ee/posts/2024/05/07/thinkpad-l390-hidden-media-keys/</link><pubDate>Tue, 07 May 2024 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2024/05/07/thinkpad-l390-hidden-media-keys/</guid><description>How a few accidental key presses revealed the presence of media playback control keys on my ThinkPad L390 Yoga.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2024/05/07/thinkpad-l390-hidden-media-keys/media/cover_hu_a6666e239a0c3efa.jpg" width="1200" height="630" alt="The hidden media play/pause/stop keys on the Lenovo ThinkPad L390 Yoga" /><p>ThinkPad keyboards were once well known for their great layouts, feel and
functionality. This included the media playback control keys.</p>









<figure class="center">
  <a href="/posts/2024/05/07/thinkpad-l390-hidden-media-keys/media/T420.jpg">
    <img src="/posts/2024/05/07/thinkpad-l390-hidden-media-keys/media/T420_hu_3a0505d7634368c6.webp"
     width="463"
     height="302"
     loading="lazy"
     decoding="async"
     alt="Media playback control keys on a ThinkPad T420 keyboard.">

  </a>
  <figcaption class="center">Media playback control keys on a ThinkPad T420 keyboard.</figcaption>
</figure>

<p>On the ThinkPad T430, the new chiclet keyboard layout moved the media keys to
the function row. Still there, but less convenient to access.</p>









<figure class="center">
  <a href="/posts/2024/05/07/thinkpad-l390-hidden-media-keys/media/T430.jpg">
    <img src="/posts/2024/05/07/thinkpad-l390-hidden-media-keys/media/T430_hu_619b1ebe964a53f4.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Media playback control keys on a ThinkPad T430 keyboard.">

  </a>
  <figcaption class="center">Media playback control keys on a ThinkPad T430 keyboard.</figcaption>
</figure>

<p>The ThinkPad L390 Yoga doesn&rsquo;t have any visible function keys for controlling
media playback. However, I found that the play/pause and stop
buttons are still functional on the up/down arrow keys. Left/right arrow keys
act as <code>Home</code> and <code>End</code> keys.</p>
<p><code>evtest</code> output for play/pause key combination:</p>
<pre tabindex="0"><code>Event: time 1714716211.222697, type 4 (EV_MSC), code 4 (MSC_SCAN), value e3
Event: time 1714716211.222697, type 1 (EV_KEY), code 143 (KEY_WAKEUP), value 1
Event: time 1714716211.222697, -------------- SYN_REPORT ------------
Event: time 1714716212.291293, type 4 (EV_MSC), code 4 (MSC_SCAN), value a2
Event: time 1714716212.291293, type 1 (EV_KEY), code 164 (KEY_PLAYPAUSE), value 1
Event: time 1714716212.291293, -------------- SYN_REPORT ------------
Event: time 1714716212.366568, type 4 (EV_MSC), code 4 (MSC_SCAN), value a2
Event: time 1714716212.366568, type 1 (EV_KEY), code 164 (KEY_PLAYPAUSE), value 0
Event: time 1714716212.366568, -------------- SYN_REPORT ------------
Event: time 1714716214.026847, type 4 (EV_MSC), code 4 (MSC_SCAN), value e3
Event: time 1714716214.026847, type 1 (EV_KEY), code 143 (KEY_WAKEUP), value 0
Event: time 1714716214.026847, -------------- SYN_REPORT ------------
</code></pre><p><code>evtest</code> output for stop key combination:</p>
<pre tabindex="0"><code>Event: time 1714716254.780584, type 4 (EV_MSC), code 4 (MSC_SCAN), value e3
Event: time 1714716254.780584, type 1 (EV_KEY), code 143 (KEY_WAKEUP), value 1
Event: time 1714716254.780584, -------------- SYN_REPORT ------------
Event: time 1714716255.614775, type 4 (EV_MSC), code 4 (MSC_SCAN), value a4
Event: time 1714716255.614775, type 1 (EV_KEY), code 166 (KEY_STOPCD), value 1
Event: time 1714716255.614775, -------------- SYN_REPORT ------------
Event: time 1714716255.658388, type 4 (EV_MSC), code 4 (MSC_SCAN), value a4
Event: time 1714716255.658388, type 1 (EV_KEY), code 166 (KEY_STOPCD), value 0
Event: time 1714716255.658388, -------------- SYN_REPORT ------------
Event: time 1714716256.961601, type 4 (EV_MSC), code 4 (MSC_SCAN), value e3
Event: time 1714716256.961601, type 1 (EV_KEY), code 143 (KEY_WAKEUP), value 0
Event: time 1714716256.961601, -------------- SYN_REPORT ------------
</code></pre><p>On a very recent laptop, <a href="/posts/2024/04/12/lenovo-p14s-gen4/">the ThinkPad P14s gen4</a>, the media playback keys seem to
be gone. Left/right arrow keys do still work as <code>Home</code> and <code>End</code> keys, though.</p>
<p>If you also miss your media playback control keys on your ThinkPad, then hit
that <code>Fn</code> key and give it a go, you might get lucky!</p>
]]></content:encoded></item><item><title>Lenovo ThinkPad P14s gen 4 (AMD): it doesn't suck under Linux</title><link>https://ounapuu.ee/posts/2024/04/12/lenovo-p14s-gen4/</link><pubDate>Fri, 12 Apr 2024 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2024/04/12/lenovo-p14s-gen4/</guid><description>I'm just as surprised as you are.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2024/04/12/lenovo-p14s-gen4/media/cover_hu_26b1ddd0d2beb2d6.jpg" width="1200" height="630" alt="Lenovo ThinkPad P14s gen 4 (AMD): it doesn't suck under Linux" /><p>I&rsquo;ve had the opportunity to try out another new laptop at work. I&rsquo;ve used a brand new laptop recently, <a href="/posts/2022/11/21/hp-elitebook-845-g9/">and it was horrible.</a></p>
<p>But this time I&rsquo;m pleasantly surprised.</p>
<p>The <a href="https://www.lenovo.com/us/en/p/laptops/thinkpad/thinkpadp/thinkpad-p14s-gen-4-%2814-inch-amd%29-mobile-workstation/len101t0070">Lenovo ThinkPad P14s gen 4</a> has great specs:</p>
<ul>
<li>CPU: <a href="https://www.amd.com/en/products/apu/amd-ryzen-7-7840u">AMD Ryzen 7 PRO 7840U (8 cores, 16 threads, up to 5.1 GHz)</a></li>
<li>GPU: AMD Radeon 780M (integrated)</li>
<li>RAM: 32GB DDR5, soldered</li>
<li>SSD: 1 TB NVMe</li>
<li>Display: 1920x1200 resolution</li>
<li>Two USB-C ports</li>
<li>Two USB-A ports</li>
<li>HDMI out</li>
<li><strong>A full-sized Ethernet port!</strong></li>
</ul>
<p>I have used it for about a month at work, and so far I have not noticed anything outright broken about it.
The Fedora Linux 39 installation that I copied over from the previous laptop (Dell Latitude 5411) simply works, no modifications required.
The CPU is blazing fast. The GPU driver does not crash. No issues with Wi-Fi or Bluetooth so far. USB-C docks and
monitors that I have just work. The webcam is also functional and has an acceptable image quality for meetings. CPU and GPU temperature data is present with <code>lm-sensors</code>.</p>
<p>The build quality is what you&rsquo;d expect from a modern ThinkPad: better than consumer-grade crap, but not as solid as a ThinkPad T430.
The case has a soft-feeling light gray finish to it, which will likely look horrible after a few years of use.</p>
<p>The battery life is not great: don&rsquo;t expect to last a full 8-hour work day on battery with this thing. It&rsquo;s been years
since Apple has released Apple Silicon laptops with great battery life and somehow the rest of the industry still
hasn&rsquo;t caught up.</p>
<p>The fan has a really annoying high-pitched whine to it. You only hear it when pushing the CPU hard, like you&rsquo;d do
when compiling a legacy Java monolith, but in a quiet room it&rsquo;s really annoying. I&rsquo;m not even sure that the fan has to
be run that hard, the AMD Ryzen CPU inside is very efficient and can regulate its power consumption based on the current
temperature. You <em>can</em> tweak the fan curve on this laptop <a href="/posts/2022/09/26/minimum-viable-fan-control-script/">with a basic script.</a></p>
<p>I haven&rsquo;t tried functionality that I don&rsquo;t use myself, such as the fingerprint reader, so I cannot comment on that.</p>
<p>This laptop can also play games. I took an external SSD, installed <a href="https://bazzite.gg/">Bazzite on it (GNOME + gamemode version)</a>, set
everything up, and installed Forza Horizon 4 on it. It runs, and for an integrated GPU surprisingly well. I could push the
game to run with medium-high settings on the internal 1920x1200 display at a solid 60 FPS, with very rare dips below it.
That&rsquo;s even better than what I got with the Steam Deck, and the CPU running near the 5 GHz mark certainly contributed
to it. This makes the laptop a great candidate for a LAN party after work, unless you favor more demanding games, in
which case you might want to temper your expectations a little bit.</p>
<p>It&rsquo;s the first time that I&rsquo;ve had a brand new laptop that just works on Linux.
Hats off to the FOSS community for making this happen, AMD for getting their act
together, and Lenovo for not completely fucking it up this time.</p>
]]></content:encoded></item><item><title>Fairphone 5 long-term review: notes on 1 year and 3 months of use</title><link>https://ounapuu.ee/posts/2024/03/06/fairphone5/</link><pubDate>Wed, 06 Mar 2024 12:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2024/03/06/fairphone5/</guid><description>I voted with my wallet and bought a Fairphone 5. Here's what I've learned after 1 year and 3 months.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2024/03/06/fairphone5/media/cover_hu_a24d3fd2483e690.jpg" width="1200" height="630" alt="Fairphone 5 long-term review: notes on 1 year and 3 months of use" /><p>2025 June update: Fairphone support is <em><strong>unacceptably bad.</strong></em>
<a href="/posts/2025/06/17/fairphone-customer-care-experience/">I have detailed my experience in this post</a> where it took
me almost 4 months to get a refund for the product. As a result of this experience and flaws with the phone, I have lost
confidence in Fairphone, and have become skeptical of their ability to support their products long-term.</p>
<p>Changelog:</p>
<ul>
<li>2024-03-06: 58 days, initial post</li>
<li>2024-07-28: <a href="/posts/2024/03/06/fairphone5/#2024-07-28-update-202-days">202 days, still going strong!</a></li>
<li>2024-10-15: <a href="/posts/2024/03/06/fairphone5/#2024-10-15-update-281-days">281 days</a></li>
<li>2025-01-08: <a href="/posts/2024/03/06/fairphone5/#2025-01-08-update-1-year">1 year!</a></li>
<li>2025-04-14: <a href="/posts/2024/03/06/fairphone5/#2025-04-14-update-im-very-disappointed">I&rsquo;m very disappointed</a></li>
</ul>
<p>After months of contemplating I finally pulled the trigger and got myself
a <a href="https://shop.fairphone.com/fairphone-5">Fairphone 5.</a> The fact
that <a href="https://support.apple.com/guide/iphone/models-compatible-with-ios-17-iphe3fa5df43/ios">iPhone X stopped receiving major iOS updates certainly helped make that decision.</a></p>
<p><em>&ldquo;But why? My Xiaomi/Oneplus/Samsung/other glued-together device is like so much cheaper and faster and makes better
photos and the software is good after I completely format it and install a custom
ROM! <a href="https://www.youtube.com/watch?v=e-4RlKcinzc">And LinusTechTips said that it is trash!</a>&rdquo;</em></p>
<p>Well, it&rsquo;s simple: Fairphone is the one of the few companies out there that has a good track record of long-lasting
software support
<strong>and</strong> the phones they produce
are <a href="https://www.ifixit.com/Device/Fairphone_4">easily</a> <a href="https://www.ifixit.com/Device/Fairphone_5">repairable.</a></p>
<p><a href="https://blog.google/products/pixel/software-support-pixel-8-pixel-8-pro/">The competition is catching on regarding the software support side,</a>
but at this time those claims have
not been proven
yet, <a href="https://arstechnica.com/gadgets/2023/07/fairphone-3-gets-seven-years-of-updates-besting-every-other-android-oem/">unlike Fairphone.</a></p>
<p>They also make an active effort to make sure that the people behind the production of their phones are treated well.</p>
<p>These efforts need to be supported so that we don&rsquo;t end up
replacing our phones every few years because the manufacturer stopped releasing software updates or your battery died
and <a href="https://www.ifixit.com/Guide/Google&#43;Pixel&#43;8&#43;Battery&#43;Replacement/166180">you cannot easily replace it</a>.</p>
<p>This post is <strong>not sponsored</strong>, I bought this phone with my own money.
The iPhone X that I used before the Fairphone 5 got passed to someone else as an upgrade so this was not a vanity
purchase.</p>
<p><strong>tl;dr</strong> it&rsquo;s a perfectly <a href="https://en.wiktionary.org/wiki/cromulent">cromulent</a> phone that comes with some intentional
trade-offs that improve the
repairability and longevity while reducing the environmental impact and human suffering.</p>
<p>For those who
saw <a href="https://www.youtube.com/watch?v=e-4RlKcinzc">the LTT video</a>: Fairphone
made <a href="https://youtu.be/Q79Jl842B4g">a response video</a>
where they address most concerns and explain some design choices and trade-offs that they made with the Fairphone 5.</p>
<h2 id="the-mission">
  <a class="heading-anchor" href="#the-mission">The mission<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I really admire what Fairphone is trying to achieve.</p>
<p>If you&rsquo;re not sure what makes Fairphone special and different from
others, <a href="https://shop.fairphone.com/about-us">then give their website a read.</a> They also
held <a href="https://fosdem.org/2024/schedule/event/fosdem-2024-3362-open-source-for-sustainable-and-long-lasting-phones/">a talk at FOSDEM 2024</a>
which goes into more technical detail, describing their journey, goals, and challenges faced when building phones and
trying to support existing ones for as long as possible (Qualcomm sucks in this regard).</p>
<p>In short: they build sustainable phones that you can use and repair for a very long time, made by people that get paid
and treated fairly.</p>
<p>One of the not-so-fun facts from their FOSDEM 2024 talk was that it only takes a few extra dollars per phone to make
sure that the factory workers get paid a living wage. Makes you think: if that is all it takes, then why aren&rsquo;t other
companies doing it?</p>
<h2 id="my-use-case-for-a-phone">
  <a class="heading-anchor" href="#my-use-case-for-a-phone">My use case for a phone<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>It&rsquo;s important to recognize that everyone uses their phone differently. Some expect great performance, especially if
they play games. Some just want a good camera. Some just want to chat with their friends and family and share dank
memes.</p>
<p>My expectations are very modest: a phone should make adequate pictures, be reasonably fast and get regular software
updates.
This post is written from <strong>my</strong> perspective and will likely conflict with your views on what a phone should be, keep
that in mind.</p>
<p>The Fairphone 5 is the first one that I actually considered buying because it resembles a modern smartphone
with relatively few compromises. This is in part thanks to the rate at which smartphones innovate slowing down, both in
performance and the amount of new features that people actually care about.</p>
<h2 id="the-cool-factor">
  <a class="heading-anchor" href="#the-cool-factor">The cool factor<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I got the transparent edition, meaning that the backside of the phone is made out of semi-transparent plastic. I can at
a
moments notice flip the phone over and see the components, including the battery, SIM card and the microSD card.
Absolutely unpractical, still cool though.</p>









<figure class="center">
  <a href="/posts/2024/03/06/fairphone5/media/battery.jpg">
    <img src="/posts/2024/03/06/fairphone5/media/battery_hu_1607fe7379315634.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="What took me almost 2 hours on an iPhone X took me about 30 seconds on a Fairphone 5.">

  </a>
  <figcaption class="center">What took me almost 2 hours on an iPhone X took me about 30 seconds on a Fairphone 5.</figcaption>
</figure>

<p>I wouldn&rsquo;t do the &ldquo;I can replace the battery in 30 seconds&rdquo; party trick too much because I feel like the plastic clips
holding the back cover in are quite fragile and can break if too much force is used. <a href="https://shop.fairphone.com/shop/fairphone-5-back-cover-267?category=4#attr=94">You can easily buy replacement
covers, though.</a></p>
<h2 id="the-software">
  <a class="heading-anchor" href="#the-software">The software<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>My first proper smartphone was a <a href="https://www.gsmarena.com/samsung_galaxy_gio_s5660-3741.php">Samsung Galaxy Gio</a> back
in 2011.
It was also my first introduction to custom ROMs and over the years I ended up running all sorts of phones with various
flavours of Cyanogen and LineageOS. At one point certain banking and e-ID related apps began blocking users who decided
to run custom ROMs, so I went to the Apple side for a few years.</p>
<p>Why this preface? Well, it&rsquo;s because coming back to the Android side of things felt so refreshing and freeing.</p>
<p>I can:</p>
<ul>
<li>finally run a real version of Firefox on my phone
with <a href="https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/">an actual ad blocker.</a>
<ul>
<li>this is an absolute gamechanger for me and something I sorely missed on iOS</li>
</ul>
</li>
<li>install any app that I want.
<ul>
<li>there are also a lot more FOSS apps available.</li>
</ul>
</li>
<li>rearrange shortcuts on my home screen as I want to.
<ul>
<li>or hell, run a different launcher altogether</li>
</ul>
</li>
<li><a href="https://syncthing.net/">seamlessly back up photos from my phone to PC using Syncthing!</a></li>
<li>work with actual files!</li>
<li>cram in a 512GB microSD card.</li>
</ul>
<p>The Fairphone 5 ships with Android 13, with Android 14 upgrade currently scheduled to summer 2024. The base OS is quite
clean, the only preinstalled app (other than the Google stuff) is the &ldquo;My Fairphone&rdquo; app that shows information about
your device. That same app can also be used to verify that the functionality on your phone works, and yes, the speaker
testing ones get quite loud.</p>
<p>If you decide that the stock Android experience isn&rsquo;t for you, then know that this phone can easily run alternative
operating systems. At FOSDEM 2024 almost every alternative OS booth had one or more Fairphone 5 running, including
Ubuntu Touch and CalyxOS. It&rsquo;s clear that the FOSS community has embraced the Fairphone.</p>
<p>I was a bit sad to see that a lot of open source apps that I used to run or that come up in searches are unsupported or
out of date. In some cases modern forks exist, but overall the picture looks very discouraging, especially if I was
new to the scene.</p>
<h2 id="performance">
  <a class="heading-anchor" href="#performance">Performance<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The performance isn&rsquo;t great, but it&rsquo;s good for most activities. I can feel it being sluggish from time to time or with
certain animations.</p>
<p>This is due to an intentional trade-off that Fairphone made: to be able to properly support this device for a very long
time, they
had to go with a Qualcomm SoC that gets long-term support, and that ruled out the ones that provide the best
performance. They ended up
putting in a chip that was designed for IoT applications, funnily enough. If having a slightly slower phone is what is
needed to run this phone for 5+ years, then it&rsquo;s a worthwhile trade-off in my view.</p>
<p>Fairphone <a href="https://fosdem.org/2024/schedule/event/fosdem-2024-3362-open-source-for-sustainable-and-long-lasting-phones/">highlighted the OEM support issue in their FOSDEM 2024 talk</a>
in case you&rsquo;re curious about why this trade-off needed to be made.
My opinionated <strong>tl;dw</strong>: we have to get OEM-s to either open source
the proprietary parts or hit them with some regulations and enforcement so that they do support the chips they produce
for longer.</p>
<h2 id="battery-life">
  <a class="heading-anchor" href="#battery-life">Battery life<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The battery life is what you would expect from a typical smartphone: 1-2 days of normal use, but I once stretched it to
almost 4 days during a
time when I used my phone very little. Do note that this is highly dependent on your usage patterns, if you do constant
video calls then you can&rsquo;t expect the battery to last much.</p>
<p>If you want to extend the longevity of your battery, then there is an option to limit charging to 80% in battery
settings. I&rsquo;ve recently enabled it because it doesn&rsquo;t impact my use of the phone much. Let&rsquo;s see how it fares in a few
years.</p>
<h2 id="size-and-feeling">
  <a class="heading-anchor" href="#size-and-feeling">Size and feeling<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This phone is big. Really big. Biggest one I&rsquo;ve had yet.</p>
<p>I actually prefer smaller phones, something like the iPhone 13
mini size would be ideal (Apple stopped making smaller phones that aren&rsquo;t iPhone 7 reskins after that so that&rsquo;s not an
option any longer). When I was in
a store that sold iPhones, I compared my phone to the latest iPhone 15 offerings and was surprised to see that my phone
was <a href="https://www.gsmarena.com/size-compare-3d.php3?idPhone1=12558&amp;idPhone2=12540">about the same size as an iPhone 15 Plus.</a>
Hopefully we&rsquo;ll see smaller Fairphones in the future, all while not introducing too many compromises.</p>
<p>Some people are surprised at the thickness of the Fairphone 5. Yes, it&rsquo;s thicker than most of the competitors, but note
that with other phones you&rsquo;ll likely buy a separate case for the phone, so you&rsquo;ll end up with something just as thick
anyway. At least with Fairphone 5 you don&rsquo;t have a glass backside that easily shatters if you drop it.</p>
<h2 id="camera">
  <a class="heading-anchor" href="#camera">Camera<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>When I bought the phone, I expected only one thing from the Fairphone 5: its camera should be better than the one on the
iPhone X.
GSMArena comparisons and reviews by others looked promising</p>
<p>The camera on the Fairphone is acceptable. I don&rsquo;t have proper photography education, but in most cases the Fairphone
makes OK pictures. In low light situations it seems to be inferior to flagship phones from other companies, which
may often end up with smudged pictures. At least it <em>has</em> a low light mode, something that my previous phone (iPhone X)
lacked. The colors look funky sometimes and are oversaturated.</p>
<p>This is a selection of photos made with the Fairphone 5. Thumbnails are compressed to avoid unnecessary bandwidth. Click
on the image to view the original, full-sized version.</p>
<p>








<figure class="center">
  <a href="/posts/2024/03/06/fairphone5/media/camera-0.jpg">
    <img src="/posts/2024/03/06/fairphone5/media/camera-0_hu_58e9593748461f7f.webp"
     width="300"
     height="400"
     loading="lazy"
     decoding="async"
     alt="Click on the image to see the full version.">

  </a>
  <figcaption class="center">Click on the image to see the full version.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/03/06/fairphone5/media/camera-1.jpg">
    <img src="/posts/2024/03/06/fairphone5/media/camera-1_hu_a7d6a1b65531e347.webp"
     width="300"
     height="400"
     loading="lazy"
     decoding="async"
     alt="Click on the image to see the full version.">

  </a>
  <figcaption class="center">Click on the image to see the full version.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/03/06/fairphone5/media/camera-2.jpg">
    <img src="/posts/2024/03/06/fairphone5/media/camera-2_hu_7855054aacc7681b.webp"
     width="300"
     height="400"
     loading="lazy"
     decoding="async"
     alt="Click on the image to see the full version.">

  </a>
  <figcaption class="center">Click on the image to see the full version.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/03/06/fairphone5/media/camera-3.jpg">
    <img src="/posts/2024/03/06/fairphone5/media/camera-3_hu_cf5261a539fe118f.webp"
     width="300"
     height="400"
     loading="lazy"
     decoding="async"
     alt="Click on the image to see the full version.">

  </a>
  <figcaption class="center">Click on the image to see the full version.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/03/06/fairphone5/media/camera-4.jpg">
    <img src="/posts/2024/03/06/fairphone5/media/camera-4_hu_36623f884314c5fd.webp"
     width="300"
     height="400"
     loading="lazy"
     decoding="async"
     alt="Click on the image to see the full version.">

  </a>
  <figcaption class="center">Click on the image to see the full version.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/03/06/fairphone5/media/camera-5.jpg">
    <img src="/posts/2024/03/06/fairphone5/media/camera-5_hu_e94bc3e3b707a5b5.webp"
     width="533"
     height="400"
     loading="lazy"
     decoding="async"
     alt="Click on the image to see the full version.">

  </a>
  <figcaption class="center">Click on the image to see the full version.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/03/06/fairphone5/media/camera-6.jpg">
    <img src="/posts/2024/03/06/fairphone5/media/camera-6_hu_afd3be1ff1f9152c.webp"
     width="300"
     height="400"
     loading="lazy"
     decoding="async"
     alt="Click on the image to see the full version.">

  </a>
  <figcaption class="center">Click on the image to see the full version.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/03/06/fairphone5/media/camera-7.jpg">
    <img src="/posts/2024/03/06/fairphone5/media/camera-7_hu_b34f5913c4a684b8.webp"
     width="533"
     height="400"
     loading="lazy"
     decoding="async"
     alt="Click on the image to see the full version.">

  </a>
  <figcaption class="center">Click on the image to see the full version.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/03/06/fairphone5/media/camera-8.jpg">
    <img src="/posts/2024/03/06/fairphone5/media/camera-8_hu_1920f48a87af9d91.webp"
     width="300"
     height="400"
     loading="lazy"
     decoding="async"
     alt="Click on the image to see the full version.">

  </a>
  <figcaption class="center">Click on the image to see the full version.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/03/06/fairphone5/media/camera-9.jpg">
    <img src="/posts/2024/03/06/fairphone5/media/camera-9_hu_d02a0a4894f4cb5d.webp"
     width="533"
     height="400"
     loading="lazy"
     decoding="async"
     alt="Click on the image to see the full version.">

  </a>
  <figcaption class="center">Click on the image to see the full version.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/03/06/fairphone5/media/camera-10.jpg">
    <img src="/posts/2024/03/06/fairphone5/media/camera-10_hu_46dba5981191f586.webp"
     width="300"
     height="400"
     loading="lazy"
     decoding="async"
     alt="Click on the image to see the full version.">

  </a>
  <figcaption class="center">Click on the image to see the full version.</figcaption>
</figure>
</p>
<h2 id="the-headphone-jack">
  <a class="heading-anchor" href="#the-headphone-jack">The headphone jack<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I feel like I&rsquo;m obliged to mention that this Fairphone doesn&rsquo;t have a headphone jack. As someone who spent a few years
on
iPhones, this one doesn&rsquo;t bother me too much.</p>
<h2 id="usb-c-port">
  <a class="heading-anchor" href="#usb-c-port">USB-C port<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I plugged it into an USB-C dock and it actually output to an external display in portrait mode. Not sure how practical,
but really cool.</p>
<p><a href="https://shop.fairphone.com/shop/fairphone-5-usb-c-port-268?category=4#attr=">Oh, and the USB-C port is easily replaceable.</a></p>
<h2 id="price">
  <a class="heading-anchor" href="#price">Price<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If you only focus on the spec sheet and compare the Fairphone 5 to the competition, then it will strike you as an
expensive
phone, coming in at <strong>699 EUR.</strong></p>
<p>It <em>is</em> expensive, but that&rsquo;s a result of a lot of small things. Fairphone tries to do their best to source the raw
materials
from ethical sources and that narrows down your selection by a lot. Add to that living wages to the factory workers,
more repairable components, declining to add sponsored apps/ads into the OS and that&rsquo;s the result.</p>
<p>If you take the price and divide it by the number of years that you expect to get out of this phone (5-10 years),
then the price is likely much more comparable to the competition.</p>
<p>If a higher purchase price results in less human suffering and a longer lifetime of the device, then so be it.</p>
<h2 id="schematics">
  <a class="heading-anchor" href="#schematics">Schematics<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p><a href="https://www.fairphone.com/en/2024/01/24/have-you-seen-the-schematics-for-the-fairphone-5/">They provide schematics</a> for
the phone (direct
link <a href="https://www.fairphone.com/wp-content/uploads/2024/02/Fairphone5_Information-on-how-to-repair-and-recycle-SCH-09-02-2024.pdf">here</a>).</p>
<p>My hours of watching <a href="https://www.youtube.com/channel/UCl2mFZoRqjw_ELax4Yisf6w">Louis Rossmann</a> do board level repairs
have taught me that this is <a href="https://store.rossmanngroup.com/schematics-or-die-t-shirt.html">a very good thing.</a></p>
<h2 id="its-not-perfect">
  <a class="heading-anchor" href="#its-not-perfect">It&rsquo;s not perfect<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Every phone has issues.</p>
<p><a href="https://arstechnica.com/gadgets/2023/10/apple-and-devs-plan-software-fixes-for-iphone-15-pro-overheating-issues/">iPhone 15 had overheating problems.</a></p>
<p>That one iPhone SE 2020 that I ran for a few months had a hard to reproduce system board issue that made the phone
inoperable for 5+ minutes in random situations.</p>
<p>Here are some issues that I&rsquo;ve noticed while using the Fairphone 5</p>
<h3 id="sim-card">
  <a class="heading-anchor" href="#sim-card">SIM card<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>After I set up the phone, the SIM card would stop functioning properly after a few hours of use. Reseating the SIM card
did not work, and I was quite frustrated because I was expecting to send the phone back just after I set it all up.
Luckily it seem to be a known issue
and <a href="https://support.fairphone.com/hc/en-us/articles/10375226431505-Troubleshoot-the-SIM-Card-s">there is an official support article that covers it.</a>
My SIM card is much older than the specified 2 years, but I couldn&rsquo;t be arsed with replacing it yet so I used pure
ethanol to clean the contacts on the SIM card, popped it back in and it has worked with absolutely no issues ever since.
I&rsquo;m glad that I got this easily fixed, but for a normal customer this would be a very frustrating experience so
hopefully
there is something that Fairphone can do to fix and/or avoid this in the future.</p>
<h3 id="the-display">
  <a class="heading-anchor" href="#the-display">The display<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>The display of the Fairphone 5 supports 90 Hz refresh rate, but ships with it set to 60 Hz. I&rsquo;ve heard that most other
phones do something similar with the likely reason being the negative impact that high refresh rate displays have on the
battery
life. At the time of writing, however, there is a known issue with the 90 Hz mode which can actually result in more lag
and a worse user experience. I&rsquo;ve set the display back to 60 Hz for this reason. Luckily this is something that can
probably be fixed with a software update.</p>
<p>The automatic brightness setting is quite bad, especially when compared to any iPhone. The brightness jumps around a lot
in darker conditions and it&rsquo;s very irritating when driving because random street lights and cars seem to trigger the
sensor often. Again, probably something that can be fixed in software.</p>
<h3 id="software-stability">
  <a class="heading-anchor" href="#software-stability">Software stability<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>Overall the software is stable, but there was this one time when the phone crashed and rebooted unexpectedly. It was
triggered while playing music and opening a Snapchat notification. Nothing serious and has only happened once in an
almost two-month period, but still noteworthy.</p>
<h3 id="the-google-crapware">
  <a class="heading-anchor" href="#the-google-crapware">The Google crapware<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>This isn&rsquo;t really a Fairphone issue, but more of an Android gripe. I still have to mention it though. The Android 13
experience has started resembling the Windows experience. I had to toggle off countless &ldquo;features&rdquo; to turn off most
of the Google crapware that ships with the phone, and even then I still have to stare at the unremovable Google Search
bar at the home screen. That thing takes up so much useful screen real estate and is absolutely useless to me. It <em>used</em>
to be removable according to some discussions I found online, but I guess Google noticed that feedback and made it a
permanent fixture on the home screen with an update. Absolutely disgusting. You <em>can</em> work around this by using a
launcher
that&rsquo;s not affected by Google. <a href="https://kvaesitso.mm20.de/">Kvaesitso</a> is a FOSS one that seems to work well enough for
me.</p>
<h2 id="final-thoughts">
  <a class="heading-anchor" href="#final-thoughts">Final thoughts<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Fairphone 5 is what you get when you focus on delivering a phone with long-term support and repairability in mind, all
while doing your best to treat your workers well. This does mean that you&rsquo;ll be making some trade-offs.</p>
<p>You won&rsquo;t get the best performance, the best camera, or the smallest size. What you get in return is the ease of
repairability,
years of software updates with a proven track record, and the knowledge that at least those workers who assembled your
phone get paid a living wage.</p>
<p>If you don&rsquo;t expect much from a phone and are willing to pay more for a phone that you can use for a lot longer, then
the Fairphone 5 is a good option.</p>
<p>Can I make it to 2031 with this phone? I&rsquo;ll definitely give it a try.</p>
<h2 id="2024-07-28-update-202-days">
  <a class="heading-anchor" href="#2024-07-28-update-202-days">2024-07-28 update: 202 days<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>My Fairphone 5 is still going strong. Here are some notes after 202 days of use.</p>
<h3 id="android-14">
  <a class="heading-anchor" href="#android-14">Android 14<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>The promised Android 14 update is here and on time. The upgrade took a while to install but was boring, in a positive
way. Nothing I relied on broke and the interface looks more-or-less the same.</p>
<p>The only aspect I&rsquo;m not happy about with the Android 14 update
is <a href="https://9to5google.com/2023/09/21/pixel-webcam-android-14-qpr1/">the USB webcam mode feature not being present.</a>
It&rsquo;s possible that it&rsquo;s an optional feature of Android 14, and none of the Fairphone 5 materials indicate it being
included.</p>
<h3 id="video-playback-issues">
  <a class="heading-anchor" href="#video-playback-issues">Video playback issues<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>I&rsquo;ve noticed some oddities regarding video playback. The video playback can be choppy on higher resolutions, especially
when I run them at 2x speed. Lower resolutions are fine. Sometimes the issues only occur with certain encodings, like
H.265, or audio tracks where I can only seem to hear certain audio channels.</p>
<h3 id="camera-in-action">
  <a class="heading-anchor" href="#camera-in-action">Camera in action<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>The camera doesn&rsquo;t seem to be the best option for point-and-shoot situations where there is a lot of movement or where
the lighting conditions are bad. I&rsquo;ve taken my fair share of blurry photos as a result. The included microphone also
seems lacking in real life use, especially when I accidentally cover them with my fingers.</p>
<p>If I could pick one improvement for the next Fairphone, then it will have to be the camera. A lot of people care about
camera quality and might rule out getting a Fairphone as a result.</p>
<p>At least with the pro mode you have a lot of control over the camera, which is great for more stationary shots.</p>
<h3 id="durability">
  <a class="heading-anchor" href="#durability">Durability<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>I have nothing bad to say about the durability here. I have dropped it a few times already and as a result I have two
small dings on the aluminium frame.</p>
<p>The backside has also held firm. After one fall a couple of clips came loose, but I could easily pop them back in.</p>
<p>Various oils and finger grease have an interesting effect with the transparent case, resulting in the see-through
effect being better. The grip has gotten better with time and negates any need for a separate case. The Fairphone 5
is still a big phone and not that easy to handle one-handed, but the grippy backside makes up for part of it.</p>
<p>The display glass has a few scratches, but nothing too bad. I can&rsquo;t seem to find any serious scratches on the backside.</p>
<h3 id="battery">
  <a class="heading-anchor" href="#battery">Battery<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>The battery has held up fine. I turned off the battery saving feature because of how simple it is to replace the
battery,
enabled fast charging because it&rsquo;s really handy, and stopped showing the battery percentage on the notification bar to
reduce battery anxiety.</p>
<h3 id="5g">
  <a class="heading-anchor" href="#5g">5G<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>I switched mobile service providers during this time and could finally test the 5G capabilities of this phone.
Since I went with the cheapest option at the time, then the signal strength will not be as good as with other ones,
but at least I know it works in Estonia.</p>
<p>Maximum speeds I&rsquo;ve seen are around 250 Mbit/s. Could be limited by Fairphone 5, or the service provider (more likely
option).</p>
<h3 id="display-brightness">
  <a class="heading-anchor" href="#display-brightness">Display brightness<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>At some point I got an update that seems to have improved the automatic brightness feature. It&rsquo;s not as jarring as
before,
especially at low light levels. I&rsquo;m not sure which update fixed it, but I haven&rsquo;t noticed any annoyances with it for
a long time.</p>
<h2 id="2024-10-15-update-281-days">
  <a class="heading-anchor" href="#2024-10-15-update-281-days">2024-10-15 update: 281 days<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I have one gripe with the software support on Fairphone 5.</p>
<p>The security updates are lagging behind way too much.</p>
<p>They&rsquo;ve always come with a small delay of a few weeks, but it took over a month to get the 5th of September security
patches. These are supposed to be <strong><em>monthly.</em></strong></p>
<p>I finally received the 5th of September security patches today, <strong>15th of October.</strong>
<a href="https://source.android.com/docs/security/bulletin/2024-10-01">There&rsquo;s already a new security bulletin out with the October patches,</a>
which I don&rsquo;t have on my phone.</p>
<p>It&rsquo;s better than no updates at all, but this does not bode well for future long-term software support.</p>
<h2 id="2025-01-08-update-1-year">
  <a class="heading-anchor" href="#2025-01-08-update-1-year">2025-01-08 update: 1 year<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Well, I&rsquo;ve successfully made it 1 year with the Fairphone 5.</p>
<p>Overall I&rsquo;m impressed with how little the phone gets in the way. It just gets along with doing normal phone things.</p>
<p>Security updates are still lagging behind, so that&rsquo;s a bit concerning.</p>
<p>Camera is still not the best, but not the worst.</p>
<p>The USB-C port is holding on nicely, but largely thanks to a few pocket lint cleanings that I&rsquo;ve done using a small
needle.</p>
<p>There have been a few unexpected quick reboots on the Android layer, but these are rare enough that I end up forgetting
about them. Seems to happen about once a quarter.</p>
<p>I have dropped the phone at least 100 times at this point, mainly due to my clumsiness and open pockets.
Fairphone 5 has shrugged it all off.</p>
<p>The Fairphone app also reminded me of my phone-versary and let me know that I&rsquo;m 20% there towards my goal of using the
Fairphone 5 for <em>at least</em> 5 years. It also asked for feedback regarding the Fairphone experience, which some may find
annoying. I see it as a positive sign that they&rsquo;re at least trying to collect feedback to improve this and any future
Fairphones.</p>
<p>At this point in time, I&rsquo;m happy with my Fairphone 5, and have not considered replacing it. It&rsquo;s not perfect, but it
gets the job done.</p>
<p>Here&rsquo;s a cat picture to celebrate the occasion.</p>









<figure class="center">
  <a href="/posts/2024/03/06/fairphone5/media/1-year-anniversary.jpg">
    <img src="/posts/2024/03/06/fairphone5/media/1-year-anniversary_hu_f005e3768f2176b.webp"
     width="1000"
     height="750"
     loading="lazy"
     decoding="async"
     alt="Shot on Fairphone 5.">

  </a>
  <figcaption class="center">Shot on Fairphone 5.</figcaption>
</figure>

<h2 id="2025-04-14-update-im-very-disappointed">
  <a class="heading-anchor" href="#2025-04-14-update-im-very-disappointed">2025-04-14 update: I&rsquo;m very disappointed<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I don&rsquo;t take video recordings often, but when I do, it&rsquo;s about content that I care about. Unfortunately, the Fairphone 5
is butchering them.</p>
<p>The HDR feature is ruining the framerate of the videos. The sound is seriously lacking in videos, rendering some videos
unusable, <a href="https://forum.fairphone.com/t/massive-sound-issues-in-recording-videos/107582">and unfortunately I&rsquo;m not alone in this regard.</a>
The autofocus keeps kicking in constantly in videos with no good reason, resulting in lots of frames having blurry
sections in them, repeatedly.</p>
<p>It&rsquo;s very hard to take good non-blurry photos with the Fairphone 5. Definitely not a point-and-shoot camera.</p>
<p>The security updates are lagging behind by over a month, constantly. It&rsquo;s April 14th, and I&rsquo;m still on the March 5th
security patch level. There is no news about Android 15 coming to the
phone, <a href="https://calyxos.org/news/2025/04/09/qpr2-fp-moto-pixel5/">while the people behind CalyxOS have shipped an Android 15 based version on the Fairphone 5.</a></p>
<p>The phone has rebooted on me at least 4 times within the last month, which is unusually high. The worst one was while I
was driving.</p>
<p><a href="/posts/2025/03/17/fairbuds-xl-review/#customer-care-experience">And I&rsquo;m still waiting for that refund on the Fairbuds XL.</a>
And yet again, <a href="https://forum.fairphone.com/t/how-do-i-apply-for-a-refund/117613">I&rsquo;m not alone in this.</a></p>
<p>I&rsquo;m starting to feel like in order to create a well performing, sustainable and repairable phone, we first need to take
a good phone and <em>then</em> make it repairable and support it for a long time. Fairphone is trying it the other way around,
and it does not seem to be working out.</p>
<p>Guess I&rsquo;ll have to get a glued together phone again, at least that will work well until its battery dies along with its
software support.</p>
<h2 id="the-experiment-has-ended">
  <a class="heading-anchor" href="#the-experiment-has-ended">The experiment has ended<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I have stopped using the Fairphone 5. It will likely still find some use as a test bed for alternative operating systems
or using it as a very fancy baby monitor. I just need a phone that I can rely on.</p>
<p>Sustainability and repairability does not matter if the product is unusable.</p>
<p>For those wondering, I bought a Google Pixel 8a as a replacement. It addresses the shortcomings of the Fairphone 5 and
the battery will be completely dead by the time the software support runs out, which should be in 5-6 years or so.</p>
]]></content:encoded></item><item><title>My cat water fountain comes with a spicy USB power adapter</title><link>https://ounapuu.ee/posts/2023/12/19/spicy-usb-adapter/</link><pubDate>Tue, 19 Dec 2023 14:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2023/12/19/spicy-usb-adapter/</guid><description>It turns out that you can't trust any USB type A power adapter to be within spec.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2023/12/19/spicy-usb-adapter/media/cover_hu_fcf88f3f7c17bdbd.jpg" width="1200" height="630" alt="My cat water fountain comes with a spicy USB power adapter" /><p>It turns out that you can&rsquo;t trust any USB type A power adapter to be within spec.</p>
<p>I have a <a href="https://www.catit.com/products/drinking-fountains/flower-fountain/">Catit Flower Fountain</a>
for my two adorable cats. The idea of a water fountain for cats may sound odd,
but having one really helps with cats staying hydrated and that alone avoids all
sorts of health issues.</p>
<p>At one point I wanted to see if I could create a sort of a DIY UPS for the water fountain. It would be quite bad if I
was at work and a power outage results in cats not being able to drink water (they don&rsquo;t really care for normal water
bowls after getting the fountain). I had some battery banks available for testing, and I noticed that the pump for the
water fountain is powered over a USB type A cable.</p>
<p>Should be easy, right?</p>
<p>Apparently not.</p>
<p>I tried multiple different power banks between the water fountain and the
USB power adapter that came with it, and all of them would work for a bit
and turn off after some time. I didn&rsquo;t think much of it back then, but I did
notice that two of the power banks I used started glitching out during
normal use elsewhere.</p>
<p>Months later, I attached an IKEA power strip to the side of my work desk
to make charging various things easier. It also has two USB type A ports and the
water fountain was near the desk temporarily, so I plugged it in there. It worked,
but I noticed that the water fountain was quieter now, the &ldquo;hum&rdquo; that it makes
was almost gone. That made me curious, so I used the original adapter again
and the &ldquo;hum&rdquo; was there again.</p>
<p>I took a look at the original power adapter specs to see if there&rsquo;s a difference
in the amount of current that these two different USB power sources provide.
What I discovered instead was that the power adapter that comes with the fountain
outputs a solid <em><strong>7.5V</strong></em>. I measured the voltage with my multimeter as well,
and it reports <em><strong>7.71V</strong></em>. USB type A ports typically provide about 5V, with a maximum
of 5.25V from my observations in the real world.</p>









<figure class="center">
  <a href="/posts/2023/12/19/spicy-usb-adapter/media/image0.jpg">
    <img src="/posts/2023/12/19/spicy-usb-adapter/media/image0_hu_11377618365e531c.webp"
     width="954"
     height="595"
     loading="lazy"
     decoding="async"
     alt="Yikes.">

  </a>
  <figcaption class="center">Yikes.</figcaption>
</figure>

<p>7.5V over USB type A is <em>probably</em> not safe with other devices, especially since a normal person
only sees a USB port on the adapter and thinks that it is perfectly safe to use
it to charge their phone or other devices. Yes, properly implemented USB type <em><strong>C</strong></em>
ports can negotiate all sorts of voltages, but this is not one of them.</p>
<p>Probably explains why my power banks are acting odd now and glitching out.</p>
<p>This is why I have trust issues.</p>
<h2 id="2023-12-19-update">
  <a class="heading-anchor" href="#2023-12-19-update">2023-12-19 update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>By popular demand, here are the two adorable cats.</p>









<figure class="center">
  <a href="/posts/2023/12/19/spicy-usb-adapter/media/cats.jpg">
    <img src="/posts/2023/12/19/spicy-usb-adapter/media/cats_hu_4e3ddb6741f64f98.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Tux and Põssa. Põssa can be roughly translated to &#34;Piggy&#34; in English. I&#39;ll let you guess how he got that name.">

  </a>
  <figcaption class="center">Tux and Põssa. Põssa can be roughly translated to &#34;Piggy&#34; in English. I&#39;ll let you guess how he got that name.</figcaption>
</figure>

]]></content:encoded></item><item><title>Zimaboard: the closest thing to my dream home server setup</title><link>https://ounapuu.ee/posts/2023/10/09/zimaboard/</link><pubDate>Mon, 09 Oct 2023 14:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2023/10/09/zimaboard/</guid><description>I gave in to my impulses and bought myself a small single board computer to be my power-efficient home server, here's how it went.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2023/10/09/zimaboard/media/cover_hu_1511165ed98ee92c.jpg" width="1200" height="630" alt="Zimaboard: the closest thing to my dream home server setup" /><p>I stumbled upon <a href="https://youtu.be/V_ZdvrIMKEQ">this Hardware Haven video about the Zimaboard recently.</a></p>
<p>I liked it a lot.</p>
<p>I finally bought one.</p>
<p>In short, <a href="https://www.zimaboard.com/zimaboard/product">Zimaboard</a> is a small single-board computer that is relatively affordable and comes
with an interesting selection of ports, which includes an exposed PCI Express port.</p>
<p>Before we get down to the build, here&rsquo;s a list of aspects that I want to see in my dream home server:</p>
<ul>
<li>low power usage (2-15W typical power usage)</li>
<li>8GB of RAM or better</li>
<li>enough performance to run my workloads, most of which are containerized</li>
<li>2x SATA or NVMe SSD slots, plus option for a third drive for the OS</li>
<li>passively cooled and completely silent</li>
<li>compact size</li>
<li>gigabit Ethernet or better</li>
</ul>
<p>You might be thinking, &ldquo;<em>Wait, that&rsquo;s your <strong>dream setup</strong>? No clusters of machines, Threadrippers, 10 Gigabit networking, crazy number of disks?</em>&rdquo;.
Well, yes. After years of trying all sorts of setups and learning about my home server usage patterns, this is the set of requirements that finds a balance between performance, efficiency
and silence.</p>
<h2 id="basics">
  <a class="heading-anchor" href="#basics">Basics<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I recommend checking <a href="https://www.zimaboard.com/zimaboard/product">the product page</a> to see the exact specifications.
The configuration I bought was the 832 model: 8GB of RAM, 32GB of eMMC storage and a quad-core Intel Celeron N3450 CPU.
It&rsquo;s not the most powerful setup or even a recent one with the CPU being from 2016, but it&rsquo;s just powerful enough to fit
my needs.</p>
<p>This variant of the board costs 200 USD, but other configurations cost much less
than that, I just needed the extra memory to be on the safe side. If you don&rsquo;t
care about the noise and size aspect of home servers, then you can get a better
deal on the used market (<a href="https://www.servethehome.com/introducing-project-tinyminimicro-home-lab-revolution/">see the TinyMiniMicro project for inspiration)</a>,
but as you know by this point, I care about those aspects a lot.</p>
<h2 id="the-package">
  <a class="heading-anchor" href="#the-package">The package<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>What sets the Zimaboard apart from other single board computers is how polished the product feels.
Unlike a board like the Raspberry Pi, this one comes with a case and a cooling setup
already attached to it. I suspect that a similarily configured Raspberry Pi 4/5
with all the accessories added on top would result in a price that&rsquo;s quite
similar to the cost of a top-of-the-line Zimaboard.</p>
<p>The heatsink looks great and is practical at the same time.
Under the most torturous loads I could only see the CPU being around 72°C and due
to it being passively cooled it made absolutely no noise. With the case being
present, I do not have to worry about placing the board on my desk and scratching
the table or shorting something out.</p>









<figure class="center">
  <a href="/posts/2023/10/09/zimaboard/media/theboard.jpg">
    <img src="/posts/2023/10/09/zimaboard/media/theboard_hu_2cd89bb8686bd5dc.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Just plop it wherever.">

  </a>
  <figcaption class="center">Just plop it wherever.</figcaption>
</figure>

<p>The board does not seem to have a power button, but by default it&rsquo;s configured
to power on as soon as you connect the power supply, which is great if you&rsquo;re
going to use this as a home server.</p>
<p>The box that the board was shipped survived and overall I&rsquo;d say that the packaging
is good. The board comes with some stickers and a single SATA data+power cable.
The included power adapter comes with EU, US and UK plugs all included.</p>
<p>Shipping to Estonia was quite fast, taking just 10 days. The shipping costs were
18 USD.</p>









<figure class="center">
  <a href="/posts/2023/10/09/zimaboard/media/box.jpg">
    <img src="/posts/2023/10/09/zimaboard/media/box_hu_eb50fa4af959b977.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The box did its job.">

  </a>
  <figcaption class="center">The box did its job.</figcaption>
</figure>

<h2 id="storage">
  <a class="heading-anchor" href="#storage">Storage<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The included 32GB eMMC storage is fine for hosting your operating system. The
read speeds cap out at around 175 MB/s and the typical write speeds I observed
were around 50-100 MB/s. The storage is identified as <code>mmc-BJTD4R_0xc7d04e40</code> under
<code>/dev/disk/by-id/</code>, and searching online suggests that it&rsquo;s a Samsung chip.</p>
<p>Because this board offers two SATA ports, I also added a SATA Y-cable to my order
(4 USD) so that I can take my existing Samsung 870 QVO 4TB SATA drives and move
my home server setup to this board.</p>









<figure class="center">
  <a href="/posts/2023/10/09/zimaboard/media/ycable.jpg">
    <img src="/posts/2023/10/09/zimaboard/media/ycable_hu_1b434f16b568b5da.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="SATA Y-cable in action.">

  </a>
  <figcaption class="center">SATA Y-cable in action.</figcaption>
</figure>

<p>Allegedly this cable can also be used to drive
two 3.5&quot; hard drives powered by the board itself according to <a href="https://shop.zimaboard.com/products/sata-y-cable-for-zimaboard-2-5-inch-hdd-3-5-inch-hdd-raid-free-nas-unraid">the shop page
for the Y-cable</a>, but I suspect that at that point you&rsquo;ll be pushing the limits of
the 12V/3A power adapter.</p>
<p>There is also a white drive activity LED
placed near the SATA power connector on the board. Perhaps not for everyone, but I
like the aesthetic and the sight of the server doing server things.</p>
<p>The performance of the SATA ports is what you would expect. When performing
read operations on both SSD-s I saw the maximum total transfer rates hover around
900-950MB/s, which is pretty close to the SATA III transfer speed limit.</p>
<p>There is no native way to mount the two SATA drives to the Zimaboard. The creators
of the board do sell a metal bracket, but it doesn&rsquo;t seem to integrate that well
to the board. However, <a href="https://www.printables.com/model/224057-zimaboard-dual-hdd-stand">there exists a 3D printable design that houses two
2.5&quot; drives, even 15mm ones</a>, and
that&rsquo;s how I ended up using a 3D printer for the first time in my life.
The print was done using a <a href="https://wiki.k-space.ee/en/utilities/3D-Printer">Voron v2 Afterburner printer hosted at k-space</a>
and it came out pretty well.</p>









<figure class="center">
  <a href="/posts/2023/10/09/zimaboard/media/3dprint-1.jpg">
    <img src="/posts/2023/10/09/zimaboard/media/3dprint-1_hu_1063ec1f0205a475.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Print in progress.">

  </a>
  <figcaption class="center">Print in progress.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2023/10/09/zimaboard/media/3dprint-2.jpg">
    <img src="/posts/2023/10/09/zimaboard/media/3dprint-2_hu_d701924b7455a796.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The final product">

  </a>
  <figcaption class="center">The final product</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2023/10/09/zimaboard/media/3dprint-3.jpg">
    <img src="/posts/2023/10/09/zimaboard/media/3dprint-3_hu_824404626ee747d8.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Another angle.">

  </a>
  <figcaption class="center">Another angle.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2023/10/09/zimaboard/media/3dprint-4.jpg">
    <img src="/posts/2023/10/09/zimaboard/media/3dprint-4_hu_734e2439b5176454.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Some 3D printing related inconsistencies, but nothing serious.">

  </a>
  <figcaption class="center">Some 3D printing related inconsistencies, but nothing serious.</figcaption>
</figure>

<p>The SSD mounting holes were a bit finicky due
to slight printing errors, and during my first installation attempt I forgot to
put in the plastic middle layer of the case that&rsquo;s between the PCB and the stock
bottom cover, but other than that the installation was a breeze.</p>









<figure class="center">
  <a href="/posts/2023/10/09/zimaboard/media/board-backside.jpg">
    <img src="/posts/2023/10/09/zimaboard/media/board-backside_hu_df793b4541493c33.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Installation of the caddy requires removing the stock backplate and splitting it.">

  </a>
  <figcaption class="center">Installation of the caddy requires removing the stock backplate and splitting it.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2023/10/09/zimaboard/media/caddy-1.jpg">
    <img src="/posts/2023/10/09/zimaboard/media/caddy-1_hu_78d2b684b7f1572c.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The finished result.">

  </a>
  <figcaption class="center">The finished result.</figcaption>
</figure>

<p>








<figure class="center">
  <a href="/posts/2023/10/09/zimaboard/media/caddy-2.jpg" aria-label="View full-size image">
    <img src="/posts/2023/10/09/zimaboard/media/caddy-2_hu_bb144d2c394a571f.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>










<figure class="center">
  <a href="/posts/2023/10/09/zimaboard/media/caddy-3.jpg" aria-label="View full-size image">
    <img src="/posts/2023/10/09/zimaboard/media/caddy-3_hu_835bdd7977c2313d.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>










<figure class="center">
  <a href="/posts/2023/10/09/zimaboard/media/caddy-4.jpg" aria-label="View full-size image">
    <img src="/posts/2023/10/09/zimaboard/media/caddy-4_hu_bcbdbc57030a3901.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>










<figure class="center">
  <a href="/posts/2023/10/09/zimaboard/media/caddy-5.jpg" aria-label="View full-size image">
    <img src="/posts/2023/10/09/zimaboard/media/caddy-5_hu_7ba9351ed37ad4e3.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>










<figure class="center">
  <a href="/posts/2023/10/09/zimaboard/media/caddy-6.jpg" aria-label="View full-size image">
    <img src="/posts/2023/10/09/zimaboard/media/caddy-6_hu_5a82ffd61f02dfe2.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>










<figure class="center">
  <a href="/posts/2023/10/09/zimaboard/media/caddy-7.jpg" aria-label="View full-size image">
    <img src="/posts/2023/10/09/zimaboard/media/caddy-7_hu_4e393891551319ac.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>
</p>
<p>The drives never hit above 64°C, which is absolutely okay for these SSD-s. I&rsquo;m not
sure how actual spinning hard drives might fare in this environment, but I don&rsquo;t
think that it&rsquo;s going to be that serious because 2.5&quot; hard drives should not
generate as much heat in the first place.</p>
<h2 id="power-consumption">
  <a class="heading-anchor" href="#power-consumption">Power consumption<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>What I love about this board is the power usage. At this point my home server
is not even the most power hungry component of my setup, that honor now goes
to the ISP-provided router/modem combo box that always draws at least 12W, even
when it&rsquo;s in bridge mode.</p>
<p>Here are my power usage measurements (measured with a simple power meter):</p>
<ul>
<li>idle: 2.5W</li>
<li>no drives attached, CPU stress test (<code>stress -c 4</code>): 9.0W</li>
<li>one Samsung 870 QVO 4TB SSD attached, CPU stress test: 13.2W</li>
<li>2 SSD-s attached, typical power draw in my setup (~10-40% CPU usage): ~8-9W</li>
<li>2 SSD-s attached, max load on SSD-s and CPU: ~14W</li>
</ul>
<p>The Zimaboard, ISP modem/router box, my TP-Link router/Wi-Fi AP and my CyberPower
UPS all together use at most around 34W, all combined. That&rsquo;s even less than
what my Dell monitor uses at reasonably low brightness levels!</p>
<p>These tests are not scientifically accurate, but they should give you an idea on what
power consumption numbers to expect when running this setup.</p>
<h2 id="performance">
  <a class="heading-anchor" href="#performance">Performance<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I use a simple Prometheus Node Exporter + Grafana setup to view how much resources
my various servers use. My home server has lately either been an <a href="/posts/2022/01/17/asrock-x300-future-of-desktops/">ASRock Deskmini X300 based setup</a> or
an <a href="/posts/2022/05/10/thinkpad-as-a-home-server/">old ThinkPad T430</a>, and something that both had in common was that the CPU usage was
generally very low, mostly at or below the 10% mark. There would be bursty loads
from time to time and backup processes running that bump that up, but not significantly.</p>









<figure class="center">
  <a href="/posts/2023/10/09/zimaboard/media/prom-old.png">
    <img src="/posts/2023/10/09/zimaboard/media/prom-old_hu_708f14b1eed98d02.webp"
     width="1280"
     height="674"
     loading="lazy"
     decoding="async"
     alt="Typical CPU performance on a ThinkPad T430 acting as a home server.">

  </a>
  <figcaption class="center">Typical CPU performance on a ThinkPad T430 acting as a home server.</figcaption>
</figure>

<p>Memory usage of my setup was also quite low, with all my services and containers
fitting into 2GB during typical usage. With this information and some CPU performance
comparisons done, I knew that the Zimaboard will likely be able to handle my home
server tasks.</p>
<p>This board is not very powerful, but if you mainly rely on containerized workloads
and can rely on Intel QuickSync to accelerate media transcodes, then you&rsquo;ll be
just fine.</p>









<figure class="center">
  <a href="/posts/2023/10/09/zimaboard/media/prom-new.png">
    <img src="/posts/2023/10/09/zimaboard/media/prom-new_hu_85b12aa5a7e8f9b7.webp"
     width="1280"
     height="674"
     loading="lazy"
     decoding="async"
     alt="Zimaboard CPU usage, which includes migrating filesystems, creating new multi-TB
backups from scratch and a lot of Jellyfin playback and GPU-accelerated transcoding.
Pretty much the worst case scenario for this board.">

  </a>
  <figcaption class="center">Zimaboard CPU usage, which includes migrating filesystems, creating new multi-TB
backups from scratch and a lot of Jellyfin playback and GPU-accelerated transcoding.
Pretty much the worst case scenario for this board.</figcaption>
</figure>

<p>I was actually impressed with how well the GPU-accelerated transcode
worked on this machine once you set everything up properly.
If you&rsquo;re running Linux and Jellyfin,
run <code>vainfo</code> to get a list of supported codecs and make sure that you have hardware
decoding selected for those in Jellyfin settings. Also enable hardware encoding.
I checked with <code>intel_gpu_top</code> to see if work was offloaded to the GPU and saw
activity there, which means that hardware acceleration for Jellyfin worked out great!
<a href="https://jellyfin.org/docs/general/administration/hardware-acceleration/">Check the Jellyfin hardware acceleration for more details on other requirements
that have to be met for all of this to work.</a></p>









<figure class="center">
  <a href="/posts/2023/10/09/zimaboard/media/jellyfin-qs-conf.png">
    <img src="/posts/2023/10/09/zimaboard/media/jellyfin-qs-conf_hu_6c1ba97b1f638294.webp"
     width="715"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The Jellyfin QuickSync hardware acceleration config that works on my Zimaboard.
May not be 100% correct but so far have not encountered issues.">

  </a>
  <figcaption class="center">The Jellyfin QuickSync hardware acceleration config that works on my Zimaboard.
May not be 100% correct but so far have not encountered issues.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2023/10/09/zimaboard/media/intel-gpu-top.png">
    <img src="/posts/2023/10/09/zimaboard/media/intel-gpu-top_hu_c612456e5219acc0.webp"
     width="1280"
     height="204"
     loading="lazy"
     decoding="async"
     alt="intel_gpu_top during Jellyfin transcoded media playback. ">

  </a>
  <figcaption class="center">intel_gpu_top during Jellyfin transcoded media playback. </figcaption>
</figure>

<h2 id="caveats">
  <a class="heading-anchor" href="#caveats">Caveats<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The Zimaboard does ship with a Linux-based OS called CasaOS. However, I had no
intention of using it as I know what my requirements are and my infrastructure
is already decently documented and set up via Ansible, which is why I can&rsquo;t say
how good that experience is. I also did not test Windows 10 or 11.</p>
<p>During testing, I noticed that the USB 3 ports can act a bit weird. The Fedora
Server USB stick would not boot properly if connected to one of the USB ports,
and when doing other tests with external USB storage I noticed hiccups from time to time.
Not sure what might be the cause, but I&rsquo;m writing it down nevertheless. It&rsquo;s not
a dealbreaker for me luckily since I don&rsquo;t rely much on the USB ports in typical use anyway.</p>
<p>I did not test the PCI Express port, simply because I don&rsquo;t need it, yet. It&rsquo;s
a great addition, though, and opens up plenty of modding capabilities in the
future.</p>
<h2 id="fedora-server-and-btrfs">
  <a class="heading-anchor" href="#fedora-server-and-btrfs">Fedora Server and btrfs<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The Zimaboard gave me an opportunity to start fresh with my home server.</p>
<p>I made a leap: I&rsquo;ve ditched ZFS and am now running
Fedora Server with my storage being on a btrfs RAID1 setup, snapshotted
and backed up using <a href="/posts/2022/07/09/btrbk-is-awesome/">btrbk</a>.
It was a bit tricky to migrate and set everything
up regarding backups and snapshotting, but I got it working.</p>
<p>ZFS is great, but it has always felt like an unwanted guest in the Linux ecosystem.
The kernel developers don&rsquo;t care much for maintaining compatibility with ZFS since
it&rsquo;s not in the kernel due to licensing issues, and Ubuntu has been one of the few
distros that actually ships a kernel that includes ZFS built in. I didn&rsquo;t want
to be tied to Ubuntu forever, especially because of how they try to make <code>snap</code>
a thing. ZFS DKMS builds are generally okay on distros like Debian, but on
others you might find yourself not being able to access your data after a reboot
because of a kernel update.</p>
<p>btrfs has had some issues in the past, especially with the RAID5/6 setup, but
in my single and dual disk setups it has been solid for years, except for that one time around
2018-2019 when I ran btrfs RAID1 over USB storage. To be fair to btrfs, that
was a pretty stupid setup.</p>
<p>Before committing
to btrfs, I used two USB sticks to create a RAID1 setup and created real torture test scenarios.
Tests looked something like this:</p>
<ul>
<li>write a file to the filesystem</li>
<li>use <code>md5sum</code> to calculate a hash of it for verification purposes</li>
<li>completely wipe one USB drive with <code>dd</code></li>
<li>run <code>md5sum</code> to calculate the hash again (it matched every time)</li>
<li>run <code>btrfs scrub</code> on the filesystem to fix all errors</li>
<li>rinse and repeat with variations to this setup</li>
</ul>
<p>After doing all that, I was quite confident that this was going to work.</p>
<p>One thing to note with <code>btrfs</code>: if you&rsquo;re running any type of multi-disk and
redundant setup like RAID1 or RAID10, then make sure to include the mount option
<code>degraded</code> in <code>/etc/fstab</code> so that you can still mount your filesystem if one or
more of your drives fail. If you lose too many drives then it&rsquo;s still probably going to fail to boot.</p>
<p>Here&rsquo;s my <code>/etc/fstab</code> setup to serve as an example:</p>
<pre tabindex="0"><code>LABEL=turbo /turbo      btrfs subvol=turbo,compress-force=zstd:1,ssd,degraded,nofail            0 0
</code></pre><p>When doing the migration I kept all the paths the same, and each ZFS dataset
was recreated using <code>btrfs</code> subvolumes, which is why this filesystem is mounted on a top-level folder.</p>
<h2 id="alternatives">
  <a class="heading-anchor" href="#alternatives">Alternatives<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>My notes for the next dream home server setup included a few candidates:</p>
<ul>
<li>
<p>the Zimaboard</p>
</li>
<li>
<p><a href="https://www.asustor.com/en/product?p_id=79">Asustor Flashstor 6</a> or <a href="https://www.asustor.com/en/product?p_id=80">Flashstor 12</a></p>
</li>
<li>
<p>a TinyMiniMicro style machine with at least two NVMe SSD slots</p>
</li>
</ul>
<p>The first two fall nicely into my requirements for the dream home server. I picked
the Zimaboard mainly because it&rsquo;s much cheaper and I was already running two SATA SSD-s
for my home server storage, so migrating would be really easy and I would not
have to buy any new drives.</p>
<p>If large capacity SATA SSD-s start becoming less common and NVMe SSD-s become
even cheaper than they already are, then I&rsquo;ll have to look into something like a Flashstor.</p>
<h2 id="conclusion">
  <a class="heading-anchor" href="#conclusion">Conclusion<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Overall, I&rsquo;m very happy with this purchase. The performance is just enough for
my services to work reasonably fast, the board uses very little power and it&rsquo;s
silent, and it looks good on my wall.</p>









<figure class="center">
  <a href="/posts/2023/10/09/zimaboard/media/wallsetup.jpg">
    <img src="/posts/2023/10/09/zimaboard/media/wallsetup_hu_263feac6bc54aaa1.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Oh it&#39;s a setup it&#39;s a setup it&#39;s a setup 🎶">

  </a>
  <figcaption class="center">Oh it&#39;s a setup it&#39;s a setup it&#39;s a setup 🎶</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2023/10/09/zimaboard/media/cablegore.jpg">
    <img src="/posts/2023/10/09/zimaboard/media/cablegore_hu_75af033ad64d88f6.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Managing the coax cable like this feels so wrong, and yet it works fine.">

  </a>
  <figcaption class="center">Managing the coax cable like this feels so wrong, and yet it works fine.</figcaption>
</figure>

<p>My setup is also quite flexible, so in case I need more resources, I can get
more Zimaboards and make them serve different purposes. However, it&rsquo;s more likely
that I&rsquo;m going to discover a new toy to experiment and play with by the time
I run out of resources on this one.</p>
<h2 id="2024-08-20-update">
  <a class="heading-anchor" href="#2024-08-20-update">2024-08-20 update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I ran the Zimaboard for over half a year, but decided to switch back to
the <a href="/posts/2022/01/17/asrock-x300-future-of-desktops/">ASRock Deskmini X300.</a></p>
<p>I still love the low power consumption and the expandability, but I ended up putting more load on the system than I
initially anticipated CPU-wise (running over 20 different Docker containers, some heavy). Should&rsquo;ve guessed that it would happen eventually.</p>
<p>If it came with an embedded AMD Ryzen APU, then that would probably change things up quite a bit.</p>
<p>Zimaboard: still the closest thing to my dream home server, but it&rsquo;s that last little bit of performance being missing
that gets me. If your needs are moderate or low, then it&rsquo;s still a fantastic option, if the price is right.</p>
<p>My eyes are now on
the <a href="https://nascompares.com/2024/06/10/the-asustor-flashstor-gen2-performance-and-pci-lanes/">Asustor Flashstor Gen 2</a>
machines.
Up to 12 NVMe SSD-s plus 4 cores of AMD Ryzen goodness sounds too good to be true. Let&rsquo;s see what the reviews will say
once it&rsquo;s out.</p>
]]></content:encoded></item><item><title>My experience at the k-space hackerspace hackathon</title><link>https://ounapuu.ee/posts/2023/08/03/k-space-hackathon/</link><pubDate>Thu, 03 Aug 2023 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2023/08/03/k-space-hackathon/</guid><description>I went to the hackathon, built some useful stuff and only did stupid things about 4 times!</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2023/08/03/k-space-hackathon/media/cover_hu_417372bb9bfe3c4.jpg" width="1200" height="630" alt="My experience at the k-space hackerspace hackathon" /><p><a href="https://www.k-space.ee/">k-space</a> is a hackerspace in Tallinn, Estonia, and they organized
a hackathon recently. Unlike in most hackathons, in this one you could whatever you like with no
expectations about building a business or coming up with an MVP, just come on down to the space and
start working on your passion projects!</p>
<p>I had some ideas on what I could do, but a few of them would have required access to workshop tools,
for which I did not have a key. I could always get one, but was too lazy to bother with it. I looked at
<a href="https://wiki.k-space.ee/en/hackathon/2023">the list of ideas that had been written down by other hackerspace members</a> and picked
the one marked as <code>[easy]</code>:  <em>Wire up electronic lock for workshop</em>.</p>
<p>If I achieve that goal, then I don&rsquo;t have to worry about getting another key, and I could also get access to all
the workshop tooling! And since it was marked as easy, I figured that I could do it and have some time
left over for playing around with things like the laser cutter.</p>
<h2 id="impressions">
  <a class="heading-anchor" href="#impressions">Impressions<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Before I get to the technical part, I&rsquo;d like to say a few words about the hackathon and the organization itself.</p>
<p>The highlight of the hackathon was the immense sense of accomplishment that I felt. I work as a software
developer at my day job, which often involves dealing with incidents, migrating services from virtual machines
to Kubernetes, and sometimes from Kubernetes to Kubernetes, and anything else that comes my way.
The issue with most software teams is that the products that you build and maintain are often disconnected
from the real world. You don&rsquo;t see the physical impact of the work that you do, and that can leave you
feeling empty. Sure, you spent days switching a service to Kubernetes, but you don&rsquo;t feel like you did anything at all.</p>
<p>During this hackathon I had the opportunity to build things with my own hands, and the door controller software doing
its thing resulted in real-life actions. You swipe the card, it beeps, and you can hear the electronic lock being
opened. That, and the opportunity to work on a project involving a Raspberry Pi and mounting it so neatly was very
satisfying.</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image0.jpg">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image0_hu_61bd02bbbae6985d.webp"
     width="1200"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Software developer at work. Photo by Arti Zirk.">

  </a>
  <figcaption class="center">Software developer at work. Photo by Arti Zirk.</figcaption>
</figure>

<p>The hackathon crowd itself was not that big, hovering around 15 or so people. We even had guests from Germany who were
really helpful, great to talk with and they provided their expertise to help out wherever possible. I loved how the
collaboration worked for the rewrite of the door controller software to the Go programming language. One guy knew all about
the original software and how it works but was just learning Go, and the other guy was just visiting the space and had
extensive Go experience.</p>
<p>Although this post is mainly about my own experience and the stuff that I worked on, there were plenty of other
cool projects going on during the hackathon as well. One that I really liked due to how practical it was is <a href="https://wiki.k-space.ee/en/utilities/kegerator">&ldquo;the kegerator&rdquo;</a>
that provided cold carbonated mate tea throughout the hackathon. It lives in an old fridge and I think the execution
of it was really neat! <a href="https://youtu.be/x4Qh9MTCzQo">Here&rsquo;s the livestream recording where other projects are also covered.</a></p>
<p>There were plenty of refreshments available and I took full advantage of that because if there&rsquo;s one thing that can get
my brain working on overdrive, it&rsquo;s copious amounts of sugar and caffeinated beverages. Oh, and we got pancakes as well!
Peetri Pizza really blew it with the pizzas though, never seen pizzas that are this sad.</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image1.jpg">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image1_hu_d56a9b50ed3dd9d7.webp"
     width="601"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Vibes on day 0.">

  </a>
  <figcaption class="center">Vibes on day 0.</figcaption>
</figure>

<p>There were some small issues, such as the streaming setup crapping out at the last day during the part where we presented
our work, but overall I was happy with how the hackathon turned out.</p>
<p>For future hackathons we probably need to do a bit more marketing and think about the dates more so that we can get
more enthusiasts on board. Having our German friends around really added a lot to the event and I would like to see
more knowledge-sharing between communities in the future.</p>
<h2 id="build-log">
  <a class="heading-anchor" href="#build-log">Build log<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Here&rsquo;s a rundown of what I did during the hackathon.</p>
<p><a href="https://youtu.be/x4Qh9MTCzQo?t=985">There&rsquo;s also a video where I talk about my hackathon work!</a></p>
<p>Whenever you see the name <a href="https://zirk.me">Arti</a>, then that refers to my good friend who helped out a lot during the hackathon.</p>
<h3 id="day-0">
  <a class="heading-anchor" href="#day-0">Day 0<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>The hackathon began on 27th of July at 18:00.</p>
<p><a href="https://www.youtube.com/watch?v=eZLQK60Cj3c">Everyone presented their plans</a> and then the work begun.</p>
<p>I used the first evening to put together a rough plan and figure out what needs to be done. In short, the
plan was like this:</p>
<ul>
<li>buy some quick splice terminals</li>
<li>assemble the Raspberry Pi with the custom HAT that is used to interact with the card reader and electronic door lock</li>
<li>install the card reader on the door</li>
<li>run the networking and power cables</li>
<li>connect all the cables to the Pi</li>
<li>set up the card reader software</li>
<li>test in production</li>
</ul>
<p>After taking some pictures of the door lock test setup that another participant assembled, I decided to go and rest for what&rsquo;s
to come.</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image3.jpg">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image3_hu_e04dcad5c3a93216.webp"
     width="1200"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Door controller test setup. Photo by Arti Zirk.">

  </a>
  <figcaption class="center">Door controller test setup. Photo by Arti Zirk.</figcaption>
</figure>

<h3 id="day-1">
  <a class="heading-anchor" href="#day-1">Day 1<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>This is the part where all the action started.</p>
<p>I began by taking stuff apart.</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image4.jpg" aria-label="View full-size image">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image4_hu_1a64de43f3ae9edb.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>After making some additional holes I ran the cable that connects to the electronic door switch. That was easy enough.</p>
<p>Then I began thinking about where the Raspberry Pi door controller setup would go. The workshop is a very
dusty place and it would probably need some kind of protection from it. The first idea was to custom design
a 3D printed case or customise an existing design, but after a short discussion and brainstorming we realized
that getting a plastic box big enough to house the Pi and all the wiring makes more sense.</p>
<p>Me and Arti set off to find something like that in the hackerspace. After going through lots of boxes and shelves,
we stumbled upon two metal boxes. Those boxes used to house some kind of security equipment and had inside
circuitry that converts 220V AC to 13.6V DC, which was ideal for our use case. It also had leads to connect
an UPS battery, which was even better!</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image5.jpg" aria-label="View full-size image">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image5_hu_945147e72f8db4e3.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>Oh, and we also found this fun little thing.</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image6.jpg" aria-label="View full-size image">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image6_hu_9bd0f755b43c90a5.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>Anyway, I went ahead and drilled some mounting holes for the Pi. We had M2.5 nylon screws and standoffs available
at the space, and with some assistance from Arti I learned about the wonders of countersink drill bits.</p>
<p>I really liked how the mounted Pi looked. I&rsquo;ve seen a ton of projects on YouTube and elsewhere with Raspberry Pi-s
being modded and mounted in all sorts of ways, but doing it myself felt really good, especially since I
was reusing an old metal box that had no other purpose.</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image7.jpg" aria-label="View full-size image">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image7_hu_bcd67fde930b4011.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>I set up the microSD card with Raspberry Pi OS and figured that I could find it on the k-space network. However,
I then remembered that the internal network was <code>/16</code>, which made the process much longer. I did not have access
to the network switch, but I did end up getting acces to <em>a</em> Pi, it just wasn&rsquo;t the one I just set up. That was a
fun discovery.</p>
<p>I decided to go with the easy route and connect the Pi to an actual monitor and keyboard. That process ended
up being faster than scanning the network for Pi-s.</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image8.jpg" aria-label="View full-size image">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image8_hu_e71431422df0ef61.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>I also added an UPS battery to the setup. It barely fit the enclosure and it had to be raised a bit so that
the lid on the box would close properly. But it worked out really well!</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image9.jpg" aria-label="View full-size image">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image9_hu_abe30aa12543d233.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>By the end of the day we also had the card reader installed on the door. We contemplated putting the reader on the other
side of the glass because the reader can read cards up to 9cm away, and quick tests showed that it would actually work,
however we had concerns about mounting it that way, and it would look a bit too janky even by k-space standards.</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image10.jpg" aria-label="View full-size image">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image10_hu_932489d20a35046e.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<h3 id="day-2">
  <a class="heading-anchor" href="#day-2">Day 2<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>Day 2 started with me trying to figure out how to run the cables. Making a suitably sized CAT5e cable was easy and
it worked on the first try and drilling a hole through plywood was also simple, but when trying to figure out how to
run the power I ran into a bit of trouble. There was very little room in the junction point that I intended to use, and
when my brain shorted out I asked Arti for some help (again). He figured out a way to run the additional cable while not
interfering with the power cables that ran to the light fixtures.</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image11.jpg">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image11_hu_54326914815c4fce.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="In hindsight, that first aid kit didn&#39;t really have anything that would help with an electricity-related accident.">

  </a>
  <figcaption class="center">In hindsight, that first aid kit didn&#39;t really have anything that would help with an electricity-related accident.</figcaption>
</figure>

<p>Due to the way we decided to run the card reader cables, we had to extend the cable that comes from the card reader.
For that I used a CAT5e cable and some quick splices. I later learned that using your thumb power alone is not enough to
splice cables, you actually need to push them all the way in with plyers. Once that was figured out, me and Arti
installed a very professional looking cable cover involving a random piece of plastic tube, zipties and screws.
Not that I needed the help, Arti was just working on porting some Python code to Golang and wanted a break. He ended
up making a lot of breaks, not sure what that says about the learning curve of Golang.</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image12.jpg" aria-label="View full-size image">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image12_hu_f41214ba834d1d6e.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>Now came the difficult part. I had to wire up everything to the Raspberry Pi without breaking anything. I had the photos
I took on day 0, but in hindsight they were not that great since I had trouble figuring out what went where. Luckily
another door controller in the space had a similar setup and I could use that as a reference point.</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image13.jpg" aria-label="View full-size image">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image13_hu_d3ba65c2fc38a4d6.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>The Raspberry Pi HAT gets 12V input power, some of that is passed to the door controller, and then we have two leads
that are connected to both the door controller and the electronic lock. If someone swipes their card and they have access to
that particular door, the card reader light
goes green and 12V is applied to the electronic door lock, making it open it. There&rsquo;s software that controls it, but
I did not have to worry about that too much because two other hackathon participants were working on that.</p>
<p>I had Arti check the cabling before the initial test and after a hesitant go-ahead from him we powered it on. The Pi
powered on, but the card reader was not doing anything. It was supposed to do a few beeps and show a red light. Uh-oh.
That&rsquo;s when Arti reviewed the quick splices that I used and pointed out that they were not pushed all the way in. After
using brute force (pliers), we powered it on again and it worked!</p>
<p>The rest of the evening was spent testing out the card reader software that was being ported. That revealed a few issues,
but <a href="/posts/2023/08/03/k-space-hackathon/media/dooropen.mov">we did get a successful door opening!</a></p>
<p>At this point I was very happy and I think half the hackerspace heard that.</p>
<h3 id="day-3">
  <a class="heading-anchor" href="#day-3">Day 3<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>At this point I was quite tired, but I felt really accomplished. I assembled the setup without burning everything down,
and I only shorted out the UPS battery once after absent-mindedly connecting the same alligator clip to both power
leads. Whoops.</p>
<p>I spent that half-day cleaning everything up and mounting the power and networking cables to the wall. I also labeled
the box so that we know what that mysterious white box is and where it gets its power.</p>
<p>At 14:00 the hackathon timer ran to zero and we were wondering what would happen with the countdown. Well&hellip;</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image14.jpg" aria-label="View full-size image">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image14_hu_a2d06791217a9388.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>I presented my work, listened to what others were up to, and then we got some creative awards. Arti, the guy working
on the Golang port of the door controller software, got &ldquo;K-SPACE Certified Go Developer&rdquo;, and I am now a &ldquo;K-SPACE
Certified Licensed Electrician&rdquo;. Whoo!</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image15.jpg" aria-label="View full-size image">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image15_hu_d3effbeb939ea057.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>I&rsquo;d like to thank everyone who organized the event, and Arti Zirk for helping out with the project on many occasions!</p>
<p>That was pretty much it!</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image16.jpg">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image16_hu_ff471a16a5d6d66f.webp"
     width="1200"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Left: happy hackathon participant. Right: the guy responsible for organizing it. Photo by Arti Zirk.">

  </a>
  <figcaption class="center">Left: happy hackathon participant. Right: the guy responsible for organizing it. Photo by Arti Zirk.</figcaption>
</figure>

]]></content:encoded></item><item><title>Dell Latitude 5411: the Linux compatibility sweet spot</title><link>https://ounapuu.ee/posts/2023/04/28/dell-latitude-5411/</link><pubDate>Fri, 28 Apr 2023 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2023/04/28/dell-latitude-5411/</guid><description>It's a jet engine with an integrated furnace, but at the same time it fits into the Linux compatibility sweet spot. Not great, not terrible.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2023/04/28/dell-latitude-5411/media/cover_hu_597bd29d05cc41fb.jpg" width="1200" height="630" alt="Dell Latitude 5411: the Linux compatibility sweet spot" /><p><em>Oh boy, here I go testing a new laptop again!</em></p>
<p>Well, it <em>was</em> new back in 2020.</p>
<p>You might remember <a href="/posts/2022/01/09/why-i-went-back-to-using-a-thinkpad-from-2012/">my article on why I went back to a ThinkPad T430 in 2022</a>.
Or that other time when I got a new HP laptop for testing and got so frustrated that <a href="/posts/2022/11/21/hp-elitebook-845-g9/">I wrote about it</a>.</p>
<p>Well, today I&rsquo;m writing about the <a href="https://www.dell.com/en-nz/shop/business-laptop-notebook-computers/latitude-5411-business-laptop/spd/latitude-14-5411-laptop">Dell Latitude 5411</a>.</p>
<p>It&rsquo;s not the newest laptop in the world, but I decided to give it a go because of a few reasons:</p>
<ul>
<li>nobody wanted one at work due to the reputation of this laptop (sounds like a jet engine)</li>
<li>it&rsquo;s almost 3 years old at this point, which is the Linux compatibility sweet spot (in theory)</li>
<li>there were some changes coming to the office, which meant more flexible seating arrangements and everything
being designed around USB-C, and I wanted to continue my employment at the same company which might have been tricky
with a ThinkPad T430</li>
</ul>
<p>And that&rsquo;s how I ended up with one.</p>
<h2 id="the-linux-compatibility-sweet-spot">
  <a class="heading-anchor" href="#the-linux-compatibility-sweet-spot">The Linux compatibility sweet spot<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If you have spent any time using new hardware on Linux, then you probably know how painful it can be.
You might get lucky and receive hardware that has support right from the get-go, but in most cases
there are issues around that may or may not get fixed with time.</p>
<p>If you take the same device a couple of years later, it&rsquo;s highly likely that the Linux support on it
will be much better. The price of the device will also be much lower than before, especially if you get
it on the second hand market.</p>
<p>Any machine that falls into this time window is what I like to call &ldquo;the Linux compatibility sweet spot&rdquo;.
This Dell happens to be one such machine.</p>
<p>Here&rsquo;s a quick rundown of some specifications:</p>
<ul>
<li>CPU: Intel Core i7-10850H 6C/12T, 2.7 GHz/ 5.1 GHz</li>
<li>RAM: 32GB DDR4</li>
<li>SSD: 512 GB NVMe</li>
<li>OS: Fedora Linux 38</li>
<li>Thunderbolt support</li>
<li>Wi-Fi, Ethernet based on Intel chips</li>
</ul>
<p>The Dell Latitude 5411 is powerful, and the components in it seem to be working just fine under Linux.
The USB-C port has not had major issues in a work environment, and it also works tolerably with a Dell WD19TB Thunderbolt 3
dock. My ultrawide monitor works, the Ethernet port on the dock can push gigabit speeds, and USB 3 ports work as expected.</p>
<p>Honestly, that&rsquo;s pretty much it regarding compatibility. It just works <em>most of the time</em>, and that&rsquo;s why I like this machine.</p>
<h2 id="oh-god-the-noise">
  <a class="heading-anchor" href="#oh-god-the-noise">Oh god, the noise<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Not everything about this machine is ideal, though.</p>
<p>One of the first things I noticed with this machine is some kind of electrical noise. Some call it &ldquo;coil whine&rdquo;,
but all I know is that it&rsquo;s this high-pitched squealing that&rsquo;s coming from the laptop. Based on some searching
and personal testing I can confirm that the noise is related to the CPU switching between idle and really high turbo boost speeds very quickly. If you remember
the spec sheet, you&rsquo;ll know that this CPU can reach <strong>5.1 GHz</strong>. The noise is apparent whenever there&rsquo;s a load
on the CPU, and it&rsquo;s probably the sound of the power delivery components screaming in pain to deliver all this power
that this furnace of a CPU requires.</p>
<p>There is a workaround to the electrical noise: try running the CPU at a lower speed. You can do that by disabling
Intel Turbo Boost, for example. There&rsquo;s an UEFI setting for that, but on Fedora Linux 38 there&rsquo;s an even easier
option in the form of the &ldquo;Power Profiles&rdquo; setting. When running the CPU slower, the noise is much less severe.</p>









<figure class="center">
  <a href="/posts/2023/04/28/dell-latitude-5411/media/image-1.png">
    <img src="/posts/2023/04/28/dell-latitude-5411/media/image-1_hu_28dd5e6897c6cb89.webp"
     width="494"
     height="492"
     loading="lazy"
     decoding="async"
     alt="Power Profiles in GNOME 44.">

  </a>
  <figcaption class="center">Power Profiles in GNOME 44.</figcaption>
</figure>

<p>This machine got the reputation of being a jet engine at work, and I agree with those people as this thing can
be damn loud even when it&rsquo;s seemingly not doing much. This is a result of the CPU demanding a lot of power and the
cooling solution not being able to catch up. I feel that the stock fan curve is quite aggressive to prevent
any reliability issues after long-term use.</p>
<p>If you have the same laptop and are looking for a fix to that issue, then you&rsquo;re in luck!
There are plenty of solutions out there and I am personally a fan of <a href="https://wiki.archlinux.org/title/fan_speed_control#Dell_laptops">this Arch Wiki section</a>.
I use <a href="https://github.com/TomFreudenberg/dell-bios-fan-control">dell-bios-fan-control</a> to be able to control
the fan speed myself, and a simple script to fine-tune the behaviour of the system. The script looks something like
this:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e">#!/bin/bash
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>set -e
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>echo <span style="color:#e6db74">&#34;Finding device path.&#34;</span>
</span></span><span style="display:flex;"><span>device_path<span style="color:#f92672">=</span><span style="color:#66d9ef">$(</span>echo /sys/devices/platform/dell_smm_hwmon/hwmon/hwmon*<span style="color:#66d9ef">)</span>
</span></span><span style="display:flex;"><span>echo <span style="color:#e6db74">&#34;Device path: </span>$device_path<span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>echo <span style="color:#e6db74">&#34;Testing existence of paths.&#34;</span>
</span></span><span style="display:flex;"><span>cat <span style="color:#e6db74">&#34;</span>$device_path<span style="color:#e6db74">&#34;</span>/temp1_input
</span></span><span style="display:flex;"><span>cat <span style="color:#e6db74">&#34;</span>$device_path<span style="color:#e6db74">&#34;</span>/pwm1
</span></span><span style="display:flex;"><span>echo <span style="color:#e6db74">&#34;Testing existence of paths done.&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>echo <span style="color:#e6db74">&#34;Disabling Dell stock BIOS fan control.&#34;</span>
</span></span><span style="display:flex;"><span>/root/.local/bin/dell-bios-fan-control <span style="color:#ae81ff">0</span>
</span></span><span style="display:flex;"><span>echo <span style="color:#e6db74">&#34;Done!&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">while</span> true; <span style="color:#66d9ef">do</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  temp<span style="color:#f92672">=</span><span style="color:#66d9ef">$(</span>cat <span style="color:#e6db74">&#34;</span>$device_path<span style="color:#e6db74">&#34;</span>/temp1_input<span style="color:#66d9ef">)</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e"># Only two fan speed levels seem to exist, anything above 200 is basically</span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e"># equivalent to full speed.</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">if</span> <span style="color:#f92672">((</span>temp &gt; 50000<span style="color:#f92672">))</span>; <span style="color:#66d9ef">then</span>
</span></span><span style="display:flex;"><span>    echo <span style="color:#ae81ff">64</span> &gt;<span style="color:#e6db74">&#34;</span>$device_path<span style="color:#e6db74">&#34;</span>/pwm1
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">else</span>
</span></span><span style="display:flex;"><span>    echo <span style="color:#ae81ff">0</span> &gt;<span style="color:#e6db74">&#34;</span>$device_path<span style="color:#e6db74">&#34;</span>/pwm1
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">fi</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  sleep <span style="color:#ae81ff">15</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">done</span>
</span></span></code></pre></div><p>The CPU is already temperature limited even in the stock configuration and will throttle under load, which should
mean that running the machine at a lower fan speed is just fine. Let&rsquo;s hope that I&rsquo;m right.</p>
<h2 id="the-damn-usb-c-port">
  <a class="heading-anchor" href="#the-damn-usb-c-port">The damn USB-C port<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>While the USB-C port generally works well, I do still get annoyed with it. When connecting it to my
Dell WD19TB Thunderbolt 3 dock, there&rsquo;s a good chance that it will do nothing but charge. Restarting the machine
with the dock connected will usually work, but it does take away from the portability of the setup.</p>
<p>I&rsquo;m convinced at this point that USB-C is a cursed standard and will never &ldquo;just work&rdquo;. If you disagree, then
please look up any article that tries to explain how USB-C works and all the things you have to keep in
mind if you want to buy a damn cable for your device that does what you want. And then add Thunderbolt to the mix.</p>
<p>If this aspect starts becoming very annoying, then it might become a dealbreaker for me, but right now it happens
infrequently enough that I can ignore it.</p>
<p>Oh, wait, it happened again while writing this article. Damn it all.</p>
<h2 id="other-notes">
  <a class="heading-anchor" href="#other-notes">Other notes<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Here&rsquo;s a rundown of some observations that I&rsquo;ve made while using this machine:</p>
<ul>
<li>you can actually boot from the microSD card, which is nice</li>
<li>if you dual boot Fedora (two completely separate installations), then you&rsquo;ll get two Fedora entries
in the boot options list, and although the names are identical, you can set a preferred boot order just fine</li>
<li>keyboard and touchpad are not the best things out there, but they are at the very least tolerable</li>
<li>cannot say the same about the <a href="https://xkcd.com/243/">clit mouse</a>, it&rsquo;s not that good</li>
<li>battery life is what I expected from a laptop that&rsquo;s not an Apple M1/M2 based laptop: 2-4 hours of use when doing
any real work, and up to 8 hours if your work involves staring at the screen with the brightness set to low and Wi-Fi/Bluetooth
turned off</li>
<li>lowest power draw I observed with <code>upower</code> was around 6 watts</li>
<li>this machine has enough power to be a solid desktop replacement for software development</li>
<li>the above is true even when you switch turbo boost off, you still have 6 cores running at 2.7 GHz!</li>
<li>never managed to overheat the machine, even if I accidentally forgot to turn the laptop fan back on
while running heavy loads (CPU throttled to around 2.2-2.4 GHz, which is impressive!), or when I accidentally
put it in my backpack while it was still running</li>
<li>&ldquo;power on with USB-C connected&rdquo; or any other UEFI setting with a similar purpose should be avoided, you
<strong>will</strong> end up putting it into your backpack while it&rsquo;s running</li>
<li>this laptop has a full sized Ethernet port, which is incredibly handy for many IT professionals</li>
<li>it even has the old Dell barrel plug charging port, which is great for situations where you&rsquo;ve damaged the only
USB-C port on the laptop</li>
<li>I don&rsquo;t have too much faith in the construction of the machine, some parts feel very plasticky and might not hold up
well 5-10 years from now</li>
<li>I was the one who actually made the recommendation to purchase this particular laptop model at my current job
back in 2020 due to the fleet of ThinkPads being compatibility nightmares with the monitors and docks available, and
in that regard it was an improvement. Shame about the fan and electrical noise.</li>
</ul>
<h2 id="conclusion">
  <a class="heading-anchor" href="#conclusion">Conclusion<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Will I end up switching to a modern laptop now? Maybe. I&rsquo;ve done so for my day job already, but the jury is still
out on whether I might end up with this particular model for my personal use (especially because of the damn Thunderbolt
dock issue). There are alternative laptops out there with similar pricing that are also in this Linux compatibility sweet spot.</p>
<p>Should you get one? If the price is right and you don&rsquo;t mind applying the workarounds for the issues I mentioned, then
go for it!</p>
<p>I have restored some faith in modern laptops now. They all suck in different ways, but this one is
not the worst one, and that&rsquo;s good enough for me. Probably. I&rsquo;ll keep my ThinkPad T430 in an easy to reach spot, just in
case.</p>
]]></content:encoded></item><item><title>TOMO M4: probably the coolest power bank I've owned</title><link>https://ounapuu.ee/posts/2023/03/03/tomo-m4-powerbank/</link><pubDate>Fri, 03 Mar 2023 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2023/03/03/tomo-m4-powerbank/</guid><description>All the reasons why I find this particular power bank to be really neat and why it could realistically be the last power bank I buy.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2023/03/03/tomo-m4-powerbank/media/cover_hu_7db932d60f3158c.jpg" width="1200" height="630" alt="TOMO M4: probably the coolest power bank I've owned" /><p>A friend once showed me a power bank that was so cool that I had to get one
myself. Ended up getting two, and here&rsquo;s why.</p>
<p>This post is <strong>not</strong> sponsored.</p>
<h2 id="removable-batteries">
  <a class="heading-anchor" href="#removable-batteries">Removable batteries<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Let&rsquo;s start with the feature that I appreciate the most: removable batteries!
The TOMO M4 accepts up to 4 18650 lithium ion battery cells, which are very
common nowadays and can be purchased from lots of retailers. You can also mix
and match cells and even run the power bank with 1-3 cells in it.</p>









<figure class="center">
  <a href="/posts/2023/03/03/tomo-m4-powerbank/media/image-0.jpg">
    <img src="/posts/2023/03/03/tomo-m4-powerbank/media/image-0_hu_9e4c88835b1afeeb.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="TOMO M4 running on two battery cells.">

  </a>
  <figcaption class="center">TOMO M4 running on two battery cells.</figcaption>
</figure>

<p>If you&rsquo;re feeling adventurous and you know what you&rsquo;re doing, you could in
theory take an used battery pack from a device that utilises 18650 lithium ion
cells, disassemble it completely and use the healthier cells inside power banks
like this one. They might not be healthy enough to power bigger
devices, such as e-scooters, but they might be just enough to charge your phone.
This is something I want to try out eventually with things like old ThinkPad
laptop batteries since the risk of burning the whole building down is smaller
with those.</p>
<p>I&rsquo;ve previously bought cheap &ldquo;10000 mAh&rdquo; power banks from brands like Xiaomi
and have had mixed experiences. Yeah, they usually get the job done, but should
the battery die in it, then you&rsquo;re probably just going to throw the thing away
because the battery is not easily replaceable. That&rsquo;s really wasteful.</p>
<p>With the TOMO M4 it&rsquo;s a matter of sliding the plastic case open and just
replacing the cells, similar to what you&rsquo;d do for a TV remote with AA batteries.
It&rsquo;s so easy that even your grandma could do it!</p>
<p>I don&rsquo;t understand why it&rsquo;s acceptable to enclose consumable items like
batteries in devices that are difficult or impossible to open up (the real
reason is probably profits, right?). The battery <strong>will die</strong> at some point, no
matter how well you take care of it.</p>
<p>If the rest of the device holds up, then the TOMO M4 could realistically be the
last power bank I buy.</p>
<h2 id="the-cool-factor">
  <a class="heading-anchor" href="#the-cool-factor">The cool factor<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Now that we&rsquo;re done with the most practical aspect, let&rsquo;s look at the display.
Once you power it on, you&rsquo;ll see the green-lit LCD screen light up. The screen
shows the charge level of the individual cells during standby. While charging,
you&rsquo;ll see a nice little animation.</p>
<p>But that&rsquo;s not the coolest part. If you connect a device to one of the USB ports,
it will show the voltage and current that the power bank is outputting. Multiply
those two numbers and you can actually see the wattage that a device is pulling.</p>









<figure class="center">
  <a href="/posts/2023/03/03/tomo-m4-powerbank/media/image-1.jpg">
    <img src="/posts/2023/03/03/tomo-m4-powerbank/media/image-1_hu_5e8efaa315dddc79.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The display does exhibit ghosting, which is most noticeable during charging.">

  </a>
  <figcaption class="center">The display does exhibit ghosting, which is most noticeable during charging.</figcaption>
</figure>

<p>Not everyone probably appreciates this as much as I do, but I just find it
to be really cool.</p>
<h2 id="the-downsides">
  <a class="heading-anchor" href="#the-downsides">The downsides<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>There are some things I&rsquo;ve noticed about this power bank that are less than
ideal.</p>
<p>The charging port is micro-USB, which is not that great in 2023. Out of all the
IT gear that I own, this power bank is the only regularly used item that
charges via that port. I&rsquo;d love to see this replaced with USB-C port, just for
the sake of uniformity. It&rsquo;s probably possible to modify this power bank and
replace the charging port with an USB-C port, but I have not got around to
doing that yet.</p>
<p>The display backlight can be turned off with a single click of the power button.
However, if you&rsquo;re charging a device that is close to being fully charged and
starts trickle-charging, the display backlight will turn back on. This is less
than ideal in situations where the backlight illumination bothers you, such as
during night.</p>
<p>The detailed analysis that I mention in the next paragraph mentioned that this
power bank <em>&ldquo;Can be used as UPS&rdquo;</em>. I put this to the test with two devices:
Raspberry Pi model B+ and a LattePanda V1. The Raspberry Pi struggled a lot and
the red power LED flickered constantly, indicating issues with power delivery.
The LattePanda V1 booted up and ran nicely for a while, but under a bigger load
it threw some errors into kernel logs and eventually locked up completely. On
a functional level this power bank can probably act as a UPS, but in practice
it did not work out for me. Other factors, such as the USB cable used and/or
the lithium ion cells that I used in the power bank, might have also influenced
the results of this quick test.</p>









<figure class="center">
  <a href="/posts/2023/03/03/tomo-m4-powerbank/media/image-2.jpg">
    <img src="/posts/2023/03/03/tomo-m4-powerbank/media/image-2_hu_bcb323ca35012844.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="LattePanda V1, powered by the TOMO M4.">

  </a>
  <figcaption class="center">LattePanda V1, powered by the TOMO M4.</figcaption>
</figure>

<h2 id="the-technical-details-in-detail">
  <a class="heading-anchor" href="#the-technical-details-in-detail">The technical details, in detail<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If you&rsquo;re interested in all the technical details for this particular power bank,
then definitely check out <a href="https://lygte-info.dk/review/Review%20USB%20battery%20box%20Tomo%20M4%20UK.html">this review on lygte-info.dk</a>.
It&rsquo;s a very detailed overview of the capabilities of this power bank, its
behaviour under different circumstances and a bunch of measurements and
explanations to back it all up.</p>
<p>I also like the way they phrased the verdict: <em>&ldquo;I will rate it as acceptable.&rdquo;</em>
Short and concise.</p>
<p>The author also reviews lots of other products and has the <a href="https://lygte-info.dk/info/Review%20UK.html">reviewing process
documented in detail.</a></p>
<h2 id="closing-thoughts">
  <a class="heading-anchor" href="#closing-thoughts">Closing thoughts<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>In general, I&rsquo;m very happy with this power bank. Although I&rsquo;d probably not
recommend it as an UPS for low-power computers, I&rsquo;d happily recommend this to
someone who needs a simple power bank that they won&rsquo;t have to throw away
after a few years.</p>
]]></content:encoded></item><item><title>LattePanda V1 - my experience with a Raspberry Pi alternative</title><link>https://ounapuu.ee/posts/2023/02/28/lattepanda-v1/</link><pubDate>Tue, 28 Feb 2023 09:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2023/02/28/lattepanda-v1/</guid><description>I got a LattePanda V1 and gave it a go as a Raspberry Pi replacement for my self-hosting setup. Here's how it went.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2023/02/28/lattepanda-v1/media/cover_hu_d0bf1305a5f9620b.jpg" width="1200" height="630" alt="LattePanda V1 - my experience with a Raspberry Pi alternative" /><p>As with many homelab experiments around 2022/2023, it all started with Raspberry Pi-s
being either out of stock or absurdly overpriced.</p>
<p>I once noticed a listing for a <a href="https://www.lattepanda.com/lattepanda-v1">LattePanda V1</a> on a local auction site.
The price was reasonable at 45 EUR, and after I looked at the specifications, I
had to get one to play around with.</p>
<p>The auction site usually sells used items, but this LattePanda V1 was brand new
in box, which surprised me. I got the 2GB RAM/32GB eMMC option.</p>
<p>I put the LattePanda through its paces, and here&rsquo;s what I learned.</p>
<p>Please note that my use cases are more on the software side, I did not try out
the hardware capabilities that SBC-s are also associated with (GPIO, camera/display
ports etc).</p>
<h2 id="the-hardware">
  <a class="heading-anchor" href="#the-hardware">The hardware<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>What makes the LattePanda V1 special is that it&rsquo;s based off of an x86 CPU.
Mine came with an <a href="https://ark.intel.com/content/www/us/en/ark/products/93361/intel-atom-x5z8350-processor-2m-cache-up-to-1-92-ghz.html">Intel Atom x5-Z8350</a>.
4 cores, not very fast ones, but similar or better to what you&rsquo;d find in a
Raspberry Pi 4. Most single-board computers usually come with an ARM-based CPU.</p>
<p>The board behaves like any normal PC. You power it on, you see the LattePanda
logo, and the OS just starts up. Smashing the &ldquo;Delete&rdquo; key during the boot
will direct you to the UEFI settings. Since this board is marketed towards
the technical crowd, it has so many settings that you can play with.
Definitely more than what I&rsquo;d know to do with.</p>
<p>The board comes with Windows 10 preinstalled. I booted it up and gave it a go,
and it was slow as molasses while it downloaded the latest updates. At one
point I reinstalled Windows 10 and ran into issues. It &ldquo;works&rdquo;, but I had trouble
getting any Intel GPU drivers installed on it, which rendered it almost useless
for any media playback use case that I could have used it for.</p>
<p>The port selection is okay. It comes with 100 Mbit/s Ethernet, one USB 3.0 port
and two USB 2.0 ports. I could get around 350 MB/s out of the USB 3 port with
an external SSD, and the USB 2 ports pulled anywhere between 15-40 MB/s,
depending on my luck. If you fancy a gigabit connection, then an USB-to-Ethernet
adapter might do the trick.</p>
<p>Adding one external HDD or SSD over USB is okay and works well, but after
adding a second one I noticed issues with either one of the disks not receiving
enough power. If you intend to use the LattePanda V1 as the brains for a cheap
NAS, then use drives that are powered externally.</p>
<p>The eMMC storage on the board is decent. Regarding performance it&rsquo;s somewhere
between a hard drive and a proper SSD, and the sequential read speeds max out
around 150 MB/s. My main concern with it is the durability. The eMMC chip is probably hidden
behind the metal shielding on the board and replacing it (if that is even
possible) might turn out to be tricky. <code>ls -lah /dev/disk/by-id/</code> lists the
eMMC chip as <code>mmc-DA4032</code>, which a little bit of Googling refers to it being a
SanDisk chip.</p>
<p>The microSD card port works, but either booting from the microSD card is not
possible or the board was a bit temperamental when I gave it a go with Ubuntu Server 22.04.</p>
<p>The board runs hot in its barebones configuration, any decent load over a longer time period
will result in the CPU throttling itself. I recommend rigging up a metal
heat sink to the bottom of the board to avoid throttling and stability issues
under very high load. A thermal pad, a piece of metal, and a bunch of zip ties
will do wonders.</p>









<figure class="center">
  <a href="/posts/2023/02/28/lattepanda-v1/media/image-1.jpg">
    <img src="/posts/2023/02/28/lattepanda-v1/media/image-1_hu_e1f7f36d88fce326.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Do not look at the bend.">

  </a>
  <figcaption class="center">Do not look at the bend.</figcaption>
</figure>

<h2 id="the-linux-experience">
  <a class="heading-anchor" href="#the-linux-experience">The Linux experience<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>When experimenting with Linux, I found a couple of annoyances. The LattePanda V1
seems to have a display connector on board. However, in Linux it turned out to
be an annoyance as the system always presented a 1024x768 display being
connected to the system. Booting into a Fedora Linux liveUSB environment will
lead you to staring a blank view with only the wallpaper present.
Playing with settings in UEFI did not lead to any improvements. What works is
<a href="https://unix.stackexchange.com/a/526619">adding a kernel parameter</a>:
<code>video=DSI-1:d</code>. With Fedora Linux, if you apply this fix in GRUB when first
booting into the liveUSB environment, it will persist after the installation
is done.</p>
<p>Once I had Fedora Linux booted up, I did not have a good time. The display
flickered when I dragged the mouse near the edges and the performance was awful.
It didn&rsquo;t take long for the desktop session to crash.</p>
<p>One of the main reasons I wanted to experiment with this setup was the low power
usage of this board. The LattePanda V1 idles at around 3 watts, and under a high
CPU load generated with <code>stress -c 4</code> I could get it to 5-6 watts. This made it
a great candidate for running this website and Wireguard VPN 24/7 at home.
I ended up installing Ubuntu Server 22.04 on it and actually ran this website
off of it for about a week or so.</p>
<p>The reason I stopped using the LattePanda V1 for that purpose was the
performance. The 100 Mbit/s Ethernet wasn&rsquo;t a disaster, but it did set limits
to how much traffic I could push through the board. What made me reconsider was
the CPU performance. Simply put: SSL encryption speeds were about 5-10x slower
than on my ThinkPad T430 that ran as a server before.</p>
<p>My performance testing wasn&rsquo;t scientific or anything, but I did run simple tests.
One of the involved running <code>curl</code> against resources, such as an image on my
blog, in an infinite loop and over multiple threads. The ThinkPad T430 peaked at
around 650 Mbit/s of network bandwidth while the LattePanda V1 struggled at
around 60 Mbit/s.</p>
<p>After looking for some other benchmarking options that I could set up really
quickly, I also gave <a href="https://serverfault.com/a/160807">ApacheBenchmark a go</a>.
This more-or-less confirmed my findings and the requests per second results
are the following:</p>
<ul>
<li>ThinkPad T430: 301.72</li>
<li>LattePanda V1: 55.86</li>
</ul>









<figure class="center">
  <a href="/posts/2023/02/28/lattepanda-v1/media/bench-T430.png">
    <img src="/posts/2023/02/28/lattepanda-v1/media/bench-T430_hu_558c4a4c431b3448.webp"
     width="626"
     height="733"
     loading="lazy"
     decoding="async"
     alt="ApacheBenchmark results for the ThinkPad T430.">

  </a>
  <figcaption class="center">ApacheBenchmark results for the ThinkPad T430.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2023/02/28/lattepanda-v1/media/bench-lattepanda.png">
    <img src="/posts/2023/02/28/lattepanda-v1/media/bench-lattepanda_hu_84fa5fa602aa54cc.webp"
     width="626"
     height="708"
     loading="lazy"
     decoding="async"
     alt="ApacheBenchmark results for the LattePanda V1.">

  </a>
  <figcaption class="center">ApacheBenchmark results for the LattePanda V1.</figcaption>
</figure>

<p>The LattePanda V1 was over 5 times slower in that test. With a slow internet
uplink this might not matter much, though.</p>
<p>I ended up putting the T430 back in service after doing more calculations.
One idea I had with the LattePanda V1 was to have that run 24/7 due to its
low idle power usage and have another beefy server run during certain hours.
I liked that idea until I calculated the difference in power savings. Having
the main server with around 12 W of idle power turn off for 6 hours and the
LattePanda running at the same time would have actually increased the total
power consumption of the setup compared to having the main server running 24/7.</p>
<p>The math will make sense if your main server uses much more power. Most desktop
PC-s that I have seen idle around 35-50 W and rack-mounted servers use even
more than that, so in those situations this might make more sense. <a href="https://maximiliangolla.com/blog/2022-10-wol-plex-server/">Or you can
whip up a solution that starts and stops machines in your homelab on-demand.</a></p>
<p>Oh, and don&rsquo;t expect to run CPU or GPU based transcoding off of this thing with
Jellyfin. It works okay for certain video formats and resolutions, but a 1080p
H.265 video transcoded to H.264 is just not fast enough on this machine.</p>
<h2 id="a-suitable-use-case">
  <a class="heading-anchor" href="#a-suitable-use-case">A suitable use case<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I might change my mind at one point and give the LattePanda a go again as a
low power web server. <a href="/posts/2022/11/01/finding-use-case-for-raspberry-pi/">I hate unused hardware</a>,
which is why this LattePanda V1 is now serving as an offsite backup. The USB 3
port makes sense for attaching a bigger storage device and if you run ZFS, you
can also send your whole filesystem to it with <code>zfs send/receive</code> or <code>syncoid</code>.
I haven&rsquo;t had much luck with ARM and ZFS, but with the LattePanda and its
x86-based CPU I have not had issues.</p>









<figure class="center">
  <a href="/posts/2023/02/28/lattepanda-v1/media/image-2.jpg">
    <img src="/posts/2023/02/28/lattepanda-v1/media/image-2_hu_6b11150490335f68.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="LattePanda V1 in its final form: a backup endpoint.">

  </a>
  <figcaption class="center">LattePanda V1 in its final form: a backup endpoint.</figcaption>
</figure>

<h2 id="conclusion">
  <a class="heading-anchor" href="#conclusion">Conclusion<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>All-in-all, it&rsquo;s a neat little board that shows signs of instability from time to time.
If you intend to just run Ubuntu Server on it and your workloads are not
very performance critical, then it might work out well for you. Think of it
like a juiced-up Raspberry Pi 4 to get an idea of what it might be suitable for
regarding performance.</p>
<p>It did not fit the use case I intended to use it for, but I&rsquo;m still happy that
I could play around with this board. It was fun!</p>
]]></content:encoded></item><item><title>Shrinkflation, SanDisk style</title><link>https://ounapuu.ee/posts/2023/02/15/shrinkflation/</link><pubDate>Wed, 15 Feb 2023 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2023/02/15/shrinkflation/</guid><description>A cheap USB stick and the marketing around it caused disappointment, more at 11.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2023/02/15/shrinkflation/media/cover_hu_3f8d085c81d8a354.jpg" width="1200" height="630" alt="Shrinkflation, SanDisk style" /><p><strong>2023-02-16 update:</strong> this post is <strong>not</strong> about the &ldquo;GB vs GiB&rdquo; issue, or the &ldquo;lost disk space&rdquo; that you
notice after formatting the device in an OS. Please read the article in full before
making inaccurate comments online.</p>
<p>For many years, I have used two SanDisk Ultra 16 GB USB flash drives
as OS installation media. Since I do not trust <a href="https://www.ventoy.net/en/index.html">Ventoy</a> yet,
and alternative &ldquo;one stick that does it all&rdquo; solutions have had odd bugs from time to time,
I prefer having separate physical USB sticks for each OS, one for Fedora Linux,
and one for Windows 10.</p>
<p>I hate reflashing sticks all the time and would like to have at least one around
that always has Fedora Linux on it, so I decided to get two more USB sticks of the
same brand and size. Once they arrived, I got annoyed.</p>
<p>The old flash drive shows up like this in GNOME Disks.</p>









<figure class="center">
  <a href="/posts/2023/02/15/shrinkflation/media/image-0.png" aria-label="View full-size image">
    <img src="/posts/2023/02/15/shrinkflation/media/image-0_hu_e94c505cd851477c.webp"
     width="397"
     height="122"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>Here&rsquo;s the new one.</p>









<figure class="center">
  <a href="/posts/2023/02/15/shrinkflation/media/image-1.png" aria-label="View full-size image">
    <img src="/posts/2023/02/15/shrinkflation/media/image-1_hu_33959bdf0f4bf38e.webp"
     width="409"
     height="120"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>Although it does not matter one <em>bit</em> for my use case, I am annoyed that the new one
is shipping with much fewer bits than the old one. I&rsquo;m a whole 607125504 bytes short!
That&rsquo;s 579 MB, or about half a gigabyte.</p>
<p>The only difference that I can make out on the surface is that the new one was manufactured in Malaysia.</p>









<figure class="center">
  <a href="/posts/2023/02/15/shrinkflation/media/image-2.jpg">
    <img src="/posts/2023/02/15/shrinkflation/media/image-2_hu_482485eb9cc5b2fd.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Other than years worth of wear and tear, they look almost identical.">

  </a>
  <figcaption class="center">Other than years worth of wear and tear, they look almost identical.</figcaption>
</figure>

<p>But it seems that SanDisk (or their new owner Western Digital) has legally covered their butt with
<a href="https://support-en.wd.com/app/answers/detailweb/a_id/35080">this knowledge base article.</a></p>









<figure class="center">
  <a href="/posts/2023/02/15/shrinkflation/media/image-3.png" aria-label="View full-size image">
    <img src="/posts/2023/02/15/shrinkflation/media/image-3_hu_4fb23f920cfa8ac8.webp"
     width="862"
     height="179"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>Here&rsquo;s the line that explains why some bytes are seemingly missing on formatted media.
This is what consumers are usually concerned about once they use their storage device.</p>
<blockquote>
<p>SanDisk defines 1 GB as 1,000,000,000 bytes.  Operating Systems define 1 GB as 1,073,741,824 BYTES.</p>
</blockquote>
<p>However, this section is the one actually relevant to my finding.</p>
<blockquote>
<p>A portion of the total capacity is used to store certain functions including optimizations of the memory
that support performance and endurance and therefore is not available for user storage.
This is disclosed on our packaging and marketing materials when you see the statement &ldquo;Actual user storage less.&rdquo;</p>
</blockquote>
<p>Based on this, I assume that SanDisk cheaped out and decided to not add enough flash to provide
both the advertised storage of 16 000 000 000 bytes available to the user <em>and</em> some room for
over-provisioning that flash storage benefits from. And somehow they are the only ones who do it
this way, as all other storage media that I own shows up with the proper number of bytes.</p>
<p>And for those interested, here&rsquo;s <code>f3</code> output for both the old and new sticks.</p>
<p>Old:</p>
<pre tabindex="0"><code># f3probe /dev/sdc --destructive --time-ops
F3 probe 8.0
Copyright (C) 2010 Digirati Internet LTDA.
This is free software; see the source for copying conditions.

WARNING: Probing normally takes from a few seconds to 15 minutes, but
         it can take longer. Please be patient.

Good news: The device `/dev/sdc&#39; is the real thing

Device geometry:
	         *Usable* size: 14.91 GB (31266816 blocks)
	        Announced size: 14.91 GB (31266816 blocks)
	                Module: 16.00 GB (2^34 Bytes)
	Approximate cache size: 0.00 Byte (0 blocks), need-reset=no
	   Physical block size: 512.00 Byte (2^9 Bytes)

Probe time: 1&#39;49&#34;
 Operation: total time / count = avg time
      Read: 463.8ms / 4814 = 96us
     Write: 1&#39;48&#34; / 4192321 = 25us
     Reset: 1us / 1 = 1us
</code></pre><p>New:</p>
<pre tabindex="0"><code># f3probe /dev/sdd --destructive --time-ops
F3 probe 8.0
Copyright (C) 2010 Digirati Internet LTDA.
This is free software; see the source for copying conditions.

WARNING: Probing normally takes from a few seconds to 15 minutes, but
         it can take longer. Please be patient.

Good news: The device `/dev/sdd&#39; is the real thing

Device geometry:
	         *Usable* size: 14.34 GB (30081024 blocks)
	        Announced size: 14.34 GB (30081024 blocks)
	                Module: 16.00 GB (2^34 Bytes)
	Approximate cache size: 0.00 Byte (0 blocks), need-reset=no
	   Physical block size: 512.00 Byte (2^9 Bytes)

Probe time: 1&#39;02&#34;
 Operation: total time / count = avg time
      Read: 338.2ms / 4814 = 70us
     Write: 1&#39;02&#34; / 4192321 = 14us
     Reset: 1us / 1 = 1us
</code></pre><p>I&rsquo;m not even mad, I&rsquo;m just disappointed.</p>
<h2 id="2023-02-16-update">
  <a class="heading-anchor" href="#2023-02-16-update">2023-02-16 update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This post received more attention than usual, so here are some additional details and clarifications.</p>
<blockquote>
<p>Why do you not trust Ventoy?</p>
</blockquote>
<p>Ventoy is a great tool from what I&rsquo;ve seen online and the use case it fills does save time and resources.
However, I have some reservations about it. If I had to compromise a bunch of critical systems
over a long time period, then publishing a great tool and having it tamper with your OS installation media
silently would be a really good pick. At this time, I don&rsquo;t trust the developers of the tool enough
and I don&rsquo;t have the time or skills to perform repeated audits of the software every time they release a
new version.</p>
<blockquote>
<p>MBR vs GPT partitioning</p>
</blockquote>
<p>That was an oversight on my part, I should have presented both disks with the same partitioning scheme
to avoid unnecessary confusion. This has now been corrected.</p>
<blockquote>
<p>Alternatives to Ventoy</p>
</blockquote>
<p>One reader pointed out a physical device that can be used for a similar purpose as Ventoy: <a href="http://iodd.kr">IODD</a>.
I have not tested on myself and reportedly it has some bugs and is not 100% perfect, but it seems like
a neat hardware-based alternative.</p>
<p>I have personally tried out things like <a href="https://www.drivedroid.io/">DriveDroid</a> in the past, but
that required a rooted Android phone and it was not 100% bug-free either.</p>
<blockquote>
<p>Everyone knows that GB and GiB are not the same, why is this post even a thing,
the author is clearly incompetent and dumb.</p>
</blockquote>
<p>Read the article.</p>
]]></content:encoded></item><item><title>ThinkPad as a server: the follow-up</title><link>https://ounapuu.ee/posts/2023/01/27/thinkpad-as-server-followup/</link><pubDate>Fri, 27 Jan 2023 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2023/01/27/thinkpad-as-server-followup/</guid><description>The ThinkPad as a server is back, this time with a couple of adjustments.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2023/01/27/thinkpad-as-server-followup/media/cover_hu_cbe0fc525453c7fc.jpg" width="1200" height="630" alt="ThinkPad as a server: the follow-up" /><p>It&rsquo;s been a while since I last wrote about my <a href="/posts/2022/05/10/thinkpad-as-a-home-server/">ThinkPad T430 that was tasked with being a home server.</a>
After doing some experiments with my setup a couple of times, it is once again the main server for all my self-hosting
needs. However, this time I have made some adjustments.</p>
<h2 id="background">
  <a class="heading-anchor" href="#background">Background<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The monstrosity that you&rsquo;re looking at is what I&rsquo;d call &ldquo;the minimum viable ThinkPad as a server&rdquo;. To be fair, you <em>could</em>
go even more minimal by ripping out everything but the motherboard and the drives, but for my use case this is how far I
was willing to go.</p>
<p>In my previous post about this setup, I mentioned that the T430 suffered unexpected shutdowns under certain situations,
which usually involved running the fan at the lowest speed, moderate to high CPU load, and a lot of storage activity.
It wasn&rsquo;t the CPU as the temperatures were way below the critical point, so I suspected either the motherboard or the
storage running hot and tripping some sensor that I wasn&rsquo;t aware of.</p>
<p>For a while now, I have been thinking about running the T430 as bare as possible. One idea involved taking the bare
motherboard and the storage and slapping it on an acrylic sheet with some stand-offs, which should give it the best
chance at cooling. Unfortunately I didn&rsquo;t have enough time to commit to this, and that setup would have had some
downsides as well. At some point an idea popped to my mind: I could probably achieve a similar result by stripping
everything but the bare necessities from the laptop and improve the cooling as a result. That&rsquo;s how I ended up with
what you just saw.</p>
<h2 id="t430-stripped">
  <a class="heading-anchor" href="#t430-stripped">T430, stripped<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I ended up removing the following from the T430:</p>
<ul>
<li>palm rest</li>
<li>smart card reader</li>
<li>Bluetooth chip</li>
<li>WiFi chip</li>
<li>the whole display assembly</li>
</ul>
<p>This was in part motivated by the fact that those parts are the ones that are not in the best shape on my main ThinkPad
T430 that I use as an actual laptop. The other part was this nagging feeling that the most powerful PC that I own
<a href="/posts/2022/01/17/asrock-x300-future-of-desktops/">(the ASRock DeskMini X300)</a> was woefully underutilized as my home
server.</p>
<p>The keyboard had to stay because the power button is part of the keyboard assembly. There are ways to power on the
laptop without the keyboard:</p>
<ul>
<li>put the laptop in a dock and use the power button that is present on the dock</li>
<li>short a specific pin on the keyboard connector to ground</li>
</ul>
<p>I do have some extra ThinkPad docks around that I could have used for this purpose, but it would have made the setup
bulkier, which is why I did not go for that, at least not yet.</p>
<p>There is also an option in UEFI settings that can be used to turn the laptop on by connecting the charger
(&ldquo;Power on with AC attach&rdquo;), but that only seems to work if you have a battery connected and after you have turned the
laptop on manually once. The same caveat applies for Wake on LAN functionality. If the laptop overheats or it runs out
of battery completely, then you need to manually power it on.</p>
<h2 id="the-cooling-situation">
  <a class="heading-anchor" href="#the-cooling-situation">The cooling situation<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Removing the palm rest reveals something that might be related to the unexpected shutdowns that I observed with this
setup previously.</p>









<figure class="center">
  <a href="/posts/2023/01/27/thinkpad-as-server-followup/media/image-0.jpg" aria-label="View full-size image">
    <img src="/posts/2023/01/27/thinkpad-as-server-followup/media/image-0_hu_1c812eb038d9345b.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>Under this area is a chip on the motherboard that seems to generate a modest amount of heat. While the machine is running,
it gets warm to touch and gets hot if you throw a high load at the system, especially if you include storage in the
mix. With the laptop lid closed and the palm rest being present, the cooling situation for this area can be quite bad
indeed. Now that the palm rest is removed, this area of the laptop is now exposed, which should help with the cooling
for this chip.</p>
<p>Having the keyboard connected in this state isn&rsquo;t too bad. It does restrict the airflow a bit, yes, but at least it can
be fastened using two screws, which means that it won&rsquo;t move around and cause any other issues.</p>









<figure class="center">
  <a href="/posts/2023/01/27/thinkpad-as-server-followup/media/image-1.jpg" aria-label="View full-size image">
    <img src="/posts/2023/01/27/thinkpad-as-server-followup/media/image-1_hu_4e06712e1cdb52a4.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>With this setup, the cooling has improved noticeably. Unfortunately it didn&rsquo;t come to my mind to make a before/after
comparison to better illustrate this, so I will just write about how well it operates in this configuration.</p>
<p>Currently, I have the laptop fan controlled by a modified version of <a href="/posts/2022/09/26/minimum-viable-fan-control-script/">the minimum viable fan control script</a>.
The fan only kicks in after the CPU reaches 60°C, ramps up to a moderate speed at over 85°C, and lets the default fan
behaviour handle everything if the temperatures reaches over 95°C. This results in the fan being off completely for most
of the day as the server is idling at around 5-10% CPU usage and temperatures being anywhere between 45-60°C. When there
is a workload on the system that taxes the CPU, the fan will kick on with a small delay.</p>
<p>I&rsquo;ve also disabled turbo boost on the Intel i7-3632QM that is currently in this T430, which limits the clock speed to
2.2 GHz max. Performance takes a small hit, but the CPU is now running much more efficiently. This is one of the tweaks
that allows the laptop to be near silent. At a full 8 thread CPU load using <code>stress -c 8</code>, the CPU core temperatures
peak at 70°C at 22°C ambient temperature, with the fan running at around 2600 RPM.</p>
<p>As a result of all of this, the T430 is very quiet while using about 10-12W of power while idling.
Under the maximum CPU load generated by <code>stress</code>, the total system power usage is around 34W.</p>
<h2 id="putting-the-paste-in-thermal-paste">
  <a class="heading-anchor" href="#putting-the-paste-in-thermal-paste">Putting the &ldquo;paste&rdquo; in thermal paste<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Originally, the T430-as-a-server ran vertically using a basic laptop vertical stand. Back when I concluded the initial
test in 2022, I disassembled the machine and noticed something very odd with the thermal paste.</p>









<figure class="center">
  <a href="/posts/2023/01/27/thinkpad-as-server-followup/media/image-2.jpg" aria-label="View full-size image">
    <img src="/posts/2023/01/27/thinkpad-as-server-followup/media/image-2_hu_b6ce887f6e02fc08.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>Based on this image and the fact that I ran the machine quite warm most of the time (CPU temperatures around 60-80°C),
I assume that the excess thermal paste started slowly dripping down. The part that concerns me the most is that the top
of the chip was barely covered by the thermal paste. Either that part of the chip had great contact with the heatsink,
or the thermal paste drooped down with time and left it mostly uncovered. It could explain some of the issues, but
I&rsquo;ll avoid making any definitive conclusions from this alone.</p>
<p>To avoid similar issues in the future, the laptop is now on a stand at about 60° angle. Not sure if it will work,
but it&rsquo;s worth a shot.</p>
<h2 id="closing-thoughts">
  <a class="heading-anchor" href="#closing-thoughts">Closing thoughts<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Overall, I&rsquo;m happy with how this experiment turned out. Cooling is no longer an issue, and the T430 that I initially
got for spare parts is actually being useful. The amount of performance this machine offers while using very little
power seems to be a good balance for the workloads that I run on my home server.</p>
]]></content:encoded></item><item><title>Anything's a portable speaker if you're brave enough</title><link>https://ounapuu.ee/posts/2023/01/02/anythings-a-portable-speaker/</link><pubDate>Mon, 02 Jan 2023 07:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2023/01/02/anythings-a-portable-speaker/</guid><description>All about that time I converted a JBL soundbar into a portable speaker</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="Anything's a portable speaker if you're brave enough" /><p>I hate buying things that are single-purpose, which is why I ended up with this
setup.</p>









<figure class="center">
  <a href="/posts/2023/01/02/anythings-a-portable-speaker/media/0-image.jpg" aria-label="View full-size image">
    <img src="/posts/2023/01/02/anythings-a-portable-speaker/media/0-image_hu_7dceac05ae91cecc.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>










<figure class="center">
  <a href="/posts/2023/01/02/anythings-a-portable-speaker/media/1-image.jpg" aria-label="View full-size image">
    <img src="/posts/2023/01/02/anythings-a-portable-speaker/media/1-image_hu_e4b5dd1bab88357b.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>Take a speaker, a battery, put them together, and what you now have is a
portable speaker. Since I had access to both, I felt no need to buy a separate
portable speaker for use in social events.</p>
<p>The fact that this JBL soundbar supports Bluetooth was what sealed the deal.
Just make sure to keep the setup a fair distance away from any bigger bonfires,
liquids and bugs, and you should be good to go.</p>
]]></content:encoded></item><item><title>What changing the CPU on a laptop looks like</title><link>https://ounapuu.ee/posts/2022/12/09/changing-cpu-in-a-laptop/</link><pubDate>Fri, 09 Dec 2022 07:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2022/12/09/changing-cpu-in-a-laptop/</guid><description>Quick demonstration of a CPU replacement in a ThinkPad T430.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="What changing the CPU on a laptop looks like" /><p>This post illustrates something that is not common on modern laptops:
changing the CPU.</p>









<figure class="center">
  <a href="/posts/2022/12/09/changing-cpu-in-a-laptop/media/0-cover.jpg">
    <img src="/posts/2022/12/09/changing-cpu-in-a-laptop/media/0-cover_hu_4c83819246e9e445.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The CPU we&#39;re replacing in the T430: a 45W Intel i7-3820QM.">

  </a>
  <figcaption class="center">The CPU we&#39;re replacing in the T430: a 45W Intel i7-3820QM.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2022/12/09/changing-cpu-in-a-laptop/media/1-unscrew.jpg">
    <img src="/posts/2022/12/09/changing-cpu-in-a-laptop/media/1-unscrew_hu_9919a14cced4cfe2.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Loosen the CPU by turning the screw with a flathead screwdriver.">

  </a>
  <figcaption class="center">Loosen the CPU by turning the screw with a flathead screwdriver.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2022/12/09/changing-cpu-in-a-laptop/media/2-socket.jpg">
    <img src="/posts/2022/12/09/changing-cpu-in-a-laptop/media/2-socket_hu_b741f6f45086469.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="A CPU socket in a laptop.">

  </a>
  <figcaption class="center">A CPU socket in a laptop.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2022/12/09/changing-cpu-in-a-laptop/media/3-replacement.jpg">
    <img src="/posts/2022/12/09/changing-cpu-in-a-laptop/media/3-replacement_hu_4b76c681c5159ef6.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Make sure the golden triangle aligns with the marking on the socket, and pop that new CPU in.">

  </a>
  <figcaption class="center">Make sure the golden triangle aligns with the marking on the socket, and pop that new CPU in.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2022/12/09/changing-cpu-in-a-laptop/media/4-cleaned-up.jpg">
    <img src="/posts/2022/12/09/changing-cpu-in-a-laptop/media/4-cleaned-up_hu_bd97f26bd4d33882.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="A bit of 98% alcohol goes a long way.">

  </a>
  <figcaption class="center">A bit of 98% alcohol goes a long way.</figcaption>
</figure>

<h2 id="background">
  <a class="heading-anchor" href="#background">Background<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>One of the modifications that you can do to a ThinkPad T430 laptop is changing
the CPU to a more powerful quad core model. That&rsquo;s exactly what I did back in 2017,
but due to the poor availability of compatible CPU-s in my region I went for
one with a 45W TDP, which is a bit much for a laptop designed for CPU-s with a
35W TDP.</p>
<p><a href="/posts/2022/09/26/minimum-viable-fan-control-script/">You could work around this issue with software</a>,
and that&rsquo;s what I also did for a long time. Since I now own two T430-s and the
availability of 35W parts is better now, I decided to go for one to see how
well these two options compare (result: it doesn&rsquo;t overheat as often, but it
managed to do it once anyway).</p>
<p>Unlike my T430, most modern laptops come with a soldered CPU.
<a href="https://www.tech-critter.com/review-level51-forge-15r/">There do exist laptops that come with a socketed CPU</a>,
but those are not that common and are designed for very specific use cases.</p>
<p>Soldering the CPU right to the board has its benefits, such as the machine
being thinner, and CPU-s don&rsquo;t really die all that often. However, what we have
lost out on is the option to upgrade older machines with more powerful
components, extending the useful lifetime of the device.</p>
<p>Yes, you <em>can</em> replace soldered CPU-s, but that requires a skillset and
equipment that few people have.</p>
]]></content:encoded></item><item><title>I have a 'Dall UD19PB ThundeRbglt Dock': my experience with the HP Elitebook 845 G9</title><link>https://ounapuu.ee/posts/2022/11/21/hp-elitebook-845-g9/</link><pubDate>Mon, 21 Nov 2022 07:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2022/11/21/hp-elitebook-845-g9/</guid><description>I've tried out newer laptops before and it was nothing short of a disaster. Is this HP any different, or do I need to go back to my ThinkPad T430 again?</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2022/11/21/hp-elitebook-845-g9/media/cover_hu_f904b2426d99b085.jpg" width="1200" height="630" alt="I have a 'Dall UD19PB ThundeRbglt Dock': my experience with the HP Elitebook 845 G9" /><p>I&rsquo;ve decided to give a new laptop a test drive, mainly because I had the
opportunity at work, and also out of <a href="/posts/2022/01/09/why-i-went-back-to-using-a-thinkpad-from-2012/">morbid curiosity.</a></p>
<p>It&rsquo;s the HP Elitebook 845 G9, and it has pretty good specifications:</p>
<ul>
<li>CPU: <a href="https://www.amd.com/en/products/apu/amd-ryzen-7-6800u">AMD Ryzen 7 6800U</a></li>
<li>RAM: 2x16GB DDR5</li>
<li>Storage: 512GB KIOXIA NVMe SSD (KBG50ZNV512G)</li>
<li>OS: Fedora 37, kernel version 6.0.8</li>
</ul>
<p>This laptop was also <a href="https://youtu.be/m8lsUvil_S8">shown in a recent LinusTechTips video</a>
and praised for its ease of repair and maintenance.</p>
<p>However, I can&rsquo;t seem to enjoy nice things. This attempt at using a newer
laptop has had some frustrating challenges. Perhaps the common denominator is
Linux. Or me. Can&rsquo;t rule anything out.</p>
<p>This is simply my experience with this laptop, including my attempts to overcome
certain issues with workarounds. If you find something that&rsquo;s factually
wrong about any part of this post, then please reach out!</p>
<h2 id="wi-fi">
  <a class="heading-anchor" href="#wi-fi">Wi-Fi<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>It all began with the Wi-Fi card not working. The card <em>can</em> be replaced, but
the results can be mixed.</p>
<p>An Intel Wi-Fi card that I had lying around would not be recognized
by the system at all. The situation was fixed by the reseller who replaced the
Realtek RTL8852BE chip with another Realtek one, this time with the Realtek
RTL8822CE.</p>
<p><a href="https://github.com/lwfinger/rtw8852be">Yes, there exist drivers that you can install,</a>
but it&rsquo;s far from an ideal solution. You will have to reinstall the Wi-Fi driver
after every kernel update, and the kernel updates frequently on Fedora Linux.</p>
<p>The HP website allows you to pick between a Realtek and Qualcomm Wi-Fi chip. My
recommendation is to go with the Qualcomm option because the Realtek RTL8852BE
does not work out of the box.</p>
<h2 id="airplane-mode">
  <a class="heading-anchor" href="#airplane-mode">Airplane mode<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This is an issue I didn&rsquo;t think I would ever have to worry about.</p>
<p>The laptop would switch itself to airplane mode at random on boot. Not on every
boot, but about 50% of the time. When you try to disable Airplane mode from
GNOME settings, it would flip back on again, no matter how often you tried.</p>
<p>To turn Airplane mode off properly, you have to use the Airplane mode keyboard
shortcut, and even then it might take an attempt or two.</p>
<p><a href="https://h30434.www3.hp.com/t5/Notebook-Operating-System-and-Recovery/EliteBook-845-G9-BIOS-Update-Causing-Problems/td-p/8490697">Some HP users suspect that the issue might be related to a botched firmware
update.</a>
There&rsquo;s a kernel patch in the pipeline, and some users say that blacklisting
the <code>hp_wmi</code> kernel module could also fix the issue.</p>
<p><a href="https://askubuntu.com/a/965596">Others say that this behaviour might be related to certain events being triggered
on the laptop, such as lid closing or the screen rotating.</a>
The proposed fix did not work to resolve this issue on my laptop.</p>
<p>Blacklisting the <code>hp_wmi</code> kernel module was what improved the situation for me.</p>
<h2 id="usb4-and-thunderbolt">
  <a class="heading-anchor" href="#usb4-and-thunderbolt">USB4 and Thunderbolt<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This laptop is noteworthy due to its support for USB4, which brings with it
support for Thunderbolt, making it one of the first AMD-based laptops to
properly support that feature.</p>
<p>At my current employer the general trend has been towards standardization:
every meeting room and desk has a single USB-C port that you plug into, and
you should be good to go.</p>
<p>I can confirm that USB-C docks seem to work quite well under Linux, especially
the one integrated into my Dell monitor at work.</p>
<p>I can also confirm that the Dell WD19TB Thunderbolt 3 dock does work.</p>
<p>On Windows 10.</p>
<p>Not on Linux though.</p>
<p>At some point the errors I saw in kernel logs got quite ridiculous.</p>









<figure class="center">
  <a href="/posts/2022/11/21/hp-elitebook-845-g9/media/dall.png">
    <img src="/posts/2022/11/21/hp-elitebook-845-g9/media/dall_hu_d728ef9e680cce65.webp"
     width="967"
     height="236"
     loading="lazy"
     decoding="async"
     alt="The device name reads like a counterfeit merchandise listing at Amazon.">

  </a>
  <figcaption class="center">The device name reads like a counterfeit merchandise listing at Amazon.</figcaption>
</figure>

<p>When reconnecting the port, the results were slightly different almost every time.</p>









<figure class="center">
  <a href="/posts/2022/11/21/hp-elitebook-845-g9/media/garbage-time.png">
    <img src="/posts/2022/11/21/hp-elitebook-845-g9/media/garbage-time_hu_da7d0962ae3ddfed.webp"
     width="976"
     height="132"
     loading="lazy"
     decoding="async"
     alt="I think the dock has suffered a stroke.">

  </a>
  <figcaption class="center">I think the dock has suffered a stroke.</figcaption>
</figure>

<p>The UEFI settings allow some control over the behaviour of the USB-C ports.
You can even disable Thunderbolt support and use them as plain USB-C ports with
DisplayPort support.</p>
<p>The behaviour of the dock would also be different depending on how you connect
it. If the dock is connected during boot, your USB devices and Ethernet port
will all be functional, but there&rsquo;s no display output. If you boot while the
dock is disconnected and connect it once you have reached the GUI, your display
will work, but you have no USB or Ethernet support.</p>
<p>Even if one of the two critical functions of the dock work, reconnecting the
cable will eventually result in nothing working. You also have a 50% chance of
the machine locking up completely.</p>
<p>The reasons for these issues can be any one of these:</p>
<ul>
<li>the proper kernel support is not there yet</li>
<li>HP messed something up with the latest UEFI update for Linux users</li>
<li>I was using it wrong</li>
</ul>
<h2 id="dell-wd19tb-thunderbolt-dock-workaround">
  <a class="heading-anchor" href="#dell-wd19tb-thunderbolt-dock-workaround">Dell WD19TB Thunderbolt dock workaround<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>After multiple sessions of troubleshooting, I seem to have come up with a
solution that seems to work for my use case, which involves connecting a
couple of USB devices, an Ethernet cable, and one 1440p monitor. You&rsquo;re giving
up Thunderbolt capabilities and forcing the dock to fall back to USB+DP altmode
setting, but in return you&rsquo;ll get a setup that actually works.</p>
<p>To get the Dell WD19TB Thunderbolt dock working, do the following:</p>
<ul>
<li>go to UEFI settings and turn off Thunderbolt mode</li>
<li>save settings and reboot</li>
<li>connect your monitor over HDMI</li>
</ul>
<p>Yup, that was it. I could not get DisplayPort working. Only HDMI.</p>
<p>The UEFI settings do contain a setting that allows you to sacrifice
USB and Ethernet bandwidth to allow for higher resolution DP signals to be passed
through, but that&rsquo;s simply not acceptable to me. Based on the description, I
think that the setting forces all USB devices to run at USB 2.0 speeds.
This setting may fix the issue if you want to use DisplayPort, but I haven&rsquo;t
tried it yet.</p>
<h2 id="suspend">
  <a class="heading-anchor" href="#suspend">Suspend<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Doesn&rsquo;t work. The screen will go black and the power button indicator will keep
blinking. Only way to break that cycle is to force the laptop to reset by
holding the power button down for an extended amount of time.</p>
<p>On Lenovo laptops I&rsquo;ve seen an option that allows you to change the S3 state
behaviour for Linux compatibility. I haven&rsquo;t found a way to do something
similar on the HP yet.</p>
<h2 id="stability">
  <a class="heading-anchor" href="#stability">Stability<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This is the straw that broke the camel&rsquo;s back. When playing back video, I
noticed issues with glitching and stuttering. The video would play fine, until
a frame froze for a few seconds, and then everything continued as normal.</p>
<p>What ruined everything for me were the random crashes that only occurred when
playing back video.</p>
<p>When I checked system logs from a previous boot (<code>journalctl -b -1</code>), I found
that something was up with the GPU driver.</p>









<figure class="center">
  <a href="/posts/2022/11/21/hp-elitebook-845-g9/media/amdgpubrr.png" aria-label="View full-size image">
    <img src="/posts/2022/11/21/hp-elitebook-845-g9/media/amdgpubrr_hu_2466209bebcde57b.webp"
     width="1280"
     height="289"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>This was not a one-off event and once it had happened for the fourth time, I
gave up on this machine and switched back to my trusty ThinkPad T430.</p>
<h2 id="conclusion">
  <a class="heading-anchor" href="#conclusion">Conclusion<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Given enough time, I&rsquo;m sure that at least some of the issues will get fixed,
either with a kernel update or HP rolling out a UEFI update that fixes things
for Linux users.</p>
<p>It&rsquo;s also possible that a specific set of UEFI settings will contribute to
fixing any of the issues listed here. The number of combinations you can have
is too high for me to bother testing all of those, so I won&rsquo;t be doing that.</p>
<p>In its current state, I cannot recommend this laptop to Linux users. You <em>can</em>
get most things working, but you will still be incredibly frustrated with the
issues that remain.</p>
<p>Something has to change, and it&rsquo;s going to be how I choose hardware in the
future. Linux will stay, which means that the newest and &ldquo;greatest&rdquo; hardware
is off the table for me. Honestly, lagging behind the newest hardware 3-5 years
(or 10 in my case) doesn&rsquo;t sound too bad, you&rsquo;ll still get the performance
improvements at a fraction of the original price.</p>
<p>If that&rsquo;s what&rsquo;s necessary for a good Linux experience, then so be it.</p>
]]></content:encoded></item><item><title>I finally found an use case for my Raspberry Pi Model B+</title><link>https://ounapuu.ee/posts/2022/11/01/finding-use-case-for-raspberry-pi/</link><pubDate>Tue, 01 Nov 2022 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2022/11/01/finding-use-case-for-raspberry-pi/</guid><description>I take a severely underpowered computer and make it do something useful.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="I finally found an use case for my Raspberry Pi Model B+" /><p>You have probably heard about the Raspberry Pi. It&rsquo;s a nice little affordable
single-board computer with a huge community using it for all sorts of projects.</p>
<p>I got my first Raspberry Pi, <a href="https://www.raspberrypi.com/products/raspberry-pi-1-model-b-plus/">the Model B+</a>,
during my first year at university, which was around the winter of 2014/2015.
The idea of a super tiny PC that could actually do useful things was just very
fascinating to me, and I loved the way that green PCB looked.</p>
<p>Over the years, I&rsquo;ve used that Pi and newer revisions of them in all sorts of
use cases: a simple Kodi media box, a Minecraft server, a web server, retro game
emulation box, and much more.</p>
<p>Because the goal of the Raspberry Pi was to be an affordable platform for
experimentation and learning for everyone, they had to keep the costs down. This
meant that the computing power that the Raspberry Pi 1 packed wasn&rsquo;t much.
With the Model B+, you get one ARM CPU core that you can overclock to 1 GHz,
and 512MB of RAM. It wasn&rsquo;t much even at the time of release, and it definitely
isn&rsquo;t great in 2022.</p>
<p>Due to the very limited performance, the use cases for a Raspberry Pi 1 are
quite limited in 2022. Use cases that don&rsquo;t require much computational power
are often better solved by other platforms. Use cases that are actually useful
to me and solve a problem I have are too much for the Pi 1. At the same time,
I absolutely hate it when I have computing equipment sitting around on a shelf
doing nothing. I can&rsquo;t even sell this Pi, because it is not worth much any more
and it has some sentimental value for me.</p>
<p>Taking all that into account, and looking at my parts box, I decided to give one
idea a go: let&rsquo;s build the slowest damn Syncthing backup endpoint imaginable.</p>









<figure class="center">
  <a href="/posts/2022/11/01/finding-use-case-for-raspberry-pi/media/0-setup.jpg" aria-label="View full-size image">
    <img src="/posts/2022/11/01/finding-use-case-for-raspberry-pi/media/0-setup_hu_1440ba594030c917.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<h2 id="the-build">
  <a class="heading-anchor" href="#the-build">The build<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Here&rsquo;s a quick rundown of the parts:</p>
<ul>
<li>SBC: Raspberry Pi 1 Model B+</li>
<li>Storage (microSD): SanDisk 8GB that I had lying around</li>
<li>Storage (USB): Crucial BX500 1TB SATA 2.5&quot; SSD, in an IcyBox USB-SATA enclosure</li>
<li>Power: official Raspberry Pi microUSB power adapter</li>
<li>Networking: TP-Link TL-WN722N USB WiFI adapter</li>
<li>OS: Raspberry Pi OS 32-bit (lite)</li>
<li>Acoustic foam: yes.</li>
</ul>









<figure class="center">
  <a href="/posts/2022/11/01/finding-use-case-for-raspberry-pi/media/1-setup.jpg">
    <img src="/posts/2022/11/01/finding-use-case-for-raspberry-pi/media/1-setup_hu_525023390c5fe338.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Alternate angle of the setup.">

  </a>
  <figcaption class="center">Alternate angle of the setup.</figcaption>
</figure>

<p>Use case: networked offsite backup of files that I cannot afford
to lose, powered by <a href="https://syncthing.net/">Syncthing</a>, <code>btrfs</code> as the
filesystem, and <a href="https://digint.ch/btrbk/">btrbk</a> as the snapshotting solution.</p>
<p>I set the OS up using the Raspberry Pi imager due to the useful options it
offered, such as automatically setting my SSH public key authentication up.
Once booted, I logged in and ran <code>sudo apt update -y</code>. I knew what to expect
regarding performance, and was still surprised at how slow things have become.
Updating the system and deploying the configuration using Ansible took hours.</p>
<p>The 1TB SSD is formatted as a <code>btrfs</code> file system and mounted to <code>/storage</code>.
For the Syncthing service, I created a separate user <code>syncthing</code> with the home
folder on <code>/storage/home/syncthing</code>. The synced data will live on <code>/storage/syncthing</code>.
Keeping the home folder on the SSD is intentional: Syncthing keeps track of
application state in a database and storing it on the microSD card will wear it
out much faster. The database can also be quite big if you have a lot of
files to sync.</p>
<p>I&rsquo;m not going to go into the <code>btrbk</code> setup in much detail, but if you&rsquo;re
interested in that, then <a href="/posts/2022/07/09/btrbk-is-awesome/">I do have a write-up about btrbk</a>.
Long story short: snapshots are cool, and they help prevent data loss in case
of accidental deletions.</p>
<p>I set up Syncthing to allow access to the GUI from over the network by changing
the <code>~/.config/syncthing/config.xml</code> file while the service was stopped. Just
change the GUI listen address to <code>0.0.0.0:8384</code>, that will make the GUI accept
connections not only from localhost, but from all machines on the same network.
The next step was to set a password to the GUI and check the &ldquo;Use HTTPS for GUI&rdquo;
box, because you probably don&rsquo;t want any rando messing your machine up.</p>
<p>The choice to go with the WiFi for networking is related to the environment
this system will eventually be deployed to. Ethernet isn&rsquo;t an option there.</p>
<p>Once the system was all set up and files were syncing extremely slowly, I kept
an eye on the Pi, especially the red power LED. I had set the CPU to run at 1 GHz
using <code>raspi-config</code>, and with both the WiFi adapter and SSD connected, I had
concerns that the Pi could not supply enough power. The power limitations of the
Pi are a common source for issues and that has come up in the past as well,
especially with external storage connected to the Pi. However, with this
particular setup this has not been an issue so far. The fact that Pi is so
underpowered that it cannot even make full use of the SSD is probably a
contributing factor to the overall stability.</p>
<p>The file sync was very slow, but at least it was working. The typical transfer
speeds hovered around 1.5 MB/s. Not great, but given the fact that this setup
will operate in an environment where the download speeds are typically capped
around 15-20 Mbit/s, this will be more than enough.</p>









<figure class="center">
  <a href="/posts/2022/11/01/finding-use-case-for-raspberry-pi/media/2-htop.png">
    <img src="/posts/2022/11/01/finding-use-case-for-raspberry-pi/media/2-htop_hu_5e9fa9e6be7ff6de.webp"
     width="956"
     height="295"
     loading="lazy"
     decoding="async"
     alt="`htop` showing how much the Pi is struggling under operation.">

  </a>
  <figcaption class="center">`htop` showing how much the Pi is struggling under operation.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2022/11/01/finding-use-case-for-raspberry-pi/media/3-syncthing.png">
    <img src="/posts/2022/11/01/finding-use-case-for-raspberry-pi/media/3-syncthing_hu_21fd106fb915d1da.webp"
     width="735"
     height="205"
     loading="lazy"
     decoding="async"
     alt="Typical transfer speed that I observed with the setup.">

  </a>
  <figcaption class="center">Typical transfer speed that I observed with the setup.</figcaption>
</figure>

<p>How well will this setup work over a longer time period? Only time will tell.
Just like with <a href="/posts/2021/03/20/whacky-setups-1/">other disastrous tests that I have done</a>,
I&rsquo;ll try to update this post whenever anything noteworthy happens.</p>
<p>Does this setup make any sense if you need a performant Syncthing endpoint?
Hell no. However, I&rsquo;m very happy that this little Pi finally has a purpose.</p>
<h2 id="alternatives">
  <a class="heading-anchor" href="#alternatives">Alternatives<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This project was about finding a purpose for an SBC I already had lying around.</p>
<p><a href="https://www.jeffgeerling.com/blog/2022/you-cant-buy-raspberry-pi-right-now">If the price and availability of Raspberry Pi-s wasn&rsquo;t a complete shitshow in
2022</a>,
I would go for a Raspberry Pi 4 in a heartbeat. I can&rsquo;t, and that makes me
and most of the Raspberry Pi community very sad. The more performant Pi-s open
up so many possibilities.</p>
<p>An <a href="https://orangepi.com/index.php?route=product/product&amp;product_id=846">Orange Pi Zero</a>
running <a href="https://www.armbian.com/orange-pi-zero/">Armbian</a> was something I also
considered, since I had one lying around, but it was a bit too competent for
the job, and I might find a better use for it eventually.</p>
<p>If you wanted performance, then any x86-based PC will do just fine. My
recommendation is to go for an used PC, be it <a href="/posts/2022/05/10/thinkpad-as-a-home-server/">a laptop</a>
or <a href="https://www.servethehome.com/introducing-project-tinyminimicro-home-lab-revolution/">a very small and efficient PC</a>.
Just keep in mind that the power usage is typically higher on these setups
compared to a small ARM-based single-board computer. If a machine runs 24/7, then
the difference between 2-3 W and 10-20 W will start to matter, especially when
energy prices are quite high in your region.</p>
]]></content:encoded></item><item><title>Recovering a password-protected ThinkPad T60</title><link>https://ounapuu.ee/posts/2022/10/13/recovering-password-locked-thinkpad-t60/</link><pubDate>Thu, 13 Oct 2022 08:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2022/10/13/recovering-password-locked-thinkpad-t60/</guid><description>An illustrated overview about the process of clearing the supervisor password from a ThinkPad T60, based on guides that some smart and persistent people have written.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="Recovering a password-protected ThinkPad T60" /><p>A couple of years ago, I worked on a ThinkPad T60. That ThinkPad had been in use
by a family member before that, and I started its cleanup by disassembling the
whole machine and making sure that it was pristine. However, once I put it all
back together, I saw that it was password protected. I wasn&rsquo;t even able to access
the BIOS. After repeatedly asking for hints for the password and trying some
simple cases myself, I never cracked it.</p>
<p>Not too long ago I got curious and looked for a way to overcome this issue.
That&rsquo;s when I stumbled upon <a href="https://superuser.com/questions/393922/how-to-remove-the-supervisor-bios-password-for-an-ibm-thinkpad">this SuperUser post about resetting the supervisor password on a ThinkPad.</a></p>
<p>Once my to-do list was down to a reasonable size, I decided to finally give this
a go, since it didn&rsquo;t seem that difficult. Here&rsquo;s an illustrated guide on how
I approached this task.</p>
<p>Sources that are relevant to this topic:</p>
<ul>
<li>
<p><a href="https://superuser.com/questions/393922/how-to-remove-the-supervisor-bios-password-for-an-ibm-thinkpad">How to remove the Supervisor BIOS password for an IBM ThinkPad</a></p>
</li>
<li>
<p><a href="http://www.ja.axxs.net/t60_t60p.htm">www.ja.axxs.net</a></p>
</li>
<li>
<p><a href="https://www.youtube.com/watch?v=FW-RLkzjAS8">&ldquo;How to unlock BIOS Supervisor Password from Lenovo Thinkpad Laptop (no damage to laptop)&rdquo; by Arpan Dubey</a></p>
</li>
</ul>









<figure class="center">
  <a href="/posts/2022/10/13/recovering-password-locked-thinkpad-t60/media/0-cover.jpg" aria-label="View full-size image">
    <img src="/posts/2022/10/13/recovering-password-locked-thinkpad-t60/media/0-cover_hu_e7878d9bc5fd3e19.webp"
     width="1280"
     height="753"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<h2 id="setup">
  <a class="heading-anchor" href="#setup">Setup<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>What you&rsquo;ll need to pull this off:</p>
<ul>
<li>your ThinkPad T60 laptop that has a supervisor password enabled</li>
<li>a screwdriver</li>
<li>anything that conducts electricity and can be used to short two pins</li>
<li>a steady hand</li>
<li>a magnifier, if your eyesight isn&rsquo;t that great</li>
</ul>









<figure class="center">
  <a href="/posts/2022/10/13/recovering-password-locked-thinkpad-t60/media/1-the-big-short.jpg">
    <img src="/posts/2022/10/13/recovering-password-locked-thinkpad-t60/media/1-the-big-short_hu_ab68aee36d70d2b3.webp"
     width="922"
     height="800"
     loading="lazy"
     decoding="async"
     alt="For shorting pins, I came up with this contraption.">

  </a>
  <figcaption class="center">For shorting pins, I came up with this contraption.</figcaption>
</figure>

<p>To begin the process, you need to remove the palm rest of the ThinkPad. Follow
the service manual if needed. Removing the keyboard screws is optional, but
it might help you access the correct pins better.</p>









<figure class="center">
  <a href="/posts/2022/10/13/recovering-password-locked-thinkpad-t60/media/2-disassembly.jpg">
    <img src="/posts/2022/10/13/recovering-password-locked-thinkpad-t60/media/2-disassembly_hu_48b0223a797b6e0c.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="T60, slightly disassembled.">

  </a>
  <figcaption class="center">T60, slightly disassembled.</figcaption>
</figure>

<h2 id="the-process">
  <a class="heading-anchor" href="#the-process">The process<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The steps for performing the supervisor password clearing:</p>
<ul>
<li>turn on the laptop</li>
<li>when you see the ThinkPad logo, short two specific pins</li>
<li>keep shorting those pins!</li>
<li>press F1 to go to the BIOS</li>
<li>navigate to the section in BIOS where you can set the Supervisor Password</li>
<li>enter the supervisor password setting prompt and enter a blank password in
the first field</li>
<li>stop shorting the pins, and then enter an empty password to the second field</li>
<li>save settings and restart</li>
<li>after rebooting, you should be able to boot without having to enter a password</li>
</ul>
<p>What follows is an illustrated guide of the process.</p>









<figure class="center">
  <a href="/posts/2022/10/13/recovering-password-locked-thinkpad-t60/media/3-pins.jpg">
    <img src="/posts/2022/10/13/recovering-password-locked-thinkpad-t60/media/3-pins_hu_74ffbfde9c6e201d.webp"
     width="1103"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The pins you need to short are located on the left side of the laptop, under the palmrest.">

  </a>
  <figcaption class="center">The pins you need to short are located on the left side of the laptop, under the palmrest.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2022/10/13/recovering-password-locked-thinkpad-t60/media/4-startup.jpg">
    <img src="/posts/2022/10/13/recovering-password-locked-thinkpad-t60/media/4-startup_hu_5a1a5f4a00212719.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Once you see this, short those pins!">

  </a>
  <figcaption class="center">Once you see this, short those pins!</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2022/10/13/recovering-password-locked-thinkpad-t60/media/5-short.jpg">
    <img src="/posts/2022/10/13/recovering-password-locked-thinkpad-t60/media/5-short_hu_b2486b50ca7b7282.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Just apply pressure to those pads and make sure the contact is solid.">

  </a>
  <figcaption class="center">Just apply pressure to those pads and make sure the contact is solid.</figcaption>
</figure>

<p>This is the step where I messed up initially. The contact between the pins was
not good and I got prompted with the supervisor password prompt. Power the machine
off and try again if you face the same issue.</p>
<p>Once the pins are shorted, you should be able to access the BIOS with a little
bit of F1 key spamming.</p>









<figure class="center">
  <a href="/posts/2022/10/13/recovering-password-locked-thinkpad-t60/media/6-bios.jpg">
    <img src="/posts/2022/10/13/recovering-password-locked-thinkpad-t60/media/6-bios_hu_c8c5216d8283d52d.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="While the pins are still shorted, you should be able to get access to the BIOS.">

  </a>
  <figcaption class="center">While the pins are still shorted, you should be able to get access to the BIOS.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2022/10/13/recovering-password-locked-thinkpad-t60/media/7-password.jpg">
    <img src="/posts/2022/10/13/recovering-password-locked-thinkpad-t60/media/7-password_hu_627c5b3973c8cc7c.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Leave the first field blank, stop shorting the pins, and leave the other field blank as well.">

  </a>
  <figcaption class="center">Leave the first field blank, stop shorting the pins, and leave the other field blank as well.</figcaption>
</figure>

<p>After saving the settings and rebooting, you should be greeted with a successful
boot.</p>









<figure class="center">
  <a href="/posts/2022/10/13/recovering-password-locked-thinkpad-t60/media/8-its-booting.jpg">
    <img src="/posts/2022/10/13/recovering-password-locked-thinkpad-t60/media/8-its-booting_hu_33261b36e6e8f758.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="It&#39;s booting! Not into Linux, since the SSD is removed, but still, it works!">

  </a>
  <figcaption class="center">It&#39;s booting! Not into Linux, since the SSD is removed, but still, it works!</figcaption>
</figure>

<p>Once you&rsquo;ve confirmed that everything&rsquo;s OK, assemble the machine again and enjoy
the laptop that you just saved from becoming e-waste.</p>
<h2 id="caveats">
  <a class="heading-anchor" href="#caveats">Caveats<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This guide might not be terribly relevant in 2022. I still remember starting
my software development career in 2016 with a ThinkPad T60 and it was painful
even back then. These laptops are classics, but they are really starting to show
their age. I&rsquo;ve even encountered issues like the WiFi chip causing lots of
trouble, with the connection being very spotty and borderline unusable.</p>
<p>But hey, at least it&rsquo;s not completely unusable any more!</p>
]]></content:encoded></item><item><title>Testing a cheap ExpressCard to NVMe SSD adapter on my ThinkPad T430</title><link>https://ounapuu.ee/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/</link><pubDate>Tue, 04 Oct 2022 05:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/</guid><description>I got curious about an ExpressCard to NVMe M.2 NGFF adapter I saw on Reddit, so I got one to try out myself, ending up with a total of 4 SSD-s on my ThinkPad T430. Yes, four.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="Testing a cheap ExpressCard to NVMe SSD adapter on my ThinkPad T430" /><p>I stumbled upon <a href="https://www.reddit.com/r/thinkpad/comments/urvkeb/expresscard_to_m2_nvme_key_m_adapter_from/">this post in /r/thinkpad</a>,
which got my attention. It showcases an ExpressCard to M.2 NGFF adapter that
they purchased from AliExpress. The adapter has a similar purpose to the one
designed by <a href="https://thinkmods.store/">thinkmods.store</a>, with the added bonus
that it could fit longer NVMe SSD-s if you didn&rsquo;t mind them sticking out of the
case. You could also order one instantly, so I did.</p>
<p>For those interested, the title of the listing at the time of writing of this
article is &ldquo;ExpressCard interface to m.2 NGFF nvme solid state disc x201 t430 hp8570 w520&rdquo;.
The listing I chose was <a href="https://www.aliexpress.com/item/1005002023877404.html?spm=a2g0o.order_list.0.0.74c21802cTrI3L">this one.</a>
I&rsquo;m not affiliated with the manufacturer or the seller in any way.</p>









<figure class="center">
  <a href="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/media/0-cover.jpg">
    <img src="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/media/0-cover_hu_b7132969bcfb8a95.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Bits and pieces.">

  </a>
  <figcaption class="center">Bits and pieces.</figcaption>
</figure>

<h2 id="the-idea">
  <a class="heading-anchor" href="#the-idea">The idea<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I try to avoid buying things that I don&rsquo;t need, which is why I came up with an
excuse for getting this adapter: adding a cache SSD to my <a href="/posts/2022/05/10/thinkpad-as-a-home-server/">ThinkPad-as-a-server</a>.</p>
<p>The OS is running off of an mSATA SSD that I could theoretically use for the
same purpose, but eventually killing the SSD that also hosts the OS with constant
writes sounded like a really bad idea. I also didn&rsquo;t want to have excessive writes
on my pair of Samsung 870 QVO 4TB SATA SSD-s, because replacing those will be
quite expensive down the line.</p>
<p>Here&rsquo;s what we&rsquo;re working with:</p>
<ul>
<li><a href="https://sabrent.com/collections/memory-and-storage/products/sb-1342-512">Sabrent Rocket Nano NVMe 2242 SSD (512GB)</a></li>
<li>the aforementioned ExpressCard to M.2 NGFF adapter</li>
<li>ThinkPad T430 with an ExpressCard34 slot</li>
</ul>
<p>Quick word on the packaging: it was packaged in a small cardboard box, which
held up okay, but a more rough treatment of the box would probably have broken
the tiny PCB.</p>









<figure class="center">
  <a href="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/media/1-parts.jpg">
    <img src="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/media/1-parts_hu_392afbeee6a2ca65.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The SSD, adapter PCB, and the case.">

  </a>
  <figcaption class="center">The SSD, adapter PCB, and the case.</figcaption>
</figure>

<h2 id="assembly">
  <a class="heading-anchor" href="#assembly">Assembly<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>According to comments I saw before purchasing the adapter, I expected the assembly
to be a bit tricky, and after assembling it I have to agree with that sentiment.</p>
<p>First, you&rsquo;ll have to squeeze the SSD in there. Unlike M.2 slots that are common
in laptops and desktops alike, this one requires you to horizontally push the SSD
in without breaking anything. Don&rsquo;t be afraid to use a bit of force here, but be
careful in how you apply it.</p>









<figure class="center">
  <a href="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/media/2-assembly.jpg">
    <img src="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/media/2-assembly_hu_2f837f858065178e.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="na-no">

  </a>
  <figcaption class="center">na-no</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/media/3-underside.jpg">
    <img src="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/media/3-underside_hu_af7b21b7b9fbcb6f.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Bottom of the adapter.">

  </a>
  <figcaption class="center">Bottom of the adapter.</figcaption>
</figure>

<p>After the SSD is in, screw it in properly and place the assembly on one of the
metal parts.</p>
<p>Now comes the fun part: you&rsquo;ll have to clip on the top part as well. My
recommendation is to first clip in the part that sits near the contact pins,
then the one at the other end of the adapter, and then push in the metal
shielding at the edges.</p>









<figure class="center">
  <a href="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/media/4-assembled.jpg">
    <img src="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/media/4-assembled_hu_fbd612045f68d2d4.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The adapter, 100% assembled.">

  </a>
  <figcaption class="center">The adapter, 100% assembled.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/media/5-sideview.jpg">
    <img src="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/media/5-sideview_hu_2ada239f212695b8.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="For some reason, mine ended up a bit crooked near the connector.">

  </a>
  <figcaption class="center">For some reason, mine ended up a bit crooked near the connector.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/media/6-opening.jpg">
    <img src="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/media/6-opening_hu_828eb1cfc210cb27.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="This opening allows for the installation of longer M.2 SSD-s.">

  </a>
  <figcaption class="center">This opening allows for the installation of longer M.2 SSD-s.</figcaption>
</figure>

<h2 id="tests">
  <a class="heading-anchor" href="#tests">Tests<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>To test this adapter out, I just plugged it into my main ThinkPad T430 running
Fedora 36 and Linux kernel version 5.19.12. It worked right out of the box.</p>









<figure class="center">
  <a href="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/media/7-led.jpg">
    <img src="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/media/7-led_hu_4c08dbca18a1ec54.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Yes, it has a blue LED that blinks.">

  </a>
  <figcaption class="center">Yes, it has a blue LED that blinks.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/media/8-installed.jpg">
    <img src="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/media/8-installed_hu_42af8bb4aeb094a2.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="When not blinking, it looks something like this.">

  </a>
  <figcaption class="center">When not blinking, it looks something like this.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/media/9-dmesg.png">
    <img src="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/media/9-dmesg_hu_9268cddb4b78501c.webp"
     width="957"
     height="200"
     loading="lazy"
     decoding="async"
     alt="Fedora picked it up with no issues.">

  </a>
  <figcaption class="center">Fedora picked it up with no issues.</figcaption>
</figure>

<p>My ThinkPad T430 can now support hotpluggable NVMe SSD-s, and 4 internal SSD-s
in total. Not quite tricked out as <a href="https://youtu.be/tHNQOJ_nsLc">this setup</a>,
but not bad for a 10 year old laptop.</p>









<figure class="center">
  <a href="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/media/10-gnome-disks.png">
    <img src="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/media/10-gnome-disks_hu_774bb68429c0cb0d.webp"
     width="960"
     height="392"
     loading="lazy"
     decoding="async"
     alt="4 SSD-s on a ThinkPad T430. Bonkers.">

  </a>
  <figcaption class="center">4 SSD-s on a ThinkPad T430. Bonkers.</figcaption>
</figure>

<p>Please note that these tests are not done with any meaningful testing methodology
and are just quick one-off tests that aim to showcase what to expect when using
this adapter with the configuration I&rsquo;m using it with.</p>
<p>To check how well the adapter performs, I opened <code>gnome-disks</code> and did a quick
benchmark offered by it.</p>









<figure class="center">
  <a href="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/media/11-benchmark.png">
    <img src="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/media/11-benchmark_hu_2d0b5109e530e691.webp"
     width="634"
     height="594"
     loading="lazy"
     decoding="async"
     alt="Results of the quick one-off benchmark.">

  </a>
  <figcaption class="center">Results of the quick one-off benchmark.</figcaption>
</figure>

<p>The average read speed is at 411.2 MB/s, and writes at 366.7 MB/s.</p>
<p>The results are in line with the limitations of a PCIe 2.0 x1 link, which has a
theoretical cap of 500 MB/s.</p>
<p>What&rsquo;s more noteworthy is the latency. Average access time is at 0.03 ms,
which compares well to a Samsung 870 EVO 1TB SATA SSD that&rsquo;s connected to the
same machine, which reports an average access time of 0.07 ms.</p>
<p>When copying files to the SSD, the temperature sensor reported a maximum of 60°C.
Additional read operations in the form of an ZFS scrub hit 63°C, which was the
maximum I observed during my quick testing.</p>
<p>When I threw both read and write operations to the SSD, the total I/O bandwidth
for both operations was capped at around 390 MB/s according to <code>zpool iostat 1 -v</code>.
If your workloads do a lot of read-write operations in parallel, then take this
into account.</p>









<figure class="center">
  <a href="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/media/12-zfs-bandwidth.png">
    <img src="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/media/12-zfs-bandwidth_hu_11738924d5bce375.webp"
     width="729"
     height="120"
     loading="lazy"
     decoding="async"
     alt="I/O stats during heavy read-write operations.">

  </a>
  <figcaption class="center">I/O stats during heavy read-write operations.</figcaption>
</figure>

<p>As for my use case, it seems to be holding up okay. I&rsquo;ll have to report back
after this adapter and SSD combo has been in use for a longer time.</p>
]]></content:encoded></item><item><title>The minimum viable fan control script</title><link>https://ounapuu.ee/posts/2022/09/26/minimum-viable-fan-control-script/</link><pubDate>Mon, 26 Sep 2022 08:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2022/09/26/minimum-viable-fan-control-script/</guid><description>Some assembly required. No, not _that_ one.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="The minimum viable fan control script" /><p>I&rsquo;ve always been a fan of tinkering with cooling setups on my computers.
I&rsquo;ve even went as far as writing <a href="https://github.com/Hermanio/linux-cpu-manager">crappy</a>
<a href="https://github.com/Hermanio/linux-gpu-manager">solutions</a> to make up for
deficiencies on the hardware level. After years of dumb experiments I&rsquo;ve seen
how little you can get away with in cooling and how to run your machines as
quietly as possible without giving up too much performance.</p>
<p>I also appreciate simplicity, which is why I&rsquo;m currently running the simplest
damn solution you can imagine to control how my ThinkPad T430 and ASRock
DeskMini X300 run: a shell script.</p>
<p>It also comes with some added benefits:</p>
<ul>
<li>self-documenting</li>
<li>highly customizable</li>
<li>low resource usage</li>
</ul>
<p>These scripts are not &ldquo;battle-hardened&rdquo; and using them incorrectly may or
may not result in hardware failure. Use at your own risk. The only guarantee
I can give is that <em>it works on my machine™</em>.</p>
<p>If you&rsquo;re someone who doesn&rsquo;t like tinkering with their computers and wants
their machines to &ldquo;just work&rdquo;, then this article likely isn&rsquo;t for you.</p>









<figure class="center">
  <a href="/posts/2022/09/26/minimum-viable-fan-control-script/media/image.png" aria-label="View full-size image">
    <img src="/posts/2022/09/26/minimum-viable-fan-control-script/media/image_hu_cf274236fe7bd4f.webp"
     width="473"
     height="209"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<h2 id="thinkpad-t430">
  <a class="heading-anchor" href="#thinkpad-t430">ThinkPad T430<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>With the ThinkPad T430, the script does two things:</p>
<ul>
<li>control the fan speed</li>
<li>preemptively throttle the CPU and GPU</li>
</ul>
<p>This type of behaviour is optimized for mostly quiet operation. The fan is
running at its lowest speed when under a small load, and the CPU/GPU throttling
has an added benefit of reducing the overall power usage, too. The difference
between non-turbo and turbo speeds on the Intel i7-3820QM can be as much as
13-15 watts.</p>
<p><a href="https://wiki.archlinux.org/title/fan_speed_control#ThinkPad_laptops">To enable fan control on ThinkPads</a>,
you need to have a file at <code>/usr/lib/modprobe.d/thinkpad_acpi.conf</code> with the
following contents:</p>
<pre tabindex="0"><code>options thinkpad_acpi fan_control=1
</code></pre><p>Reboot, and you can now have full control over the fan speed in your ThinkPad!</p>
<p>The script itself looks like this:</p>
<pre tabindex="0"><code>#!/bin/bash

set -e

while true; do

  temp=$(cat /sys/class/thermal/thermal_zone1/temp)

  if ((temp &gt; 90000)); then
    echo level 7 &gt;/proc/acpi/ibm/fan
  elif ((temp &gt; 75000)); then
    echo level 5 &gt;/proc/acpi/ibm/fan
  elif ((temp &gt; 60000)); then
    echo level 3 &gt;/proc/acpi/ibm/fan
  elif ((temp &gt; 30000)); then
    echo level 1 &gt;/proc/acpi/ibm/fan
  else
    echo level 0 &gt;/proc/acpi/ibm/fan
  fi

  if ((temp &gt; 97000)); then
    echo 350 &gt;/sys/class/drm/card*/gt_max_freq_mhz
    echo 350 &gt;/sys/class/drm/card*/gt_boost_freq_mhz
  elif ((temp &gt; 90000)); then
    echo 650 &gt;/sys/class/drm/card*/gt_max_freq_mhz
    echo 650 &gt;/sys/class/drm/card*/gt_boost_freq_mhz
  else
    echo 1250 &gt;/sys/class/drm/card*/gt_max_freq_mhz
    echo 1250 &gt;/sys/class/drm/card*/gt_boost_freq_mhz
  fi

  if ((temp &gt; 70000)); then
    echo 1 &gt;/sys/devices/system/cpu/intel_pstate/no_turbo
  else
    echo 0 &gt;/sys/devices/system/cpu/intel_pstate/no_turbo
  fi

  sleep 0.5
done
</code></pre><p>What we&rsquo;re doing is reading the temperature of the CPU package and then setting
the fan speed and throttling based on that. Note that the temperatures are
represented without any decimal places. A reading of 78000 means that the chip
is running at 78 °C.</p>
<p>On my ThinkPad T430, the fan speed levels can be roughly described as such:</p>
<ul>
<li>level 1: lowest speed, barely audible</li>
<li>level 3: audible, but tolerable</li>
<li>level 5 and above: it&rsquo;s probably loud enough to bother you</li>
</ul>
<p>The second section controls the integrated GPU. What I&rsquo;ve found in my testing
is that a weak integrated GPU can still chug up to 20 watts, which is a
considerable amount, especially on a laptop. The <code>card*</code> wildcard is there
because the integrated GPU may change between <code>card0</code> and <code>card1</code>, and I&rsquo;m too
lazy to make the script any smarter.</p>
<p>The values written there correspond to the maximum GPU clock speed. <code>1250</code> happens
to be the max clock speed (in MHz) and at that speed the GPU is using a lot of
power. <code>650</code> is the speed at which the integrated GPU is running most
efficiently. <code>350</code> is the lowest speed, and you will notice it due to the
performance being extra crappy.</p>
<p>With the CPU, I chose to just turn the turbo boost on or off. With turbo boost
off, the CPU will top out at 2.7 GHz and around 22 watts of power usage. With
turbo boost, the CPU can run anywhere between 3.4-3.7 GHz, depending on the number
of cores under load. You&rsquo;ll likely notice much higher CPU temperatures and power
usage climbing to around 35 watts. Fast at short and bursty workloads, and yet
efficient and relatively cool at sustained loads.</p>
<p>And at the very end, you have a simple <code>sleep</code> statement. I&rsquo;ve set it to half a
second, but feel free to set it as you see fit. Higher intervals might not be
that good of an idea because the script may not be able to respond quickly enough
to changing thermals, just keep that in mind.</p>
<h2 id="asrock-deskmini-x300">
  <a class="heading-anchor" href="#asrock-deskmini-x300">ASRock DeskMini X300<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Although I&rsquo;ve opted for a more experimental setup with my home server and the
ASRock DeskMini X300 is no longer running as one, I think it&rsquo;s still worthwhile
to share how I configured the fan control logic on this machine.</p>
<p>With the ASRock DeskMini X300, my goal was simple: let it run as quietly as
reasonably possible without losing too much performance.</p>
<p>This machine was running 24/7 as a server and has a powerful 8-core AMD Ryzen 7
5700G CPU in it. One thing this script is heavily relying on is the fact that Ryzen
CPU-s have well-engineered boosting logic in them, meaning that they&rsquo;re already
designed to run at the highest speed possible and only limit their speed if they
hit power or thermal limits.</p>
<p>One thing you may need to do first is installing <code>lm-sensors</code> and running
<code>sudo sensors-detect</code>. By default the CPU fan speed controls were not properly
exposed, but after running <code>sensors-detect</code> and saying yes at every prompt,
they were picked up.</p>
<p>The script looks like this:</p>
<pre tabindex="0"><code>#!/bin/bash

set -e

# /sys/devices/platform/nct6775.656/hwmon/hwmon3

echo 1 &gt;/sys/devices/platform/nct6775.656/hwmon/hwmon3/pwm2_enable

while true; do

  temp=$(cat /sys/class/hwmon/hwmon4/temp1_input)

  if ((temp &gt; 94000)); then
    echo 170 &gt;/sys/devices/platform/nct6775.656/hwmon/hwmon3/pwm2
  elif ((temp &gt; 90000)); then
    echo 140 &gt;/sys/devices/platform/nct6775.656/hwmon/hwmon3/pwm2
  elif ((temp &gt; 70000)); then
    echo 120 &gt;/sys/devices/platform/nct6775.656/hwmon/hwmon3/pwm2
  elif ((temp &gt; 40000)); then
    echo 30 &gt;/sys/devices/platform/nct6775.656/hwmon/hwmon3/pwm2
  else
    echo 0 &gt;/sys/devices/platform/nct6775.656/hwmon/hwmon3/pwm2
  fi

  sleep 5
done
</code></pre><p>The <code>hwmon</code> values and which fan you&rsquo;re controlling is likely different on your
own PC. Take a look at the paths found in the script and poke around while also
physically looking at your PC. Try enabling PWM control by writing to <code>pwm*_enable</code>
handles and then setting the fan speed. As a result of your poking, you should
see the CPU fan change its speed. If it doesn&rsquo;t, try another value.</p>
<p>The values you can write are in the range 0-255, where the higher value corresponds
to a higher speed.</p>
<p>I&rsquo;ve limited the TDP of my CPU to 35 watts using a setting found in UEFI
settings. This results in the CPU running cool and quiet even under a full load.</p>
<h2 id="systemd-service">
  <a class="heading-anchor" href="#systemd-service">systemd service<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>To run your fan control script as a systemd service, drop the script to your
preferred location (I placed it in <code>/root/.local/bin/fancontrol</code>), then create
a file <code>/etc/systemd/system/fancontrol.service</code> with the following contents:</p>
<pre tabindex="0"><code>[Unit]
Description=Quick fan control software

[Service]
ExecStart=/root/.local/bin/fancontrol

[Install]
WantedBy=multi-user.target
</code></pre><p>And once that is done, enable and start your fan control service with
<code>sudo systemctl enable --now fancontrol.service</code>.</p>
<p>If you encounter issues or something isn&rsquo;t working right, check the status of
the service with <code>systemctl status fancontrol.service</code> or full logs with
<code>journalctl -u fancontrol.service</code>.</p>
<h2 id="conclusion">
  <a class="heading-anchor" href="#conclusion">Conclusion<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If you want something that works out of the box and does the smart stuff for you,
then <a href="https://wiki.archlinux.org/title/fan_speed_control">give this Arch Linux wiki page a look</a>.
If you&rsquo;re not into that and want to easily tune the behaviour of your machine,
then feel free to use these scripts as a baseline for your own experimentation.</p>
]]></content:encoded></item><item><title>Accidentally turning the ASRock DeskMini X300 into a semi-passively cooled PC</title><link>https://ounapuu.ee/posts/2022/09/17/asrock-deskmini-x300-semipassive/</link><pubDate>Sat, 17 Sep 2022 08:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2022/09/17/asrock-deskmini-x300-semipassive/</guid><description>Experimenting with my fan control scripts ended up with an interesting discovery.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="Accidentally turning the ASRock DeskMini X300 into a semi-passively cooled PC" /><p>After playing around with fan curves on my <a href="https://www.asrock.com/nettop/AMD/DeskMini%20X300%20Series/index.asp">ASRock DeskMini X300</a>
based home server, I noticed one interesting thing. At least it was
interesting to me.</p>









<figure class="center">
  <a href="/posts/2022/09/17/asrock-deskmini-x300-semipassive/media/poster.jpg" aria-label="View full-size image">
    <img src="/posts/2022/09/17/asrock-deskmini-x300-semipassive/media/poster_hu_987cfa9e5320d8a2.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<h2 id="background">
  <a class="heading-anchor" href="#background">Background<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I had one goal: to try to see if I could turn it into a semi-passive PC by only
turning the fan on when the PC was under load while keeping it off for as long
as possible. Running the fan only when necessary means less noise
and less dust accumulating on the heat sink. No dust, no maintenance required.</p>
<p>The cooling solution used is the <a href="https://noctua.at/en/nh-l9a-am4">Noctua NH-L9a</a>,
a low-profile CPU cooler. The two main selling points for me were that it was
small enough to fit into the DeskMini, and it is much quieter than the stock
AMD Ryzen Stealth cooler.</p>
<p>I started with something reasonable: only kick the fan on when the CPU is over
55°C. This did end up with the fan occasionally turning off, but after around
10-15 seconds it would kick on again. With time, I bumped this limit up by 5-10
degrees each time and ended up with the current configuration. The fan now
turns on after 80°C and starts spinning at a modest level at over 90°C.</p>
<p>By turning this limit up, I noticed that the PC could be run in a fanless mode
for much longer. This meant that the PC was also much hotter itself and was
warm to touch, but nothing extreme or concerning.</p>
<h2 id="results">
  <a class="heading-anchor" href="#results">Results<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I added a couple of lines to my fan control script to track the CPU
temperatures and the fan speeds, here are the results:</p>









<figure class="center">
  <a href="/posts/2022/09/17/asrock-deskmini-x300-semipassive/media/deskmini-graph.png">
    <img src="/posts/2022/09/17/asrock-deskmini-x300-semipassive/media/deskmini-graph_hu_c327b68db9924b41.webp"
     width="1016"
     height="492"
     loading="lazy"
     decoding="async"
     alt="CPU temperatures over a 19 hour period.">

  </a>
  <figcaption class="center">CPU temperatures over a 19 hour period.</figcaption>
</figure>

<p>Based on the data I gathered, the CPU fan was off for 90.7% of the time during
this test period. The temperature in the apartment was around 26-30°C, which
is pretty much the worst case scenario in my region.</p>
<p>My running theory is that a hotter heat sink is able to dissipate more heat
passively. The motherboard and the metal case may also be small contributors to
cooling the PC this way. The PC is also acting as a 24/7 home server, which means
a lot of idle time that&rsquo;s interrupted by occasional short-term load. Heat from
those bursty loads can be stored in the heat sink relatively easily without it
heating up enough to trigger the fan.</p>
<p>This approach will likely not work that well if your workloads are more demanding
and result in a higher continuous loads on the system.</p>
<p>Yes, I&rsquo;m aware that running a PC like this may have negative consequences. I ran
the server like this for about a week and while I liked it being a
semi-passively cooled server, but decided to go back to the old behaviour.</p>
<p>While there are plenty of fanless designs out there that run hot by design, I
decided that I don&rsquo;t want to take this risk with the DeskMini. It would be a
cool experiment, but my main server is probably not the best candidate for it.
The CPU could handle it without breaking a sweat, but I&rsquo;m more concerned about
the rest of the components, especially the motherboard. The stickers on the
DRAM modules were already warped due to the heat, I prefer not to damage
anything else.</p>
<p>For those who want to try something similar (and at your own risk, of course),
here&rsquo;s my fan control script. Just make sure to install <code>lm-sensors</code> first and
run <code>sudo sensors-detect</code> so that the controls are exposed by your system.
The exact paths and values may be something you need to change to match your
system.</p>
<pre tabindex="0"><code>#!/bin/bash

set -e

# /sys/devices/platform/nct6775.656/hwmon/hwmon3

echo 1 &gt;/sys/devices/platform/nct6775.656/hwmon/hwmon3/pwm2_enable

while true; do

  temp=$(cat /sys/class/hwmon/hwmon4/temp1_input)

  if ((temp &gt; 94000)); then
    echo 120 &gt;/sys/devices/platform/nct6775.656/hwmon/hwmon3/pwm2
  elif ((temp &gt; 80000)); then
    echo 70 &gt;/sys/devices/platform/nct6775.656/hwmon/hwmon3/pwm2
  else
    echo 0 &gt;/sys/devices/platform/nct6775.656/hwmon/hwmon3/pwm2
  fi

  sleep 5
done
</code></pre><h2 id="honorable-mentions">
  <a class="heading-anchor" href="#honorable-mentions">Honorable mentions<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I&rsquo;m not the only one who likes to experiment with the ASRock DeskMini X300.
This all started with an idea of fitting a <a href="https://www.arctic.de/en/Alpine-AM4-Passive/ACALP00022A">passive cooler</a>
into the DeskMini and me discovering that it was already done.</p>
<p>More fun ideas:</p>
<ul>
<li><a href="https://www.reddit.com/r/sffpc/comments/envgds/asrock_a3003400gml120_mod/">the hotrod of PC cooling</a></li>
<li><a href="https://www.fanlesstech.com/2018/11/fixing-mini-stx.html">a reader of FanlessTech actually slapped the passive cooler onto the DeskMini</a></li>
</ul>
]]></content:encoded></item><item><title>I tried out the CyberPower UT650EG UPS</title><link>https://ounapuu.ee/posts/2022/08/04/cyberpower-ut650eg-overview/</link><pubDate>Thu, 04 Aug 2022 07:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2022/08/04/cyberpower-ut650eg-overview/</guid><description>Small and very efficient, but not quite ideal for all use cases. At least it hasn't caught on fire yet!</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="I tried out the CyberPower UT650EG UPS" /><p>After some spicy feedback to <a href="/posts/2022/05/10/thinkpad-as-a-home-server/">my post where a ThinkPad T430 acted as a server,</a>
I decided to try out one UPS that was recommended on the basis of it being much
more power efficient compared to the APC UPS that I previously ran.</p>
<p>That UPS? <a href="https://www.cyberpower.com/id/en/product/sku/UT650EG">CyberPower UT650EG</a>.</p>









<figure class="center">
  <a href="/posts/2022/08/04/cyberpower-ut650eg-overview/media/image.jpg">
    <img src="/posts/2022/08/04/cyberpower-ut650eg-overview/media/image_hu_114a0a37badbaeb3.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="My ThinkPad-as-a-server, and the UPS that&#39;s powering it.">

  </a>
  <figcaption class="center">My ThinkPad-as-a-server, and the UPS that&#39;s powering it.</figcaption>
</figure>

<h2 id="why-switch-out-a-perfectly-good-ups">
  <a class="heading-anchor" href="#why-switch-out-a-perfectly-good-ups">Why switch out a perfectly good UPS?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The APC Smart-UPS 750 is good, but uses a lot of power compared to the whole setup,
making up roughly half of the total power consumption at idle: ~17-18W. It&rsquo;s
also very big compared to what it is actually powering.</p>
<p>One of the main selling points of this particular CyberPower UPS is that it uses
very little power itself. Depending on the model, the UPS can use around 1-2W
of power, at least according to the tests that they <a href="https://www.cyberpower.com/promotion/ut/id/id">publish on their website</a>.</p>
<p>Once I set up everything with the new UPS, I gave it a go. After the battery was
fully charged, I did observe a dramatic drop in power usage. The whole setup now
ran around 19-21W when idle, which confirms the power consumption numbers
claimed by CyberPower.</p>
<h2 id="overview">
  <a class="heading-anchor" href="#overview">Overview<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The UPS itself is great for someone who just wants to connect a couple of
devices into a standalone UPS. The model I got came with three EU-style sockets.
Compared to the APC UPS, this is a much cleaner setup as I do not have to
connect an extension cord using an adapter.</p>
<p>The APC Smart-UPS 750 can provide anywhere between 100 and 120 minutes of runtime
with my setup. I did a quick runtime test with the CyberPower UPS as well and
found that with around 25W of load it ran for 37 minutes. Not the best runtime,
but given its size it&rsquo;s a respectable result.</p>
<p>Uninterruptible power supplies like to be noisy when running off of batteries.
This CyberPower unit is no exception. However, by letting it run on batteries
and double-clicking the power button I managed to silence the alarm and in
subsequent power cut scenarios it has not started beeping. I was unable to find
a simple manual explaining how to operate the UPS and what other button combos
might be out there. The piece of paper that came with the UPS was also
lackluster. I&rsquo;m not sure if this was intended functionality or not, but I do
like that turning the alarm off is an option in the first place.</p>
<p>The status LED-s on the unit are okay. There aren&rsquo;t many of them and the legend
explaining the behaviour of those lights is just enough to understand what&rsquo;s
going on.</p>
<h2 id="the-not-so-good-parts">
  <a class="heading-anchor" href="#the-not-so-good-parts">The not-so-good parts<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This particular unit has an issue. I did a poor job reading the spec sheet at
my local retailer and missed the fact that this specific model does <em>not</em> come
with USB connectivity. If the UPS runs out of power, it cannot warn my server
to shut down in advance, resulting in a dirty shutdown scenario. Given how
stable the power at my apartment generally is, this won&rsquo;t likely be
a major issue, but it&rsquo;s definitely something I miss. The APC UPS supports this,
plus you can log everything about how the batteries are doing and even detect
input voltage anomalies that you probably weren&rsquo;t even aware of.</p>
<p>What I&rsquo;m concerned about is the battery. <a href="https://www.cyberpower.com/id/en/product/sku/UT650EG#specification">The specifications</a>
say that the battery is not user replaceable. I hope that this is simply something
the legal team thought of to avoid any liability when dealing with users who
messed this process up. If not, then it will be a major problem down the line.
Batteries are consumable items, and according to various threads on the web
about UPS batteries, the consensus is that you should replace them every 3-4
years to avoid problems with the batteries swelling up and potentially causing
fires.</p>
<p>If the battery dies and I cannot replace it, then what am I supposed to do,
throw the otherwise functional UPS straight to the landfill? Not acceptable.</p>
<p>Speaking of concerns, I happened to see some
<a href="https://forums.redflagdeals.com/some-cyberpower-upses-may-pose-fire-hazard-2516306/">troubling</a>
<a href="https://www.youtube.com/watch?v=9gqBzLNMFe4">reports</a>
about certain <a href="https://www.reddit.com/r/homelab/comments/voy9kl/cyberpower_cp1500pfclcd_fire_hazard/">CyberPower UPS-es catching on fire.</a>
The culprit seems to be a certain type of glue used in the manufacturing of the
UPS that ends up conducting electricity after a longer time period. I unplugged
my UPS, powered it off and gave it a look, and it seems like I should be fine.
At least I hope so.</p>









<figure class="center">
  <a href="/posts/2022/08/04/cyberpower-ut650eg-overview/media/hopefullynotafirehazard.jpg">
    <img src="/posts/2022/08/04/cyberpower-ut650eg-overview/media/hopefullynotafirehazard_hu_6a24703ac4909581.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Inside of the UPS.">

  </a>
  <figcaption class="center">Inside of the UPS.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2022/08/04/cyberpower-ut650eg-overview/media/inside.jpg">
    <img src="/posts/2022/08/04/cyberpower-ut650eg-overview/media/inside_hu_a98afada1f31cc43.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="I sure hope that this piece of glue won&#39;t burn my house down.">

  </a>
  <figcaption class="center">I sure hope that this piece of glue won&#39;t burn my house down.</figcaption>
</figure>

<p>Based on this view inside the UPS, I feel like changing the battery should at
least be possible, assuming that replacement batteries are readily available.
Just make sure to not touch the rest of the components as they can probably
kill you, and that&rsquo;s just not a fun thing to do.</p>
<h2 id="conclusion">
  <a class="heading-anchor" href="#conclusion">Conclusion<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If you want a dumb and efficient UPS that protects you from basic power cutouts
and input voltage changes, then do consider this UPS. However, if you care about
USB connectivity and ease of maintenance, then I recommend looking for other
options.</p>
]]></content:encoded></item><item><title>Disabling the crappy Broadcom Bluetooth adapter in your ThinkPad T430 running Linux</title><link>https://ounapuu.ee/posts/2022/06/01/thinkpad-t430-bluetooth-shenanigans/</link><pubDate>Wed, 01 Jun 2022 12:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2022/06/01/thinkpad-t430-bluetooth-shenanigans/</guid><description>If you have ever felt frustated with the Bluetooth experience that your ThinkPad T430 offers you, especially after upgrading the WiFi adapter to one that also has Bluetooth capabilities, then this article might help you out.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="Disabling the crappy Broadcom Bluetooth adapter in your ThinkPad T430 running Linux" /><p>You&rsquo;ve disabled the boneheaded Lenovo WiFi adapter whitelist using a tool like
<a href="https://github.com/n4ru/1vyrain">1vyrain</a>, installed a better adapter like the
<a href="https://ark.intel.com/content/www/us/en/ark/products/75439/intel-dual-band-wirelessac-7260.html">Intel Dual Band Wireless-AC 7260</a>,
and found that Bluetooth is not working as intended on your ThinkPad T430
running Linux?</p>
<p>Here&rsquo;s a guide on what you can try to resolve some issues you may encounter.</p>
<h2 id="the-integrated-bluetooth-adapter">
  <a class="heading-anchor" href="#the-integrated-bluetooth-adapter">The integrated Bluetooth adapter<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The ThinkPad T430 comes with Bluetooth out of the box. Mine is this one:</p>
<pre tabindex="0"><code>Bus 001 Device 004: ID 0a5c:21e6 Broadcom Corp. BCM20702 Bluetooth 4.0 [ThinkPad]
</code></pre>








<figure class="center">
  <a href="/posts/2022/06/01/thinkpad-t430-bluetooth-shenanigans/media/image.jpg">
    <img src="/posts/2022/06/01/thinkpad-t430-bluetooth-shenanigans/media/image_hu_7f58e7068cea5d7a.webp"
     width="1280"
     height="775"
     loading="lazy"
     decoding="async"
     alt="And it looks something like this.">

  </a>
  <figcaption class="center">And it looks something like this.</figcaption>
</figure>

<p>I run Fedora Linux and frankly the experience with the stock adapter is horrible.
Getting stuck while pairing a device or the GNOME Bluetooth settings GUI hanging
isn&rsquo;t a rare sight. Sometimes I&rsquo;ve had to run a script to reset all USB devices
to get things sorted out, or restart the machine altogether. This is not fun
when a work call started 3 minutes ago and your Bluetooth headset is just not
working.</p>
<p>After installing the new Intel WiFi adapter, I thought that I&rsquo;d just disable the
integrated Bluetooth controller via the UEFI settings. That should do the trick,
right?</p>
<p>Nope. Apparently this disabled ALL bluetooth devices, including the one provided
by the Intel adapter.</p>
<p>Well, no problem, I&rsquo;ll just physically remove the Broadcom device and that
should force the ThinkPad to use the Intel adapter, right?</p>
<p>Nope. Now the machine just shows no Bluetooth devices.</p>
<h2 id="udev-to-the-rescue">
  <a class="heading-anchor" href="#udev-to-the-rescue">udev to the rescue<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If you install the Intel adapter and don&rsquo;t touch any of the settings, you&rsquo;ll have
two Bluetooth adapters. On my laptop, the OS used the Broadcom adapter by default,
which was evident by all GUI interactions interfacing with the Broadcom one and
throwing out errors in <code>dmesg -w</code> as a result.</p>
<p>Since disabling the Broadcom bluetooth adapter via other means did not work, I
had to look for some solutions. One that I stumbled upon relied on <code>udev</code> rules.</p>
<p>Essentially, what you want to do is drop a file in <code>/etc/udev/rules.d/</code>, name it
something like <code>81-bluetooth-hci.rules</code> and make the contents something like
this:</p>
<pre tabindex="0"><code>SUBSYSTEM==&#34;usb&#34;, ATTRS{idVendor}==&#34;0a5c&#34;, ATTRS{idProduct}==&#34;21e6&#34;, ATTR{authorized}=&#34;0&#34;
</code></pre><p>Make sure to replace the <code>idVendor</code> and <code>idProduct</code> with the correct values for
your Bluetooth adapter. Output of <code>lsusb</code> will likely contain those values.</p>
<p>In my case, the output of <code>lsusb</code> is</p>
<p><code>Bus 001 Device 004: ID 0a5c:21e6 Broadcom Corp. BCM20702 Bluetooth 4.0 [ThinkPad]</code></p>
<p>The <code>idVendor</code> and <code>idProduct</code> info is in this string: <code>ID 0a5c:21e6</code>.</p>
<p>After making this change and restarting, you should see that<code>bluetoothctl list</code>
outputs only one Bluetooth device.</p>
<pre tabindex="0"><code>[host@T430 ~]$ bluetoothctl list
Controller AC:FD:CE:30:EB:BA T430 [default]
</code></pre><p>Because Bluetooth is still a hot mess in 2022, I still have to occasionally beat
it with a hammer. However, the experience with the Intel adapter is much better
and a simple &ldquo;turn the adapter off and on again in the GUI&rdquo; solved 99% of the
issues I&rsquo;ve encountered since then.</p>
<h3 id="have-you-tried-turning-it-off-and-on-again">
  <a class="heading-anchor" href="#have-you-tried-turning-it-off-and-on-again">&ldquo;Have you tried turning it off and on again?&rdquo;<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>If for whatever reason this solution does not apply to you, and you feel like
you want to hit your machine with a big hammer without having to restart it, then
<a href="https://askubuntu.com/a/290519">here&rsquo;s a script</a> that resets all the USB
devices on your machine. I&rsquo;ve observed that most Bluetooth adapters run over USB,
which is why this script works with those as well.</p>
<p>It has helped me countless times when desperate for a quick Bluetooth fix on
various desktops and laptops that I&rsquo;ve used.</p>
<p>Run it at your own risk.</p>
<pre tabindex="0"><code>#!/bin/bash

for i in /sys/bus/pci/drivers/[uoex]hci_hcd/*:*; do
  [ -e &#34;$i&#34; ] || continue
  echo &#34;${i##*/}&#34; &gt; &#34;${i%/*}/unbind&#34;
  echo &#34;${i##*/}&#34; &gt; &#34;${i%/*}/bind&#34;
done
</code></pre>]]></content:encoded></item><item><title>Can a laptop from 2012 be a viable home server?</title><link>https://ounapuu.ee/posts/2022/05/10/thinkpad-as-a-home-server/</link><pubDate>Tue, 10 May 2022 09:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2022/05/10/thinkpad-as-a-home-server/</guid><description>I took a spare ThinkPad T430 and put all my home server workloads on it. Here's how it went.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="Can a laptop from 2012 be a viable home server?" /><p>I&rsquo;m a man of many ideas. It&rsquo;s a shame that most of them are quite stupid.</p>
<p>This is one of them, but at least it makes for a fun experiment.</p>
<h2 id="intro">
  <a class="heading-anchor" href="#intro">Intro<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>After <a href="/posts/2022/03/21/ups-i-did-it-again/">adding an UPS to accompany my server,</a>
my setup was as complete as it could reasonably be. The server is low power,
but packs quite a punch with fast storage and plenty of compute power around.
The UPS provides a battery backup for both my server and the router.</p>
<p>There was still one annoyance lingering at the back of my head: this setup took
40 watts of power in idle. That&rsquo;s a lot for something that runs 24/7. Yes,
<a href="https://www.reddit.com/r/homelab/">/r/homelab</a> regularly showcases more
power hungry setups, but my standards are quite high when it comes to power use.
I want to go as low as reasonably possible.</p>
<p>I recently bought a spare ThinkPad T430 so that I can have a backup machine in case
something happens to <a href="/posts/2022/01/09/why-i-went-back-to-using-a-thinkpad-from-2012/">my laptop that doesn&rsquo;t suck</a>.
I&rsquo;ve also <a href="/posts/2020/08/22/stupid-project-ideas-1/">had ideas about a server setup involving this laptop.</a></p>
<p>That&rsquo;s when I decided to try running my services off of the ThinkPad T430.</p>









<figure class="center">
  <a href="/posts/2022/05/10/thinkpad-as-a-home-server/media/image1.jpg">
    <img src="/posts/2022/05/10/thinkpad-as-a-home-server/media/image1_hu_60bcdba190871e52.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The setup.">

  </a>
  <figcaption class="center">The setup.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2022/05/10/thinkpad-as-a-home-server/media/image2.jpg">
    <img src="/posts/2022/05/10/thinkpad-as-a-home-server/media/image2_hu_fa9f5efc5d128f8b.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Another angle of the setup.">

  </a>
  <figcaption class="center">Another angle of the setup.</figcaption>
</figure>

<h2 id="the-setup">
  <a class="heading-anchor" href="#the-setup">The setup<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Here&rsquo;s a quick rundown of the relevant specifications:</p>
<ul>
<li>CPU: Intel i5-3320M, 2 cores 4 threads @ 3.3GHz max</li>
<li>RAM: 16GB DDR3</li>
<li>OS disk: 256GB Micron mSATA SSD</li>
<li>Main storage: 2x 4TB Samsung 870 QVO SSD</li>
</ul>
<p>One of the main reasons that this setup is viable in the first place is the fact
that the ThinkPad T430 supports up to 3 SSD-s if you replace the optical drive
with a HDD caddy. Your OS can run off of an mSATA SSD and your mirrored storage
can utilize the two 2.5&quot; SATA slots.</p>
<p>You probably don&rsquo;t want to use a setup like this if you want to store a lot of
big files, such as your legally obtained media collection. If your data can fit
on a pair of SATA SSD-s, then this setup will be just fine.</p>
<h2 id="why-use-a-laptop-as-a-home-server">
  <a class="heading-anchor" href="#why-use-a-laptop-as-a-home-server">Why use a laptop as a home server?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If you don&rsquo;t have a home server yet and want to start off as cheap as possible
while also being mindful of the power usage, then an used laptop with a competent
CPU is a fantastic starting point. In an age where 6 CPU cores is considered
mid-range, two CPU cores might not sound like much, but for most home server
workloads it&rsquo;s absolutely fine.</p>
<p>Laptop CPU-s are designed to use as little power as possible. After all, they
need to run off of a small battery most of the time and have to run cool as well
to make do with the limited cooling setup that they have. This makes them ideal
for a machine that runs 24/7.</p>
<p>I measured the power usage of my ThinkPad T430 in this configuration and found
that it used around 15-20 watts when running with a low load. This is comparable
to the <a href="/posts/2022/01/17/asrock-x300-future-of-desktops/">ASRock DeskMini X300</a>.</p>
<p>What sets laptops apart from the usual desktop-based home server builds is that
they often have a working battery, which can act as a poor man&rsquo;s UPS. If you
momentarily lose power, then the server will happily keep on working until the
battery runs out, which might take 1-2 hours (or more if your battery is in a
good state). This is comparable to the runtime I saw with the DeskMini server
build and the APC Smart-UPS 750.</p>
<p>Most laptops also come with an Ethernet port, and if the laptop is made some
time after 2005, then it&rsquo;s likely running at gigabit speeds. Unless you have a
valid use case for 10 gigabits or more, then this will be plenty of network
bandwidth for most home server use cases.</p>
<p>One aspect that&rsquo;s often overlooked with a laptop-based home server setup is the
inclusion of an integrated keyboard and mouse. If you accidentally mess up your
configuration and your server does not start up properly, then you can just open
the lid and start fixing it on the spot. On any other setup, you&rsquo;d have to find
a monitor to hook the server up to and find a spare keyboard to use as well,
which can be a hassle.</p>
<h2 id="performance">
  <a class="heading-anchor" href="#performance">Performance<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>A home server that serves the needs of a couple of users at most and runs some
scheduled tasks from time to time can run perfectly fine off of a dual core
Intel Core series CPU from 2012. You probably don&rsquo;t want to run intensive
computational workloads off of it, such as transcoding video files on a service
like Jellyfin. However, you can utilize the integrated GPU to off-load specific
workloads to it, and media encode-decode for select video codecs is one of those.
Intel QuickSync is an absolute godsend for situations where you need to transcode
media on a CPU that isn&rsquo;t that powerful.</p>
<p>My home server runs a lot of services: Docker containers, this blog, data archival
jobs, backup jobs etc. When running them on the T430, the average CPU usage was
around 20%. Not ideal, but still leaves plenty of headroom for services.</p>
<p>The overall usability and performance that this machine offers was completely
acceptable. It&rsquo;s not as lightning fast as something that runs a modern CPU,
like the AMD Ryzen 5 PRO 4650G in the DeskMini, but it gets the job done.</p>
<h2 id="caveats-thermals">
  <a class="heading-anchor" href="#caveats-thermals">Caveats: thermals<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>A home server built around a used laptop brings a lot of benefits. However,
it also has some potential downsides that you should be aware of.</p>
<p>Most laptops have fans, and they can be damn loud. The ThinkPad T430 is
notoriously loud if you have the cooling fan manufactured by Toshiba. In a home
setting this can potentially a deal-breaker, unless you can wedge the laptop
into a corner of the room where it&rsquo;s not audible.</p>
<p>There exist solutions to the fan control problem. You can install a tool like
thinkfan or just write your preferred fan level to <code>/proc/acpi/ibm/fan</code> to
avoid the cooling fan running too loud <a href="https://wiki.archlinux.org/title/fan_speed_control#ThinkPad_laptops">(instructions here)</a>.</p>
<p>Running the fan at the lowest speed works fine most of the time since your CPU
can throttle itself when it&rsquo;s running too hot. However, with my setup I had an
odd issue where the machine would power off suddenly when it was doing a lot of
I/O workload, such as scrubbing the ZFS pool on the two 4TB SSD-s. This happened
even when the CPU was not even close to throttling, running around 75 C. I do
not know what the actual reason for the sudden shutdown is, but I suspect that
it may be related to the motherboard overheating or the system treating the hot
SSD-s as hard drives that are over the critical temperature limit of around 60 C.</p>
<p>I was able to work around most of the cooling-related issues by mounting the
laptop vertically and limiting the maximum CPU clock speed to around 2.4 GHz
using the knobs made available with <code>intel_pstate</code>.</p>
<p>The CPU temperatures during normal operation were mostly around 60C, with a high
load reaching max 75C with the tweaks applied and the CPU fan running at the
slowest possible speed.</p>
<h2 id="caveats-maintenance">
  <a class="heading-anchor" href="#caveats-maintenance">Caveats: maintenance<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If you have a machine that runs 24/7, maintenance will become an issue. No
matter how often you clean your home, dust will accumulate. On desktop PC-s,
cleaning out your CPU heatsink is just a matter of taking off the PC case side
panel, removing the heatsink fan, cleaning off the dust and putting it all back
together. You probably want to replace the thermal paste from time to time as
well.</p>
<p>On most laptops, cleaning out the CPU heatsink is much trickier. You will likely
have to disassemble most of the machine to even access it, which takes up much
more time compared to a desktop PC, which also means more downtime.</p>
<p>Depending on the model, a simple change, such as upgrading your storage or
replacing a faulty drive, can also be more complicated. I&rsquo;ve seen laptops where
you actually have to disassemble the whole machine to access the hard drive.
The ThinkPad T430 has an easily accessible setup when it comes to storage, but
the main storage bay does have an annoying pull-tab setup that probably won&rsquo;t
survive multiple subsequent changes.</p>
<h2 id="conclusion">
  <a class="heading-anchor" href="#conclusion">Conclusion<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Aside from the setbacks that may or may not be due to the specifics of my setup,
I find that a laptop can make for a good home server. If you have more specific
requirements, then a custom-built server is likely the way to go, but if you&rsquo;re
just starting out, then definitely do consider this option.</p>
<p>After running this setup for a week or two, I decided to go back to my previous
setup based on the ASRock DeskMini. The reliability woes weren&rsquo;t something I
was too happy with, and I didn&rsquo;t really have another use case for the DeskMini
either, so it made sense for me.</p>
]]></content:encoded></item><item><title>My self-hosting setup has an UPS now, here's my experience with it</title><link>https://ounapuu.ee/posts/2022/03/21/ups-i-did-it-again/</link><pubDate>Mon, 21 Mar 2022 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2022/03/21/ups-i-did-it-again/</guid><description>UPS, I did it again 🎵</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="My self-hosting setup has an UPS now, here's my experience with it" /><p>I changed my setup again.</p>
<p>I&rsquo;m now the proud owner of an APC Smart-UPS 750.</p>









<figure class="center">
  <a href="/posts/2022/03/21/ups-i-did-it-again/media/ups.jpg">
    <img src="/posts/2022/03/21/ups-i-did-it-again/media/ups_hu_8b82e70f8d835724.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The UPS is many times larger than the actual server.">

  </a>
  <figcaption class="center">The UPS is many times larger than the actual server.</figcaption>
</figure>

<p>Why? Because I got it as a gift, and I have never actually had an UPS before, so
it makes for a good introduction to this world.</p>
<h2 id="overview">
  <a class="heading-anchor" href="#overview">Overview<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>My setup is quite basic: everything that I have on my table (server, monitor,
laptop) is connected through the UPS. Since my setup uses very little power,
I&rsquo;m running way below the output limit of 500 watts.</p>
<p>When I&rsquo;m not using my laptop, the UPS reports itself at 10% utilization. My
server and the UPS itself seems to consume around 35-40 watts, as measured by
an energy meter. When the laptop and monitor are also powered on, the load is
around 15-25%, depending on the workload.</p>
<p>To make sure that I get the full benefit of the UPS, I connected it to my server
with an USB cable and installed <code>apcupsd</code>. By default, the daemon could not
detect the UPS, which was then fixed with the help of <a href="https://unix.stackexchange.com/a/538636">this StackExchange answer</a>:</p>
<blockquote>
<p>I had the same problem with COMMLOST with a USB connection, after a lot of
research I found by pure hazard that with a USB connection you should change
DEVICE /dev/ttys0 to DEVICE in /etc/apcupsd/apcupsd.conf with nothing after it,
this way apcupsd search everywhere on the system to find the UPS and connect
correctly, no more COMMLOST.</p>
<p>After that, restart apcupsd with:</p>
<p>$ sudo /etc/init.d/apcupsd restart</p>
</blockquote>
<p>With the UPS connected and the service up and running, I could now see more
detailed specs. The output for <code>apcaccess</code> looks something like this:</p>
<pre tabindex="0"><code>APC      : 001,043,1007
DATE     : 2022-02-04 21:49:08 +0200  
HOSTNAME : deskmini
VERSION  : 3.14.14 (31 May 2016) debian
UPSNAME  : deskmini
CABLE    : USB Cable
DRIVER   : USB UPS Driver
UPSMODE  : Stand Alone
STARTTIME: 2022-02-01 05:45:50 +0200  
MODEL    : Smart-UPS 750 
STATUS   : ONLINE 
LINEV    : 241.9 Volts
LOADPCT  : 9.1 Percent
BCHARGE  : 100.0 Percent
TIMELEFT : 98.0 Minutes
MBATTCHG : 5 Percent
MINTIMEL : 3 Minutes
MAXTIME  : 0 Seconds
OUTPUTV  : 241.9 Volts
SENSE    : High
DWAKE    : -1 Seconds
DSHUTD   : 90 Seconds
LOTRANS  : 208.0 Volts
HITRANS  : 253.0 Volts
RETPCT   : 0.0 Percent
ITEMP    : 33.3 C
ALARMDEL : 30 Seconds
BATTV    : 27.4 Volts
LINEFREQ : 50.0 Hz
LASTXFER : No transfers since turnon
NUMXFERS : 0
TONBATT  : 0 Seconds
CUMONBATT: 0 Seconds
XOFFBATT : N/A
SELFTEST : NO
STESTI   : 14 days
STATFLAG : 0x05000008
MANDATE  : 2007-03-16
SERIALNO : &lt; serial number goes here &gt;
BATTDATE : 2007-03-16
NOMOUTV  : 230 Volts
NOMBATTV : 24.0 Volts
FIRMWARE : 651.13.I USB FW:7.3
END APC  : 2022-02-04 21:49:10 +0200  
</code></pre><p>I&rsquo;ve seen some unintentionally funny abbreviations, but <code>CUMONBATT</code> takes the
cake.</p>
<h2 id="battery-runtime-test">
  <a class="heading-anchor" href="#battery-runtime-test">Battery runtime test<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>To test out the state of the batteries and understand how the UPS handles power
failure scenarios, I decided to pull the plug and see what happens next.</p>
<p>The first thing you&rsquo;ll notice is the beeping. It&rsquo;s not quite as loud as a smoke
detector, but I couldn&rsquo;t blame my neighbours for thinking that this was the case.
To silence the UPS, just press the power on/test button (the one with the | on
it).</p>
<p>While on batteries, the UPS emits a hum that&rsquo;s not too different from the one
present near some power stations and transformers. Other than that, it doesn&rsquo;t
get awfully loud or anything, at least on a small load.</p>
<p>I continued using my laptop and monitor while keeping an eye on the <code>apcupsd</code>
daemon and <code>apcaccess</code> output. The estimated runtime was around the 60 minute
mark and it ended up being quite close to the actual figure.</p>
<p>Around the 10% capacity mark <code>apcupsd</code> triggered a shutdown of the server. The
UPS still provided power at that point. I decided to supply the UPS with power
again and turn on my server. To my surprise, the UPS now cut off all output
power and started blinking some lights, one of them indicating some sort of an
issue with the battery. I turned everything off, then on again and the UPS was
just fine.</p>
<p>I&rsquo;m not sure if the last incident was intended behaviour or my inexperience
causing an issue.</p>
<h2 id="power-usage">
  <a class="heading-anchor" href="#power-usage">Power usage<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The goal of <a href="/posts/2022/01/17/asrock-x300-future-of-desktops/">moving my setup to an efficient machine</a>
was to experiment with how low can I go with the power usage of my setup.
Unfortunately with the introduction of the UPS I have wiped out almost all of
the gains that I got from the move. The UPS itself seems to constantly consume
around 17-18 watts, which is just a bit more than my server itself is using.</p>
<p>However, I hope that the reliability improvements and various protections
that come with the use of an UPS make up for that downside.</p>
<h2 id="lan-resilience">
  <a class="heading-anchor" href="#lan-resilience">LAN resilience<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>With the initial setup that I had, the server and the UPS were both on my desk.
In the event of a power outage, the server, my laptop and all the connected
peripherals would continue working. The only issue is that the networking won&rsquo;t
work in such a scenario, as both the ISP provided modem-router box and my own
router would be knocked offline. What use is a server disconnected from the
network?</p>
<p>Since I use my laptop for work, I&rsquo;m not too worried about it losing power.
Laptops have batteries, so in the event of a power outage, it will just continue
running off of the internal battery.</p>
<p>I&rsquo;ve configured my router to resolve my own domains internally, meaning that even
when I cannot connect to the Internet, my locally hosted services will keep
working in some capacity.</p>
<p>With all of this in mind, I decided to move my setup closer to my main router.</p>









<figure class="center">
  <a href="/posts/2022/03/21/ups-i-did-it-again/media/newsetup.jpg">
    <img src="/posts/2022/03/21/ups-i-did-it-again/media/newsetup_hu_6a26e086f041e5f1.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Not the prettiest setup, but it does do the trick, and it makes for a good conversation starter.">

  </a>
  <figcaption class="center">Not the prettiest setup, but it does do the trick, and it makes for a good conversation starter.</figcaption>
</figure>

<p>Power goes out, my server and local network will still keep on working for up to
2 hours due to the low combined power usage.</p>
<h2 id="desktop-integration">
  <a class="heading-anchor" href="#desktop-integration">Desktop integration<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>When testing the UPS on my main workstation (ThinkPad T430 running Fedora 35), I
was positively surprised by the out of the box experience that I had with the
UPS. With the USB cable connected to the laptop and the <code>apcupsd</code> service
running in the background, I could see the remaining battery life of the UPS the
same way that the laptop battery shows up.</p>









<figure class="center">
  <a href="/posts/2022/03/21/ups-i-did-it-again/media/gnome-power-info.png">
    <img src="/posts/2022/03/21/ups-i-did-it-again/media/gnome-power-info_hu_347b5c3294d0c6ea.webp"
     width="718"
     height="265"
     loading="lazy"
     decoding="async"
     alt="The UPS showing up as the main battery in GNOME 41.">

  </a>
  <figcaption class="center">The UPS showing up as the main battery in GNOME 41.</figcaption>
</figure>

<p>And once I ran out the batteries, I got a notification saying that the UPS was
about to run out of power soon.</p>









<figure class="center">
  <a href="/posts/2022/03/21/ups-i-did-it-again/media/gnome-ups-warning.png">
    <img src="/posts/2022/03/21/ups-i-did-it-again/media/gnome-ups-warning_hu_3462b75ba9ef5f21.webp"
     width="508"
     height="106"
     loading="lazy"
     decoding="async"
     alt="Warning notification that pops up once the UPS is running low on power.">

  </a>
  <figcaption class="center">Warning notification that pops up once the UPS is running low on power.</figcaption>
</figure>

<p>I love seeing these relatively niche use cases supported out of the box. Props
to the developers behind these quality of life improvements!</p>
<h2 id="conclusion">
  <a class="heading-anchor" href="#conclusion">Conclusion<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Would I have gone out and bought this UPS if I didn&rsquo;t receive it as a gift?
Probably not, because I didn&rsquo;t see much of a need for one.</p>
<p>Now that I have it, will I keep using it? Definitely, assuming that the
inevitable battery replacement cost is reasonable and the process of changing
them is easy enough for an enthusiast to handle.</p>
<p>From the manual:</p>
<blockquote>
<p>For Professional Business Applications – Not For Consumer Use</p>
</blockquote>
<p>Look, ma, I&rsquo;m a professional now!</p>
]]></content:encoded></item><item><title>ASRock X570M Pro4 motherboard overview</title><link>https://ounapuu.ee/posts/2022/02/02/asrock-x570m-pro4-overview/</link><pubDate>Wed, 02 Feb 2022 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2022/02/02/asrock-x570m-pro4-overview/</guid><description>Quick overview from someone who does this thing as a hobby, focusing on PCIe connectivity, fan control and the poor state of AM4 socket and UEFI upgrades.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="ASRock X570M Pro4 motherboard overview" /><p>Not too long ago, I had the goal of consolidating all my computing needs onto a
single desktop PC. That meant moving from an mITX-based build to something that
had a bit more expandability. Since I already had a
<a href="https://www.fractal-design.com/products/cases/meshify/meshify-c-mini-dark-tempered-glass/black/">Fractal Meshify C Mini</a>,
I decided to go for an mATX motherboard. And that&rsquo;s how I ended up with an
<a href="https://www.asrock.com/mb/AMD/X570M%20Pro4/">ASRock X570M Pro4</a>.</p>









<figure class="center">
  <a href="/posts/2022/02/02/asrock-x570m-pro4-overview/media/glamshot.jpg">
    <img src="/posts/2022/02/02/asrock-x570m-pro4-overview/media/glamshot_hu_96cab6cd6b670713.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="ASRock X570M Pro4. Looks great, doesn&#39;t it?">

  </a>
  <figcaption class="center">ASRock X570M Pro4. Looks great, doesn&#39;t it?</figcaption>
</figure>

<h2 id="matx-a-dying-breed">
  <a class="heading-anchor" href="#matx-a-dying-breed">mATX: a dying breed?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>One of the requirements for the build was that it had to support IOMMU well so
that a VFIO setup would be possible. While AMD B-series motherboards may work
just fine in such scenarios, the X-series boards allegedly have better IOMMU
groups and thus better compatibility with VFIO.</p>
<p>Once I started the search for the new motherboard, I was surprised to see that
locally there was only one mainstream option available. There were plenty of
B450 and B550 boards available, but only a single X570 board in this form factor.</p>
<p>I checked the board out, saw that it had plenty of NVMe and SATA storage options,
and went for it.</p>
<h2 id="pcie-connectivity">
  <a class="heading-anchor" href="#pcie-connectivity">PCIe connectivity<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>When you have a bunch of PCIe devices to connect, the way those lanes are
connected start to matter.</p>
<p>Based on my own testing, I&rsquo;ve found the following:</p>
<ul>
<li>the first M.2 slot (under the heatsink) is connected to the CPU</li>
<li>the first PCIe x16 slot is also connected to the CPU</li>
<li>the rest of PCIe connectivity goes through the chipset</li>
<li>most (if not all) SATA ports seem to go through the chipset as well</li>
</ul>









<figure class="center">
  <a href="/posts/2022/02/02/asrock-x570m-pro4-overview/media/lstopo.jpg">
    <img src="/posts/2022/02/02/asrock-x570m-pro4-overview/media/lstopo_hu_2ebd299829f27b52.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Hardware topology, as shown by `lstopo`.">

  </a>
  <figcaption class="center">Hardware topology, as shown by `lstopo`.</figcaption>
</figure>

<p>This matters, because anything connected to the CPU via the chipset shares the
bandwidth of a limited x4 link. This was apparent when running two NVMe drives and
noticing that one of them was much slower when I also put load on SATA SSD-s.</p>
<p>GPU-s can still work fine when connected via the chipset, but there&rsquo;s definitely
a performance penalty involved. While I don&rsquo;t have the exact numbers available
at this time, I do remember a CSGO benchmarking map showing at least a double-digit
framerate difference compared to the full x16 slot.</p>









<figure class="center">
  <a href="/posts/2022/02/02/asrock-x570m-pro4-overview/media/gpu-in-chipset.jpg">
    <img src="/posts/2022/02/02/asrock-x570m-pro4-overview/media/gpu-in-chipset_hu_9392dfe09abc1536.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The GPU works just fine in the chipset PCIe slot, albeit at lower performance.">

  </a>
  <figcaption class="center">The GPU works just fine in the chipset PCIe slot, albeit at lower performance.</figcaption>
</figure>

<p>I also gave PCIe bifurcation a go. I borrowed an ASUS PCIe adapter card that can
support up to 4 NVMe SSD-s, hoping that I could set up a crazy storage setup.
The bifurcation works, but for the CPU I used (AMD Ryzen 7 5700G) I was only
provided the option of 2x4 split, which meant that at most I could run two SSD-s
in the riser card at a time. A non-APU Ryzen CPU is likely needed to take full
advantage of the bifurcation support.</p>









<figure class="center">
  <a href="/posts/2022/02/02/asrock-x570m-pro4-overview/media/bifurcation-uefi.jpg">
    <img src="/posts/2022/02/02/asrock-x570m-pro4-overview/media/bifurcation-uefi_hu_471a7ba53278b5d0.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The setting that controls bifurcation in ASRock UEFI settings.">

  </a>
  <figcaption class="center">The setting that controls bifurcation in ASRock UEFI settings.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2022/02/02/asrock-x570m-pro4-overview/media/bifurcation-card.jpg">
    <img src="/posts/2022/02/02/asrock-x570m-pro4-overview/media/bifurcation-card_hu_9f046ac9c2554355.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="ASUS Hyper M.2 PCIe card installed in the system.">

  </a>
  <figcaption class="center">ASUS Hyper M.2 PCIe card installed in the system.</figcaption>
</figure>

<p>For VFIO, this board is fine. Anything in PCIe slots, including the chipset ones,
I was able to pass through to the VM. USB and SATA ports were a different story,
I wasn&rsquo;t able to pass through a single controller, the VM would not start up
properly.</p>
<p>If you have an use case where you need reliable and fast PCIe connectivity,
then I&rsquo;d recommend another platform that has lots of real PCIe connectivity,
such as the AMD Threadripper/EPYC platform. This board exhibited some odd
behaviour when trying to utilize all the PCIe slots, or when trying to use the
ASUS Hyper M.2 card in bifurcation mode while also having the GPU connected at
the bottom PCIe x16 slot.</p>
<h2 id="chipset-fan">
  <a class="heading-anchor" href="#chipset-fan">Chipset fan<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>One aspect of X570 boards that stuck out to most people on release was the
inclusion of a chipset fan. Not too long after, people started to report that
those fans are very loud and low quality, resulting in them failing easily.</p>
<p>For this particular board, ASRock provides an option in UEFI settings that allows
you to run this chipset fan semi-passively. It will spin up once on boot and
sit idle the rest of the time, unless the temperatures are high enough. I was
not able to get that fan to spin even with a full GPU load and all SSD-s running
heavy read operations at the same time.</p>
<p>If you have PWM fans, it&rsquo;s also possible to manually control these in Linux
with the use of <a href="https://wiki.archlinux.org/title/fan_speed_control#Fancontrol_%28lm-sensors%29">fancontrol</a>.
For me, it just took a bit of trial and error to figure out the mapping between
the software fan controls and the actual fan in the PC, after that I could
fine-tune them to run as quietly as possible. Yes, even the chipset fan was
controllable using the same method.</p>
<h2 id="am4-socket-long-term-support">
  <a class="heading-anchor" href="#am4-socket-long-term-support">AM4 socket long term support<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>AMD introduced the <a href="https://en.wikipedia.org/wiki/Socket_AM4">AM4 socket</a> back in
2016 and promised to support it until 2020. I applaud that effort and am
happy that I was able to run the latest AMD Ryzen 5000 series APU on a B450
board. If you happen to have a newer CPU that requires a UEFI upgrade for it to
be supported, then you will be in a world of hurt.</p>
<p>I found myself in a situation where I had a motherboard that didn&rsquo;t have the
newest UEFI version from the factory, and a CPU that was just a bit too new for
it to work. The board supported AMD Ryzen 5000 series CPU-s, not 5000 G-series
CPU-s. I also didn&rsquo;t have an older CPU available that I could use to perform
this upgrade on my own. Luckily I was able to find a loaner 5000 series CPU,
perform the upgrade and finally assemble the machine.</p>
<p>At least ASRock puts a sticker with the UEFI version on the chip itself so that
you can check the CPU support once you physically have the motherboard, but it&rsquo;s
pretty much useless when buying this board online. There&rsquo;s no indication as to
which version it will ship with, the best you can do is to look for some Reddit
threads where others have shared their experiences with the board and the UEFI
version it shipped with from the factory.</p>
<p>Pro tip for CPU and motherboard manufacturers: if you&rsquo;re going for long-term
support on your platform, please include a CPU-less UEFI upgrading solution.
Some high-end motherboards already ship with that type of functionality, but I
believe it should be made mandatory for all boards. Avoiding headaches like that
will be worth the extra cost.</p>
<h2 id="verdict">
  <a class="heading-anchor" href="#verdict">Verdict<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>It&rsquo;s fine, looks good and gets the job done. Can&rsquo;t recommend it for someone who
needs a lot of performance and PCIe lanes, but for hobbyist workloads it will
<em>probably</em> be just fine. UEFI flashing situation really soured the experience
though.</p>
]]></content:encoded></item><item><title>ASRock DeskMini X300: the future form factor of desktop PC-s?</title><link>https://ounapuu.ee/posts/2022/01/17/asrock-x300-future-of-desktops/</link><pubDate>Mon, 17 Jan 2022 07:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2022/01/17/asrock-x300-future-of-desktops/</guid><description>Honey, I shrunk my desktop PC!</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="ASRock DeskMini X300: the future form factor of desktop PC-s?" /><p>I wasn&rsquo;t happy with my <a href="/posts/2021/12/29/vr-vfio-latency/">&ldquo;one machine that does it all&rdquo;</a>
setup, which is why I finally bit the bullet and got myself an <a href="https://www.asrock.com/nettop/AMD/DeskMini%20X300%20Series/index.asp">ASRock DeskMini X300 bare-bones kit</a>.
This is a fantastic little desktop PC kit that is very small, quiet and can
still be configured to have ridiculous amounts of power. In the past. I once
built a low-power server based off of the predecessor, <a href="https://www.asrock.com/nettop/AMD/DeskMini%20A300%20Series/index.asp">the DeskMini A300</a>,
and instantly fell in love with this form factor. Since then, I&rsquo;ve tried to come
up with a reason to get one, and finally I&rsquo;ve got one.</p>









<figure class="center">
  <a href="/posts/2022/01/17/asrock-x300-future-of-desktops/media/0-assembled.jpg">
    <img src="/posts/2022/01/17/asrock-x300-future-of-desktops/media/0-assembled_hu_582636fe3dc6562.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The ASRock DeskMini X300, up and running.">

  </a>
  <figcaption class="center">The ASRock DeskMini X300, up and running.</figcaption>
</figure>

<h2 id="configuration">
  <a class="heading-anchor" href="#configuration">Configuration<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Because this is a bare-bones kit, you have to supply your own parts.</p>
<p>My configuration:</p>
<ul>
<li>CPU: AMD Ryzen 7 5700G, locked to 35 W TDP in UEFI settings.</li>
<li>Cooling: Noctua NH-L9a</li>
<li>RAM: 2x 16 GB DDR4-3200 SODIMM</li>
<li>NVMe storage: 2x Samsung SSD 980 500GB</li>
<li>SATA storage: 2x Samsung SSD 870 QVO 4TB</li>
<li>USB storage: 1x Samsung SSD 860 EVO 250GB in an IcyBox USB enclosure</li>
</ul>









<figure class="center">
  <a href="/posts/2022/01/17/asrock-x300-future-of-desktops/media/1-mobo.jpg">
    <img src="/posts/2022/01/17/asrock-x300-future-of-desktops/media/1-mobo_hu_dd2b8d53a1ea5414.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Initial test configuration with Ryzen 5 PRO 4650G and 16GB of RAM.">

  </a>
  <figcaption class="center">Initial test configuration with Ryzen 5 PRO 4650G and 16GB of RAM.</figcaption>
</figure>

<p>The use case for my kit is simple: it&rsquo;s my server that hosts all my services and
data, including this blog you&rsquo;re reading.</p>
<p>Why this setup in particular?</p>
<ul>
<li>Most of my storage needs can be served by two 4 TB SSD-s.</li>
<li>8 cores with SMT are perfect for multithreaded workloads, such as <a href="https://jellyfin.org/">Jellyfin</a>
transcoding. This also works well for just running a bunch of services on the same
machine.</li>
<li>Can support up to 64 GB of RAM, which should be plenty in the foreseeable
future.</li>
<li>Supports fast NVMe SSD-s, which are perfect for more IO-sensitive workloads,
such as databases.</li>
<li>Low power usage. Even with my almost maxed out kit, it still uses around
14 W in idle. At most this PC can use around 50-60 watts due to the CPU TDP
limit and SSD-s hitting full load.</li>
</ul>









<figure class="center">
  <a href="/posts/2022/01/17/asrock-x300-future-of-desktops/media/3-testbed.jpg">
    <img src="/posts/2022/01/17/asrock-x300-future-of-desktops/media/3-testbed_hu_ccae4dc7a42f9185.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Never assemble the whole PC without checking if it actually works.">

  </a>
  <figcaption class="center">Never assemble the whole PC without checking if it actually works.</figcaption>
</figure>

<h2 id="why-is-this-form-factor-so-good">
  <a class="heading-anchor" href="#why-is-this-form-factor-so-good">Why is this form factor so good?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Desktop PC-s are big. Really big. While the small form factor PC movement has become
more popular lately, the most commonly available cases and parts still end up
taking a lot of space and resources. There are legitimate use cases for these
types of setups, especially if you&rsquo;re running video renders, scientific
simulations or a lot of VM-s as part of a lab. Not every workload needs such a
big setup, however.</p>
<p>The DeskMini X300 looks like a miniature version of a desktop PC in a tower case.
Similar shape and features, but at a fraction of the size and raw resources usage.
One might say that it even looks adorable, similar to how
<a href="https://www.reddit.com/r/pcmasterrace/comments/nlddyc/since_gpus_are_in_short_supply_i_decided_to_build/">Raspberry Pi-based builds look compared to desktops</a>.</p>
<p>This PC takes up just 1.92 liters in volume (excluding the power adapter). For
comparison, a micro-ATX case like <a href="https://www.fractal-design.com/products/cases/meshify/meshify-c-mini-dark-tempered-glass/black/">the Fractal Meshify Mini C</a>,
takes up a whopping 33.4 liters. I don&rsquo;t have the raw numbers regarding material
usage or the weight difference, but this comparison should give you an idea of
the material usage difference between the two.</p>









<figure class="center">
  <a href="/posts/2022/01/17/asrock-x300-future-of-desktops/media/5-size.jpg">
    <img src="/posts/2022/01/17/asrock-x300-future-of-desktops/media/5-size_hu_ff89a889b8dda0ca.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Included driver CD for scale. Not sure where you&#39;d insert it, though.">

  </a>
  <figcaption class="center">Included driver CD for scale. Not sure where you&#39;d insert it, though.</figcaption>
</figure>

<h2 id="caveats">
  <a class="heading-anchor" href="#caveats">Caveats<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I love this piece of kit, but I do have to acknowledge that there are some
trade-offs that you should be aware of.</p>
<p>Starting with the obvious one first: you&rsquo;re trading off some expandability.
No discrete GPU-s will fit in this thing, not even an external one due to lack
of Thunderbolt. On the other hand, if you don&rsquo;t foresee a need for such
additions to your PC, then the DeskMini will be a great choice.</p>
<p>Something that&rsquo;s specific to the X300 is the lack of USB connectivity. You get
two USB 3.0 Type-A ports, one USB 2.0 port and a USB 3.2 Gen 1 Type-C port as
well. If you have a USB hub, then this won&rsquo;t be much of an issue, but this
configuration is quite limited compared to most modern desktop motherboards.</p>
<p>The motherboard inside this thing can also be a point of concern. It&rsquo;s a
non-standard form factor, meaning that in case of failure you&rsquo;re unlikely to
easily find a replacement. The most obvious step here would be to either repair
it or get another DeskMini kit to replace your existing one.</p>
<p>One aspect of the DeskMini X300 that you may care about is the fact that the
power supply is an external 19V 120W power brick. This does mean that replacing
the power supply won&rsquo;t be much of an issue, but you do have to take this into
account when planning your build. The power brick is quite big and has to be
placed somewhere, after all. In my setup, I&rsquo;ve opted for sticking it to the
underside of my desk with double-sided tape.</p>









<figure class="center">
  <a href="/posts/2022/01/17/asrock-x300-future-of-desktops/media/8-powersupply.jpg">
    <img src="/posts/2022/01/17/asrock-x300-future-of-desktops/media/8-powersupply_hu_3786ce24a6498256.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="How to hide bulky power supplies: the tutorial.">

  </a>
  <figcaption class="center">How to hide bulky power supplies: the tutorial.</figcaption>
</figure>

<h2 id="gpu-s-apu-s-and-the-future">
  <a class="heading-anchor" href="#gpu-s-apu-s-and-the-future">GPU-s, APU-s, and the future<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>For anyone who&rsquo;s followed the GPU market in 2021/2022, the ridiculously high pricing
of GPU-s shouldn&rsquo;t come as a surprise. As a firm believer in thinking that low
power computing is the future, I think that this presents a great opportunity
to start thinking differently about our computing architecture.</p>
<p>AMD introduced the concept of <a href="https://en.wikipedia.org/wiki/AMD_Accelerated_Processing_Unit">APU-s back in 2011</a>.
In its current iteration in the form of AMD Ryzen 5000 series APU-s, they provide
a compelling package, combining powerful CPU cores with a decent GPU that&rsquo;s perfectly
capable of many tasks, including low-spec gaming.</p>
<p>I&rsquo;ve <a href="/posts/2021/11/03/tech-rants-1/">previously covered what I think about the state of computer hardware and the resource
usage associated with it</a>. It&rsquo;s possible that
we&rsquo;re simply in a time in history where resource abundance allows us to push the
limit of what computer hardware is capable of without thinking much about the
cost. At some point we do need to address that issue, and I think APU-s will
play a role in it.</p>
<p>We already have examples of what APU-like chips can be capable of in the form of
the last two console generations. To get an idea about the power usage numbers,
check out the <a href="https://www.playstation.com/en-gb/legal/ecodesign/">power usage statistics shared by Sony for the PS4 and PS5</a>.
The power usage of the PS5 is still almost 200 W under load, which isn&rsquo;t that great,
but that&rsquo;s likely due to the high performance goals set for the console itself.
You&rsquo;d have to give up some image quality or performance for a more efficient setup,
which is something the marketing department isn&rsquo;t probably very happy about, given
that they&rsquo;re in direct competition with Microsoft with their newest XBOX lineup
that is also pushing the limits of the custom APU inside it.</p>
<p>The integrated GPU solutions that AMD and Intel have put out are becoming more
and more capable. Even an AMD Ryzen 3 2200G from 2018 with its measly 4 cores
and a Vega 8 GPU is still capable enough to run GTA V at 1080p with low-medium
settings smoothly (60 FPS or more). You do have to make a conscious trade-off
in image quality and performance when relying on APU-s, but if you&rsquo;re willing
to make that trade-off, you can get a decent gaming experience.</p>
<p><a href="https://store.steampowered.com/steamdeck/">Even the Steam Deck is shipping with a custom AMD APU.</a>
What makes this one different from AMD-s previous APU-s is the inclusion of a
modern GPU core based on the RDNA 2 architecture, which should be a big jump
from the relatively old Vega-based GPU-s that desktop APU-s have shipped with.</p>
<p>If it weren&rsquo;t for the progress in gaming tech, such as high refresh rate monitors
and ever-increasing system requirements for newer games, APU-s would be a good
default choice for casual gamers, negating the need to get a huge box that you
have to somehow also fit on your desk.</p>
<p>I have run on an APU-based setup and was happy with the experience, unfortunately
an APU-based machine just doesn&rsquo;t cut it for virtual reality workloads, yet.</p>
<h2 id="comparison-to-tinyminimicro-pc-s">
  <a class="heading-anchor" href="#comparison-to-tinyminimicro-pc-s">Comparison to TinyMiniMicro PC-s<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p><a href="https://www.servethehome.com/introducing-project-tinyminimicro-home-lab-revolution/">ServeTheHome&rsquo;s TinyMiniMicro series</a>
gives a good overview of the options available for someone who wants a very small
1 liter PC to do all their work on. Since these machines are also very small,
power-efficient and yet still quite powerful, I think a comparison between the
two is a reasonable one.</p>
<p>One area where the TinyMiniMicro PC-s win is an obvious one: the size. They are
about half the size of the DeskMini X300: 1 liter vs 1.92 liters.</p>
<p>TinyMiniMicro PC-s are also abundant on the used market with various configurations.
In most cases, the storage and RAM are upgradeable, and with some older models
you&rsquo;ll find that the CPU is also socketed. Depending on your market, this means
that you may be able to get a whole PC for cheaper than the DeskMini + the rest
of the components (CPU, RAM, storage, Wi-Fi etc.).</p>
<p>The size and cost benefits do come with some compromises that are not acceptable
for my use case. At 1 liter, the only option you have is to include a blower
type cooler in your PC. This type of cooler is similar to the ones found in
laptops and has in my experience resulted in a lot of annoying noise under heavy
load.</p>
<p>The UEFI settings on these machines may also be quite limited. Sure, if you just
need the basics, these will be fine, but if you want to configure the fan
behaviour, you might find yourself unable to do so. On the DeskMini, you can
setup the CPU fan to run just the way you like it. In my case, the fan only
turns on when the system is under load, the fan is completely stopped while the
machine is idle.</p>
<p>The DeskMini also allows you to change out the CPU cooler with anything that&rsquo;s
AM4 socket compatible. The case of course sets some limits to that,
<a href="https://www.reddit.com/r/Amd/comments/enw3up/a3003400g_w_ml120_aio_mod/">unless you&rsquo;re a madlad who doesn&rsquo;t let boundaries bother them.</a>
With the <a href="https://noctua.at/en/nh-l9a-am4">Noctua NH-L9a AM4</a>, the setup is very
quiet, especially once you limit the CPU TDP and adjust the fan curve. In my
experience, the &ldquo;coil whine&rdquo; noise that the system produces under load is more
audible than the CPU fan itself.</p>









<figure class="center">
  <a href="/posts/2022/01/17/asrock-x300-future-of-desktops/media/2-cooler-installed.jpg">
    <img src="/posts/2022/01/17/asrock-x300-future-of-desktops/media/2-cooler-installed_hu_1ab963d658dec229.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Low profile Noctua cooler: looks good, is quiet and keeps the system cool.">

  </a>
  <figcaption class="center">Low profile Noctua cooler: looks good, is quiet and keeps the system cool.</figcaption>
</figure>

<p>When it comes to storage options, the DeskMini is an obvious winner. In modern
TinyMiniMicro machines that I&rsquo;ve seen, you can at most install two NVMe SSD-s.
This is a step up from older machines and you can still do a lot with that, but
the DeskMini trumps that with the addition of two SATA ports, which allows you
to go crazy with the storage configuration.</p>









<figure class="center">
  <a href="/posts/2022/01/17/asrock-x300-future-of-desktops/media/4-bulk-storage.jpg">
    <img src="/posts/2022/01/17/asrock-x300-future-of-desktops/media/4-bulk-storage_hu_3f5d94339265be4d.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="8TB of solid state storage. Bonkers.">

  </a>
  <figcaption class="center">8TB of solid state storage. Bonkers.</figcaption>
</figure>

<p>Both the DeskMini and TinyMiniMicro-series PC-s are fantastic, but for my use
case the DeskMini X300 was the obvious choice.</p>
<h2 id="tech-tip-vesa-mounts-for-what">
  <a class="heading-anchor" href="#tech-tip-vesa-mounts-for-what">Tech tip: VESA mounts, for what?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The DeskMini X300 is so light and small that you can easily attach it to a
monitor arm using a piece of foam and long velcro strips.</p>









<figure class="center">
  <a href="/posts/2022/01/17/asrock-x300-future-of-desktops/media/6-custommount.jpg">
    <img src="/posts/2022/01/17/asrock-x300-future-of-desktops/media/6-custommount_hu_2101070382b2a45.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="DeskMini X300 mounted on a monitor arm.">

  </a>
  <figcaption class="center">DeskMini X300 mounted on a monitor arm.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2022/01/17/asrock-x300-future-of-desktops/media/7-custommount.jpg">
    <img src="/posts/2022/01/17/asrock-x300-future-of-desktops/media/7-custommount_hu_f7b4950e8939cd42.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Behind the scenes.">

  </a>
  <figcaption class="center">Behind the scenes.</figcaption>
</figure>

<h2 id="future-plans">
  <a class="heading-anchor" href="#future-plans">Future plans<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I&rsquo;m hoping that the current DeskMini-based server configuration is the one that
will last me a while. The obvious upgrades in the future would be to max out the
RAM at 64 GB and upgrade the NVMe and SATA storage to whatever options are
available in the future. I&rsquo;m not expecting the DeskMini X300 to get a CPU
upgrade, which isn&rsquo;t too tragic, given that the Ryzen 7 5700G has 8 fast cores.</p>
<p>My adventures in low power computing may take me to another setup in the future.
Until then, I&rsquo;ll see how the DeskMini does. So far, it has met my expectations
in performance, power usage, reliability and noise.</p>
<h2 id="future-of-desktop-computing">
  <a class="heading-anchor" href="#future-of-desktop-computing">Future of desktop computing?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Predictions are difficult to make, especially in turbulent times that we&rsquo;ve
found ourselves in. I do hope that this form factor takes off and that we
reevaluate our current computing workloads to be more suitable for machines
that use a lot less power.</p>
<p>Constraints often result in clever tricks and fantastic end results. Hopefully
we&rsquo;ll see something similar in the future.</p>
<p>To get an idea of what you can achieve with very limited hardware, check out
the <a href="https://www.youtube.com/c/CodingSecrets">Coding Secrets YouTube channel</a>
that showcases all the tricks and thinking behind some of the most impressive
effects on game consoles from early 90&rsquo;s.</p>
<p>Sure, you can argue that not having to think about such limitations can help
create solutions faster and that definitely has some value, but at some point
we need to start optimizing. Computing resources are cheap right up to the point
where every app on your PC thinks the same way.</p>
]]></content:encoded></item><item><title>Why I went back to using a ThinkPad from 2012</title><link>https://ounapuu.ee/posts/2022/01/09/why-i-went-back-to-using-a-thinkpad-from-2012/</link><pubDate>Sun, 09 Jan 2022 11:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2022/01/09/why-i-went-back-to-using-a-thinkpad-from-2012/</guid><description>How trying out new laptops and messing with my personal computing setup motivated me to go back to a laptop that some would call ancient.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="Why I went back to using a ThinkPad from 2012" /><p><em>This post is inspired by <a href="https://solar.lowtechmagazine.com/2020/12/how-and-why-i-stopped-buying-new-laptops.html">this article from the Low-tech Magazine</a>.
I highly recommend giving that a read as well!</em></p>
<p>Over my lifetime, I&rsquo;ve used a bunch of different computers, mainly due to new
ideas and requirements popping into my mind every time I&rsquo;m content with my
current setup. One of my last changes might be a bit of a headscratcher for some.</p>









<figure class="center">
  <a href="/posts/2022/01/09/why-i-went-back-to-using-a-thinkpad-from-2012/media/t430.jpg">
    <img src="/posts/2022/01/09/why-i-went-back-to-using-a-thinkpad-from-2012/media/t430_hu_2d4404a123679511.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="ThinkPad T430 in all its glory.">

  </a>
  <figcaption class="center">ThinkPad T430 in all its glory.</figcaption>
</figure>

<h2 id="background">
  <a class="heading-anchor" href="#background">Background<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>At my current place of employment, I&rsquo;ve had the opportunity to try out recently
released laptops from Lenovo and Dell, with the goal of evaluating them for
software development workloads and pick a default option for new hires. My work
laptop at the time was the Lenovo ThinkPad T480 with some decent specs and an
NVIDIA GeForce MX 150 GPU that was weak and throttled itself whenever it hit 70
degrees Celsius in Windows 10, making it absolutely useless.</p>
<p>I tried out a fair number of makes and models: Lenovo ThinkPad P14/T14 (gen 1
and 2) in both Intel 11th gen and AMD Ryzen 4000/5000 series configurations, plus
some Dell Latitudes with Intel 11th gen CPU-s as well. And the result? A lot of
disappointment.</p>
<p>The non-exhaustive list of issues I ran into with these machines on Fedora
Linux 34:</p>
<ul>
<li>The touchpad would sometimes randomly not work on one of the ThinkPads.</li>
<li>On AMD models, performance was less than stellar for my workloads and not a
significant jump over a laptop from 2018.</li>
<li>The Intel CPU-s had throttling issues that made them unusable for basic
things like calls over Google Meet as they would throttle to 400 MHz.</li>
<li>On one of the Dell machines, it was very easy to overheat the SSD, which lead
to the CPU throttling to 400 MHz. Yes, the SSD caused the CPU to throttle.</li>
<li>Wi-Fi/Bluetooth would not work on one of the laptops, even when I was using an
up-to-date Linux distro. Likely related to the type of adapter used (not Intel).</li>
</ul>
<p>Once that experiment was done, we settled on the least crappy version of the
ThinkPads that had an AMD Ryzen CPU, at least those didn&rsquo;t sound like jet
engines under load and didn&rsquo;t have insane throttling issues.</p>
<p>It&rsquo;s not all that bad, though. I was now committed to using my current ThinkPad
T480 for as long as possible. It, too, had a rough start, but at least all the
issues it came with have been ironed out over time.</p>
<h2 id="hopping-between-machines">
  <a class="heading-anchor" href="#hopping-between-machines">Hopping between machines<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>At this point in time, I had three machines:</p>
<ul>
<li>desktop PC (for work and personal stuff)</li>
<li>work laptop (for work stuff only)</li>
<li>personal laptop (for personal stuff, of course)</li>
</ul>
<p>I could not rely on the work laptop for personal use as it has limited storage
options. Call me a freak, but I feel very uneasy running on a single SSD, even
if my data is backed up to my NAS and on external backup drives. With my <a href="/posts/2021/12/29/vr-vfio-latency/">desktop
PC use case affecting other workloads as well</a>, I
had to come up with a solution.</p>
<p>Syncing data between machines was not the issue here. <a href="https://syncthing.net/">Syncthing</a>
is an absolute open-source gem and had no issues with things like
<code>node_modules</code> folders. The main issue was the fact that I didn&rsquo;t want to carry
two laptops around or buy an extra USB-C dock for use at home.</p>
<p>I took the risk and jumped back to the ThinkPad T430 for both my personal and
work use cases.</p>
<h2 id="thinkpad-t430-the-history">
  <a class="heading-anchor" href="#thinkpad-t430-the-history">ThinkPad T430: the history<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>My ThinkPad T430 has a rich history. I got it in 2016 to replace my aging
ThinkPad T60. Getting this laptop felt similar to that time a desktop PC that ran
Windows 98 got replaced with a dual-core &ldquo;beast&rdquo; in 2006.</p>
<p>In 2006, my webpage load times went from 30 seconds to a second. Getting
Android app build times from 60 seconds to around 10 seconds on the T430 felt
the same.</p>
<p>This ThinkPad T430 has survived all the following:</p>
<ul>
<li>A bicycle crash while it was in a backpack. The latch mechanism broke and
there are a couple of cracks in the palm rest, but the rest is working fine.</li>
<li>A coffee spill, which luckily only discoloured the casing of two USB 3.0 ports.</li>
<li>Liquid metal experiments, had some pretty close calls there with my dumb ass
almost shorting the system out.</li>
<li>Use as a budget low-power server machine for a bit.</li>
</ul>
<p>5 years later, it&rsquo;s back in my possession again after a short stint at a family
members&rsquo; hands.</p>
<p>There&rsquo;s more to this than simply a rich history, though.</p>
<h2 id="the-modifications">
  <a class="heading-anchor" href="#the-modifications">The modifications<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Over the years, I&rsquo;ve been inspired by whatever modifications people over at
<a href="https://www.reddit.com/r/thinkpad/">/r/thinkpad</a> have come up with. If you
want a short summary, you can check out
<a href="https://medium.com/@n4ru/the-definitive-t430-modding-guide-3dff3f6a8e2e">the definitive T430 modding guide</a>
to get some inspiration.</p>
<p>To make this machine viable in 2021, you need the CPU, RAM and SSD upgrades at
the very minimum.</p>
<p>Here&rsquo;s the list of upgrades I&rsquo;ve done:</p>
<ul>
<li>CPU upgrade to a quad-core Intel i7-3820QM (45W TDP).</li>
<li>RAM upgrade to 16 GB DDR3 memory.</li>
<li>Storage: 250GB mSATA for OS, 2x 1TB SATA SSD-s for data, made possible with a
HDD caddy that replaces the optical drive.</li>
<li>New third party 9-cell battery. I&rsquo;ve had mixed experiences with these, but
the one I have now seems to be good enough.</li>
<li>Replaced the heatsink and fan assembly with one that has a Delta fan
(FRU 04W3270). It&rsquo;s quieter and doesn&rsquo;t have the high-pitched whine that the
Toshiba fan exhibits.</li>
<li>At one point, I ran an external GPU off of the ExpressCard34 slot.</li>
<li>Installed <a href="https://github.com/n4ru/1vyrain">1vyrain</a> to get rid of annoying
limitations, such as the Wi-Fi whitelist.</li>
<li>Upgraded the Wi-Fi card to Intel Wireless-AC 7260.</li>
</ul>









<figure class="center">
  <a href="/posts/2022/01/09/why-i-went-back-to-using-a-thinkpad-from-2012/media/fandesign.jpg">
    <img src="/posts/2022/01/09/why-i-went-back-to-using-a-thinkpad-from-2012/media/fandesign_hu_2e4291c1c9feb921.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Delta fan (top) vs the annoyingly loud Toshiba fan (bottom).">

  </a>
  <figcaption class="center">Delta fan (top) vs the annoyingly loud Toshiba fan (bottom).</figcaption>
</figure>

<p>There are some things I&rsquo;d like to eventually tinker with:</p>
<ul>
<li>Replace the display with a compatible 1600x900 panel that has better image
quality. The current screen is awful.</li>
<li>Do something fun with the ExpressCard34 slot. There&rsquo;s the <a href="https://thinkmods.store/collections/all-mods-1/products/expresscard-to-nvme-adapter">thinkmods.store
ExpressCard34 SSD adapter</a>,
but I haven&rsquo;t seen that released yet.</li>
</ul>









<figure class="center">
  <a href="/posts/2022/01/09/why-i-went-back-to-using-a-thinkpad-from-2012/media/egpu.jpg">
    <img src="/posts/2022/01/09/why-i-went-back-to-using-a-thinkpad-from-2012/media/egpu_hu_71bc0f4a5a4cb46a.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="eGPU setup that I used to run back in 2017 with surprisingly good results.">

  </a>
  <figcaption class="center">eGPU setup that I used to run back in 2017 with surprisingly good results.</figcaption>
</figure>

<p>With these modifications, it feels like an usable laptop again.</p>
<h2 id="but-why">
  <a class="heading-anchor" href="#but-why">But why?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The reasons why I went back to the T430 are quite simple.</p>
<ul>
<li>Build quality: it has survived a nasty fall, and it will probably survive the
next ones as well.</li>
<li>CPU performance is roughly on par with the T480 under sustained load.</li>
<li>No dedicated GPU that takes up valuable space and power.</li>
<li>Battery life with the 9-cell battery is on par or even better in real
world use scenarios, compared to the T480.</li>
<li>Ridiculous storage configurations: dual-boot, triple-boot, RAID1 setups,
16+TB of solid-state storage, it&rsquo;s all possible on this old laptop!</li>
<li>Decent selection of ports, including VGA and gigabit ethernet.</li>
<li>Docking stations can be dirt cheap and be bought for less than 10 EUR (used).</li>
<li>I have plenty of Lenovo barrel plug chargers, but only one USB-C Lenovo
charger. I really didn&rsquo;t want to buy more chargers when I have plenty of
perfectly working ones.</li>
</ul>
<p>There are some downsides, though:</p>
<ul>
<li>No HDMI, I&rsquo;d need a mini-Displayport to HDMI dongle for that to work.</li>
<li>No USB-C, which might be an issue if your environment at work is optimized
for that.</li>
<li>It runs hot, but doesn&rsquo;t have the same level of on-chip thermal protections
that the T480 has, resulting in <a href="https://github.com/Hermanio/linux-cpu-manager">this awful piece of software I wrote back in 2018.</a></li>
</ul>
<p>That&rsquo;s nothing compared to the unreliability I&rsquo;ve experienced with the T480.
I&rsquo;ve witnessed the keyboard dying once and the motherboard being replaced twice,
once due to charging related issues, and the other time due to random system
crashes and screen glitching.</p>
<h2 id="verdict">
  <a class="heading-anchor" href="#verdict">Verdict<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I&rsquo;ve been using this setup for over a month now, and it has been surprisingly
adequate. Yes, opening Java projects in IntelliJ will make things slow, and to
record my desktop with OBS and acceptable performance, I had to drop my screen
resolution to 720p. I can&rsquo;t expect everything to work super well on this
machine, but for a computer that&rsquo;s released almost 10 years ago, it&rsquo;s still
holding up well.</p>
<p>I&rsquo;d like to thank Intel here for making this possible. The CPU innovation
stagnation between 2012-2017 has resulted in 4 cores still being an acceptable
low-end CPU in early 2022. Without this, my laptop would likely be obsolete by
now.</p>
<h3 id="2022-01-12-update">
  <a class="heading-anchor" href="#2022-01-12-update">2022-01-12 update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>This post got a lot of feedback and comments on HackerNews with people sharing
their experiences, feel free to check it out and <a href="https://news.ycombinator.com/item?id=29871693">join the discussion!</a></p>
<h3 id="2022-09-01-update">
  <a class="heading-anchor" href="#2022-09-01-update">2022-09-01 update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>This post was translated into German and featured on golem.de,
<a href="https://www.golem.de/news/notebook-warum-ich-jetzt-wieder-ein-thinkpad-von-2012-nutze-2209-166195.html">check it out!</a></p>
]]></content:encoded></item><item><title>Tech rants: PC-s use way too much power in 2021</title><link>https://ounapuu.ee/posts/2021/11/03/tech-rants-1/</link><pubDate>Wed, 03 Nov 2021 07:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2021/11/03/tech-rants-1/</guid><description>Quick rant about the state of PC-s in 2021 regarding power and resource usage.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="Tech rants: PC-s use way too much power in 2021" /><p>Welcome to 2021. We have:</p>
<ul>
<li>supply chain issues</li>
<li>no reasonably priced GPU-s</li>
<li><a href="https://www.anandtech.com/show/16495/intel-rocket-lake-14nm-review-11900k-11700k-11600k/5">consumer-grade CPU-s with peak power consumption at 296W</a></li>
<li><a href="https://www.notebookcheck.net/The-NVIDIA-GeForce-RTX-3090-may-have-a-350-W-TDP-but-it-can-consume-nearly-60-more.494757.0.html">GPU-s that consume 350-400W of power under normal use</a></li>
</ul>









<figure class="center">
  <a href="/posts/2021/11/03/tech-rants-1/media/intel-fieri.jpg">
    <img src="/posts/2021/11/03/tech-rants-1/media/intel-fieri_hu_d541e0e5837251dc.webp"
     width="507"
     height="676"
     loading="lazy"
     decoding="async"
     alt="Accurate representation of CPU-s in 2021.">

  </a>
  <figcaption class="center">Accurate representation of CPU-s in 2021.</figcaption>
</figure>

<p>At the same time, we have made great leaps in CPU/GPU architectures and chip manufacturing technologies, which <em>should</em>
result in faster and more efficient devices, right?</p>
<p>Well, yes. However, with some fierce competition between <em>AMD vs Intel</em>
and <em>AMD vs NVIDIA</em> all reason is thrown out the window and the power limits are raised in order to preserve the
performance crown. In the end, all that matters is &ldquo;but <em>my</em> CPU is 5% faster in this benchmark!&rdquo; or &ldquo;Oh yeah Intel has
the performance crown even if it took 290W to get there&rdquo;.</p>
<p>This all sounds absurd during a time when it&rsquo;s clear that energy usage is becoming a big problem in the near future.
Using up more power daily also makes it more difficult to rely on renewable (not necessarily green!) energy sources due
to the simple fact that building more capacity is more expensive.</p>
<h2 id="all-that-power-but-at-what-cost">
  <a class="heading-anchor" href="#all-that-power-but-at-what-cost">All that power, but at what cost?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>What is often missing from this conversation is that it&rsquo;s not only the CPU or the GPU that uses up a lot of energy
while running.</p>
<p>When you have a hungry chip in your system, you will likely need to get a bigger cooler in your system to dissipate all
that heat. Whoops, more raw materials (aluminium, copper) required.</p>
<p>The GPU is so hot that the manufacturer had to put on a giant heatsink, multiple fans and made the whole darn thing
barely fit in your case. Same story.</p>
<p>Something has to deliver all that power as well. And just like that, the required amount of electrical components
on the GPU board or the motherboard has just multiplied.</p>
<p>The hot air gets stuck in your PC case? Sounds like someone is going to need to make an investment into some PC fans.</p>
<p>And to finish it all off, you discover that your power supply cuts out during high loads, because 800W power peaks are
acceptable now I guess. Time to go to your local PC parts store to get a new power supply.</p>
<p>You might look at your monthly electricity bill and not even notice the power required to run such a machine, but the
thing is that the real cost comes from everywhere else. That cost is not low.</p>
<h2 id="okay-you-convinced-me-now-what">
  <a class="heading-anchor" href="#okay-you-convinced-me-now-what">Okay, you convinced me, now what?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If you already have bought hardware that fits the above description, then there isn&rsquo;t much to do other than limiting the
power usage. CPU-s and GPU-s generally follow this kind of rule:</p>









<figure class="center">
  <a href="/posts/2021/11/03/tech-rants-1/media/masterpiece.png">
    <img src="/posts/2021/11/03/tech-rants-1/media/masterpiece_hu_644edb91e3812c9e.webp"
     width="1280"
     height="720"
     loading="lazy"
     decoding="async"
     alt="Rough representation of the relationship between power usage and performance of a chip.">

  </a>
  <figcaption class="center">Rough representation of the relationship between power usage and performance of a chip.</figcaption>
</figure>

<p>If you use Windows, then one example of making a positive change is to change the power limit of your GPU. For AMD
GPU-s, this is present in Radeon settings and is a simple percentage slider. For NVIDIA cards I usually opt for using
MSI Afterburner. While doing any changes, definitely have something like FurMark running in the background, that helps
measure performance and get readouts for your current power usage and the performance that you get out of it.</p>
<p>A modest reduction of the power limit will likely yield a small drop in performance, but a much bigger drop
percentage-wise in the power consumption of the GPU.</p>









<figure class="center">
  <a href="/posts/2021/11/03/tech-rants-1/media/msi-afterburner.png">
    <img src="/posts/2021/11/03/tech-rants-1/media/msi-afterburner_hu_9d85cd4050d45981.webp"
     width="568"
     height="722"
     loading="lazy"
     decoding="async"
     alt="Power limit slider present in MSI Afterburner.">

  </a>
  <figcaption class="center">Power limit slider present in MSI Afterburner.</figcaption>
</figure>

<p>For CPU-s, there are two types of options:</p>
<ul>
<li>configure power limits in UEFI settings (depends on your CPU and motherboard manufacturer)</li>
<li>limit the CPU power usage using tools available in the operating system</li>
</ul>
<p>Here are some examples of the knobs and tools that you can use to achieve this:</p>
<ul>
<li>AMD CPU-s and UEFI: <code>cTDP</code> option in UEFI settings. Just set the TDP that you want to run the CPU at and you&rsquo;re done!
Allows you to run your 105W TDP CPU at 35W, for example.</li>
<li>AMD Precision Boost Overdrive (PBO) and UEFI. Sometimes the cTDP setting is not present, which means that you&rsquo;ll have
to go to the overclock settings and input the correct parameters to set the same limit.</li>
<li>AMD and Linux: <code>cpufreq</code>. Honestly, not the best way to do it since the steps don&rsquo;t seem to be that granular, but
it&rsquo;s better than nothing.</li>
<li>Intel and UEFI: supported CPU-s likely support similar techniques to AMD, but since I don&rsquo;t have experience with
Intel, I cannot say what exactly you can change.</li>
<li>Intel and Windows/Linux: disable turbo boost. Peak performance will definitely suffer, but you end up running your
CPU at the base clock, which is likely very close to the efficiency point of the cpu.
<ul>
<li>in Linux, use the <code>intel_pstate</code> driver.</li>
<li>in Windows, you can set the &ldquo;Maximum processor state&rdquo; under the legacy power options UI to 99%, which will disable
turbo boost.</li>
</ul>
</li>
</ul>
<p>This list is not complete and there might be better options out there. Just go with the one that is easiest for you and
prefer UEFI-level settings to any OS settings as those will persist even if you change your operating system.</p>
<h2 id="i-changed-my-mind-why-should-i-care">
  <a class="heading-anchor" href="#i-changed-my-mind-why-should-i-care">I changed my mind. Why should I care?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Using less power actually comes with a lot of benefits:</p>
<ul>
<li>smaller electricity bill (just don&rsquo;t expect any dramatic changes)</li>
<li>your PC will run much cooler now, negating the need for a big and wasteful cooling setup</li>
<li>you can run your PC much quieter now as well, less heat to dissipate -&gt; fans don&rsquo;t need to run as fast now</li>
<li>you can pick cheaper (in <strong><em>price</em></strong>, not quality) options when it comes to PC components since
you don&rsquo;t need all that overbuilt capacity.</li>
</ul>
<h2 id="why-do-you-care">
  <a class="heading-anchor" href="#why-do-you-care">Why do you care?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Once you limit yourself with the amount of resources available to you, you&rsquo;ll soon discover that you can do a lot even
with a small power budget. I&rsquo;m running all my self-hosted services, gaming and work off of one decently configured PC
that is quiet and yet powerful enough to perform well at any task I throw at it. If you can do all of that with a CPU
that was originally designed for laptops and has a rated TDP of 65 watts, then why get anything more powerful?</p>
<h2 id="apple-has-joined-the-game">
  <a class="heading-anchor" href="#apple-has-joined-the-game">Apple has joined the game<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>We were in a Intel-lead stagnation, with new chips adding minor features and introducing small improvements in performance. AMD came
out with the first Zen-based CPU-s in 2017, followed soon by APU-s that were used in laptop designs as well. At that
point AMD had almost closed the performance gap in the laptop space, forcing Intel to up their core counts and the
turbo boost power limits as well. With the introduction of Ryzen 4000 and 5000 series, AMD went above and beyond and
managed to bring great CPU and GPU performance to the laptop space, with the one notable omission being Thunderbolt 3
support.</p>
<p>Then Apple came out of nowhere and provided heavy competition for both companies. The new Apple M1 chips are fast as
hell for what they really are and consume so little power that the fans in the laptop rarely have to turn on. You
also get the benefit of having an amazing battery life. That same design has also found use in the desktop lineup in the
form of the new iMac, and who knows, maybe it will also end up in a proper workstation machine at some point?</p>
<p>While I don&rsquo;t like the software stack that MacBooks ship with, and the poor repairability is a major downside for me,
I still have to admit that Apple is moving in the right direction with their chip designs. Performing well without your
laptop turning into a poor man&rsquo;s version of a jet engine is exactly what we should be striving for.</p>
<h2 id="closing-thoughts">
  <a class="heading-anchor" href="#closing-thoughts">Closing thoughts<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I understand that the reason we often end up using the latest and greatest hardware is a result from the need to perform
our work as fast as possible, because you&rsquo;ll end up using less time, and less time spent on a task should result in more
productivity. However, this has to be more sustainable, and continuing the trend that the &ldquo;big boys&rdquo; are going in goes
against that.</p>
<p>I hope that we will see more progress in this area, especially from companies other than Apple.</p>
]]></content:encoded></item><item><title>Turning leftover PC parts into a decent gaming PC</title><link>https://ounapuu.ee/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/</link><pubDate>Sat, 21 Aug 2021 18:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/</guid><description>Putting the 'reuse' in 'Reduce, reuse, recycle'.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="Turning leftover PC parts into a decent gaming PC" /><h2 id="introduction">
  <a class="heading-anchor" href="#introduction">Introduction<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>About a year ago, I bought an used PC based off of
a <a href="https://www.lenovo.com/us/en/desktops/erazer/x-series/x510/">Lenovo Erazer X510</a>. It had a dual-core Intel Pentium
G3220 CPU, 4GB of DDR3 RAM, a crappy Codegen 400W power supply and a 60GB SSD. I added an Nvidia GTX 1050 and just like
that, a budget gaming PC was born. My brother ended up using it, and it was good for games that didn&rsquo;t require a
powerful CPU.</p>









<figure class="center">
  <a href="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/lenovoprebuilt.jpg">
    <img src="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/lenovoprebuilt_hu_87bda0fd87b440f5.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="This is the box that started it all.">

  </a>
  <figcaption class="center">This is the box that started it all.</figcaption>
</figure>

<p>A year later, the dual core CPU was really showing its age. It could not even run GTA V, and the 4GB of RAM did not help
the situation either. After checking the used PC parts market, I had essentially two choices:</p>
<ul>
<li>get a quad core CPU (Haswell Intel i5) and upgrade the memory to 8GB</li>
<li>get a cheap PC and move over some parts, such as the GPU, SSD etc.</li>
</ul>
<h2 id="performing-the-upgrade">
  <a class="heading-anchor" href="#performing-the-upgrade">Performing the upgrade<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I happened to find a PC that cost less than the CPU + RAM upgrade would have cost for the original setup. However, that
PC was a complete horror show, and I only discovered that once I brought it home. Here&rsquo;s a short list of things wrong
with the PC:</p>
<ul>
<li>The Nvidia GT 210 that was inside it was missing the L-bracket, and the heatsink had been cut, and another smaller
heatsink was brutally screwed on top of the existing one. That&rsquo;s definitely how cooling works, right?</li>
<li>The Windows 10 installation that it came with was probably a pirated Russian version of it. I couldn&rsquo;t confirm it
because the installation bluescreened on the first boot and everything was in Russian.</li>
<li>It had some random stickers on it, which was fine, but it took some force and alcohol to get it off properly.</li>
<li>One of the memory sticks inside it threw a lot of errors in memtest. Might explain that BSOD I got.</li>
<li>The HDD was barely held in place with a wood screw. Yes, a wood screw.</li>
<li>One of the PC fans was not connected. The end of the connector was just cut off and the exposed cables were wrapped
over another power cable. I don&rsquo;t know how that could have ever worked.</li>
</ul>









<figure class="center">
  <a href="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/wtf-1.jpg">
    <img src="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/wtf-1_hu_f2ee96fc8c24c140.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="This GPU was held in place with a piece of wire.">

  </a>
  <figcaption class="center">This GPU was held in place with a piece of wire.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/wtf-2.jpg">
    <img src="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/wtf-2_hu_a78fb667ab77287c.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Oh, it gets worse.">

  </a>
  <figcaption class="center">Oh, it gets worse.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/wtf-3.jpg">
    <img src="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/wtf-3_hu_7e05ca487f5c2c70.webp"
     width="1024"
     height="768"
     loading="lazy"
     decoding="async"
     alt="I don&#39;t know if I should be mad as this is clearly a fantastic demonstration of the creativity that some people have.">

  </a>
  <figcaption class="center">I don&#39;t know if I should be mad as this is clearly a fantastic demonstration of the creativity that some people have.</figcaption>
</figure>

<p>It goes to show that you really need to do your homework when buying a suspiciously cheap PC. In my case it was fine as
I was going to replace a lot of the parts anyway and it ended up being a good gaming PC, capable of running GTA V and
streaming CSGO on Twitch. A less experienced buyer would have been absolutely screwed though.</p>
<p>After moving the good parts over, I was left with a weak but functional PC. I didn&rsquo;t really have a good use for it so I
considered selling it. But then I thought about it and decided to try to build a good gaming PC out of it, since I
didn&rsquo;t have a competent machine at the time and I needed something to drive a big TV.</p>
<h2 id="the-plan">
  <a class="heading-anchor" href="#the-plan">The plan<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The case and the PSU this setup came with were not that great. I&rsquo;d hate it if I built a good PC and the shoddy PSU fried
it.</p>
<p>After some careful consideration, I decided to get the following:</p>
<ul>
<li>Case: Fractal Design Meshify Mini C with dark tempered glass. I would have preferred a plain version of this case, but
the tempered glass doesn&rsquo;t look half bad either, just can&rsquo;t drop that panel. Oh, and it looks good as well.</li>
<li>PSU: Seasonic Core 500W 80+ Gold. They make good stuff.</li>
<li>Storage: 2x 1TB Crucial BX500 SSD. Have to keep the games somewhere and an SSD-based RAID0 setup made the most sense
to me.</li>
</ul>
<p>The core of the system would be the motherboard, CPU and 8GB of RAM that I pieced together from leftover sticks. All I
needed to do now was to simply upgrade the CPU and get myself a GPU, right?</p>
<h2 id="cpu-upgrade">
  <a class="heading-anchor" href="#cpu-upgrade">CPU upgrade<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The Lenovo Sharkbay platform supports Haswell CPU-s, which includes Intel Core 4000 series CPU-s. I checked used CPU
listings and opted for an Intel i5 4460. 4 cores, 4 threads at a reasonable clock speed, that should play all the games
I have with reasonable performance.</p>
<p>The CPU arrived, and with it came trouble. Because I started following the hardware world in more detail in 2016, I was
not aware of one crucial detail: <em>Haswell</em> vs <em>Haswell Refresh</em>. Turns out that the CPU I bought was part of the Haswell
Refresh series, meaning that you either needed a motherboard that supported this CPU, or a motherboard that offered a
BIOS update which adds support for the upgraded CPU-s. This motherboard from the Lenovo prebuilt PC turned out to be
neither of them. The fans spun up and kept spinning at max speed, but the PC did not POST.</p>
<p>Frustrated and disappointed, I decided to double down. I got myself another used CPU and was luckily able to sell the
existing CPU for the same price I got it for. This time, the CPU was the Intel i5 4440, same specs, but a year older and
a small drop in clock speeds. Plug it in, and it works like a charm.</p>
<h2 id="proprietary-connections">
  <a class="heading-anchor" href="#proprietary-connections">Proprietary connections<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Once the new parts arrived, I started building. I knew that the Lenovo machine had some non-standard front panel
connectors that would not work well with more standard cases. I got myself a PCIe USB 3.0 internal header adaptor to
enable the front USB ports and left the audio ports disconnected since I had no need for them.</p>









<figure class="center">
  <a href="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/the-build-internals-3.jpg">
    <img src="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/the-build-internals-3_hu_e32c50ca07f93b92.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="PCIe to USB 3.0 internal header adapter, and dust.">

  </a>
  <figcaption class="center">PCIe to USB 3.0 internal header adapter, and dust.</figcaption>
</figure>

<p>Finding out which pins are for the power button was also a relatively simple process. I grabbed my flathead screwdriver
and tried shorting pairs of pins in the front panel connector area. Once I found the one that turned the machine on, I
connected the PC power button connector there. I didn&rsquo;t care for the other connectors, so I left those disconnected as
well.</p>









<figure class="center">
  <a href="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/the-build-internals-5.jpg">
    <img src="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/the-build-internals-5_hu_d8e2695341095e77.webp"
     width="823"
     height="800"
     loading="lazy"
     decoding="async"
     alt="These are the two pins that you need to short to turn this machine on.">

  </a>
  <figcaption class="center">These are the two pins that you need to short to turn this machine on.</figcaption>
</figure>

<h2 id="adding-the-gpu">
  <a class="heading-anchor" href="#adding-the-gpu">Adding the GPU<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>To make this machine into a proper gaming PC, I needed a GPU. At first, I used an AMD RX 560 that I had, but since I
borrowed it from my main PC and the Nvidia GT 710 was a horrible GPU for even the most basic tasks, I had to put that
one back into the workstation.</p>
<p>The GPU market of mid-2021 is not that great. Any decent GPU from the last 5 years is completely overpriced, and even
cards like AMD RX 480 - a 5 year old card at this point - sell for the original price from 2016. Somehow I managed to
stumble upon an AMD RX 570 4GB model with a somewhat acceptable price, so I pulled the trigger on that one. That card is
powerful enough to keep me busy until the prices for newer GPU-s become reasonable on the used market.</p>
<p>I plug the GPU in, and the TV displays nothing but a black screen. Tried the Nvidia GT 710 and the integrated graphics,
all good. Tried the RX 570 as a secondary GPU, and the PC gets past the POST screen. Odd.</p>
<p>After some searching and digging, I saw some forum posts detailing how the CSM (compatibility support module) setting on
the motherboard could fix the issue. I went into the BIOS while running off of integrated graphics, enabled CSM, plugged
the RX 570 in, booted, and it actually worked now!</p>
<p>What I discovered after using the GPU for a while was that it got quite loud under load, even though the GPU itself
wasn&rsquo;t that dusty. While cleaning it, I noticed that the thermal paste seems to have never been changed, and it showed:
the thermal paste was rock solid. I had to take a plastic prying tool to get rid of the thermal paste without breaking
the GPU. A repaste and a reassembly later, the GPU was whisper-quiet even under a full FurMark test.</p>
<h2 id="cooling">
  <a class="heading-anchor" href="#cooling">Cooling<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The Lenovo prebuilt game with a surprisingly adequate CPU cooler. However, the fan was not having a good time and made
more noise than I&rsquo;d like. I decided to splurge a bit and got for a beQuiet Pure Rock Slim 2 as I had a good experience
running that cooler on a PC I built years earlier.</p>
<p>When installing it, I noticed one critical flaw: the CPU cooler mounting holes were non-standard. They were simply too
big. If I had the patience, I could have probably added some washers or other available solutions to fix it. Anyway, I
ended up just replacing the fan on the original cooler with the one from the beQuiet cooler. I could probably use the
CPU cooler in another project, so no big loss there.</p>
<p>I also noticed that the stock fan curve (or lack of it) means that the case fans run pretty loud by default. To fix
this, I used Noctua low noise adapters that I happened to have from previous projects. It did fix the issue, but I still
wish that I had more granular control over the fan speeds.</p>
<h2 id="how-well-does-it-work">
  <a class="heading-anchor" href="#how-well-does-it-work">How well does it work?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This PC has mainly two uses: watching media and playing games. To keep it short: yes, it works well for these use cases.
I value smooth performance more than a crystal clear image, which results in me running all of my games under 1080p and
medium-high settings.</p>
<p>I don&rsquo;t consider this particular setup to be in any way practical. The cost of all the parts is actually quite big once
you add it all up. The setup does do everything that I need it for and that&rsquo;s what makes it worth it for me. As an
additional bonus, I also get the satisfaction of prolonging the life of the used parts (CPU, RAM, motherboard).</p>
<p>I&rsquo;ll try to see how long I can keep using this setup. In case the CPU and/or RAM become the limiting factors, I&rsquo;ll just
replace that part of the system with something reasonable and carry the rest of the system over.</p>
<h2 id="gallery">
  <a class="heading-anchor" href="#gallery">Gallery<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Here&rsquo;s what the setup looks like.</p>









<figure class="center">
  <a href="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/the-build.jpg">
    <img src="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/the-build_hu_fd98b89aea13118.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The tinted glass does a great job at hiding the green PCB.">

  </a>
  <figcaption class="center">The tinted glass does a great job at hiding the green PCB.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/the-build-internals.jpg">
    <img src="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/the-build-internals_hu_b5ad1d960fff972d.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Here&#39;s what it looks like on the inside.">

  </a>
  <figcaption class="center">Here&#39;s what it looks like on the inside.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/the-build-internals-2.jpg">
    <img src="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/the-build-internals-2_hu_c9d9e9f519f8b4cf.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The same, but now at a pretty angle!">

  </a>
  <figcaption class="center">The same, but now at a pretty angle!</figcaption>
</figure>

]]></content:encoded></item><item><title>AMD Ryzen 7 5700G: first impressions on Fedora 34</title><link>https://ounapuu.ee/posts/2021/08/07/amd-ryzen-7-5700-first-impressions/</link><pubDate>Sat, 07 Aug 2021 07:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2021/08/07/amd-ryzen-7-5700-first-impressions/</guid><description>Or _'How to downgrade your CPU at great expense!'_</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="AMD Ryzen 7 5700G: first impressions on Fedora 34" /><h2 id="introduction">
  <a class="heading-anchor" href="#introduction">Introduction<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I&rsquo;ve covered my self-hosting setup in <a href="/posts/2021/05/23/self-hosting-endgame/">a previous post</a>. It has been a couple of
months and the setup has mostly been fine. Sure, the power usage was pretty big under load, and yes, my internet did cut
out every time I turned the VM on with all the services starting, but other than that, it has been rock-solid.</p>
<p>However, I soon realized that in most situations, the 12 CPU cores is a bit overkill. Performance was fantastic, but due
to the case and the cooling solution that I&rsquo;m using, the fans did have to ramp up to cool the CPU down. Due to the
ongoing GPU drought driven by yet another cryptocurrency bubble, it also felt a bit wasteful to use an AMD RX 560 just
to drive two 1080p monitors.</p>
<p>It just so happened that around this time, AMD released the Ryzen 5000 G-series APU-s to retail. Yes, you could buy the
4000 series &ldquo;OEM-only&rdquo; APU-s from certain online retailers as well, but with this release, it&rsquo;s 100% official. The
release date rolled around, and the reviews were good. A day later, the CPU was also listed at a local reseller and was
actually in stock. After checking the street price for a used Ryzen 9 3900X and the Radeon RX 560, I decided to go for
it, as it would be very close to a free &ldquo;upgrade&rdquo;.</p>









<figure class="center">
  <a href="/posts/2021/08/07/amd-ryzen-7-5700-first-impressions/media/image1.jpg">
    <img src="/posts/2021/08/07/amd-ryzen-7-5700-first-impressions/media/image1_hu_e44d061a3baf7773.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="CPU retail packaging. Holds the APU and a small CPU cooler as well.">

  </a>
  <figcaption class="center">CPU retail packaging. Holds the APU and a small CPU cooler as well.</figcaption>
</figure>

<h2 id="prep-work">
  <a class="heading-anchor" href="#prep-work">Prep work<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Before performing the purchase, I confirmed that the motherboard that I
use (<a href="https://www.gigabyte.com/Motherboard/B450-I-AORUS-PRO-WIFI-rev-10#kf">Gigabyte  B450 I AORUS PRO WIFI</a>) supports
this CPU after a BIOS upgrade. B450 chipset lives in a bit of a gray area where the CPU support is determined by the
motherboard manufacturer. No updates? No CPU support for you.</p>
<p>From my previous BIOS updating experiences, I remember that this particular motherboard had some buggy BIOS
implementations. I ran into two issues:</p>
<ul>
<li>PC would get stuck on POST if you reboot. It&rsquo;s annoying when making changes to UEFI settings, but with my use case
this is not that big of a deal.</li>
<li>If you remove a boot option, then it is impossible to get it back. Seriously, even a CMOS reset did not help with this
one.</li>
</ul>
<p>This time around, I decided to update the versions one by one to follow the happy path and not run into other types of
issues. The bug did resurface right after the first version that I tried, so that was a bit disappointing.</p>









<figure class="center">
  <a href="/posts/2021/08/07/amd-ryzen-7-5700-first-impressions/media/image2.jpg">
    <img src="/posts/2021/08/07/amd-ryzen-7-5700-first-impressions/media/image2_hu_e5575283135b3859.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Now would be the perfect time for a surprise power outage or a cat intervention.">

  </a>
  <figcaption class="center">Now would be the perfect time for a surprise power outage or a cat intervention.</figcaption>
</figure>

<p>Once I was all up-to-date, I carefully removed the old CPU and plugged in the new one.</p>









<figure class="center">
  <a href="/posts/2021/08/07/amd-ryzen-7-5700-first-impressions/media/image3.jpg">
    <img src="/posts/2021/08/07/amd-ryzen-7-5700-first-impressions/media/image3_hu_b1b288149193258a.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="There&#39;s something very satisfying and beautiful about computer hardware. Just look at it!">

  </a>
  <figcaption class="center">There&#39;s something very satisfying and beautiful about computer hardware. Just look at it!</figcaption>
</figure>

<h2 id="hold-on-why-would-you-intentionally-downgrade-your-cpu">
  <a class="heading-anchor" href="#hold-on-why-would-you-intentionally-downgrade-your-cpu">Hold on, why would you intentionally downgrade your CPU?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>It all came down to <em>&ldquo;use the right tool for the job&rdquo;</em>. The Ryzen 9 3900X is a good CPU, no doubts about that, but
during my work, I kept an eye on my CPU usage quite often and found that even in the worst-case scenarios, such as
IntelliJ IDEA performing indexing, I wasn&rsquo;t using the CPU to the full extent. It&rsquo;s great for those scenarios, but I
wasn&rsquo;t hitting them as often as I would have thought.</p>
<p>It also did not help that the CPU did not have an integrated GPU. When all you have to run is a basic desktop setup with
60Hz 1080p monitors, having a dedicated GPU to run them sounds so wasteful. This increased the power use of the whole
setup and the GPU could be utilized better elsewhere.</p>
<p>The Ryzen 7 5700G is a downgrade in multi-core performance, mainly due to 4 fewer cores and only 25% of the L3 cache,
but according to various reviews and benchmarks, you could actually expect a small single-core performance uplift.
Nothing groundbreaking, but good enough for my use case.</p>
<h2 id="power-usage">
  <a class="heading-anchor" href="#power-usage">Power usage<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Because I don&rsquo;t change my CPU-s too often, I thought I&rsquo;d take the time to run some benchmarks and measure the power
usage of the whole setup. This includes everything: the PC (with two spinning hard drives), standing desk, two 1080p
monitors and peripherals.</p>
<p>Please note that these benchmarks are not very scientific and are simply my observations of the change you can expect
when performing a switch like this on your own setup. I did my best to make sure that the running conditions are as
close as possible by stopping the service VM, waiting until the background CPU usage was normal, running the memory at
the same spec etc.</p>
<h3 id="amd-ryzen-9-3900x--radeon-rx-560">
  <a class="heading-anchor" href="#amd-ryzen-9-3900x--radeon-rx-560">AMD Ryzen 9 3900X + Radeon RX 560<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<ul>
<li>Idle, sitting on desktop: ~139W</li>
<li>Full synthetic CPU load using <code>stress</code>: ~253W</li>
</ul>
<h3 id="amd-ryzen-7-5700g--integrated-vega-8-gpu">
  <a class="heading-anchor" href="#amd-ryzen-7-5700g--integrated-vega-8-gpu">AMD Ryzen 7 5700G + integrated Vega 8 GPU<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<ul>
<li>Idle, sitting on desktop: ~99W (generally between 85-100W)</li>
<li>Full synthetic CPU load using <code>stress</code>: ~166W</li>
</ul>
<p>As expected, the change of the CPU and removal of the dedicated GPU results in a big drop when it comes to the power
usage of the whole workstation setup. To go even lower, I&rsquo;d have to switch out the core of the PC to something like
the <a href="https://www.asrock.com/nettop/AMD/DeskMini%20X300%20Series/">ASRock Deskmini X300</a> and replace the hard drives with
two big SSD-s. I&rsquo;d go for that as soon as bulk SSD storage became a viable option. Unfortunately, this is not the case,
yet.</p>
<h2 id="performance">
  <a class="heading-anchor" href="#performance">Performance<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Reputable review sites, such
as <a href="https://www.anandtech.com/show/16824/amd-ryzen-7-5700g-and-ryzen-5-5600g-apu-review">AnandTech</a>, have already done a
lot of benchmarks with better testing methodologies, so I instead went ahead and tested out something that I do quite
often at work: running tests in poorly written Java projects!</p>
<p>For this, I have two Java projects that have their own test suites. Project A has 900 or so tests, which are mainly
parallel in nature. Project B has 2000+ tests, where a good number of them are dependent on a single thread to do all
the work.</p>
<p>To run the tests, I just call the &ldquo;Run all tests&rdquo; function in IntelliJ and let it do the work of running the tests and
measuring the elapsed time. And as mentioned before: this is not scientific, there are probably some errors in here, but
the actions performed here are in my opinion a pretty good reflection of day-to-day work, and that&rsquo;s what matters the
most to me. Tests were run twice with a short break between the test runs to let the CPU cool down a bit.</p>
<h3 id="project-a-amd-ryzen-9-3900x">
  <a class="heading-anchor" href="#project-a-amd-ryzen-9-3900x">Project A: AMD Ryzen 9 3900X<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>Test run 1: 10.396s.</p>
<p>Test run 2: 10.494s.</p>
<h3 id="project-a-amd-ryzen-7-5700g">
  <a class="heading-anchor" href="#project-a-amd-ryzen-7-5700g">Project A: AMD Ryzen 7 5700G<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>Test run 1: 15.561s.</p>
<p>Test run 2: 15.690s.</p>









<figure class="center">
  <a href="/posts/2021/08/07/amd-ryzen-7-5700-first-impressions/media/image4.png">
    <img src="/posts/2021/08/07/amd-ryzen-7-5700-first-impressions/media/image4_hu_df8ef1bdccee37b.webp"
     width="952"
     height="407"
     loading="lazy"
     decoding="async"
     alt="CPU usage on the Ryzen 9 3900X during the test run.">

  </a>
  <figcaption class="center">CPU usage on the Ryzen 9 3900X during the test run.</figcaption>
</figure>

<h3 id="project-b-amd-ryzen-9-3900x">
  <a class="heading-anchor" href="#project-b-amd-ryzen-9-3900x">Project B: AMD Ryzen 9 3900X<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>Test run 1: 364s.</p>
<p>Test run 2: 365s.</p>
<h3 id="project-b-amd-ryzen-7-5700g">
  <a class="heading-anchor" href="#project-b-amd-ryzen-7-5700g">Project B: AMD Ryzen 7 5700G<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>Test run 1: 471s.</p>
<p>Test run 2: 480s.</p>
<p>The performance hit was somewhat expected for project A due to the parallel nature of the tests. However, for project B
I expected better results than that due to the alleged improvements in single-thread CPU performance.</p>
<h2 id="the-linux-experience">
  <a class="heading-anchor" href="#the-linux-experience">The Linux experience<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I expected the APU to work as expected, with perhaps some small issues popping up here and there. I&rsquo;m currently running
Fedora 34 with all the latest updates installed and the kernel version at 5.13.6, which should be the best option when
trying to get new hardware working on Linux.</p>
<p>The CPU portion of the APU is working relatively well for a CPU that was released just a couple of days ago. I have
noticed that for some reason this CPU is constantly clocked at around 4.2GHz on all cores at all times, even if there
isn&rsquo;t too much going on in the system. <code>sensors</code>, the program I use to monitor system temperatures, is also having a
small hiccup, as I cannot see the CPU temperatures at all, only the integrated GPU temperatures show up even after
running <code>sensors-detect</code>.</p>
<pre tabindex="0"><code>nvme-pci-0900
Adapter: PCI adapter
Composite:    +47.9°C  (low  = -40.1°C, high = +89.8°C)
                       (crit = +93.8°C)
Sensor 2:     +47.9°C  (low  = -40.1°C, high = +89.8°C)

iwlwifi_1-virtual-0
Adapter: Virtual device
temp1:        +48.0°C  

amdgpu-pci-0a00
Adapter: PCI adapter
vddgfx:        1.36 V  
vddnb:       999.00 mV 
edge:         +51.0°C  
power1:        6.00 mW 
</code></pre><p>The GPU seems to be a bit rough around the corners. I&rsquo;m using the <a href="https://www.gnome.org/">GNOME desktop environment</a>,
which means that I&rsquo;ve learned to endure laggy user interfaces. I default to using Wayland, but I sometimes also use Xorg
for those situations where the application I&rsquo;m trying to run does not work properly under Wayland (looking at you, Slack
and your screen sharing functionality&hellip;).</p>
<p>The integrated Vega 8 graphics are almost as fast as the dedicated RX 560 GPU under normal light desktop workloads. Once
you run something very heavy, like Furmark, the GPU performance tanks and the desktop becomes almost unusable. This is
not the case when running some
<a href="https://webglsamples.org/">WebGL workloads</a> though, so it could be an isolated case.</p>
<p>The most serious issue I&rsquo;ve managed to find is that Firefox has some issues with this GPU once you put enough load on
the GPU. You may start to notice flickering and UI elements blinking when moving around. A good test case for this is to
run <a href="https://www.netdata.cloud/">Netdata</a> in live mode and have a 1080p Youtube video in another window. I haven&rsquo;t seen
anything like that since running
the <a href="https://www.pny.eu/en/consumer/explore-all-products/graphics-cards/1294-geforce-gt-710-2gb-ddr3-single-fan">Nvidia GT 710</a>
with Nouveau drivers under Fedora 34. At least it does not crash the browser or the Wayland session, so it&rsquo;s not a
complete disaster. Still, pretty annoying, so I hope this gets resolved eventually. If I had to guess: the issue is
probably related to the Webrender implementation that makes use of the GPU to speed up the browsing experience.</p>
<h2 id="closing-thoughts">
  <a class="heading-anchor" href="#closing-thoughts">Closing thoughts<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Overall, I&rsquo;m happy that the APU actually works. I&rsquo;ve had a couple of bad experiences in the past where the Ryzen 3 2200G
had stability issues and had to be replaced, so this experience is already a step up from that. The PC runs cooler and
quieter, the desktop experience is good enough for me and the CPU performance is acceptable.</p>
<p>I&rsquo;m sure that the issues that I&rsquo;ve had with this APU under Linux will be fixed eventually. Each kernel update usually
brings lots of improvements to new hardware and I&rsquo;m sure that this APU is no exception.</p>
<p>As for the BIOS issues, I&rsquo;m happy that AMD and Gigabyte opted to support the B450 chipset well into 2021, but I&rsquo;m sure
that this choice has come at the cost of QA. If I had to choose between buggy support and having to buy a new
motherboard for my new, shiny CPU, then I&rsquo;d still pick the first one.</p>
<h2 id="update-2021-08-18">
  <a class="heading-anchor" href="#update-2021-08-18">Update (2021-08-18)<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I&rsquo;ve had this CPU for a while now, and there have been a couple of kernel updates in the meantime. Here are my notes.</p>
<p>The idle power usage has recently been in between 65-70W for the whole setup. I&rsquo;ve measured the desktop itself to take up 38W of that.</p>
<p>Although my motherboard does not seem to expose the cTDP option or have <code>ECO mode</code> available, I still managed to limit my TDP to 45W
using <a href="https://www.reddit.com/r/Amd/comments/j3ro5j/eco_mode_setting_in_bios_on_gigabyte_b550i_aorus/g7dysoo/">this trick that /u/The-Stilt mentioned over at Reddit</a>:</p>
<pre tabindex="0"><code>The potential lack of the ECO-mode does not prevent you from using it, 
since it is nothing but a preset of PPT/TDC/EDC settings.

Eco-Mode (95W): PPT = 128W, TDC = 80A, EDC = 125A

Eco-Mode (65W): PPT = 88W, TDC = 60A, EDC = 90A

Eco-Mode (45W): PPT = 61W, TDC = 45A, EDC = 65A
</code></pre><p>This had a great effect on the full load of the system: 3.8GHz all-core while the whole setup consumed 113W.</p>









<figure class="center">
  <a href="/posts/2021/08/07/amd-ryzen-7-5700-first-impressions/media/image5.jpg">
    <img src="/posts/2021/08/07/amd-ryzen-7-5700-first-impressions/media/image5_hu_734652f1c723e4d1.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Precision Boost Overdrive settings that should result in a nice efficiency win. Target = 45W.">

  </a>
  <figcaption class="center">Precision Boost Overdrive settings that should result in a nice efficiency win. Target = 45W.</figcaption>
</figure>

<h2 id="update-2021-08-20">
  <a class="heading-anchor" href="#update-2021-08-20">Update (2021-08-20)<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Quick update on the GPU situation: Firefox seems to be fine now, I could not get the flickering to occur again even under
worst case scenarios.</p>
<h2 id="notes-and-stuff">
  <a class="heading-anchor" href="#notes-and-stuff">Notes and stuff<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Here are the outputs for a couple of commands that I could think of.</p>
<h3 id="iommu-groups">
  <a class="heading-anchor" href="#iommu-groups">IOMMU groups<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>Script taken from <a href="https://wiki.archlinux.org/title/PCI_passthrough_via_OVMF#Setting_up_IOMMU">Arch wiki</a>.</p>
<pre tabindex="0"><code>shopt -s nullglob
for g in `find /sys/kernel/iommu_groups/* -maxdepth 0 -type d | sort -V`; do
    echo &#34;IOMMU Group ${g##*/}:&#34;
    for d in $g/devices/*; do
        echo -e &#34;\t$(lspci -nns ${d##*/})&#34;
    done;
done;

IOMMU Group 0:
        00:01.0 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Renoir PCIe Dummy Host Bridge [1022:1632]
IOMMU Group 1:
        00:02.0 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Renoir PCIe Dummy Host Bridge [1022:1632]
IOMMU Group 2:
        00:02.1 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] Renoir/Cezanne PCIe GPP Bridge [1022:1634]
IOMMU Group 3:
        00:02.2 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] Renoir/Cezanne PCIe GPP Bridge [1022:1634]
IOMMU Group 4:
        00:08.0 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Renoir PCIe Dummy Host Bridge [1022:1632]
        00:08.1 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] Renoir Internal PCIe GPP Bridge to Bus [1022:1635]
        00:08.2 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] Renoir Internal PCIe GPP Bridge to Bus [1022:1635]
        0a:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Cezanne [1002:1638] (rev c8)
        0a:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Renoir Radeon High Definition Audio Controller [1002:1637]
        0a:00.2 Encryption controller [1080]: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 10h-1fh) Platform Security Processor [1022:15df]
        0a:00.3 USB controller [0c03]: Advanced Micro Devices, Inc. [AMD] Renoir/Cezanne USB 3.1 [1022:1639]
        0a:00.4 USB controller [0c03]: Advanced Micro Devices, Inc. [AMD] Renoir/Cezanne USB 3.1 [1022:1639]
        0a:00.6 Audio device [0403]: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 10h-1fh) HD Audio Controller [1022:15e3]
        0b:00.0 SATA controller [0106]: Advanced Micro Devices, Inc. [AMD] FCH SATA Controller [AHCI mode] [1022:7901] (rev 81)
        0b:00.1 SATA controller [0106]: Advanced Micro Devices, Inc. [AMD] FCH SATA Controller [AHCI mode] [1022:7901] (rev 81)
IOMMU Group 5:
        00:14.0 SMBus [0c05]: Advanced Micro Devices, Inc. [AMD] FCH SMBus Controller [1022:790b] (rev 51)
        00:14.3 ISA bridge [0601]: Advanced Micro Devices, Inc. [AMD] FCH LPC Bridge [1022:790e] (rev 51)
IOMMU Group 6:
        00:18.0 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Device [1022:166a]
        00:18.1 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Device [1022:166b]
        00:18.2 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Device [1022:166c]
        00:18.3 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Device [1022:166d]
        00:18.4 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Device [1022:166e]
        00:18.5 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Device [1022:166f]
        00:18.6 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Device [1022:1670]
        00:18.7 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Device [1022:1671]
IOMMU Group 7:
        01:00.0 USB controller [0c03]: Advanced Micro Devices, Inc. [AMD] 400 Series Chipset USB 3.1 XHCI Controller [1022:43d5] (rev 01)
        01:00.1 SATA controller [0106]: Advanced Micro Devices, Inc. [AMD] 400 Series Chipset SATA Controller [1022:43c8] (rev 01)
        01:00.2 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] 400 Series Chipset PCIe Bridge [1022:43c6] (rev 01)
        02:00.0 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] 400 Series Chipset PCIe Port [1022:43c7] (rev 01)
        02:01.0 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] 400 Series Chipset PCIe Port [1022:43c7] (rev 01)
        02:04.0 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] 400 Series Chipset PCIe Port [1022:43c7] (rev 01)
        02:05.0 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] 400 Series Chipset PCIe Port [1022:43c7] (rev 01)
        02:06.0 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] 400 Series Chipset PCIe Port [1022:43c7] (rev 01)
        02:07.0 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] 400 Series Chipset PCIe Port [1022:43c7] (rev 01)
        06:00.0 Network controller [0280]: Intel Corporation Wireless-AC 9260 [8086:2526] (rev 29)
        08:00.0 Ethernet controller [0200]: Intel Corporation I211 Gigabit Network Connection [8086:1539] (rev 03)
IOMMU Group 8:
        09:00.0 Non-Volatile memory controller [0108]: Kingston Technology Company, Inc. U-SNS8154P3 NVMe SSD [2646:5008] (rev 01)
</code></pre><pre tabindex="0"><code># lscpu
Architecture:                    x86_64
CPU op-mode(s):                  32-bit, 64-bit
Byte Order:                      Little Endian
Address sizes:                   48 bits physical, 48 bits virtual
CPU(s):                          16
On-line CPU(s) list:             0-15
Thread(s) per core:              2
Core(s) per socket:              8
Socket(s):                       1
NUMA node(s):                    1
Vendor ID:                       AuthenticAMD
CPU family:                      25
Model:                           80
Model name:                      AMD Ryzen 7 5700G with Radeon Graphics
Stepping:                        0
Frequency boost:                 enabled
CPU MHz:                         3800.000
CPU max MHz:                     4672,0698
CPU min MHz:                     1400,0000
BogoMIPS:                        7585.94
Virtualization:                  AMD-V
L1d cache:                       256 KiB
L1i cache:                       256 KiB
L2 cache:                        4 MiB
L3 cache:                        16 MiB
NUMA node0 CPU(s):               0-15
Vulnerability Itlb multihit:     Not affected
Vulnerability L1tf:              Not affected
Vulnerability Mds:               Not affected
Vulnerability Meltdown:          Not affected
Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp
Vulnerability Spectre v1:        Mitigation; usercopy/swapgs barriers and __user pointer sanitization
Vulnerability Spectre v2:        Mitigation; Full AMD retpoline, IBPB conditional, IBRS_FW, STIBP always-on, RSB filling
Vulnerability Srbds:             Not affected
Vulnerability Tsx async abort:   Not affected
Flags:                           fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid ap
                                 erfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topo
                                 ext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate ssbd mba ibrs ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a rdseed adx smap clflushopt clwb sha_ni 
                                 xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr rdpru wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists paus
                                 efilter pfthreshold avic v_vmsave_vmload vgif v_spec_ctrl umip pku ospke vaes vpclmulqdq rdpid overflow_recov succor smca fsrm
</code></pre><pre tabindex="0"><code># lspci -nnk
00:00.0 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Renoir/Cezanne Root Complex [1022:1630]
	Subsystem: Advanced Micro Devices, Inc. [AMD] Renoir/Cezanne Root Complex [1022:1630]
00:00.2 IOMMU [0806]: Advanced Micro Devices, Inc. [AMD] Renoir/Cezanne IOMMU [1022:1631]
	Subsystem: Advanced Micro Devices, Inc. [AMD] Renoir/Cezanne IOMMU [1022:1631]
00:01.0 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Renoir PCIe Dummy Host Bridge [1022:1632]
00:02.0 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Renoir PCIe Dummy Host Bridge [1022:1632]
00:02.1 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] Renoir/Cezanne PCIe GPP Bridge [1022:1634]
	Kernel driver in use: pcieport
00:02.2 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] Renoir/Cezanne PCIe GPP Bridge [1022:1634]
	Kernel driver in use: pcieport
00:08.0 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Renoir PCIe Dummy Host Bridge [1022:1632]
00:08.1 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] Renoir Internal PCIe GPP Bridge to Bus [1022:1635]
	Kernel driver in use: pcieport
00:08.2 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] Renoir Internal PCIe GPP Bridge to Bus [1022:1635]
	Kernel driver in use: pcieport
00:14.0 SMBus [0c05]: Advanced Micro Devices, Inc. [AMD] FCH SMBus Controller [1022:790b] (rev 51)
	Subsystem: Gigabyte Technology Co., Ltd Device [1458:5001]
	Kernel modules: i2c_piix4, sp5100_tco
00:14.3 ISA bridge [0601]: Advanced Micro Devices, Inc. [AMD] FCH LPC Bridge [1022:790e] (rev 51)
	Subsystem: Gigabyte Technology Co., Ltd Device [1458:5001]
00:18.0 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Device [1022:166a]
00:18.1 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Device [1022:166b]
00:18.2 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Device [1022:166c]
00:18.3 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Device [1022:166d]
00:18.4 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Device [1022:166e]
00:18.5 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Device [1022:166f]
00:18.6 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Device [1022:1670]
00:18.7 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Device [1022:1671]
01:00.0 USB controller [0c03]: Advanced Micro Devices, Inc. [AMD] 400 Series Chipset USB 3.1 XHCI Controller [1022:43d5] (rev 01)
	Subsystem: ASMedia Technology Inc. Device [1b21:1142]
	Kernel driver in use: xhci_hcd
01:00.1 SATA controller [0106]: Advanced Micro Devices, Inc. [AMD] 400 Series Chipset SATA Controller [1022:43c8] (rev 01)
	Subsystem: ASMedia Technology Inc. Device [1b21:1062]
	Kernel driver in use: ahci
01:00.2 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] 400 Series Chipset PCIe Bridge [1022:43c6] (rev 01)
	Kernel driver in use: pcieport
02:00.0 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] 400 Series Chipset PCIe Port [1022:43c7] (rev 01)
	Kernel driver in use: pcieport
02:01.0 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] 400 Series Chipset PCIe Port [1022:43c7] (rev 01)
	Kernel driver in use: pcieport
02:04.0 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] 400 Series Chipset PCIe Port [1022:43c7] (rev 01)
	Kernel driver in use: pcieport
02:05.0 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] 400 Series Chipset PCIe Port [1022:43c7] (rev 01)
	Kernel driver in use: pcieport
02:06.0 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] 400 Series Chipset PCIe Port [1022:43c7] (rev 01)
	Kernel driver in use: pcieport
02:07.0 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] 400 Series Chipset PCIe Port [1022:43c7] (rev 01)
	Kernel driver in use: pcieport
06:00.0 Network controller [0280]: Intel Corporation Wireless-AC 9260 [8086:2526] (rev 29)
	Subsystem: Intel Corporation Device [8086:0014]
	Kernel driver in use: iwlwifi
	Kernel modules: iwlwifi
08:00.0 Ethernet controller [0200]: Intel Corporation I211 Gigabit Network Connection [8086:1539] (rev 03)
	Subsystem: Gigabyte Technology Co., Ltd Device [1458:e000]
	Kernel driver in use: igb
	Kernel modules: igb
09:00.0 Non-Volatile memory controller [0108]: Kingston Technology Company, Inc. U-SNS8154P3 NVMe SSD [2646:5008] (rev 01)
	Subsystem: Kingston Technology Company, Inc. U-SNS8154P3 NVMe SSD [2646:5008]
	Kernel driver in use: nvme
	Kernel modules: nvme
0a:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Cezanne [1002:1638] (rev c8)
	Subsystem: Gigabyte Technology Co., Ltd Device [1458:d000]
	Kernel driver in use: amdgpu
	Kernel modules: amdgpu
0a:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Renoir Radeon High Definition Audio Controller [1002:1637]
	Subsystem: Advanced Micro Devices, Inc. [AMD/ATI] Renoir Radeon High Definition Audio Controller [1002:1637]
	Kernel driver in use: snd_hda_intel
	Kernel modules: snd_hda_intel
0a:00.2 Encryption controller [1080]: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 10h-1fh) Platform Security Processor [1022:15df]
	Subsystem: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 10h-1fh) Platform Security Processor [1022:15df]
	Kernel driver in use: ccp
	Kernel modules: ccp
0a:00.3 USB controller [0c03]: Advanced Micro Devices, Inc. [AMD] Renoir/Cezanne USB 3.1 [1022:1639]
	Subsystem: Gigabyte Technology Co., Ltd Device [1458:5007]
	Kernel driver in use: xhci_hcd
0a:00.4 USB controller [0c03]: Advanced Micro Devices, Inc. [AMD] Renoir/Cezanne USB 3.1 [1022:1639]
	Subsystem: Gigabyte Technology Co., Ltd Device [1458:5007]
	Kernel driver in use: xhci_hcd
0a:00.6 Audio device [0403]: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 10h-1fh) HD Audio Controller [1022:15e3]
	Subsystem: Gigabyte Technology Co., Ltd Device [1458:a0c3]
	Kernel driver in use: snd_hda_intel
	Kernel modules: snd_hda_intel
0b:00.0 SATA controller [0106]: Advanced Micro Devices, Inc. [AMD] FCH SATA Controller [AHCI mode] [1022:7901] (rev 81)
	Subsystem: Gigabyte Technology Co., Ltd Device [1458:b002]
	Kernel driver in use: ahci
0b:00.1 SATA controller [0106]: Advanced Micro Devices, Inc. [AMD] FCH SATA Controller [AHCI mode] [1022:7901] (rev 81)
	Subsystem: Gigabyte Technology Co., Ltd Device [1458:b002]
	Kernel driver in use: ahci
</code></pre>]]></content:encoded></item><item><title>How to mess up a simple ThinkPad X230 BIOS flash and how to recover from it</title><link>https://ounapuu.ee/posts/2021/06/28/breaking-and-fixing-thinkpad-x230/</link><pubDate>Mon, 28 Jun 2021 07:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2021/06/28/breaking-and-fixing-thinkpad-x230/</guid><description>At least it won't end up in a landfill!</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="How to mess up a simple ThinkPad X230 BIOS flash and how to recover from it" /><h2 id="background">
  <a class="heading-anchor" href="#background">Background<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I have a Lenovo ThinkPad X230. It&rsquo;s a small and good laptop that I&rsquo;ve used as my main laptop and a server as well.</p>
<p>A couple of years ago I messed around with flashing alternative BIOS implementations on the X230, such
as <a href="https://github.com/merge/skulls">the skulls project</a>, which made installing prebuilt coreboot images very simple. Of
course, before doing any testing, I made backups of the stock BIOS implementation (ooh, foreshadowing!).</p>
<p>Skulls was nice, it booted fast, but changing the boot order likely required modifications and rebuilding the coreboot
image (I wanted to set the mSATA SSD as the first bootable device). It was also not UEFI-compatible, which could have
probably been solved with something like TianoCore, but I didn&rsquo;t feel like messing with that too much. Eventually I
flashed the original UEFI implementation back and went on with my life.</p>
<p>Then I stumbled upon <a href="https://1vyra.in/">the 1vyrain project</a> project, which allows you to &ldquo;jailbreak&rdquo; your BIOS. This
modification also enables a lot more bells and whistles in the BIOS under the <em>Advanced</em> menu option, plus it also gets
rid of the WiFi adaptor whitelist that Lenovo has put in place, allowing you to now use any adaptor that&rsquo;s compatible
with the form factor.</p>
<p>The mod was very easy to install and had no issues, until I got myself a DDR3 SODIMM RAM kit. One of the sticks was not
working properly, showing up with graphical glitches and failing a memtest run. To troubleshoot it, I decided to change
the speed at which the memory runs from DDR3-1600 to DDR3-1333. It booted, and still had the issues.</p>
<p>Then I changed it to DDR3-1066.</p>
<p>Black screen. Uh-oh.</p>
<h2 id="initial-troubleshooting">
  <a class="heading-anchor" href="#initial-troubleshooting">Initial troubleshooting<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Thinking that this is just a simple issue that I could get fixed by clearing the BIOS settings and starting fresh, I
looked up some basic instructions on doing so.</p>
<p>Things I tried:</p>
<ul>
<li>remove the battery (even if it is completely dead, like mine), and hold the power button for 60 seconds, then attach
the battery and turn it on again.</li>
<li>remove both the battery and disconnect the internal CMOS battery that sits under the palmrest and hold the power
button for 60 seconds again.</li>
<li>disconnect all the batteries and leave the laptop sitting on a shelf, then try again.</li>
<li>try <a href="http://www.masnick.com/2007/09/07/the-secret-thinkpad-powerbutton-code-to-bring-dead-laptops-back-to-life/">&ldquo;the secret ThinkPad power button combo&rdquo;</a>:</li>
</ul>
<blockquote>
<p>&hellip; unplug the AC adapter and take out the battery. Then, you push the power button 10 times in a row at one second intervals.
Next, you push and hold the power button for 30 seconds. Then you put the battery back in and push the power button…
and she lives. The computer came back, good as ever.</p>
</blockquote>
<p>After all of that, the laptop was still as good as dead. You could see the light turn on, the fan starts spinning, but
nothing shows up on the screen. At that point I knew that the BIOS reflash was probably my only choice.</p>
<h2 id="flashing-the-bios">
  <a class="heading-anchor" href="#flashing-the-bios">Flashing the BIOS<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>To fix the issue, I had to flash the BIOS externally. Luckily I still had the original BIOS backup images available.</p>
<p>With the help of a good friend, we set everything up and did some tests to ensure that the connection is good and that
read/write operations on the chips return consistent results.</p>









<figure class="center">
  <a href="/posts/2021/06/28/breaking-and-fixing-thinkpad-x230/media/bios-chips-2.jpg">
    <img src="/posts/2021/06/28/breaking-and-fixing-thinkpad-x230/media/bios-chips-2_hu_82eb324a42c768d5.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The chips that we&#39;re going to flash sit behind the left side of the palmrest, making them quite easy to access.">

  </a>
  <figcaption class="center">The chips that we&#39;re going to flash sit behind the left side of the palmrest, making them quite easy to access.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2021/06/28/breaking-and-fixing-thinkpad-x230/media/bios-chips-1.jpg">
    <img src="/posts/2021/06/28/breaking-and-fixing-thinkpad-x230/media/bios-chips-1_hu_989137a4e63602da.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Left one is generally referred to as the bottom chip and the right one is the top one.">

  </a>
  <figcaption class="center">Left one is generally referred to as the bottom chip and the right one is the top one.</figcaption>
</figure>

<p>Once we had specified the correct chip type by looking at what was written on the chip package itself, we flashed both
the top and bottom chips with the original images that were once made as a backup. After reading the chips back and
comparing checksums using <code>md5sum</code>, it all looked good.</p>
<p>We disconnected the SOIC clip, attached the power cable and tried turning the laptop on. Power button light comes up for
1 second and then turns off. Not a good sign.</p>
<p>We flashed both chips again and made sure that everything is in order. No dice, the symptoms are the same.</p>
<h2 id="a-closer-look">
  <a class="heading-anchor" href="#a-closer-look">A closer look<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>It didn&rsquo;t take too long for me to start thinking about what I could use all these extra laptop parts for. After all, the
screen was good, it had 16GB DDR3 RAM, two SSD-s, a screen assembly in good condition etc. I was stopped in my tracks
when my friend noticed something.</p>









<figure class="center">
  <a href="/posts/2021/06/28/breaking-and-fixing-thinkpad-x230/media/something-missing.jpg">
    <img src="/posts/2021/06/28/breaking-and-fixing-thinkpad-x230/media/something-missing_hu_4572e9842f6a6cc6.webp"
     width="967"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Find the missing resistor.">

  </a>
  <figcaption class="center">Find the missing resistor.</figcaption>
</figure>

<p>It turns out that during this flashing process, we (probably me) had managed to get rid of a resistor that sat next to
the top flash chip. Whoops. Turns out that it was an important one, because over at
Reddit, <a href="https://old.reddit.com/r/coreboot/comments/dhwdss/did_i_just_brick_my_x230/">someone else also ran into this issue and had similar symptoms</a>
.</p>
<p>To resolve this, my friend had the idea of putting a 10K resistor in there to see if it fixes things. The issue was that
the only one available right from the get-go was a very big one, so he had to be clever with it. He ended up positioning
it upright with a piece of wire handling the other side.</p>









<figure class="center">
  <a href="/posts/2021/06/28/breaking-and-fixing-thinkpad-x230/media/resistor-hackjob.jpg">
    <img src="/posts/2021/06/28/breaking-and-fixing-thinkpad-x230/media/resistor-hackjob_hu_34d3505e3b9f8a42.webp"
     width="700"
     height="372"
     loading="lazy"
     decoding="async"
     alt="Isn&#39;t it beautiful?">

  </a>
  <figcaption class="center">Isn&#39;t it beautiful?</figcaption>
</figure>

<p>This, however, didn&rsquo;t improve the situation much.</p>
<h2 id="schematics-to-the-rescue">
  <a class="heading-anchor" href="#schematics-to-the-rescue">Schematics to the rescue<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>To understand the role of the missing resistor better, we started looking for schematics online. I managed to find an OK
looking one from a random forum and started browsing through it. The keyword of the day was &ldquo;SPI&rdquo; and when searching for
it, we found some promising results. My friend found the resistor and found that we could just short it, since the
resistor used to be between two wires. And that he did.</p>









<figure class="center">
  <a href="/posts/2021/06/28/breaking-and-fixing-thinkpad-x230/media/schematics.png">
    <img src="/posts/2021/06/28/breaking-and-fixing-thinkpad-x230/media/schematics_hu_e238f6bcdf0bfede.webp"
     width="1280"
     height="401"
     loading="lazy"
     decoding="async"
     alt="The missing resistor, as shown on the schematic.">

  </a>
  <figcaption class="center">The missing resistor, as shown on the schematic.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2021/06/28/breaking-and-fixing-thinkpad-x230/media/the-big-short.jpg">
    <img src="/posts/2021/06/28/breaking-and-fixing-thinkpad-x230/media/the-big-short_hu_ea2fb8942d0aab25.webp"
     width="1250"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The big short.">

  </a>
  <figcaption class="center">The big short.</figcaption>
</figure>

<p>We attempted to power on the machine again and this time the error sequence was different as the laptop went into some
sort of a party mode with lights flashing. The usual troubleshooting steps didn&rsquo;t work that well here, either, so it&rsquo;s
possible that the stock BIOS image did not like something here.</p>
<p>What we did have was the option of flashing the known-good skulls image on. I handled that part quite OK, since all the
commands were in my bash history anyway. The excitement, however, got the best of me and I managed to repeat the
original mistake and I bumped the soldered piece of wire off of the board, putting us back to the original issue.</p>
<p>After another session of carefully connecting the two wires, we repeated the steps and after the flash, we finally saw
the Skulls splash screen.</p>
<p>It works!</p>









<figure class="center">
  <a href="/posts/2021/06/28/breaking-and-fixing-thinkpad-x230/media/it-works-1.jpg">
    <img src="/posts/2021/06/28/breaking-and-fixing-thinkpad-x230/media/it-works-1_hu_42b508142a55117a.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Picture taken after the fact, because I forgot to do it initially.">

  </a>
  <figcaption class="center">Picture taken after the fact, because I forgot to do it initially.</figcaption>
</figure>

<p>After booting into a Fedora 34 liveusb environment with <code>iomem=relaxed</code>, I grabbed the latest release of skulls (
released on 4/20 🔥) and used the internal flashing method to update.</p>
<p>Reboot, and we saw party mode again. Having used skulls in the past, I knew that this was likely down to skulls (or
coreboot) being very picky about RAM. The solution here is to reseat the RAM modules and turn it on again. Why does that
work? Not sure, but it did.</p>
<p>To make this solution more resistant to my unintentional attempts of breaking things, I added a glob of hot glue next to
the top chip to make sure that I don&rsquo;t knock anything off of the board again.</p>
<h2 id="testing">
  <a class="heading-anchor" href="#testing">Testing<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Once the laptop was assembled again, I did some testing to see if everything still works as intended.</p>
<p>Fedora 34 liveusb boot resulted in a black screen once, but on the second try, it worked again.</p>
<p>Windows 10 installed fine on the machine and while some functions don&rsquo;t work as well (TrackPoint and touchpad being the
prime examples here), it was still usable. Unfortunately I did not manage to write down the original Windows 10 key that
is embedded to the stock BIOS image, so I could not activate it. But hey, at least it works.</p>









<figure class="center">
  <a href="/posts/2021/06/28/breaking-and-fixing-thinkpad-x230/media/it-works-2.jpg">
    <img src="/posts/2021/06/28/breaking-and-fixing-thinkpad-x230/media/it-works-2_hu_fc2369c02a72eb2f.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Windows 10 also works.">

  </a>
  <figcaption class="center">Windows 10 also works.</figcaption>
</figure>

<h2 id="lessons-learned">
  <a class="heading-anchor" href="#lessons-learned">Lessons learned<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Even though this adventure started with a self-inflicted wound, I still consider it a success, as I learned a couple of
things.</p>
<ul>
<li>It&rsquo;s very easy to get confused when reviewing how the wires should be set up on the SOIC test clip and the device
that&rsquo;s actually performing the flashing.</li>
<li>If a piece of software exposes a bunch of knobs and levers and warns you about catastrophic failures that might occur
as a result, then trust it and don&rsquo;t mess with things that you have no clue about. With this example case, though, I
didn&rsquo;t expect a memory speed change to result in such a catastrophic failure in the first place&hellip;</li>
<li>Developers that know hardware are worth their weight in gold.</li>
<li>Access to schematics is very valuable when fixing hardware.</li>
</ul>
<p>And on the final note, I would like to give a shout-out to <a href="https://zirk.me/">Arti Zirk</a>, the guy who helped fix the
mess I created. If you need someone who is well-versed in anything related to software development, Linux and embedded
systems, then he is your guy.</p>









<figure class="center">
  <a href="/posts/2021/06/28/breaking-and-fixing-thinkpad-x230/media/the-setup.jpg">
    <img src="/posts/2021/06/28/breaking-and-fixing-thinkpad-x230/media/the-setup_hu_324bc408874b6fe3.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Genius at work.">

  </a>
  <figcaption class="center">Genius at work.</figcaption>
</figure>

<h2 id="flashrom-references">
  <a class="heading-anchor" href="#flashrom-references">flashrom references<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This section has some commands that might be useful to you. Unless you&rsquo;re using the exact same flasher, you will probably
need to specify a different programmer with the <code>-p</code> flag.</p>
<p>The names and extensions for the input-output files are arbitrary. A file is a file.</p>
<h3 id="readingwriting-the-top-chip">
  <a class="heading-anchor" href="#readingwriting-the-top-chip">Reading/writing the top chip.<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>Note that I had to specify the chip type, otherwise <code>flashrom</code> would complain.</p>
<p>The top chip is 4MB and the bottom chip is 8MB. This should also be reflected in any output that you get.</p>
<p><code>--verify</code> option is also useful for checking if the results are OK. I also recommend reading the image from the chip
after a write and comparing its checksum using <code>md5sum</code>, just to be extra safe.</p>
<pre tabindex="0"><code># Read the existing image on the chip
flashrom -p ft2232_spi:type=2232H,port=B,divisor=4 -r top.bin -c MX25L3206E/MX25L3208E 

# Write the specified image to the chip
flashrom -p ft2232_spi:type=2232H,port=B,divisor=4 -w top_backup.bin -c MX25L3206E/MX25L3208E 
</code></pre><h3 id="readingwriting-the-bottom-chip">
  <a class="heading-anchor" href="#readingwriting-the-bottom-chip">Reading/writing the bottom chip<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<pre tabindex="0"><code># Read
flashrom -p ft2232_spi:type=2232H,port=B,divisor=4 -r bottom.bin -c MX25L6406E/MX25L6408E

# Write
flashrom -p ft2232_spi:type=2232H,port=B,divisor=4 -w bottom_backup.bin -c MX25L6406E/MX25L6408E
</code></pre>]]></content:encoded></item><item><title>I've reached the self-hosting endgame</title><link>https://ounapuu.ee/posts/2021/05/23/self-hosting-endgame/</link><pubDate>Sun, 23 May 2021 07:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2021/05/23/self-hosting-endgame/</guid><description>If all you have is a powerful workstation...</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="I've reached the self-hosting endgame" /><h2 id="setup">
  <a class="heading-anchor" href="#setup">Setup<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>After I had a <a href="/posts/2021/04/02/tech-tip-1/">perfectly functional, quiet and performant server</a> up and running, I fell
victim to my imagination and completely changed my self-hosting setup. Again.</p>
<p>Here it is, in all its glory:</p>









<figure class="center">
  <a href="/posts/2021/05/23/self-hosting-endgame/media/image1.jpg">
    <img src="/posts/2021/05/23/self-hosting-endgame/media/image1_hu_ade80b9e42417ae9.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Find the server.">

  </a>
  <figcaption class="center">Find the server.</figcaption>
</figure>

<p>Well, at least that&rsquo;s what&rsquo;s on the table.</p>









<figure class="center">
  <a href="/posts/2021/05/23/self-hosting-endgame/media/image2.jpg">
    <img src="/posts/2021/05/23/self-hosting-endgame/media/image2_hu_3ea578e613d1eec1.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="There it is.">

  </a>
  <figcaption class="center">There it is.</figcaption>
</figure>

<p>This machine is a true <em>all-in-one</em>: it hosts all my services in a VM while also acting as my main workstation.</p>
<h2 id="specs">
  <a class="heading-anchor" href="#specs">Specs<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>CPU: AMD Ryzen 9 3900X. 12 cores and 24 threads in a consumer platform is absolutely bonkers.</p>
<p>RAM: 32GB DDR4 @ 3200MHz</p>
<p>Motherboard: Gigabyte B450 I Aorus PRO WIFI. It&rsquo;s OK, but oh man are the newer BIOS releases buggy. At least it gives 0
hoots about flashing an older BIOS version.</p>
<p>GPU: AMD RX 560. It gets the job done.</p>
<p>HDD: 2x 12TB WD white-label (WD120EDAZ) drives, shucked from WD My Book external drives.</p>
<p>SSD: 240GB Kingston A1000 NVMe for OS, 2x1TB Samsung 870 EVO SATA SSD for fast solid state storage</p>
<p>PSU: Seasonic Focus <em>something-something</em>. Doesn&rsquo;t really matter, it&rsquo;s reliable and has plenty of power.</p>
<p>Cooling: Noctua NH-D9L on the CPU, 200mm fan at the front and 2x80mm beQuiet fans at the back to keep the system cool.</p>
<p>Case: ThermalTake Core V1. Not the smallest case, but super simple to work in!</p>
<h2 id="why">
  <a class="heading-anchor" href="#why">Why?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Before setting this up, I had three machines running:</p>
<ul>
<li>a laptop that was always on so that there won&rsquo;t be any conflicts with Syncthing.</li>
<li>a server with server workloads</li>
<li>a desktop that I mainly used for work</li>
</ul>
<p>At any point in time, I had at least two machines running and the desktop was fired up for a good part of the day due to
work. Since trying to reduce my electricity usage was one of my goals with going low-power on my server, this sounded a
bit wasteful. At this point I got the brilliant idea of trying to combine this into one machine that does it all, but
before that, I had some concerns. The hardware was simple: just shuck the 12TB drives in there and get some big SSD-s
and partition them, but the software part required some thinking and testing.</p>
<h2 id="the-software">
  <a class="heading-anchor" href="#the-software">The software<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>To keep the work to a minimum, I found that the easiest way to move my setup was to just put the existing server
installation into a VM. I&rsquo;ve had plenty of experience with VM-s so this was not a difficult task, just install libvirt
and all the dependencies will be settled automatically.</p>
<p>The problem is the networking. If I want the VM to show up as a separate machine on the network, I need to add a virtual
network interface as a <code>macvtap</code> device, which means that the desktop and the VM can both connect to the internet and to
other devices on the local network, but the desktop cannot reach the VM directly. There are other solutions, such as the
default NAT-based solution, but with that, forwarding ports is quite tricky to someone not familiar with networking.</p>
<p>To overcome this limitation, I came up with a pretty simple solution: add another network interface to the VM! This
time, the interface was set up as the NAT-based solution. To make this work, I had to make sure that the Debian 10
install was configured to use that interface as well, which meant a little copy-pasting in <code>/etc/network/interfaces</code>. To
make the host connect to this machine using the hostname, I also added an entry to <code>/etc/hosts</code> on the host machine to
route all requests to the hostname via this second virtual network interface.</p>
<p>With this, the main obstacle was resolved and the host machine had no issues connecting to the VM.</p>
<h2 id="the-storage">
  <a class="heading-anchor" href="#the-storage">The storage<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Since this machine was also used as a workstation, I had to be a bit clever with my storage setup. The bulk storage in
the form of two 12TB hard drives was 100% managed by the VM.</p>
<p>The 1TB SSD-s were partitioned as such:</p>
<ul>
<li>2x 500GB partitions for my workstation running in BTRFS mirror, since I don&rsquo;t trust ZFS updates on Fedora.</li>
<li>2x 250GB partitions for fast SSD-based ZFS mirror in the VM</li>
<li>2x 250GB free space for overprovisioning.</li>
</ul>
<p>In the event that something does go wrong, it should not have too much of a negative impact either on the host or the
VM. If the drive quality does become a concern, there is always the option to upgrade to PRO series drives that should
have a much better endurance rating.</p>
<h2 id="pros-and-cons">
  <a class="heading-anchor" href="#pros-and-cons">Pros and cons<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>With that, the setup was up and running. The VM initially had assigned 6 CPU cores and 8GB of RAM, but lately I&rsquo;ve
decided to assign 12 cores and 16GB of RAM to make the most out of the available resources.</p>
<p>So, how well does it work?</p>
<p>Quite well, in fact. There were some hiccups, though:</p>
<ul>
<li>the latest BIOS update for the motherboard was very buggy, which resulted in the ability to permanently get rid of
boot devices in the boot device selection menu and the annoying issue of getting stuck in POST when rebooting the
machine</li>
<li>the VM would sometimes have issues with networking, which I attempted to fix by treating the NIC-s within the VM as
non-hotpluggable devices. This seems to have done the trick, as I have not had any issues since.</li>
</ul>
<p>With this setup, there are some tradeoffs that you should be aware of.</p>
<p>Pros:</p>
<ul>
<li>Everything runs in one machine with reasonable power usage : ~70 W when idle and monitors off, ~120 W with monitors on
and a light workload</li>
<li>Optimal utilization of resources. Instead of having to upgrade my workstation or server separately, I can just share
the resources and modify limits any time I want. Should I upgrade to 64GB of RAM in the future, I can make some more
available on the server by changing only one configuration parameter in the VM. The same goes for storage. If I were
to upgrade to something bigger and faster, then it will benefit both the workstation and the server workloads.</li>
<li>Easier troubleshooting. In case things go wrong with the server, I don&rsquo;t need to grab an external monitor and hook it
up to the server, the console is accessible via virt-manager on the host.</li>
</ul>
<p>Cons:</p>
<ul>
<li>All eggs in one basket. If your host OS breaks something, then this will affect your server workloads as well.</li>
<li>Noise. While not so bad with noise-cancelling headphones, it can still be annoying when you have hard drives running
at your desk.</li>
<li>Your server workload is dependent on your host OS booting up first, which will require manual input from you if your
host installation is encrypted.</li>
</ul>
<h2 id="conclusion">
  <a class="heading-anchor" href="#conclusion">Conclusion<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This setup worked out better than I expected, with no further issues occurring over a couple of weeks. The availability
issues during restarts are not a concern for me, as this is a hobby to me, and the flexibility and ridiculous amounts of
power this setup has outweighs all the cons.</p>
<p>Let&rsquo;s see how long this setup lasts.</p>
<h2 id="2021-06-28-update">
  <a class="heading-anchor" href="#2021-06-28-update">2021-06-28 update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>It still works like a charm!</p>
]]></content:encoded></item><item><title>Tech tip: eliminate HDD humming noise</title><link>https://ounapuu.ee/posts/2021/04/02/tech-tip-1/</link><pubDate>Fri, 02 Apr 2021 07:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2021/04/02/tech-tip-1/</guid><description>Silence your hard drives with this one weird trick! System administrators hate him!</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="Tech tip: eliminate HDD humming noise" /><p>Anyone that has bought themselves external WD drives from the Elements/My Book/Easystore series are probably familiar
with the acoustic characteristics of the drives. The drives have a loud hum caused
by <a href="https://arstechnica.com/gadgets/2020/09/western-digital-is-trying-to-redefine-the-word-rpm/">WD running the drives at 7200rpm while claiming the drives to be &ldquo;5400rpm-class&rdquo;</a>
and the clacking of the read-write heads is audible as well. In a small space, such as an apartment, the hum is
maddening, especially when you have more than one drive running at the same time.</p>
<p>After running such a setup for months, enough was enough. I bought some sound dampening foam and used that to try to
limit the noise that my setup was making. However, that didn&rsquo;t do much and the before/after noise comparisons didn&rsquo;t
have much of a difference. As a result of this testing, I did have various pieces of acoustic foam left, and after I
noticed that my Lenovo M73 Tiny PC had a similar shape to the WD My Book 12 TB hard drives that I got recently, I had an
idea.</p>









<figure class="center">
  <a href="/posts/2021/04/02/tech-tip-1/media/image.jpg">
    <img src="/posts/2021/04/02/tech-tip-1/media/image_hu_4f0d8b9faae28e72.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Minimum viable server, now with 90% less noise!">

  </a>
  <figcaption class="center">Minimum viable server, now with 90% less noise!</figcaption>
</figure>

<p>I used four pieces of foam and placed them so that I could stack the hard drives on top. This resulted in the humming
noise being completely eliminated. The sound of hard drive read-write heads is still there, but it is so much less
audible now. After this change, I have started hearing the cooling fan more than the hard drives themselves.</p>
<p>This setup could probably be improved by switching around the setup so that the hard drives were at the bottom with the
bottom drive having additional foam or rubber feet below it to support it better. For the time being, I&rsquo;m perfectly
happy with this arrangement, as long as it doesn&rsquo;t fall over.</p>
<h2 id="2021-04-23-update">
  <a class="heading-anchor" href="#2021-04-23-update">2021-04-23 update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I have now added a fan to the setup!</p>









<figure class="center">
  <a href="/posts/2021/04/02/tech-tip-1/media/image2.jpg">
    <img src="/posts/2021/04/02/tech-tip-1/media/image2_hu_a93d534011079b3e.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Pretty cool, eh?">

  </a>
  <figcaption class="center">Pretty cool, eh?</figcaption>
</figure>

<p>The fan itself is powered by one of the USB ports with the help of a spare sacrificial USB cable and a Noctua omni-join
kit that I had left over.</p>
<p>The drive temperatures are now reading around 42C and 46C.</p>
]]></content:encoded></item><item><title>Whacky setups: seedbox on a wall</title><link>https://ounapuu.ee/posts/2021/03/20/whacky-setups-1/</link><pubDate>Sat, 20 Mar 2021 12:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2021/03/20/whacky-setups-1/</guid><description>This is what happens when someone takes the meaning of 'brute force' too literally.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="Whacky setups: seedbox on a wall" /><p>The Orange Pi Zero is one hell of an SBC. It has served as
a <a href="/posts/2020/07/23/the-little-wifi-ap-that-could/">Wi-Fi access point for months without issues</a>
and as <a href="/posts/2021/02/27/database-optimization-adventures-on-low-end-hardware/">a testbed for playing around with MySQL</a>.</p>
<p>I wanted it to be a useful device again, but had trouble finding an use case for it due to its hardware limitations.
After messing around with my amateur archival work, I had accumulated some data that might be worth keeping around. Due
to my network being quite unreliable and slow, I decided to go with torrents as the main distribution method. I could
have just hosted the torrents on my main server box, which is what I later did anyway, but then I realized that hosting
torrents is a workload that a weak machine could handle just as well.</p>
<p>I took a board that was left over from a shelf, grabbed some twine and nails and banged together this monstrosity:</p>









<figure class="center">
  <a href="/posts/2021/03/20/whacky-setups-1/media/image1.jpg">
    <img src="/posts/2021/03/20/whacky-setups-1/media/image1_hu_16c4fe809499083c.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The setup in all its glory.">

  </a>
  <figcaption class="center">The setup in all its glory.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2021/03/20/whacky-setups-1/media/image2.jpg">
    <img src="/posts/2021/03/20/whacky-setups-1/media/image2_hu_8a7fb99c0fa20331.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="This setup originally had two 4TB hard drives. Unfortunately one of them was too faulty for even BTRFS to handle.">

  </a>
  <figcaption class="center">This setup originally had two 4TB hard drives. Unfortunately one of them was too faulty for even BTRFS to handle.</figcaption>
</figure>

<p>This brave little machine runs on <a href="https://www.armbian.com/">Armbian</a> and hosts one Transmission instance. This instance
is a mirror for some of the data that I collect as part of my archival effort. The OS
lives on a 120GB Crucial SSD with the help of the <code>nand-sata-install</code> script that Armbian provides, and the data lives
on one 4TB Seagate hard drive that is somehow still working.</p>
<p>The board is pressed against the metal part of an AMD AM4 socket stock cooler with the help of a thick 5mm thermal pad
and solid copper wires taken from an electrical cable. This looks very janky, but the cooling performance is absolutely
fantastic: 30C when idling and not more than 50-60C under the heaviest workloads.</p>
<p>The total power consumption of this setup is typically between the 5-10W range, which isn&rsquo;t the lowest, but still
acceptable. The CPU is a 32-bit one, so let&rsquo;s see if this board can make it to 2038.</p>









<figure class="center">
  <a href="/posts/2021/03/20/whacky-setups-1/media/image3.jpg">
    <img src="/posts/2021/03/20/whacky-setups-1/media/image3_hu_188439b7a186b652.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="All in all, it was just another server on the wall.">

  </a>
  <figcaption class="center">All in all, it was just another server on the wall.</figcaption>
</figure>

<h2 id="2021-04-02-update">
  <a class="heading-anchor" href="#2021-04-02-update">2021-04-02 update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The 4TB Seagate HDD decided to start a career in experimental music production and started clicking and not showing up
when connected to a PC. And thus, the seedbox on a wall has been put on pause for now.</p>
]]></content:encoded></item><item><title>My server setups throughout the years</title><link>https://ounapuu.ee/posts/2021/03/17/server-setups-throughout-the-years/</link><pubDate>Wed, 17 Mar 2021 10:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2021/03/17/server-setups-throughout-the-years/</guid><description>From repurposed old PC-s to the elusive _minimum viable server_.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="My server setups throughout the years" /><p>My self-hosting adventure started during my university days. Once I actually had money to buy myself a decent used laptop
(ThinkPad T430) that had more than 3GB of RAM that my ThinkPad T60 had, I could use some of my older hardware as
testbeds for any of the stupid ideas that I had. For someone that liked to learn more about Linux and wanted any excuse
to play around with hardware, something like a RAID0 setup over 4 80GB Samsung hard drives on an old PC setup sounded great.</p>
<p>I also had a small collection of data that I had on an 1TB external hard drive, and I wanted to also have backups of
the data that lived on my laptop. This was the main motivation for setting up a machine that would serve as a NAS and
a testbed for anything that I wanted to try out.</p>
<h2 id="the-first-box-amd-athlon-64-x2-4200-based-pc">
  <a class="heading-anchor" href="#the-first-box-amd-athlon-64-x2-4200-based-pc">The first box: AMD Athlon 64 X2 4200+ based PC<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>At this point in time, I didn&rsquo;t really have any names for my systems. They were simply named by the model of the machine
or whatever else I had in mind.</p>
<p>One of the first &ldquo;server&rdquo; builds that I built was based on some old parts I had lying around. The CPU was from an old
family PC that we got in 2006, and to this date, it is the only surviving component from that build. The motherboard
was from a place that collected old hardware and resold some of it and if I remember correctly, it was the <em>abit KN9 Ultra</em>.
AM2 socket, DDR2, 6 SATA ports, all that good stuff. This was coupled with 4GB of DDR2 memory. Not much, but it is a start.</p>









<figure class="center">
  <a href="/posts/2021/03/17/server-setups-throughout-the-years/media/amd.jpg">
    <img src="/posts/2021/03/17/server-setups-throughout-the-years/media/amd_hu_b46af76ea55c117b.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The heart of the system. It wasn&#39;t fast nor power efficient, but at least I had something.">

  </a>
  <figcaption class="center">The heart of the system. It wasn&#39;t fast nor power efficient, but at least I had something.</figcaption>
</figure>

<p>The details regarding the hard drive situation are a bit hazy, but at least initially it hosted whatever drives I had around.
At some point I managed to buy 8x 500GB hard drives to test out ZFS on a big array. This was mainly inspired by <a href="https://www.reddit.com/r/buildapc/comments/6cn1wk/build_complete_alice_a_32tb_server_in_an_nzxt/">the glorious
32TB server build in an NZXT S340 case</a>
that someone showed off in Reddit. I&rsquo;m still surprised that it was acceptable for me to be in the same room as that
monstrosity.</p>
<p>This setup ran well for a while and there weren&rsquo;t any hardware issues with this setup. Drives were OK, speed was acceptable,
and ZFS did its job well, since this was all a big RAID-Z3 array. I even removed two drives temporarily to put in a GPU
at one point and ZFS did not complain. After putting the drives back in, the drives were resilvered and all was good.</p>









<figure class="center">
  <a href="/posts/2021/03/17/server-setups-throughout-the-years/media/amd-v2.jpg">
    <img src="/posts/2021/03/17/server-setups-throughout-the-years/media/amd-v2_hu_25c122b165ff26a8.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The server box running a more sensible setup of less than 8 hard drives.">

  </a>
  <figcaption class="center">The server box running a more sensible setup of less than 8 hard drives.</figcaption>
</figure>

<h2 id="the-engoodening-of-my-server-amd-ryzen">
  <a class="heading-anchor" href="#the-engoodening-of-my-server-amd-ryzen">The engoodening of my server: AMD Ryzen<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>2017-2018 was wild in the world of CPU-s. AMD came in with some well-designed CPU-s that provided a much better value
proposition than the competing Intel CPU-s at the time. The value was insane: double the cores for the same price!
It didn&rsquo;t take much for me to be convinced that the next server build will be an AMD Ryzen based machine, and as soon as
I had the resources, I got myself parts for doing that upgrade.</p>









<figure class="center">
  <a href="/posts/2021/03/17/server-setups-throughout-the-years/media/amd-ryzen-1.jpg">
    <img src="/posts/2021/03/17/server-setups-throughout-the-years/media/amd-ryzen-1_hu_9f206dd1c6dfd4f5.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Picture taken moments before a lot of fun was had.">

  </a>
  <figcaption class="center">Picture taken moments before a lot of fun was had.</figcaption>
</figure>

<p>The build wasn&rsquo;t without hiccups, though. I discovered that cats <em>really</em> like playing around with screws and walking on
all the expensive computer parts that took up half of the free space in the apartment. Nevertheless, I managed to complete
the build.</p>









<figure class="center">
  <a href="/posts/2021/03/17/server-setups-throughout-the-years/media/hdd-migration.jpg">
    <img src="/posts/2021/03/17/server-setups-throughout-the-years/media/hdd-migration_hu_f7eae416a9114eb9.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="How to migrate from an 8x HDD setup to something more sensible.">

  </a>
  <figcaption class="center">How to migrate from an 8x HDD setup to something more sensible.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2021/03/17/server-setups-throughout-the-years/media/amd-ryzen-2.jpg">
    <img src="/posts/2021/03/17/server-setups-throughout-the-years/media/amd-ryzen-2_hu_5657a28acdf54d9.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="New parts, new drives.">

  </a>
  <figcaption class="center">New parts, new drives.</figcaption>
</figure>

<h2 id="laptop-as-a-server">
  <a class="heading-anchor" href="#laptop-as-a-server">Laptop-as-a-server<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Due to reasons that have no rational explanations, I started looking into switching out this perfectly working server
machine into something more power efficient. The CPU sat idle most of the time and I figured that I could use the machine
somewhere else.</p>
<p>And thus, one of the stupidest server builds was born: a ThinkPad X230 serving as a server, with two 4TB WD Red hard drives
attached over USB 3.0, running BTRFS RAID1. I do not have pictures of the setup, but this was pretty much it. I learned
soon after that cats like climbing on things and that they have no understanding of the amount of force that is required to
temporarily disconnect the USB 3 cable from the laptop. This is the part where BTRFS failed on me and I actually lost data
in the array. Luckily I had <em>working</em> backups.</p>
<p>Not long after this incident, I started looking for alternatives.</p>
<h2 id="low-power-but-still-somewhat-usable">
  <a class="heading-anchor" href="#low-power-but-still-somewhat-usable">Low power, but still somewhat usable?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>My search criteria was quite simple:</p>
<ul>
<li>low power (ruled out any desktop builds)</li>
<li>x86 based (no OS lock-in)</li>
<li>hosts at least 2 drives over SATA</li>
<li>reasonably priced</li>
</ul>
<p>The closest match I could find was the <a href="https://www.terra-master.com/global/f2-221.html">TerraMaster F2-221</a>. It has a
low-power Intel CPU, standard UEFI implementation, fits two drives and has two SATA ports. The only part that it really
didn&rsquo;t fit under well was the reasonable cost aspect, but it was still much more affordable than the alternatives.</p>
<p>Around this time I also discovered the world of <a href="https://www.reddit.com/r/DataHoarder/comments/7fx0i0/wd_easystore_8tb_compendium/">shucking</a>.
I got myself two 8TB WD MyBook drives and used them in this build. However, what I did not take into account was the noise.
These 8TB drives were much louder than the 4TB WD Red drives that I used previously, and allegedly this is due to WD labelling
these drives as &ldquo;5400-rpm class&rdquo;, even though they actually run at 7200 rpm. The TerraMaster NAS unit had no vibration
dampeners or other methods to isolate the noise, so I had to stick it in a closet.</p>
<p>The TerraMaster build was otherwise great. I could upgrade the RAM to 10GB using the available DDR3 SODIMM slot on the
board, and the services that ran on it were fine. This thing could even run Jellyfin, assuming that you utilized the
integrated GPU to provide hardware acceleration for transcoding video.</p>
<p>However, there were some limitations for this setup:</p>
<ul>
<li>OS lives on an USB drive. Generally fine, but depending on your setup you could pick between internal USB 2.0 ports or
one of the USB 3.0 ports at the back.</li>
<li>When you have lots of small files and a database on the system as well, the lack of SSD base storage became quite
painful. You could do it over the available USB 3.0 ports on the back, but that&rsquo;s it.</li>
</ul>









<figure class="center">
  <a href="/posts/2021/03/17/server-setups-throughout-the-years/media/terramaster.jpg">
    <img src="/posts/2021/03/17/server-setups-throughout-the-years/media/terramaster_hu_6c7842e87877151f.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Yes, that is an mSATA drive in an USB enclosure stuck inside the TerraMaster chassis.">

  </a>
  <figcaption class="center">Yes, that is an mSATA drive in an USB enclosure stuck inside the TerraMaster chassis.</figcaption>
</figure>

<h2 id="back-to-the-desktop">
  <a class="heading-anchor" href="#back-to-the-desktop">Back to the desktop<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Due to a combination of me getting two ITX builds and having workloads that are performance-sensitive (PostgreSQL,
Nextcloud, Jellyfin), I decided to go back to where I started from and put the setup back into a desktop case.
For that purpose, I picked the <a href="https://uk.thermaltake.com/core-v1.html">Thermaltake Core V1</a>, mainly due to how easy it
is to build in it and it having room for 2x8TB hard drives and 2x 2.5&quot; SSD-s.</p>









<figure class="center">
  <a href="/posts/2021/03/17/server-setups-throughout-the-years/media/desktop-server-1.jpg">
    <img src="/posts/2021/03/17/server-setups-throughout-the-years/media/desktop-server-1_hu_6a6e46bf345af9ea.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Clean and performant server setup.">

  </a>
  <figcaption class="center">Clean and performant server setup.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2021/03/17/server-setups-throughout-the-years/media/desktop-server-2.jpg">
    <img src="/posts/2021/03/17/server-setups-throughout-the-years/media/desktop-server-2_hu_db4e56b4e1d94ad8.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="For future historians: yes, even servers had RGB in 2020.">

  </a>
  <figcaption class="center">For future historians: yes, even servers had RGB in 2020.</figcaption>
</figure>

<p>This box was very fast. Too fast, in fact. It also used quite a lot of power. 70-120W doesn&rsquo;t sound like much, but when
this box is supposed to run for 24 hours a day, this really adds up. I had reached my storage target, the performance was
acceptable and everything was working, which meant that the next logical step is to change the setup and hit some limits
again.</p>
<h2 id="quest-for-low-power-usage">
  <a class="heading-anchor" href="#quest-for-low-power-usage">Quest for low power usage<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>At this point, I had made it a game for myself to try to go as low as possible with the power usage of my setup while also
running my workloads at an acceptable performance level. From my previous meddling, I had a ThinkPad T430 that now boasts
16GB of RAM and a 4-core Intel i7 3820QM quad-core CPU, which is plenty of performance. This laptop also houses up to three
SSD-s, which meant that having performant storage around over SATA was also not an issue. The main storage (2x 8TB)
was attached over USB 3.0. Not the best solution, but ZFS has handled these kinds of setups very well in my past
experience.</p>









<figure class="center">
  <a href="/posts/2021/03/17/server-setups-throughout-the-years/media/t430-server.jpg">
    <img src="/posts/2021/03/17/server-setups-throughout-the-years/media/t430-server_hu_7e083d43ceb10ec.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Sure, it&#39;s low power, but the cables are a mess.">

  </a>
  <figcaption class="center">Sure, it&#39;s low power, but the cables are a mess.</figcaption>
</figure>

<h2 id="can-we-go-even-smaller">
  <a class="heading-anchor" href="#can-we-go-even-smaller">Can we go even smaller?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Recently I have learned about tiny form factor machines produced by big OEM-s, such as Dell, HP and Lenovo. These
machines are very compact, but can pack quite a punch with a desktop-level CPU and the ability to put in 16+GB of RAM
while being powered by a laptop power supply. The only downside of these builds is that the internal storage can be limited
to 1-2 drives (SATA or M.2 form factor) and not all USB ports might be USB 3.0.</p>
<p>Once I stumbled upon one offer for a Lenovo M73, I knew that I had to try this kind of setup out. Initially I was thinking
of using such a machine for media center purposes, but after I accidentally configured one too many UEFI settings for my
ThinkPad X230 in the advanced BIOS settings, I needed a replacement laptop. And thus, the ThinkPad T430 based server
was replaced by the M73. I did have to limit the CPU power usage using <code>intel_pstate</code> driver and the USB 3.0 ports
needed a bit of bending so that they aren&rsquo;t loose, but other than that it has been smooth sailing.</p>
<p>This is where the story ends for now. The machine takes about 13-15W when idling, and with 4 8TB external hard drives
attached, the typical power usage is between 40-55W. I am planning on replacing the 4 drives with 2 high-capacity drives,
something like a WD Elements/MyBook 14TB once those go on sale.</p>









<figure class="center">
  <a href="/posts/2021/03/17/server-setups-throughout-the-years/media/lenovo-m73.jpg">
    <img src="/posts/2021/03/17/server-setups-throughout-the-years/media/lenovo-m73_hu_e5e6ff1adfec4343.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The current setup in all its glory. Don&#39;t worry, the cable mess is temporary until I get a PSU that can supply all the drives at once.">

  </a>
  <figcaption class="center">The current setup in all its glory. Don&#39;t worry, the cable mess is temporary until I get a PSU that can supply all the drives at once.</figcaption>
</figure>

<h2 id="future-plans">
  <a class="heading-anchor" href="#future-plans">Future plans<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This is probably where the setup changes will stop for a while. I occasionally play around with some alternative setups to try
to go even lower (Raspberry Pi 4), but so far this setup has proven to be the <em>minimum viable server</em>. It does everything
that I need, the power usage is low and it has room for expandability with regards to services that I can run on it.</p>
<p>If I had to start from scratch, then I would probably opt for an <a href="https://www.asrock.com/nettop/AMD/DeskMini%20X300%20Series/index.asp">AsRock Deskmini X300</a>.
It has the same power efficiency benefits, but you could install a more powerful CPU, a lot of RAM and up to 4 SSD-s,
two of which can be NVMe drives.</p>
<p>The bulk storage would still be over USB 3.0, but that comes with its own benefits:</p>
<ul>
<li>you can not go over a reasonable amount of drives, meaning that your wallet will be happy.</li>
<li>you do not need to shuck the drives, you can use them as-is and get warranty service without issues.</li>
</ul>
<p>This has been my self-hosting journey throughout the years. I hope that it was at least somewhat interesting and maybe
gave you some ideas to test out on your own.</p>
]]></content:encoded></item><item><title>Database optimization adventures on low-end hardware</title><link>https://ounapuu.ee/posts/2021/02/27/database-optimization-adventures-on-low-end-hardware/</link><pubDate>Sat, 27 Feb 2021 15:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2021/02/27/database-optimization-adventures-on-low-end-hardware/</guid><description>Who would have thought that performing basic database optimizations could be fun?</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="Database optimization adventures on low-end hardware" /><p>I used to work on a short-term project a while ago where the goal was to visualize some metrics that were collected from
a pretty fancy smart home setup. This data included power usage of various sections of the building, temperature
sensors, water usage levels and more. The data itself was collected by a proprietary piece of software that sent this
data to a MySQL database. My job was to understand the data, get useful values from the binary data and visualize it.</p>
<h2 id="the-hardware">
  <a class="heading-anchor" href="#the-hardware">The hardware<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>While testing out this solution, I started with an <a href="http://www.orangepi.org/orangepizero/">Orange Pi Zero</a> that a good
friend had given to me. You might remember this board
from <a href="/posts/2020/07/23/the-little-wifi-ap-that-could/">a previous adventure</a>. This board boasts a whopping 4 ARM 32-bit
CPU cores running at 1000MHz, 100 Mbps networking and one USB 2.0 port. The slow USB port means that the read speeds
for any storage you attach to it will be capped out at 40 MB/s.</p>
<p>With all of this in mind, I still went ahead and built this monstrosity. I took a 480 GB Kingston SSD that was lying in
a box and connected it to the board.</p>









<figure class="center">
  <a href="/posts/2021/02/27/database-optimization-adventures-on-low-end-hardware/media/image1.jpg">
    <img src="/posts/2021/02/27/database-optimization-adventures-on-low-end-hardware/media/image1_hu_8aa59cf979c030fe.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="I&#39;m pretty sure that the PCB of the SSD itself is larger than the SBC itself.">

  </a>
  <figcaption class="center">I&#39;m pretty sure that the PCB of the SSD itself is larger than the SBC itself.</figcaption>
</figure>

<h2 id="the-workload">
  <a class="heading-anchor" href="#the-workload">The workload<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This server had two jobs: collect the incoming data from sensors to a MariaDB instance and visualize it using a tool
like Grafana. The first part was OK, since the amount of incoming data was not that high and the SBC could handle it.
However, I hit some roadblocks when trying to visualize it.</p>
<p>The first hurdle was to convert the binary values into something usable. Going by the documentation, I could figure out
how to show signed and unsigned integer values correctly by utilizing some SQL magic that did the conversions
more-or-less correctly. However, with other data types, such as floating-point values of varying precision and other fun
formats, I could not use the same methods to perform the conversion.</p>
<p>The second hurdle was performance. The incoming data was put into one table, which would periodically get split up on a
month-by-month basis to avoid the table getting too big. Not a bad solution, but since I was planning on using Grafana,
having all the data in one table was the only sensible solution if I wanted to show data for previous months as well.
This meant that I had one big table with all the important data, plus some adjacent ones that provided details for the
sensor/meter type, its value type (integer, floating point, etc.) and more. Performing <code>SELECT</code> statements with a couple
of joins proved to be a headache: the queries would trigger a full table search, which was very painful on a system
where the maximum read speed of the SSD is 40 MB/s. Understandably, lookups on a database that was already at a couple
of gigabytes in size and growing would be slow even for shorter time spans (30 days).</p>
<p>These limitations meant that in its current state, the solution was pretty limited in functionality and very slow to use
as well.</p>
<h2 id="the-solution">
  <a class="heading-anchor" href="#the-solution">The solution<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I soon learned that the company behind the hardware and software of this system provides a tool which can be used
to connect to the database and read the collected data, with values converted properly and sensor/meter names provided
as well. And to top it all off, this thing was written in Java!</p>
<p>I decided to dig around in the provided <code>.jar</code> file using IntelliJ IDEA and stumbled upon some interesting files. These files
corresponded to different data types, and also contained the logic that was used to convert the binary data to usable
values. I can only guess that this conversion was made with the goal of keeping the database size as small as possible,
or to just avoid users from using this data for other purposes using tools made by other companies.</p>
<p>There were still the performance issues to resolve. I looked into optimizing MySQL/MariaDB tables and queries and
stumbled upon some useful tips and tricks. While I cannot remember the exact details, I did end up testing the different
DB engines (InnoDB vs whatever they had previously), configuring various cache sizes and limits, indexes on various
column types, investigating query plans and the performance benefits of <a href="https://en.wikipedia.org/wiki/Denormalization">denormalization</a>.</p>
<p>And then it clicked.</p>
<p>What if I wrote a small Java service that would handle the data conversion <em>and</em> put all the data into one table that
holds only the relevant data and has the correct set of indexes set up? The service would periodically check the main table that
collected all the data, select the results, convert the value into something that a human can understand, and then
insert it into a new table that is optimized for read performance.</p>
<p>After hours of work, I had this Java service up and running on the underpowered server and started testing this
solution. Queries that would previously take minutes to run, would now finish within seconds. Even queries with a time
window of 90+ days would still finish within 5 seconds. This improvement in performance is further amplified by the fact
that Grafana is able to show multiple graphs at the same time, resulting in multiple queries running at the same time.</p>
<h2 id="deployment">
  <a class="heading-anchor" href="#deployment">Deployment<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The hardware that I tested this solution on was pretty neat and used up very little power. The total cost with the SSD
included was roughly in the 100-150 euro range. However, it was decided that the deployment would be done on a more
conventional machine.</p>
<p>I went ahead and built a tiny PC based on
the <a href="https://www.asrock.com/nettop/amd/deskmini%20a300%20series/index.asp">AsRock Deskmini A300</a>. The build included a
dual-core AMD Athlon APU (cut-down version of a Ryzen APU), 16 GB of DDR4 RAM because it
cost just as much as an 8 GB DDR4 kit did at the time, one 120 GB SATA SSD for the OS, two 512GB Kingston A1000 NVMe SSD-s for the main storage (ZFS
mirror) and a cheap 480 GB Kingston A400 SATA SSD for local backups. This whole build fit in a 500 euro budget and was a
bit overkill for the purpose, but the performance that you could get out of this build was <em>insane</em>. And to top it all
off, the server itself is very tiny and energy efficient, meaning that you could stick it pretty much anywhere, and it would
still run happily while consuming less than 50 watts even under the most intense workloads.</p>









<figure class="center">
  <a href="/posts/2021/02/27/database-optimization-adventures-on-low-end-hardware/media/image2.jpg">
    <img src="/posts/2021/02/27/database-optimization-adventures-on-low-end-hardware/media/image2_hu_c3c5e0cac5b66930.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Yup, that&#39;s the whole motherboard. Very small, but it can pack quite a punch.">

  </a>
  <figcaption class="center">Yup, that&#39;s the whole motherboard. Very small, but it can pack quite a punch.</figcaption>
</figure>

<p>The performance optimizations that I did were a must-have on the SBC that I did most of my testing on. On this new
build, however, all the bottlenecks were lifted. The CPU probably had more processing power than 20 of the Orange Pi
Zero boards combined, and the maximum read speeds on the crazy fast ZFS mirror were measured in <em>gigabytes per second</em>.
Queries that took a second to run on the old setup were now done in the blink of an eye (or in other words, measured in
milliseconds).</p>
<p>This deployment would probably last years without any intervention from anyone, assuming that the incoming data would
not grow too fast. Unfortunately the solution itself did not find much use, so I could not test this theory out. The box
itself is still happily running at the time of writing.</p>
<h2 id="lessons-learned">
  <a class="heading-anchor" href="#lessons-learned">Lessons learned<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The main reason that I am writing about this experience is the simple fact that it was a fantastic challenge to try to
extract as much performance out of the Orange Pi Zero based server. Getting your queries from 30 seconds down to 0.3
seconds felt like a great achievement, plus I got to revisit some database related topics that I first learned about during
my university days.</p>
<p>This experience also shows that even low-end hardware can achieve a lot if you are aware of its limitations and can
work around them with a little bit of effort. After this project, I have played around with my homelab setup a lot and
have finally settled on a solution that does not consume a lot of power, but can still run all the workloads that I want
to run.</p>
]]></content:encoded></item><item><title>How to make digital copies of your old video tapes</title><link>https://ounapuu.ee/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/</link><pubDate>Sun, 27 Dec 2020 18:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/</guid><description>Or 'Wow, I did not know that VLC could do _that_!'</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="How to make digital copies of your old video tapes" /><h2 id="introduction">
  <a class="heading-anchor" href="#introduction">Introduction<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This is a short overview of one way to take your old video tapes and make digital copies of their contents.</p>
<p>To get started, you will need the following:</p>
<ul>
<li>old video tapes that you want to make copies of (VHS and its variants)</li>
<li>a device that can read analog AV signals and convert them to digital signals</li>
<li>a device that can play back the tapes (VHS player, camcorder etc.)
<ul>
<li>in this example, we will be using a camcorder that has video playback capabilities.</li>
</ul>
</li>
<li>a computer with enough free space to store the digital copies
<ul>
<li>for VHS and H.264+MP3, this means roughly 1.5GB of space for 1 hour of footage</li>
</ul>
</li>
<li><a href="https://www.videolan.org/vlc/index.html">VLC media player</a></li>
<li>time and patience</li>
</ul>
<p>In this example, we will be using the <a href="https://nedis.com/en-us/product/computer/imaging/media-converters/550670251/video-grabber-av-cable-scart-software-included-usb-20">Nedis VGRRU100BK</a>.
Not because it is any good, it was just something we had access to.</p>









<figure class="center">
  <a href="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/20-12-20-00-44-47-1997.jpg">
    <img src="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/20-12-20-00-44-47-1997_hu_333b06cc2ed0b1d0.webp"
     width="1024"
     height="768"
     loading="lazy"
     decoding="async"
     alt="Nedis VGRRU100BK - front.">

  </a>
  <figcaption class="center">Nedis VGRRU100BK - front.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/20-12-20-00-44-57-1998.jpg">
    <img src="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/20-12-20-00-44-57-1998_hu_63e0303a299b57aa.webp"
     width="1024"
     height="768"
     loading="lazy"
     decoding="async"
     alt="Nedis VGRRU100BK - back.">

  </a>
  <figcaption class="center">Nedis VGRRU100BK - back.</figcaption>
</figure>

<h2 id="the-process">
  <a class="heading-anchor" href="#the-process">The process<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<h3 id="step-1-setting-up-the-physical-devices">
  <a class="heading-anchor" href="#step-1-setting-up-the-physical-devices">Step 1: setting up the physical devices<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>Set up your video playback device so that it can play the cassettes that you are planning to record.</p>
<p>Connect the AV output cables (composite or S-video) to the input of the USB device. For this specific device,
it means connecting the appropriate composite AV cables together and connecting them to the USB stick using a
proprietary connector.</p>
<p>The end result might look something like this:</p>









<figure class="center">
  <a href="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/20-12-19-18-12-06-1986.jpg">
    <img src="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/20-12-19-18-12-06-1986_hu_4f27c894bddbd740.webp"
     width="1024"
     height="768"
     loading="lazy"
     decoding="async"
     alt="Overview of the setup used in this example.">

  </a>
  <figcaption class="center">Overview of the setup used in this example.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/20-12-19-18-12-22-1988.jpg">
    <img src="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/20-12-19-18-12-22-1988_hu_b232568158040b80.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The USB capture device connected to the PC.">

  </a>
  <figcaption class="center">The USB capture device connected to the PC.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/20-12-19-18-13-58-1994.jpg">
    <img src="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/20-12-19-18-13-58-1994_hu_8139b292c10db2c5.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="We are using a camcorder to play back the video in this case.">

  </a>
  <figcaption class="center">We are using a camcorder to play back the video in this case.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/20-12-19-18-14-34-1995.jpg">
    <img src="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/20-12-19-18-14-34-1995_hu_f99d25dc65353ecb.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Video outputs on the camcorder. Yes, that is mono sound.">

  </a>
  <figcaption class="center">Video outputs on the camcorder. Yes, that is mono sound.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/20-12-19-18-14-40-1996.jpg">
    <img src="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/20-12-19-18-14-40-1996_hu_1e3a52017a59b3d9.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Video output -&gt; USB capture card input.">

  </a>
  <figcaption class="center">Video output -&gt; USB capture card input.</figcaption>
</figure>

<h3 id="step-2-testing-the-initial-display-output">
  <a class="heading-anchor" href="#step-2-testing-the-initial-display-output">Step 2: testing the initial display output<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>In this example, we will be using VLC to play and record the videos. We are using Linux here, but
the process should be very similar on Windows.</p>
<p>Open up VLC.</p>
<p>In the top-left corner, click on <code>Media</code> and select <code>Open Capture device...</code>.</p>









<figure class="center">
  <a href="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/2020-12-19-18-14-14.png" aria-label="View full-size image">
    <img src="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/2020-12-19-18-14-14_hu_dacb8a6af5310b07.webp"
     width="559"
     height="456"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>You should see a screen similar to this one:</p>









<figure class="center">
  <a href="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/2020-12-19-18-16-40.png" aria-label="View full-size image">
    <img src="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/2020-12-19-18-16-40_hu_b439be1dc208358f.webp"
     width="703"
     height="539"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>Your computer probably has multiple options for selecting audio and video devices, since microphones
and webcams will likely show up here. If you are unsure which one is the correct one, go through each one-by-one
until you find the options that work.</p>









<figure class="center">
  <a href="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/2020-12-19-18-16-47.png" aria-label="View full-size image">
    <img src="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/2020-12-19-18-16-47_hu_b05c7d510875730.webp"
     width="704"
     height="534"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>










<figure class="center">
  <a href="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/2020-12-19-18-16-55.png" aria-label="View full-size image">
    <img src="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/2020-12-19-18-16-55_hu_3fdc2406d1bcefa8.webp"
     width="711"
     height="547"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>In this example, our video capture device is named <code>/dev/video2</code> and the audio feed for the capture device
is <code>hw:4,0</code>.</p>
<p>In the bottom-left corner, you have the option to play back the video signal directly in VLC. You can use this to check
which video and audio device is the correct one.</p>
<p>If all goes well, you should be able to see the output in VLC:</p>









<figure class="center">
  <a href="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/2020-12-19-18-17-48.png">
    <img src="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/2020-12-19-18-17-48_hu_27f8fef6c16b1a62.webp"
     width="1280"
     height="720"
     loading="lazy"
     decoding="async"
     alt="Camcorder output being streamed to VLC using the USB capture device.">

  </a>
  <figcaption class="center">Camcorder output being streamed to VLC using the USB capture device.</figcaption>
</figure>

<h3 id="step-3-recording">
  <a class="heading-anchor" href="#step-3-recording">Step 3: recording<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>Once you have found the correct configuration, you can click on the arrow next to the <code>Play</code> button and
select the <code>Convert</code> option.</p>









<figure class="center">
  <a href="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/2020-12-19-18-17-03.png" aria-label="View full-size image">
    <img src="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/2020-12-19-18-17-03_hu_86f0c824d30728f8.webp"
     width="723"
     height="686"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>In this view, you can configure <a href="https://en.wikipedia.org/wiki/Deinterlacing">deinterlacing</a>,
select the video profile, and set where the resulting video file will be saved.</p>









<figure class="center">
  <a href="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/2020-12-19-18-19-19.png" aria-label="View full-size image">
    <img src="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/2020-12-19-18-19-19_hu_1e17944a939cab5f.webp"
     width="589"
     height="564"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>For our purposes, we have chosen to deinterlace the video, since it provided a higher quality output,
and we have stuck with MP4 as the output format because it is an acceptable default option for us.</p>
<p>Displaying the output while converting the video did not work for us and that might be related to
how VLC accesses the video feed in Linux (only one program can read the stream at a time, it seems).</p>
<p>You can now click <code>Start</code> in VLC to start recording the video. You will also need to hit <code>Play</code> on your video playback
device.</p>









<figure class="center">
  <a href="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/2020-12-19-18-19-53.png" aria-label="View full-size image">
    <img src="/posts/2020/12/27/how-to-make-digital-copies-of-your-old-video-tapes/media/2020-12-19-18-19-53_hu_b6adf27f2c0540ce.webp"
     width="1280"
     height="720"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>Wait until the VHS tape has finished playing and then hit the stop button in VLC.</p>
<h3 id="step-4-verify-results">
  <a class="heading-anchor" href="#step-4-verify-results">Step 4: verify results<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>You can now open the resulting video file and check the results.</p>
<p>If you have additional VHS tapes to record, then repeat step 3.</p>
<h2 id="troubleshooting-notes">
  <a class="heading-anchor" href="#troubleshooting-notes">Troubleshooting notes<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>There were some challenges to get this setup working.</p>
<h3 id="not-able-to-read-the-output-from-the-usb-capture-device">
  <a class="heading-anchor" href="#not-able-to-read-the-output-from-the-usb-capture-device">Not able to read the output from the USB capture device<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>Being able to read the video signal from the USB capture device turned out to be a headache.
The software that comes with the USB capture device (Arcsoft ShowBiz) had issues displaying the video signal
and was generally unreliable and crashing.</p>
<p>Other software, like OpenShot and Kdenlive video editors, could not recognize the video capture device.</p>
<p>Since we found that this USB capture device emulates an USB webcam, we tried viewing its signal using
a browser or a camera app in the OS (Cheese in Linux, Camera in Windows), but that did not work out either.</p>
<p>We eventually found success with VLC and then chose it for performing our video recording effort. It has multiple advantages
over the software shipped with the capture device itself:</p>
<ul>
<li>it just works</li>
<li>free and open source, meaning that you can do your recording on different platforms</li>
<li>no need for a license key</li>
<li>up to date (Arcsoft ShowBiz installation files were unchanged since 2012)</li>
</ul>
<p>VLC truly is a Swiss army knife for media playback and recording.</p>
<h3 id="vhs-playback-troubles">
  <a class="heading-anchor" href="#vhs-playback-troubles">VHS playback troubles<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>We initially tried the recording process with a proper VHS player, but while recording the footage
and reviewing it later, we noticed that at random points the VHS player had fast-forwarded
over portions of the video.</p>
<p>The camcorder did not exhibit this behaviour, so we went with that. However, with the camcorder we could only
output mono sound, which means that the resulting video file will only have one sound channel present. This will
be especially noticeable when listening to the recorded footage using headphones. To fix this, we
used <a href="https://handbrake.fr/">HandBrake</a> to copy the single audio channel to both channels, which resolved that issue for us.</p>
]]></content:encoded></item><item><title>What running out of SATA ports looks like</title><link>https://ounapuu.ee/posts/2020/08/29/what-running-out-of-sata-ports-looks-like/</link><pubDate>Sat, 29 Aug 2020 17:21:21 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2020/08/29/what-running-out-of-sata-ports-looks-like/</guid><description>How I slapped two hard drives on a long PCIe x1 card.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="What running out of SATA ports looks like" /><p>One day I stumbled upon a <a href="https://www.youtube.com/watch?v=nQiWP8T9R60">Craft Computing video</a>
about his new server build, and on the parts list was a Sedna PCI Express 2x SATA adapter card:</p>









<figure class="center">
  <a href="/posts/2020/08/29/what-running-out-of-sata-ports-looks-like/media/image1.jpg">
    <img src="/posts/2020/08/29/what-running-out-of-sata-ports-looks-like/media/image1_hu_ab7a146edba408d5.webp"
     width="500"
     height="500"
     loading="lazy"
     decoding="async"
     alt="The card in question.">

  </a>
  <figcaption class="center">The card in question.</figcaption>
</figure>

<p>There are different designs out there, including a 4x SATA card, which is bonkers.</p>
<p>Anyway, I thought that I might as well give this a shot, since I have two 4TB 2.5&quot; 15mm Seagate hard drives running,
<a href="/posts/2020/08/22/disk-is-ok/">with one of them being in the process of accumulating bad sectors</a>.</p>









<figure class="center">
  <a href="/posts/2020/08/29/what-running-out-of-sata-ports-looks-like/media/20-08-26-19-48-37-1942.jpg">
    <img src="/posts/2020/08/29/what-running-out-of-sata-ports-looks-like/media/20-08-26-19-48-37-1942_hu_75dac604464ff51f.webp"
     width="1024"
     height="768"
     loading="lazy"
     decoding="async"
     alt="Adapter card with two drives installed (front).">

  </a>
  <figcaption class="center">Adapter card with two drives installed (front).</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2020/08/29/what-running-out-of-sata-ports-looks-like/media/20-08-26-19-48-58-1944.jpg">
    <img src="/posts/2020/08/29/what-running-out-of-sata-ports-looks-like/media/20-08-26-19-48-58-1944_hu_2c16666f075f2054.webp"
     width="1024"
     height="768"
     loading="lazy"
     decoding="async"
     alt="Adapter card with two drives installed (back).">

  </a>
  <figcaption class="center">Adapter card with two drives installed (back).</figcaption>
</figure>

<p>The installation procedure itself is simple, just take your drives, screw them in and
plug this into a PCIe slot.</p>









<figure class="center">
  <a href="/posts/2020/08/29/what-running-out-of-sata-ports-looks-like/media/20-08-26-19-55-14-1945.jpg">
    <img src="/posts/2020/08/29/what-running-out-of-sata-ports-looks-like/media/20-08-26-19-55-14-1945_hu_158a5b5bf4dc792f.webp"
     width="1024"
     height="768"
     loading="lazy"
     decoding="async"
     alt="This is what it looks like installed into my server.">

  </a>
  <figcaption class="center">This is what it looks like installed into my server.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2020/08/29/what-running-out-of-sata-ports-looks-like/media/20-08-26-19-55-19-1946.jpg">
    <img src="/posts/2020/08/29/what-running-out-of-sata-ports-looks-like/media/20-08-26-19-55-19-1946_hu_f6c7d8eb46ed23c0.webp"
     width="1024"
     height="768"
     loading="lazy"
     decoding="async"
     alt="Alternate angle.">

  </a>
  <figcaption class="center">Alternate angle.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2020/08/29/what-running-out-of-sata-ports-looks-like/media/20-08-26-19-55-30-1947.jpg">
    <img src="/posts/2020/08/29/what-running-out-of-sata-ports-looks-like/media/20-08-26-19-55-30-1947_hu_d034eeb1ca74dcc6.webp"
     width="1024"
     height="768"
     loading="lazy"
     decoding="async"
     alt="Alternate angle.">

  </a>
  <figcaption class="center">Alternate angle.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2020/08/29/what-running-out-of-sata-ports-looks-like/media/20-08-26-21-15-02-1948.jpg">
    <img src="/posts/2020/08/29/what-running-out-of-sata-ports-looks-like/media/20-08-26-21-15-02-1948_hu_8e6fd98d676b1c98.webp"
     width="1024"
     height="768"
     loading="lazy"
     decoding="async"
     alt="As you can see, it did not kill the system.">

  </a>
  <figcaption class="center">As you can see, it did not kill the system.</figcaption>
</figure>

<h2 id="so-how-well-does-it-work">
  <a class="heading-anchor" href="#so-how-well-does-it-work">So, how well does it work?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Quite well, actually.</p>
<p>The PCIe 2.0 x1 link does mean that your speeds will be capped at around 500MB/s, but
with current hard drives you are unlikely to reach this limit. SSD-s, on the other hand,
will be bottlenecked in sequential read/write workloads.</p>
<p><code>lspci -nnk</code> output:</p>
<pre tabindex="0"><code>01:00.0 SATA controller [0106]: ASMedia Technology Inc. ASM1062 Serial ATA Controller [1b21:0612] (rev 01)
        Subsystem: ASMedia Technology Inc. Device [1b21:1060]
        Kernel driver in use: ahci
        Kernel modules: ahci
</code></pre><p>The drives are individually addressable and show up as normal drives (like <code>/dev/sda</code>).
S.M.A.R.T info is functional and readable.</p>
<p>This adapter has been running in my system for over half a week now and so far
there haven&rsquo;t been any stability issues whatsoever.</p>
<h2 id="should-i-get-this">
  <a class="heading-anchor" href="#should-i-get-this">Should I get this?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This adapter is a good fit for the following use cases:</p>
<ul>
<li>there are no more HDD/SSD drive mounts in your system left and you do not want
to use double-sided tape as one</li>
<li>you have run out of SATA ports and don&rsquo;t mind using up a PCIe slot</li>
<li>you want to install additional SATA drives in your system, but also would prefer
to keep the amount of cabling in your system at a minimum</li>
<li>flexing on your friends with your fancy new 8/10 TB storage card</li>
</ul>
<p>I would recommend looking into alternative solutions if your use case matches one of these:</p>
<ul>
<li>using this adapter with SSD-s on sequential read/write workloads that exceed 500+MB/s</li>
<li>adding more than two SATA drives into your system (get a simple PCIe -&gt; SATA adapter
that only provides the data connectors instead)</li>
</ul>
]]></content:encoded></item><item><title>Running on fumes</title><link>https://ounapuu.ee/posts/2020/08/29/running-on-fumes/</link><pubDate>Sat, 29 Aug 2020 16:42:19 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2020/08/29/running-on-fumes/</guid><description>0GB ought to be enough for anybody.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="Running on fumes" /><p>After a run-of-the-mill Windows BSOD, I was redirected to the UEFI
settings and was presented with this fun little bug:</p>









<figure class="center">
  <a href="/posts/2020/08/29/running-on-fumes/media/20-08-28-21-55-32-1970.jpg">
    <img src="/posts/2020/08/29/running-on-fumes/media/20-08-28-21-55-32-1970_hu_34633266f8b0b44d.webp"
     width="1024"
     height="768"
     loading="lazy"
     decoding="async"
     alt="0GB ought to be enough for anybody.">

  </a>
  <figcaption class="center">0GB ought to be enough for anybody.</figcaption>
</figure>

]]></content:encoded></item><item><title>Stupid project ideas: the War Machine</title><link>https://ounapuu.ee/posts/2020/08/22/stupid-project-ideas-1/</link><pubDate>Sat, 22 Aug 2020 21:24:08 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2020/08/22/stupid-project-ideas-1/</guid><description>Maybe not stupid, but definitely stupid expensive.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="Stupid project ideas: the War Machine" /><p><a href="https://www.youtube.com/user/LinusTechTips">LinusTechTips</a> has some pretty great videos about building
insane PC and server setups, such as:</p>
<ul>
<li>
<p><a href="https://youtu.be/EtZXMj_gUjU">unboxing and deploying <em>petabytes</em> of storage</a></p>
</li>
<li>
<p><a href="https://youtu.be/LXOaCkbt4lI">7 gamers, 1 CPU</a></p>
</li>
<li>
<p><a href="https://youtu.be/R_h63IsmvSQ">building sleeper PC-s</a></p>
</li>
<li>
<p><a href="https://youtu.be/uWtU8pGspj0">testing sketchy CPU-s</a></p>
</li>
<li>
<p><a href="https://youtu.be/ZFLiKClKKhs">opening up a 100TB SSD</a></p>
</li>
</ul>
<p>I have the ideas, but not the budget of LinusTechTips, so writing them down and hoping that one day I can test this out
is the best I can do for now.</p>
<h2 id="the-project-itself">
  <a class="heading-anchor" href="#the-project-itself">The project itself<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The main idea is to have a laptop that has ridiculous amounts of storage and the performance to back it up.
The idea started gaining traction in my head after I realized that my Lenovo ThinkPad T430 can house up to 3 SSD-s, which
makes it a perfect candidate for a system with a ZFS mirror configuration. It also helps that it is powered by a quad-core
CPU and 16GB of RAM.</p>
<p>Additional points:</p>
<ul>
<li>low power, should stay below 60-90W even under the worst case scenarios</li>
<li>portable, just plug in the power and an ethernet cable and you are good to go</li>
<li>built-in UPS in the form of the laptop battery</li>
<li>well built, can survive a fall or two (already has done so, but that&rsquo;s a story for another time)</li>
<li>includes a screen and a keyboard for those times where you really screwed something up and need to fix it fast</li>
<li>supports 1x mSATA SSD (great for / partition) and 2x SATA HDD/SSD (one in the usual drive bay, the other in the HDD caddy that
is replacing the optical drive)</li>
</ul>
<h2 id="storage">
  <a class="heading-anchor" href="#storage">Storage<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>With SSD prices having dropped quite low and capacities increasing with time, it might not be completely unreasonable
to get SSD-s with capacities reaching multiple terabytes. At the time of writing, Samsung, for example, is shipping
<a href="https://www.samsung.com/au/memory-storage/870-qvo-sata-3-2-5-ssd/MZ-77Q1T0BW/">SATA SSD-s with capacities up to 8TB</a>,
which is the same size as the main hard drives in my server right now.</p>
<p>However, these SSD-s are also ridiculously expensive, with the 4 TB model costing ~400 euros and the 8 TB costing almost
800 euros.</p>









<figure class="center">
  <a href="/posts/2020/08/22/stupid-project-ideas-1/media/2020-08-22-21-49-00.png">
    <img src="/posts/2020/08/22/stupid-project-ideas-1/media/2020-08-22-21-49-00_hu_ad198e1e6aaf23cd.webp"
     width="731"
     height="509"
     loading="lazy"
     decoding="async"
     alt="The capacity isn&#39;t the only thing that is big about this SSD.">

  </a>
  <figcaption class="center">The capacity isn&#39;t the only thing that is big about this SSD.</figcaption>
</figure>

<p>Hard drives are generally cheaper per TB, but in this case we don&rsquo;t actually have much better options. 2.5&quot; 9mm hard drives
seem to go up to 2TB at most. You will also have to take into account the fact that hard drives do not like impacts,
such as falls, and they are much slower than SSD-s in most workloads.</p>
<h2 id="cooling">
  <a class="heading-anchor" href="#cooling">Cooling<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Since I have fitted this T430 with an <a href="https://ark.intel.com/content/www/us/en/ark/products/64889/intel-core-i7-3820qm-processor-8m-cache-up-to-3-70-ghz.html">Intel i7 3820QM</a>
CPU with a 45 watt TDP, cooling is an issue. Liquid metal, beefier heatsinks, fresh thermal paste, I have tried it all, but
the only solution that has actually worked is disabling the turbo boost feature. There is also this other solution I created
that automatically throttles the CPU at a chosen temperature limit using Intel p-state driver, but that solution requires
a rewrite.</p>
<p>With poor cooling comes great noise, so ideally this server should run in a place that does not bother anyone with its
high-pitched fan noise.</p>
<h2 id="performance">
  <a class="heading-anchor" href="#performance">Performance<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>With a quad core CPU, this system can do quite a lot. Running Nextcloud, PostgreSQL, Jellyfin or any other service should
be a breeze, especially since the main storage is SSD based. The amount of RAM is also perfectly suitable for doing quite
a lot. Run a couple of VM-s, transcode your media, it can do it all (with reasonable expectations, though).</p>
<h2 id="portability">
  <a class="heading-anchor" href="#portability">Portability<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>One of the best features of this setup is that you can just grab it and go, should the need arise. Its low power requirement
makes it a much more suitable candidate for powering it in situations where the electrical grid is down and all you have
is a generator or some form of renewable energy. In addition to that, everything you need to work with the machine is already
there, just open up the laptop and start working using the built-in keyboard and screen.</p>
<p>The good build quality of the laptop also means that you do not need to worry much about putting it in your backpack and
throwing it around. Sure, the plastic might break in some places, and if the impact is strong enough then it can still
break, but it is less likely to break when compared to alternative <em>thin and light</em> types of laptops.</p>
<h2 id="practicality">
  <a class="heading-anchor" href="#practicality">Practicality<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>It&rsquo;s not all fun and games, though. This setup does have quite a few downsides:</p>
<ul>
<li>no way to upgrade CPU and RAM any further. What you have is what you will have to live with.</li>
<li>it&rsquo;s expensive simply due to the fact that the SSD-s get very pricy if you require high capacities, hard drives
are still more economical for storing huge amounts of data</li>
<li>the cooling issue will remain unsolveable, unless you invest time and resources into designing a custom solution</li>
</ul>
<h2 id="conclusion">
  <a class="heading-anchor" href="#conclusion">Conclusion<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p><em>Do I still want to build this?</em></p>
<p>Yes.</p>
<p><em>Can I build this?</em></p>
<p>Not unless a delivery truck full of 8TB SSD-s happens to crash in front of me.</p>
<p>Or someone sponsors me. <em>Take a hint, WD/Seagate</em>.</p>
]]></content:encoded></item><item><title>Disk is OK</title><link>https://ounapuu.ee/posts/2020/08/22/disk-is-ok/</link><pubDate>Sat, 22 Aug 2020 07:29:19 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2020/08/22/disk-is-ok/</guid><description>It's all good, man.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="Disk is OK" /><p>Maybe I am unlucky with computer hardware.</p>
<p>Maybe I have the opposite of <a href="https://en.wikipedia.org/wiki/Midas#Golden_Touch">the golden touch of Midas</a>.</p>
<p>Or maybe it&rsquo;s just the fact that I use my hardware for things they were never meant to be used for.</p>
<p>Anyway, I have acquired two Seagate 4TB external hard drives for doing some testing with ZFS.
I shucked them (took them out of their enclosure) and started using them as internal drives in many different
configurations.</p>
<p>Funnily enough, even though the two external drives had different branding (Backup Plus, Expansion)
and enclosure design, the hard drives in them were identical.</p>
<p>Some info about the drives:</p>
<ul>
<li>Model: ST4000LM024-2AN17V</li>
<li>Recording type: <a href="https://en.wikipedia.org/wiki/Shingled_magnetic_recording">SMR (shingled magnetic recording)</a></li>
<li>Form factor: 2.5&quot;</li>
<li>Interface: SATA</li>
<li>Thickness: <strong>15 mm</strong></li>
</ul>
<p>Before I get to the stupid stuff, I would like to mention what these drives are good for, and where they suffer heavily.</p>
<p>Good:</p>
<ul>
<li>WORM (write once, read many) type of workloads, such as a Steam library, your media collection etc.</li>
</ul>
<p>Bad:</p>
<ul>
<li>random read/write workloads (performance is absolutely rubbish and makes the system unusable)</li>
<li>write heavy workloads (SMR requires some clean-up activities that are managed by the drive, and you cannot do anything while
those take place)</li>
</ul>
<h2 id="the-stupid-stuff">
  <a class="heading-anchor" href="#the-stupid-stuff">The stupid stuff<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I have done some pretty dumb things with these, such as using them in an <a href="https://www.in-win.com/en/gaming-chassis/Chopin">InWin Chopin computer case</a>
and letting them hit 60C under load. Fun fact: these drives actually fit almost perfectly in the case, as long as you
bend one small metal section for one of the drive cages. Not so fun fact: they will overheat if you have a high CPU load
and you cannot do much about that.</p>
<p>Currently these drives are sitting in my main desktop. Initially I tried using them in a mirrored configuration under
Windows, because having your whole Steam library downloaded with disk space to spare is pretty cool. Unfortunately, one
of the disks started having issues and it got kicked out of the mirror. It kept doing this every time it accumulated bad
sectors.</p>
<p>Now these two sit in a ZFS mirror configuration inside a VM, acting as some sort of a temporary scratch disk. Another
free fun fact: <code>kvm</code> (or qemu, or libvirt, one of those) will pause the VM if it detects that one of your disks has
encountered I/O errors, and seems that the only &ldquo;fix&rdquo; is to force a restart of the VM (could not unpause the VM).</p>
<p>It has become some sort of a fun pastime for me to keep an eye on one of the failing drives and the status of the ZFS mirror.</p>
<p><em>Will ZFS detect some errors?</em></p>
<p><em>How large can the bad sector count get before the drive dies?</em></p>
<p><em>When will it actually die?</em></p>
<p><em>Why is <a href="https://en.wikipedia.org/wiki/S.M.A.R.T.">S.M.A.R.T</a> <em>still</em> reporting that the disk is OK?</em></p>
<p>So far, so good.</p>









<figure class="center">
  <a href="/posts/2020/08/22/disk-is-ok/media/2020-08-17-07-45-51.png">
    <img src="/posts/2020/08/22/disk-is-ok/media/2020-08-17-07-45-51_hu_5c5bafe4f031a67.webp"
     width="414"
     height="151"
     loading="lazy"
     decoding="async"
     alt="2020-08-17. Nope, not OK.">

  </a>
  <figcaption class="center">2020-08-17. Nope, not OK.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2020/08/22/disk-is-ok/media/2020-08-20-23-21-28.png">
    <img src="/posts/2020/08/22/disk-is-ok/media/2020-08-20-23-21-28_hu_cb45e12ea3173227.webp"
     width="425"
     height="157"
     loading="lazy"
     decoding="async"
     alt="2020-08-20. Still not OK.">

  </a>
  <figcaption class="center">2020-08-20. Still not OK.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2020/08/22/disk-is-ok/media/2020-08-22-20-49-21.png">
    <img src="/posts/2020/08/22/disk-is-ok/media/2020-08-22-20-49-21_hu_e8727e34f879c63c.webp"
     width="423"
     height="153"
     loading="lazy"
     decoding="async"
     alt="2020-08-22. OK, that&#39;s pretty bad.">

  </a>
  <figcaption class="center">2020-08-22. OK, that&#39;s pretty bad.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2020/08/22/disk-is-ok/media/2020-08-29-17-10-38.png">
    <img src="/posts/2020/08/22/disk-is-ok/media/2020-08-29-17-10-38_hu_aae832d18d06b1cf.webp"
     width="837"
     height="173"
     loading="lazy"
     decoding="async"
     alt="2020-08-29. Moved this to a proper server box.">

  </a>
  <figcaption class="center">2020-08-29. Moved this to a proper server box.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2020/08/22/disk-is-ok/media/2020-09-11-07-44-31.png">
    <img src="/posts/2020/08/22/disk-is-ok/media/2020-09-11-07-44-31_hu_7efd2b0d2b5e7cf6.webp"
     width="1174"
     height="397"
     loading="lazy"
     decoding="async"
     alt="2020-09-09. He&#39;s dead, Jim.">

  </a>
  <figcaption class="center">2020-09-09. He&#39;s dead, Jim.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2020/08/22/disk-is-ok/media/2020-09-12-11-49-21.png">
    <img src="/posts/2020/08/22/disk-is-ok/media/2020-09-12-11-49-21_hu_388360a48b055b14.webp"
     width="835"
     height="182"
     loading="lazy"
     decoding="async"
     alt="2020-09-12. One restart later: it&#39;s back!">

  </a>
  <figcaption class="center">2020-09-12. One restart later: it&#39;s back!</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2020/08/22/disk-is-ok/media/2020-09-22-08-22-22.png">
    <img src="/posts/2020/08/22/disk-is-ok/media/2020-09-22-08-22-22_hu_6075a8592b11b062.webp"
     width="836"
     height="169"
     loading="lazy"
     decoding="async"
     alt="2020-09-22. More errors, more work for ZFS.">

  </a>
  <figcaption class="center">2020-09-22. More errors, more work for ZFS.</figcaption>
</figure>

<p>Expect this list to grow with time.</p>
]]></content:encoded></item><item><title>How I fixed one hardware issue with another one</title><link>https://ounapuu.ee/posts/2020/08/11/how-i-fixed-one-hardware-issue-with-another-one/</link><pubDate>Tue, 11 Aug 2020 19:08:14 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2020/08/11/how-i-fixed-one-hardware-issue-with-another-one/</guid><description>Two issues make a solution after all.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="How I fixed one hardware issue with another one" /><p>I happen to run on an <a href="https://www.asrock.com/mb/AMD/Fatal1ty%20B450%20Gaming-ITXac/">ASRock Fatal1ty B450 Gaming-ITX/ac</a>
motherboard that used to run fine, but ever since I installed one UEFI update, it has had this one annoying issue:
whenever you reboot, it gets stuck at POST. Cold boots work fine and the <em>shutdown-and-push-the-power-button</em> cycle also
does the trick, but it&rsquo;s not something I want to do all the time, especially when the machine is out of reach.</p>
<p>Before you say it: no, warranty service was not an option here, especially since this motherboard has suffered a fall once
and it has this slight curvature in it. No, this separate incident was <em>after</em> this freezing issue started occurring.</p>
<h2 id="initial-troubleshooting">
  <a class="heading-anchor" href="#initial-troubleshooting">Initial troubleshooting<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I went through most of the standard hardware troubleshooting procedures:</p>
<ul>
<li>clear CMOS</li>
<li>re-seat RAM</li>
<li>try a different CPU</li>
<li>disable features in UEFI, reduce PCIe speeds</li>
<li>disconnect storage devices</li>
</ul>
<p>No luck, issue was still there. The POST code was stuck at <code>A0</code>. When taking a look at the <a href="https://www.asrock.com/support/faq.asp?id=334">ASRock Dr. Debug POST codes
list</a>, I saw that <code>A0</code> falls under</p>
<blockquote>
<p>Problem related to IDE or SATA devices. Please re-install IDE and SATA devices.
If the problem still exists, please clear CMOS and try removing all SATA devices.</p>
</blockquote>
<p>Since I had just done that procedure, and the issue was still there, I was stumped.</p>
<h2 id="wake-on-lan">
  <a class="heading-anchor" href="#wake-on-lan">Wake-on-LAN<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I had tried wake-on-LAN many years ago and was successful with it, so I thought that perhaps this could be an option.
After all, I really did not want to get a new motherboard if I could just work around this issue.</p>
<p>I checked the ASRock UEFI for various wake-on-LAN related settings and found a couple of them. Oddly enough, the <code>Wake on LAN</code>
setting itself only became available after I enabled booting from LAN in a completely unrelated UEFI section. In addition
to the <code>Wake on LAN</code> setting, I also made sure to enable waking up from PS2 and PCIe devices, just in case.</p>
<p>After a quick Google search I found <a href="https://wiki.archlinux.org/index.php/Wake-on-LAN">the Arch Linux Wiki page</a> on this
topic and saw that I needed to make sure that my network adapter was configured properly for wake-on-LAN to work.</p>
<pre tabindex="0"><code>[root@my-machine]# ethtool enp9s0 | grep Wake-on
	Supports Wake-on: pumbg
	Wake-on: g
</code></pre><p>Super, everything should work then!</p>
<p>I set up an always-on machine to send the wake-on-lan magic packets using <code>wol</code> every minute so that the machine
eventually wakes up again. It&rsquo;s configured, I shut down the problematic machine and wait.</p>
<p>Nothing happens.</p>
<p>Huh, perhaps I missed something.</p>
<p>No, everything was configured properly and the magic packet setting <code>g</code> was on by default.</p>
<p>I checked the wiki page again and two things caught my eye:</p>
<blockquote>
<p>Note: Setting one of u, m or b along with g might also be necessary to enable the feature.</p>
</blockquote>
<blockquote>
<p>It is known that some motherboards are affected by a bug that can cause immediate or random wake-up after a shutdown
whenever the BIOS WoL feature is enabled</p>
</blockquote>
<p>Well, that&rsquo;s interesting.</p>
<p>I added <code>* * * * * ethtool -s enp9s0 wol pumbg</code> to my crontab and shut my machine down.</p>
<p>Power supply does a click. Silence. Another click, ethernet port LED-s light up and my machine is powered on again. <strong>Success!</strong></p>
<p>As it turns out, I did not even need to enable sending wake-on-LAN magic packets from another machine, the two motherboard
issues managed to cancel each other out.</p>
]]></content:encoded></item><item><title>The little Wi-Fi AP that could</title><link>https://ounapuu.ee/posts/2020/07/23/the-little-wifi-ap-that-could/</link><pubDate>Thu, 23 Jul 2020 01:17:30 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2020/07/23/the-little-wifi-ap-that-could/</guid><description>Depends on your definition of _could_.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="The little Wi-Fi AP that could" /><p>I have a bad habit of testing things whenever a &ldquo;good&rdquo; idea pops into my head. This is a short overview of one of them.</p>
<p>The <a href="http://linux-sunxi.org/Xunlong_Orange_Pi_Zero">Orange Pi Zero</a> is a SBC (single board computer) that has a slow 32-bit ARM 4 core CPU, 512MB of RAM and no display output.
It&rsquo;s actually quite OK for many tasks, such as reverse proxy (assuming 100Mbit/s is enough for you), low-performance
NAS (assuming you are fine with 10-12MB/s file transfer speeds) or a Syncthing relay. Oh, and you can also turn it into
a Wi-Fi access point.</p>









<figure class="center">
  <a href="/posts/2020/07/23/the-little-wifi-ap-that-could/media/wifi-ap.jpg">
    <img src="/posts/2020/07/23/the-little-wifi-ap-that-could/media/wifi-ap_hu_b66fbeeb649becd7.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The Wi-Fi access point in its natural habitat.">

  </a>
  <figcaption class="center">The Wi-Fi access point in its natural habitat.</figcaption>
</figure>

<h2 id="why">
  <a class="heading-anchor" href="#why">Why?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Because <a href="https://www.armbian.com/">Armbian</a> made it really easy to test out and I was interested in seeing what kind of
performance an old USB Wi-Fi dongle could offer. This cheap AP could also come into handy in situations where my main
access point dies for some reason.</p>
<h2 id="how">
  <a class="heading-anchor" href="#how">How?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Go to the <a href="https://www.armbian.com/orange-pi-zero/">Armbian device page for your SBC</a> and download the latest image, then
write it to your microSD card using the tool of your choice, start your SBC and finish the initial setup.</p>
<p>After all that is done, start <code>armbian-config</code> as root. This tool allows you to do many things over a terminal UI, including
a no-hassle method of setting up an Wi-Fi AP.</p>
<p>The option you are looking for is under <code>Network -&gt; Hotspot</code>.</p>









<figure class="center">
  <a href="/posts/2020/07/23/the-little-wifi-ap-that-could/media/armbian-config-1.png">
    <img src="/posts/2020/07/23/the-little-wifi-ap-that-could/media/armbian-config-1_hu_86a28d26c03eeca9.webp"
     width="710"
     height="403"
     loading="lazy"
     decoding="async"
     alt="This image will likely be way out of date in a couple of years.">

  </a>
  <figcaption class="center">This image will likely be way out of date in a couple of years.</figcaption>
</figure>

<p>Follow the on-screen instructions to set everything up. After the initial setup is done, make sure to navigate to the same
menu again to change the SSID and the Wi-Fi password because the defaults are horribly insecure.</p>
<p>After all this you should be good to go!</p>
<h2 id="issues-and-troubleshooting-tips">
  <a class="heading-anchor" href="#issues-and-troubleshooting-tips">Issues and troubleshooting tips<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>It would not be a proper project if something didn&rsquo;t go wrong in the process.</p>
<p>Before starting this configuration, run <code>ip a</code> to see if your Wi-Fi device is present. In my case the Orange Pi Zero also
has onboard Wi-Fi, but that particular one has poor support, so I use an USB Wi-Fi dongle instead.</p>
<p>If your Wi-Fi device is not showing up, make sure that the correct firmware is present. In my case I had to install
<code>firmware-atheros</code> package so that my <code>ath9k_htc</code> based Wi-Fi adapter would start working. <code>dmesg</code> and <code>lsusb -v</code> can help determine
what chip your Wi-Fi adapter is using and what driver it needs.</p>
<p>The Orange Pi Zero that I have could set everything up, but it would crash hard with the logs not really showing much.
After testing the USB Wi-Fi adapter in all the different USB ports with no success, I opted to use <code>armbian-config</code> menu <code>System -&gt; CPU</code>
to limit the CPU clock speed to 480MHz and set the CPU governor to <code>performance</code> to rule out power delivery issues that might be caused by
variations in CPU power usage. That seems to have done the trick, because after that change the Wi-Fi AP has been rock solid.</p>
<h2 id="testing-and-conclusions">
  <a class="heading-anchor" href="#testing-and-conclusions">Testing and conclusions<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>After setting it up and tweaking it a bit I started testing this thing out. The AP had no major issues
throughout the day and did not crash.</p>
<p>The performance, however, isn&rsquo;t anything to write home about. Speed maxes out at 30Mbit/s and is generally lower than that,
especially when more than one client is connected. You can do things like Steam Remote Play (stream your game over your home network),
but the quality will suffer. It was still quite fun to mess around in GTA V regardless of the image quality and during ~1h
of play time there were only 4-5 stutters that were caused by the network.</p>









<figure class="center">
  <a href="/posts/2020/07/23/the-little-wifi-ap-that-could/media/i-am-speed.png">
    <img src="/posts/2020/07/23/the-little-wifi-ap-that-could/media/i-am-speed_hu_a2e4f1e9419a97f.webp"
     width="223"
     height="185"
     loading="lazy"
     decoding="async"
     alt="I am speed.">

  </a>
  <figcaption class="center">I am speed.</figcaption>
</figure>

<p><strong>Would I use this as my main Wi-Fi access point?</strong></p>
<p>Definitely not. Any half-decent router will out-perform this setup.</p>
<p><strong>Can it still be useful?</strong></p>
<p>Definitely. A crappy Wi-Fi AP is better than no AP.</p>
<h2 id="parts-list">
  <a class="heading-anchor" href="#parts-list">Parts list<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<ul>
<li>Orange Pi Zero SBC (512MB RAM)</li>
<li>Orange Pi Zero expansion board (adds two USB 2.0 ports)</li>
<li>Cheap case for the Orange Pi Zero</li>
<li>32GB Sandisk microSD card</li>
<li>TP-Link WN-722N USB Wi-Fi adapter</li>
<li>Official Raspberry Pi microUSB power adapter</li>
</ul>
<h2 id="update-2020-08-22">
  <a class="heading-anchor" href="#update-2020-08-22">Update (2020-08-22)<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>It&rsquo;s still working and is happily serving as a <em>temporary</em> Wi-Fi access point.</p>
<p>During additional testing I could also hit 40 Mbps speeds when testing in an environment with
far fewer competing Wi-Fi access points nearby.</p>
<h2 id="update-2020-08-30">
  <a class="heading-anchor" href="#update-2020-08-30">Update (2020-08-30)<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>It&rsquo;s still running well and it seems that it won&rsquo;t be a simple temporary
solution after all.</p>
<h2 id="update-2020-11-30-approximately">
  <a class="heading-anchor" href="#update-2020-11-30-approximately">Update (2020-11-30, approximately)<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This setup has now been retired. It had 0 issues throughout its lifespan as a Wi-Fi access point, but I replaced
it with a more standard Wi-Fi access point so that this board can be used somewhere else.</p>
<p>The setup did surprisingly well and even survived nightly automated updates and restarts, which can be attributed to the good
work that <a href="https://www.armbian.com/">the Armbian project</a> has done.</p>
]]></content:encoded></item></channel></rss>