<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.1">Jekyll</generator><link href="https://euroquis.nl/feed.xml" rel="self" type="application/atom+xml" /><link href="https://euroquis.nl/" rel="alternate" type="text/html" /><updated>2026-02-03T17:15:26+01:00</updated><id>https://euroquis.nl/feed.xml</id><title type="html">[bobulate]</title><subtitle>My personal site of programming, C++, baking, KDE and FreeBSD things.</subtitle><entry><title type="html">GPG Update 2026</title><link href="https://euroquis.nl/blabla/2026/02/03/gpg.html" rel="alternate" type="text/html" title="GPG Update 2026" /><published>2026-02-03T00:00:00+01:00</published><updated>2026-02-03T00:00:00+01:00</updated><id>https://euroquis.nl/blabla/2026/02/03/gpg</id><content type="html" xml:base="https://euroquis.nl/blabla/2026/02/03/gpg.html"><![CDATA[<p>A recent toot of mine got the response “friends don’t let friends use GPG” which,
I suppose, is true enough. It certainly isn’t the attestation-friendly thing to use,
and the opsec failures that are so easy with GPG-encrypted mail make it a hazard there.
But for some things it’s all we’ve got, and I do like to sign Calamares releases
and incidental FreeBSD things. And I <strong>am</strong> nominally the maintainer of the
<code class="language-plaintext highlighter-rouge">security/gnupg</code> port on FreeBSD. So <a href="https://gpg.fail/">gpg.fail</a> notwithstanding,
here’s notes on my 2026 GPG key update.</p>

<p>Previously in <a href="https://euroquis.nl/blabla/2024/07/31/gpg.html">2024</a> and <a href="https://euroquis.nl/blabla/2025/03/01/gpg.html">2025</a> I wrote down basically the same things:</p>

<ul>
  <li>Things expire in about 13 months and I’ll have to remember then again,</li>
  <li>You can find my pubkey published on my <a href="https://euroquis.nl/about/">personal</a> and <a href="https://cnossos.nl/about/">business</a> sites,</li>
  <li>FreeBSD signature information is used rarely, but is available
in the <a href="https://docs.freebsd.org/en/articles/pgpkeys/#_adriaan_de_groot_adridgfreebsd_org">FreeBSD developers OpenPGP keys list</a>,</li>
  <li>Codeberg will have signed commits in the <a href="https://codeberg.org/Calamares/calamares">Calamares repository</a> with these keys.</li>
</ul>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sec   rsa4096/0x7FEA3DA6169C77D6 2016-06-11 [SC] [expires: 2027-02-03]
      Key fingerprint = 00AC D15E 25A7 9FEE 028B  0EE5 7FEA 3DA6 169C 77D6
uid                   [ultimate] Adriaan de Groot &lt;groot@kde.org&gt;
uid                   [ultimate] Adriaan de Groot &lt;adriaan@bionicmutton.org&gt;
uid                   [ultimate] Adriaan de Groot &lt;adridg@freebsd.org&gt;
uid                   [ultimate] Adriaan de Groot &lt;adriaan@commonscaretakers.com&gt;
ssb   ed25519/0x55734316C0AE465B 2025-03-04 [S] [expires: 2026-08-26]
ssb   cv25519/0x064A54E8D698F287 2025-03-04 [E] [expires: 2026-08-26]
ssb   ed25519/0x14B6CC381BC256D6 2026-02-03 [S] [expires: 2027-02-28]
ssb   cv25519/0xD716006BBA771051 2026-02-03 [E] [expires: 2027-02-28]
</code></pre></div></div>]]></content><author><name>adridg</name></author><category term="BlaBla" /><summary type="html"><![CDATA[A recent toot of mine got the response “friends don’t let friends use GPG” which, I suppose, is true enough. It certainly isn’t the attestation-friendly thing to use, and the opsec failures that are so easy with GPG-encrypted mail make it a hazard there. But for some things it’s all we’ve got, and I do like to sign Calamares releases and incidental FreeBSD things. And I am nominally the maintainer of the security/gnupg port on FreeBSD. So gpg.fail notwithstanding, here’s notes on my 2026 GPG key update.]]></summary></entry><entry><title type="html">Ooo, what does this disk do?</title><link href="https://euroquis.nl/freebsd/2026/01/29/disk.html" rel="alternate" type="text/html" title="Ooo, what does this disk do?" /><published>2026-01-29T00:00:00+01:00</published><updated>2026-01-29T00:00:00+01:00</updated><id>https://euroquis.nl/freebsd/2026/01/29/disk</id><content type="html" xml:base="https://euroquis.nl/freebsd/2026/01/29/disk.html"><![CDATA[<p>I have a pile of hard drives. 3.5” Spinning rust. There’s like a dozen of them,
some labeled cryptically (<em>EBN D2</em>), some infuriatingly (<em>1</em>) and
some not-at-all. Probably most of them work. But how to effectively figure
out what is on them? FreeBSD to the rescue.</p>

<h3 id="hotplug-just-works">Hotplug Just Works</h3>

<p>All the drives are SATA. I do have an IDE drive, I use it for opening beer bottles. And an ST-225
for old-time’s sake. But SATA it is, and there’s spare SATA data- and power-cables dangling out the
side of my PC. This particular machine runs FreeBSD 14.3, and connecting a drive (data first, then power)
yields some messages in the system log. Old-school, the command to read these is still <code class="language-plaintext highlighter-rouge">dmesg</code>,
which prints:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ada3 at ahcich0 bus 0 scbus0 target 0 lun 0
ada3: &lt;WDC WD3200AAKS-00SBA0 12.01B01&gt; ATA-7 SATA 2.x device
ada3: Serial Number WD-WMAPZ0561055
ada3: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)
ada3: Command Queueing enabled
ada3: 305245MB (625142448 512 byte sectors)
</code></pre></div></div>

<p>That matches information printed on the label of the disk (this drive is from 2007, has a <em>1</em>
written on it in black marker – it may have been a drive in the English Breakfast Network server back then).
It also tells me that the disk is registered with the system as <em>ada3</em>.</p>

<p>FreeBSD’s disk subsystem is a stack of “GEOM classes”. The <code class="language-plaintext highlighter-rouge">geom(4)</code> manpage tells me
that it is a <em>modular disk I/O	request	transformation framework</em>, but the important bit is <code class="language-plaintext highlighter-rouge">geom(8)</code>, the command to query the disk subsystem.
Running <code class="language-plaintext highlighter-rouge">geom disk list ada3</code> tells me what is known about disks involved with <em>ada3</em>. This actually doesn’t tell
me much I don’t already know:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Geom name: ada3
Providers:
1. Name: ada3
   Mediasize: 320072933376 (298G)
   Sectorsize: 512
   Mode: r0w0e0
   descr: WDC WD3200AAKS-00SBA0
   lunid: 50014ee0aabd8fe3
   ident: WD-WMAPZ0561055
   rotationrate: unknown
   fwsectors: 63
   fwheads: 16
</code></pre></div></div>

<p>Well, actually this tells me that the <code class="language-plaintext highlighter-rouge">dmesg</code> and <code class="language-plaintext highlighter-rouge">geom</code> output are in mibi- and gibi-bytes, and that they’re consistent.
How about partitions on this disk, though? <code class="language-plaintext highlighter-rouge">geom part list ada3</code> tells me (here I’ve removed several partitions, along with many other lines that are not very useful right now; the output is extensive):</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Geom name: ada3
scheme: GPT
Providers:
1. Name: ada3p1
   Mediasize: 819200 (800K)
   efimedia: HD(1,GPT,a43a2da3-bb5f-11e5-8d81-f5e4d894ddb1,0x22,0x640)
   label: (null)
   type: efi
   index: 1
2. Name: ada3p2
   Mediasize: 315679277056 (294G)
   efimedia: HD(2,GPT,a43c9069-bb5f-11e5-8d81-f5e4d894ddb1,0x662,0x24bff9c0)
   label: (null)
   type: freebsd-ufs
   index: 2
</code></pre></div></div>

<p>So it is a GPT-partitioned disk, and at least one of the partitions is an “old-fashioned” UFS partition.
That’s FreeBSD before ZFS became the <em>de-facto</em> standard filesystem (maybe just for me). This disk is simple
to deal with (further notes below)!</p>

<p>After I’m done with the disk, I power it down first with
<code class="language-plaintext highlighter-rouge">camcontrol standby ada3</code>. I can hear the disk stop spinning
and then pull out the connectors (power first, then data). And move on to
the next disk. After disconnecting, <code class="language-plaintext highlighter-rouge">dmesg</code> confirms that I unplugged the correct drive:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ada3 at ahcich0 bus 0 scbus0 target 0 lun 0
ada3: &lt;WDC WD3200AAKS-00SBA0 12.01B01&gt; s/n WD-WMAPZ0561055 detached
(ada3:ahcich0:0:0:0): Periph destroyed
</code></pre></div></div>

<p>This way I can step through all of the drives in my pile and then jot down
what disk does what (or, in rare cases, decide they can be zeroed out and
re-used for something else).</p>

<h3 id="dealing-with-non-gpt-disks">Dealing with non-GPT disks</h3>

<p>The <em>scheme</em> reported by <code class="language-plaintext highlighter-rouge">geom part list</code> is GPT if you’re sensible,
but of course it is possible to bump into MBR and BSD disklabels
as well. The <code class="language-plaintext highlighter-rouge">geom</code> subsystem abstracts all that away, and the only
realy difference is the names of devices.</p>

<p>Scheme <em>BSD</em>, also known as BSD disklabel, 
gives you <code class="language-plaintext highlighter-rouge">ada3a</code> and <code class="language-plaintext highlighter-rouge">ada3d</code>, rather than numbered partitions.
It is possible to apply this to a whole disk. It is also possible to
have a BSD disklabel inside an MBR partition, but that’s a late-90s kind of setup.</p>

<p>Scheme <em>MBR</em> gives you numbered partitions, but FreeBSD calls these <em>slices</em>
instead of partitions and so you end up with <code class="language-plaintext highlighter-rouge">ada3s1</code> instead of <code class="language-plaintext highlighter-rouge">ada3p1</code>.</p>

<h3 id="dealing-with-ufs">Dealing with UFS</h3>

<p>UFS partitions are pretty simple: mount them somewhere and things will be OK.
I go for read-only, and I have a <code class="language-plaintext highlighter-rouge">/mnt/tmp</code> for all my arbitrary-disk-mounting activity.
So <code class="language-plaintext highlighter-rouge">mount -o ro /dev/ada3p2 /mnt/tmp</code> it is (<em>ada3p2</em> is the partition name found earlier).</p>

<blockquote>
  <p>This particular disk turned out to be my main workstation drive around 2017,
with a handful of still-interesting files on it. Ones I would not have missed
if I hadn’t looked, but it was nice to find a presentation PDF I gave
to SIDN once-upon-a-time.</p>
</blockquote>

<p>After looking, <code class="language-plaintext highlighter-rouge">umount /mnt/tmp</code> to unmount and release the disk.
After that, power-down and disconnect as described above.</p>

<h3 id="dealing-with-zfs">Dealing with ZFS</h3>

<p>Slightly newer disks might be ZFS. Here’s the partition information for one:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Providers:
1. Name: ada3p1
   Mediasize: 250059309056 (233G)
   label: backup0
   type: freebsd-zfs
   index: 1
</code></pre></div></div>

<p>It’s a GPT partition with a label, and ZFS on it. That means it’s part of a ZFS pool,
and is <strong>probably</strong> referred to within the pool by its label. Possibly by its ID.
In any case, ZFS needs to be imported, not mounted, because the filesystems
are contained as part of the storage pool. The command to discover what is
available is <code class="language-plaintext highlighter-rouge">zpool import</code> , which doesn’t actually import anything.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>   pool: zbackup
 config:
        zbackup        ONLINE
          gpt/backup0  ONLINE
</code></pre></div></div>

<p>That’s encouraging: the pool consists of a single drive and everything is online.
To make the filesystems in this pool available, I need to import it. I’ll 
force it (<code class="language-plaintext highlighter-rouge">-f</code>, because it was probably untimely ripp’d from whatever machine it was
in previously), without mounting any of the filesystems in it (<code class="language-plaintext highlighter-rouge">-N</code>), readonly
(<code class="language-plaintext highlighter-rouge">-o readonly=on</code>) with a temporary name (<code class="language-plaintext highlighter-rouge">-t zwhat</code>), like so: <code class="language-plaintext highlighter-rouge">zpool import -f -N -o readonly=on -t zbackup zwhat</code></p>

<p>After importing the pool, <code class="language-plaintext highlighter-rouge">zfs list</code> tells me what filesystems are available:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>zwhat                       36.2G   189G    25K  /zwhat
zwhat/home                  36.2G   189G  36.0G  /tmp/foo/
</code></pre></div></div>

<p>I can mount a single ZFS filesystem just like a UFS filesystem.
The ZFS filesystem knows where it would want to be mounted (<code class="language-plaintext highlighter-rouge">/tmp/foo</code>, I have <strong>no</strong>
idea what I was doing back then), but we can treat it like a legacy filesystem:
<code class="language-plaintext highlighter-rouge">mount -t zfs zwhat/home /mnt/tmp</code></p>

<p>After looking, <code class="language-plaintext highlighter-rouge">umount /mnt/tmp</code> to unmount and release the disk.
After that, power-down and disconnect as described above.</p>

<h3 id="dealing-with-linux-ext4">Dealing with Linux ext4</h3>

<p>If the disk comes from a Linux machine, then it may have an ext4 filesystem on it.
I still usually pick that when installing Linuxes. Here’s the partition
information for one:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>scheme: MBR
Providers:
2. Name: ada3s2
   Mediasize: 64428703744 (60G)
   rawtype: 131
   type: linux-data
</code></pre></div></div>

<p>There is ext4 support in the FreeBSD kernel, although it is named ext2
(and some ext4 filesystems use unsupported features, and then it won’t mount).
But for simple cases: <code class="language-plaintext highlighter-rouge">mount -o ro -t ext2fs /dev/ada3s2 /mnt/tmp</code> does the job.</p>

<h3 id="dealing-with-linux-raid">Dealing with linux-raid</h3>

<p>I found two disks, both WD Caviar Blue, labeled <em>EBN D1</em> and <em>EBN D2</em> with similar layouts.
Those are <em>linux-raid</em> disks, and this is something I can’t deal with in FreeBSD.
Heck, I’m not confident I can deal with them under Linux anymore, either.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Providers:
1. Name: ada3s1
   Mediasize: 493928031744 (460G)
   efimedia: HD(1,MBR,0xa8a8a8a8,0x3f,0x398033d3)
   rawtype: 253
   type: linux-raid
</code></pre></div></div>

<h3 id="re-purposing-disks">Re-purposing Disks</h3>

<p>KDE has a lovely partitioning tool, but I wouldn’t be me if I didn’t go for the command-line approach.
Make sure the disk isn’t mounted anywhere,
but is powered up.</p>

<p>Zero out the first gigabyte or so of the disk: <code class="language-plaintext highlighter-rouge">dd if=/dev/zero of=/dev/ada3 bs=1M count=1024</code>
I guess this isn’t strictly necessary, and  <code class="language-plaintext highlighter-rouge">geom</code> warns during this operation that the
GPT is corrupt and the backup GPT (at the other end of the disk) should probably be used. Ignore that.</p>

<p>Destroy the partition table some more: <code class="language-plaintext highlighter-rouge">geom part destroy -F ada3</code> , now it is really dead.</p>

<p>Make a new GPT partition table on the disk: <code class="language-plaintext highlighter-rouge">geom part create -s gpt ada3</code></p>

<p>Start adding partitions to the partition table. I (now) use labels with the last digits of the drive’s serial-number.
This drive gets a gigabyte of swap (just in case) and the rest is a ZFS partition which I can add to a pool later.</p>
<ul>
  <li><code class="language-plaintext highlighter-rouge">geom part add -t freebsd-swap -s 1G -l swap-159666 ada3</code></li>
  <li><code class="language-plaintext highlighter-rouge">geom part add -t freebsd-zfs -l zfs-159666 ada3</code></li>
</ul>

<p>Why the labels-with-serial-numbers? Well, that’s so that I can subsequently create a ZFS pool
from labeled partitions, and it remains obvious where the parts of the pool come from
and <strong>also</strong> prevents name-collisions from naming everything <code class="language-plaintext highlighter-rouge">backup0</code> and so.</p>]]></content><author><name>adridg</name></author><category term="FreeBSD" /><summary type="html"><![CDATA[I have a pile of hard drives. 3.5” Spinning rust. There’s like a dozen of them, some labeled cryptically (EBN D2), some infuriatingly (1) and some not-at-all. Probably most of them work. But how to effectively figure out what is on them? FreeBSD to the rescue.]]></summary></entry><entry><title type="html">In praise of memory-leak-detection</title><link href="https://euroquis.nl/kde/2026/01/24/memory.html" rel="alternate" type="text/html" title="In praise of memory-leak-detection" /><published>2026-01-24T00:00:00+01:00</published><updated>2026-01-24T00:00:00+01:00</updated><id>https://euroquis.nl/kde/2026/01/24/memory</id><content type="html" xml:base="https://euroquis.nl/kde/2026/01/24/memory.html"><![CDATA[<p>Nicolas Fella wrote a bit about enabling <a href="https://nicolasfella.de/posts/detecting-leaks-in-kde-ci/">memory leak detection in KDE CI</a>,
and I thought I’d add some comments from a different software engineering environment (e.g. my work-work).</p>

<h3 id="guidelines-for-memory-management">Guidelines for Memory Management</h3>

<p>At work-work, we have a slightly peculiar software environment:</p>
<ul>
  <li>Bleeding edge C++ use – C++23 if possible, 26 features being experimented-with – and a strong reliance on C++
language and library features. Use C++ containers, <code class="language-plaintext highlighter-rouge">std::string</code> (with an <em>*implicit</em> “here be UTF-8-encoded
strings”), <code class="language-plaintext highlighter-rouge">std::jthread</code>, business-logic in standard C++ wherever possible.</li>
  <li>Qt 5.6.3, from 2017, for UI code. That’s pre-C++17.</li>
</ul>

<p>This leads to two guidelines about memory-management in our application:</p>
<ul>
  <li>Use Qt’s memory model and ownership <strong>only</strong> for <code class="language-plaintext highlighter-rouge">QWidget</code>’s inheritance tree,</li>
  <li>.. well, ok, incidentally for things inheriting from <code class="language-plaintext highlighter-rouge">QObject</code>.</li>
  <li>Use C++ resource management for all other memory-management.</li>
</ul>

<p>This does mean that depending on where in the codebase you’re working,
you either have to be a “C++ purist” (as Nico puts it)
or a “Qt pragmatist” (as I’ll phrase it).
Note that the guideline is not “use smart pointers”, because that last guideline can
deconstructed a little (it wouldn’t surprise me if this was inspired by Klaus Iglberger):</p>
<ul>
  <li>If a class manages a resource, then that resource-management should be the <strong>only</strong> thing it does,</li>
  <li>If an object needs resources, then those resources should be members (sub-objects) of a class as above.</li>
</ul>

<p>Often that means that memory-management is in the hands of <code class="language-plaintext highlighter-rouge">std::unique_ptr</code>, but
<code class="language-plaintext highlighter-rouge">std::vector</code> does the job also. We have a handful of other classes for resource-management
as well, like a wrapper for <code class="language-plaintext highlighter-rouge">FILE *</code> for those places where we need to interact with
C’s <code class="language-plaintext highlighter-rouge">stdio</code> library. Granted, <code class="language-plaintext highlighter-rouge">FILE *</code> is probably not a source of memory-leaks, but
it <strong>is</strong> a managed resource, and forgetting one will lead to leaking file-descriptors in the long run.</p>

<h3 id="leaky-libraries">Leaky Libraries</h3>

<p>Dealing with memory leaks can be difficult <strong>particularly</strong> when they happen in
libraries not under your control. As an example, I wrote this program (
headers elided for brevity) which is a Qt5 program:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>int main(int argc, char **argv)
{
  QApplication a(argc, argv);
  QTimer::singleShot(5000, qApp, &amp;QApplication::quit);
  return a.exec();
}
</code></pre></div></div>

<p>This is, like, the simplest Qt5 program. It sits there for five seconds and then quits.
It also leaks 1662 bytes of memory, in 19 allocations, according to my ASAN output.
They leak from allocations done in <code class="language-plaintext highlighter-rouge">libQt5Core</code>. Adding a <code class="language-plaintext highlighter-rouge">QLabel</code> and displaying some
text adds leaks in <code class="language-plaintext highlighter-rouge">libfontconfig</code>, and the leaks keep accumulating as more libraries enter the mix.</p>

<p>Granted, none of these leaks are large. I’m not even sure that they are impolite,
but they’re there and it makes tracking down leaks in <strong>my</strong> code harder, because
there’s some baseline of leakage that I need to ignore. Filtering out the
noise becomes a serious undertaking.</p>

<h3 id="takeaway">Takeaway</h3>

<p>Chasing all the memory-leaks is hard. Chasing any leaks in KDE Frameworks is something
I can only applaud.</p>]]></content><author><name>adridg</name></author><category term="KDE" /><summary type="html"><![CDATA[Nicolas Fella wrote a bit about enabling memory leak detection in KDE CI, and I thought I’d add some comments from a different software engineering environment (e.g. my work-work).]]></summary></entry><entry><title type="html">Debian SBuild for FreeBSD People</title><link href="https://euroquis.nl/freebsd/2026/01/14/debian.html" rel="alternate" type="text/html" title="Debian SBuild for FreeBSD People" /><published>2026-01-14T00:00:00+01:00</published><updated>2026-01-14T00:00:00+01:00</updated><id>https://euroquis.nl/freebsd/2026/01/14/debian</id><content type="html" xml:base="https://euroquis.nl/freebsd/2026/01/14/debian.html"><![CDATA[<p>For other-$WORK I am doing a bit of Debian packaging (prep-work) and upstream wrangling
to bring some projects into a more-modern world. So now I have a Debian 13 workstation and
need to build things for Debian Unstable without breaking my host system.
On FreeBSD, this is a job for <a href="https://docs.freebsd.org/en/books/porters-handbook/testing/#testing-poudriere">Poudriere</a>. Here’s my notes on how I do something half-assedly similar on Debian (as usual, mostly documentation for “future me”).</p>

<blockquote>
  <p>As an example of something I’m updating, <em>libaccounts</em> is one.
<a href="https://nicolasfella.de/posts/a-new-online-accounts-system/">KDE is moving away from it</a>,
but there are other consumers.</p>
</blockquote>

<p>The “Poudriere-alike” for Debian seems to be
<a href="https://wiki.debian.org/sbuild">SBuild</a>, and the instructions are
quite extensive. 
For my rinky-dink use, though, the <em>setup</em> section is mostly-enough.</p>

<p>Start with a plain Debian 13 (<em>Trixie</em>) installation. I have one with KDE Plasma 6 Wayland
on it, which is quite nice.</p>

<h3 id="creating-a-tarball">Creating a Tarball</h3>

<p>These commands verbatim from the SBuild instructions, as my own local user:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt install sbuild mmdebstrap uidmap
mkdir -p ~/.cache/sbuild
mmdebstrap \
  --include=ca-certificates,cmake,git,gnupg,libqt6widgets6,libqt5widgets5 \
  --skip=output/dev \
  --variant=buildd \
  unstable \
  ~/.cache/sbuild/unstable-amd64.tar.zst \
  https://deb.debian.org/debian
</code></pre></div></div>

<p>This creates a tarball. The tarball includes whatever you tell it to install additionally –
so I have a couple of typical-Qt-developer things listed.</p>

<blockquote>
  <p>This list isn’t <strong>nearly</strong> complete for anything like “Qt5 and Qt6 parallel-development”,
because it is missing <code class="language-plaintext highlighter-rouge">-dev</code> packages and <code class="language-plaintext highlighter-rouge">qmake</code> and many other things.
Debian packaging naming is an exercise in inconsistency, IMO, so it is
always an adventure to figure out what I need.</p>
</blockquote>

<p>The steps above are sort-of like creating a “base jail” in Poudriere.
The tarball is a basic Debian Unstable that can be unpacked anywhere
(creating a “jail”) and then used for whatever development work is needed.
Unlike a jail, the unpacked tarball is just a <a href="https://www.man7.org/linux/man-pages/man1/chroot.1.html">chroot(1)</a>, so it doesn’t have special networking or other restrictions.</p>

<p>The chroot, once unpacked, is <strong>persistent</strong>. That means that stuff that is installed
in it remains there and is available later. I don’t need to care about disk
space, so it’s fine to litter my filesystem with multiple chroots, one for each
project.</p>

<h3 id="extracting-tarball">Extracting Tarball</h3>

<p>Create a place for the chroot of a project, and extract the tarball there:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mkdir -p ~/src/chroot-libaccounts
sudo tar x --zstd -f ~/.cache/sbuild/unstable-amd64.tar.zst -C ~/src/chroot-libaccounts
</code></pre></div></div>

<blockquote>
  <p>GNU tar doesn’t have the advanced features of BSD tar which automatically
understands the compression, so it needs to be specified by hand.</p>
</blockquote>

<p>To enter the chroot, use <code class="language-plaintext highlighter-rouge">sudo chroot ~/src/chroot-libaccounts</code>. Since it’s persistent,
it is probably worthwhile to update and upgrade it and maybe install additional
packages, or whatever else one does with a Debian system.</p>

<h3 id="using-a-chroot-with-external-sources">Using a chroot with external sources</h3>

<p>Inside the chroot is where builds happen.
Outside the chroot is where the source lives, so I need to mount the source
directory of whatever I’m working on, in the chroot. I do so before entering
the chroot.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo mkdir ~/src/chroot-libaccounts/home/src
sudo mount --bind ~/src/libaccounts-qt/ ~/src/chroot-libaccounts/home/src
sudo chroot ~/src/chroot-libaccounts
</code></pre></div></div>

<h3 id="why-not-docker">Why not Docker?</h3>

<p>Now that I’ve written this down in this detail, I realize that a suitable
Docker image and container might have been what I was looking for.
Well, almost: <strong>persistence</strong> is a thing. It’s a feature of Docker that
the container re-starts in a pristine state every time. It’s an anti-feature
for what I’m doing here. There’s ways of dealing with that, and I do so at $WORK.
But not for this project.</p>]]></content><author><name>adridg</name></author><category term="FreeBSD" /><summary type="html"><![CDATA[For other-$WORK I am doing a bit of Debian packaging (prep-work) and upstream wrangling to bring some projects into a more-modern world. So now I have a Debian 13 workstation and need to build things for Debian Unstable without breaking my host system. On FreeBSD, this is a job for Poudriere. Here’s my notes on how I do something half-assedly similar on Debian (as usual, mostly documentation for “future me”).]]></summary></entry><entry><title type="html">2025 Musically Wrapped</title><link href="https://euroquis.nl/blabla/2026/01/13/wrapped-2025.html" rel="alternate" type="text/html" title="2025 Musically Wrapped" /><published>2026-01-13T00:00:00+01:00</published><updated>2026-01-13T00:00:00+01:00</updated><id>https://euroquis.nl/blabla/2026/01/13/wrapped-2025</id><content type="html" xml:base="https://euroquis.nl/blabla/2026/01/13/wrapped-2025.html"><![CDATA[<p>I have a paper calendar. It hangs on the wall. I draw things on it, like 🎜 Kladderadatch, to remind me where to go of an evening (or this afternoon). At the end of the year, with that calendar and my ticket history from Doornroosje
(a music podium in Nijmegen) I can reconstruct my concert visits of the year. Here’s my year wrapped.</p>

<ul>
  <li><em>Roos Rebergen &amp; SunSun Orchestra</em> Roos is always really peculiar, and did not fail to deliver. The classical string quintet as band worked well. It’s quite different from her pop recordings. I saw Roos in 2006 or so when she played in a local school, and it’s always stayed with me.</li>
  <li><em>Politie Warnsveld + Misprint</em> POPO! It’s like <em>Doe Maar</em> has reincarnated. Happy ska, although now they have a bigger setlist it is a little less wild. This was also a sad concert because of the death of a concert-friend – she was a big POPO fan – in an accident a few months earlier.</li>
  <li><em>De Kift</em> “Ik heb rood haar, en lees wel eens gedichten” It’s a punk-jazz-improv group. Live they’re weird, but I did miss listening to the actual words.</li>
  <li><em>Parker Millsap</em> Blues country, now as a solo show instead of with a band.</li>
  <li><em>Stippenlift</em> Dutch-language electro-pop about his depression.</li>
  <li><em>ELUCID</em> Rap, old-school.</li>
  <li><em>Dorpsstraat 3</em> Dutch indie.</li>
  <li><em>The Vices</em> I’m pretty sure that during this concert I ended up thinking about the font-kerning in their logo, more than the music. Meh.</li>
  <li><em>Rats on Rafts</em> I have no real recollection, it might have been boring.</li>
  <li><em>Ghost Funk Orchestra</em> Jazz. If you asked me beforehand about a trombone solo, I would have said “probably boring”. Afterwards, fuck yeah! Trombone solo! They were amazing on stage.</li>
  <li><em>Girls to the Front</em> A triple show with <em>L.A. Sagne</em>, <em>Death Sells</em> and <em>C’est Qui?</em> I’ve seen <em>Death Sells</em> a couple times after, they’re fun and personable.</li>
  <li><em>De Roos van Nijmegen</em> is a yearly battle-of-the-bands, and I go with the kids, and we Have Opinions about things. It’s spread across 3 nights and the finals. I voted for <em>PORTRAY</em>. I thought <em>Grandad</em> was pretty good in the first round, and boring in the finals. The peeps from <em>Pomme Grenade</em> are the ones I run into around town most often. <em>Liz Beekman</em> was, as singer-songwriter, the odd-one-out in the first round, but I quite liked both her music and relaxed podium presence.</li>
  <li><em>The Ex + Brader Mûsikî</em> More punk-jazz. Brader was a totally new Kurdish-language experience for me. The Ex was weird and experimental and the broad grin on the drummer’s face as she puts in more cowbell in <em>The Apartment</em> was magical.</li>
  <li><em>Tramhaus</em> had a lot of social message that I agree with, but not amazing.</li>
  <li><em>Place to Bury Strangers</em> I saw them in “old” Doornroosje, with my friend Armijn who described them as “ear-bleedingly loud”. Regulations prevent that now, but they were great and the round-through-the-crowd is a lot of fun to be part of.</li>
  <li><em>Elephant</em> is a big-ish name and had a lot of radio play, so that’s why got tickets. I have no real recollection, it might have been boring.</li>
  <li><em>KNIVES</em> Absolutely wild live-show, amazing energy. I told them I thought they were “amazeballs” after the show, they called me “old”. Love you too! I was here also because of <em>Death Sells</em> opening.</li>
  <li><em>Crash Fest</em> Organized by <em>Outahead</em> – an indie band that don’t do it for me – but I went because <em>Lodyne</em> and <em>Death Sells</em> were playing and I’m into naked bass players.</li>
  <li><em>Alice Faye</em> The first of a week of singers-songwriters. I don’t remember anything particular, but I do know I liked it for being a relaxed night out instead of sweaty and loud.</li>
  <li><em>Tara Nome Doyle</em> Second one of singers-songwriters. I remember her being very chatty and open about the songwriting process and what things were about. That’s one of the nice things in a really small venue, the artists are there and all themselves.</li>
  <li><em>Stereolab</em> The crowd was all fans, who could sing along with every song. I could tell they were having a ball, but it did not land at all for me.</li>
  <li><em>Heather Nova</em> in the park, in the rain, with a rainbow, with ducks waddling across the stage, and a spider that dropped onto her hand during <em>Like a Hurricane</em>. As a consummate performer, she put the spider away and picked up the chorus again.</li>
  <li><em>The Hard Quartet</em> This is a supergroup, I guess you could call it. I saw <em>Pavement</em> back in the day, and when Stephen is at the mike, it’s like a <em>Pavement</em> song. And when someone else takes over, it’s a different band. This was good to see for being a bunch of really experienced and work-well-together musicians.</li>
  <li><em>Bassolino</em> Italian funk. It was funky, but the funk did not reach my hips. I’m way too much a white boy for that – put me in a mosh pit instead.</li>
  <li><em>Magic Bullet</em> I have no recollections of again. It was possibly boring.</li>
  <li><em>Rosalie Cunningham</em> I did not expect a ’70s hardrock revival on stage. It was amazing. She has wonderful eyes. Roscoe can sing that one song pretty good. And it was a party for all.</li>
  <li><em>Dick Move</em> More punk bands should sell hot pink T-shirts. This was a blast.</li>
  <li><em>Preoccupations</em> I figured “band from Calgary”. There was a Flames T-shirt on-stage. They did their thing. They left. Very little interaction with the audience.</li>
  <li><em>Misprint</em> They were with POPO earlier this year, and I kept bumping into their bass player at other concerts, so it was the least I could do get tickets for their own show. Kind of middle-of-the-road, good enough.</li>
  <li><em>Early James</em> Blues from Alabama. He did a nice closing number with his girlfriend, it worked pretty well as a duet.</li>
  <li><em>Gill Landry</em> Blues from Louisiana. This was very personal, and you can tell Gill was a street performer before moving on to the stage. One to re-visit if he comes back.</li>
  <li><em>Joachim Cooder</em> Son-of-Ry, playing an electric thumb piano. This was very much not what I expected. It was interesting, and I told him “peculiar” after the show, but I’m afraid it did not get my feet a-tappin’.</li>
  <li><em>Frazey Ford</em> Was she drunk? It took forever before the show gelled a little, but it never really moved.</li>
  <li><em>Leith</em> Singer-songwriter. Blue eyes that stare right through your soul. I really enjoyed this show, and the openers, <em>Robinson Kirby</em>, were fun as well.</li>
  <li><em>DITZ</em> Fucking well tore the house down. Her with the boots has an amazing command of the audience, the pit was wild, the communion weird and disconcerting. <em>KNIVES</em> opened here, but did not get nearly the same response as earlier in the year (in a different venue, must be said).</li>
  <li><em>zZz</em> These guys I saw when they – and I – had no grey hairs and I remember them jumping up and down on the organ and it was loud and chaotic. They still are, although with a bad back climbing on stuff is no longer an option.</li>
  <li><em>Vals Alarm</em> Punk with too much backing track. Gotta hand it to them, though, with your parents in the audience belting out “I wanna fuck some new boys / I need a new dick / new dick” takes some courage.</li>
  <li><em>De Niemanders</em> This is a collective that brings singers from refugee centers in the Netherlands to the stage. With a gospel couple, and a good backing band, we can see what talent we’re squandering. I don’t know the names of the individual performers though. <em>Ahm</em> has amazing sustain. <em>Habibi</em> from Yemen, I think, is such a cute boy with an excellent delivery.</li>
  <li><em>Black Bottle Riot</em> Does a end-of-year show every year in Nijmegen. Packed house, almost all fans. Random people come up to talk with you. Sabine from Zeeland, it was good to meet you. This show was almost three hours, and one big party. It’s good to have something to plan again in 360 days or so.</li>
</ul>

<p>Not in Nijmegen:</p>
<ul>
  <li><em>Black Country New Road</em> In Paradiso, Amsterdam. I’m clearly spoiled by easy-going Nijmegen, because I thought the venue was annoying. And every song was .. not quite it. Nothing landed, and the feels-like-American-film-music makes me unhappy. Where there was a neat idea (five recorders? sure, woodwind quintet) it was executed in a too-limited way. Bit of a disappointment, but the openers, <em>Westside Cowboy</em>, were fun.</li>
  <li><em>West Side Story</em> in Rome. Man, the story is paper-thin, even if the singers were excellent. The only fun I had here was realizing that “having problems with the PRs” is not a GitHub thing.</li>
  <li>Opera school in Arezzo. There’s an opera school, students come from the United States to learn to sing an Italian opera, and execute it in the square. Stories still paper-thin, but such is operetta as an art form. I learned that “learn to sing” means “make the right sounds”, because the students could not actually speak Italian.</li>
</ul>

<p>Ones I missed (but did have tickets):</p>
<ul>
  <li><em>Spinvis</em> I was doing drywall and at 10pm remembered I had tickets to a one-off special show in Kleve. I had bought them a couple of days previous and hadn’t written it down.</li>
  <li><em>Felipe Baldomir</em> Singer-songwriter week, but I was sick.</li>
  <li><em>Hackensaw Boys</em> Bluegrass, but I was sick.</li>
</ul>

<p>That’s 46 concerts this year. I do try to see something every week. In principle I don’t listen to stuff in advance, I just go and find out what it is once the band starts. I have a strong preference for Merleyn, the smallest of the Doornroosje venues,
because everything is close-by and personal. The beer is better there, also. Punk has the best odds of making me happy on an evening, but I’m glad I go to random other stuff to broaden my horizons. I have punk, jazz, ska and rap lined up for the next three months, and also <em>Green Milk from the Planet Orange</em>, whatever genre that is.</p>]]></content><author><name>adridg</name></author><category term="BlaBla" /><summary type="html"><![CDATA[I have a paper calendar. It hangs on the wall. I draw things on it, like 🎜 Kladderadatch, to remind me where to go of an evening (or this afternoon). At the end of the year, with that calendar and my ticket history from Doornroosje (a music podium in Nijmegen) I can reconstruct my concert visits of the year. Here’s my year wrapped.]]></summary></entry><entry><title type="html">Carrot Cake Recipe</title><link href="https://euroquis.nl/blabla/2026/01/03/wortelcake.html" rel="alternate" type="text/html" title="Carrot Cake Recipe" /><published>2026-01-03T00:00:00+01:00</published><updated>2026-01-03T00:00:00+01:00</updated><id>https://euroquis.nl/blabla/2026/01/03/wortelcake</id><content type="html" xml:base="https://euroquis.nl/blabla/2026/01/03/wortelcake.html"><![CDATA[<p>This is a recipe post. I’ve written this one down before,
<a href="https://euroquis.nl/blabla/2010/01/05/new-years-recipes-2.html">in 2010</a>,
but this time I used a scale and some measurements that make more
sense in the Netherlands. Carrot cake in the Netherlands still elicits
exactly two reactions: <em>vies he?</em> and <em>oh, yummy!</em>. That rabbit still doesn’t get it.</p>

<blockquote>
  <p>For a vegan cake, use vegan egg (chia seed + some water). Kid[0] makes it that way sometimes,
but I have not tried it myself.</p>
</blockquote>

<p>Stir together:</p>
<ul>
  <li>200g grated carrots (about 4 <em>winterwortelen</em>)</li>
  <li>120g brown sugar</li>
  <li>10g koek en spekulaaskruiden (a standard-ish mix in the Netherlands, mostly cinnamon and some clove and ginger)</li>
  <li>a pinch of salt</li>
  <li>80g oil (if I hadn’t weighed this on a scale I would have said “nine goulou-goulous from the usual bottle”)</li>
</ul>

<p>Then beat in:</p>
<ul>
  <li>3 eggs</li>
  <li>60g raisins (optional)</li>
  <li>80g sunflower seeds (optional)</li>
</ul>

<p>Finally, stir in:</p>
<ul>
  <li>250g self-raising flour (<em>zelfrijzend bakmeel</em>, which is cheaper than flour in my supermarket)</li>
</ul>

<p>This is enough for a small-ish pie dish or baking dish. 
I have a 24x24cm square tray that is way too big.
The batter spreads too thin and it ends up baking too dry.
A smaller tray is better.</p>

<p>The batter looks dreadful and runny when you pour it in the baking dish.
Bake at 180℃ for 35 minutes or so.</p>]]></content><author><name>adridg</name></author><category term="BlaBla" /><summary type="html"><![CDATA[This is a recipe post. I’ve written this one down before, in 2010, but this time I used a scale and some measurements that make more sense in the Netherlands. Carrot cake in the Netherlands still elicits exactly two reactions: vies he? and oh, yummy!. That rabbit still doesn’t get it.]]></summary></entry><entry><title type="html">FreeBSD 14-to-15 Upgrade (Intel)</title><link href="https://euroquis.nl/freebsd/2026/01/03/freebsd.html" rel="alternate" type="text/html" title="FreeBSD 14-to-15 Upgrade (Intel)" /><published>2026-01-03T00:00:00+01:00</published><updated>2026-01-03T00:00:00+01:00</updated><id>https://euroquis.nl/freebsd/2026/01/03/freebsd</id><content type="html" xml:base="https://euroquis.nl/freebsd/2026/01/03/freebsd.html"><![CDATA[<p>This post has the notes I made while upgrading another laptop from FreeBSD 14 to FreeBSD 15.
Since my first upgrade was a long and annoying process, I figured I would take notes
for the second round.
These notes are “how not to do it”, even if the end-result is KDE Plasma Wayland on FreeBSD 15, as desired.</p>

<p>The laptop I have already upgraded is a Framework 13 with an AMD 7640U CPU and integrated AMD Radeon (Phoenix1) GPU. That ran into the problem that the <em>amdgpu</em> kernel driver would panic with the stock kernel. After building a world and kernel and packages of the driver that are all patched and consistent, the system works fine.</p>

<p>The laptop I’m going to upgrade is a Slimbook Base 14 with Intel i5-10210U and integrated Intel Comet Lake GT2 GPU. This laptop has a FreeBSD 14 install on it, but I’m pretty sure I never ran it as a laptop-daily-driver. This is my openSUSE laptop most of the time.</p>

<h3 id="preparations">Preparations</h3>

<p>There is no meaningful user data on the FreeBSD partition, so I’m not going to bother with a backup. The existing installation is on a UFS filesystem. It is running 14.0-CURRENT from .. um .. 2022. That’s probably going to need upgrades before I can even use the external ZFS NVMe drive to get to the 15-update.</p>

<ul>
  <li>Try to naively import the ZFS pool: fails because of missing features. (This was expected)</li>
  <li>Try to naively <code class="language-plaintext highlighter-rouge">freebsd-upgrade</code> to 14.3: fails because that tool is meant for release versions, and won’t stomp all over some random -CURRENT. (This is good, but annoying right now)</li>
  <li>Using ftp, fetch <code class="language-plaintext highlighter-rouge">base.txz</code> and <code class="language-plaintext highlighter-rouge">kernel.txz</code> for 14.3: that’s a 250MB download, which is pretty straightforward.</li>
</ul>

<p>So now I’m going to stomp all over everything, which is exactly what the tool is preventing me from doing. Why else would there be a <code class="language-plaintext highlighter-rouge">/rescue</code> directory?</p>

<ul>
  <li>Run <code class="language-plaintext highlighter-rouge">/rescue/tar xzf kernel.txz -C /</code> to clobber the kernel.</li>
  <li>Run <code class="language-plaintext highlighter-rouge">/rescue/tar xzf base.txz -C /</code> to clobber everything else except the things that have flag <em>schg</em> (The files that are <strong>really fucking important</strong>).</li>
  <li>For all the files that it complains about, run <code class="language-plaintext highlighter-rouge">/rescue/chflags noschg &lt;file&gt;</code> to assert dominance. Ignore all the warnings and error messages that are now being printed because you’ve clobbered half the system.</li>
  <li>Run <code class="language-plaintext highlighter-rouge">/rescue/tar zfs base.txz -C /</code> command again and this time it will nuke <strong>everything</strong>. Welcome to live-replacing your <code class="language-plaintext highlighter-rouge">libc</code>.</li>
  <li>Reboot.</li>
</ul>

<p>The base install doesn’t have a root password and doesn’t have any users defined and <strong>will</strong> overwrite password files, so after the reboot log in as <em>root</em> with no password, and ignore messages about missing user ID for <em>dbus</em> and <em>avahi</em> and whatever. This continues to be a bad-idea approach.</p>

<p>The next step is importing the ZFS pool with my patched world and kernel and 15.0 packages, such as they are. Unfortunately, ZFS in 15.0 has some new feature-flags that even 14.3 doesn’t understand. The pool can be imported read-only, though.</p>

<ul>
  <li>In the imported <code class="language-plaintext highlighter-rouge">/usr/src</code>, run <code class="language-plaintext highlighter-rouge">make installkernel</code> and ignore warnings about it being a read-only filesystem. After all, I just built everything (elsewhere) and am only interested in making this laptop a same-version-as the other laptop.</li>
  <li>Run <code class="language-plaintext highlighter-rouge">make installworld</code> and get an error message about missing libraries.</li>
  <li>Run <code class="language-plaintext highlighter-rouge">cp /usr/obj/usr/src/amd64.amd64/tmp/lib/* /lib</code> to replace the missing libraries. This may log you out as you clobber more essential libraries with versions from 15-STABLE.</li>
  <li>Log in again, go back to <code class="language-plaintext highlighter-rouge">/usr/src</code> and run <code class="language-plaintext highlighter-rouge">make installworld</code>.</li>
  <li>Run <code class="language-plaintext highlighter-rouge">etcupdate -B</code> to update system configuration. This probably warns about remaining modified files. Ignore that – I get warnings about <em>opieaccess</em> and <em>telnetd</em> which are lovely reminders of the early 2000s, though.</li>
  <li>Reboot.</li>
</ul>

<p>The system has now, in the most cursed-possible way, been upgraded to FreeBSD 15.0-CURRENT.</p>

<h3 id="packages-for-150">Packages for 15.0</h3>

<p>After doing the cursed upgrade to a new OS version, the rest is reasonably normal:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">pkg bootstrap -f</code> to upgrade the packaging tools to the new OS version</li>
  <li><code class="language-plaintext highlighter-rouge">pkg update</code> to fetch new packaging information</li>
  <li><code class="language-plaintext highlighter-rouge">pkg upgrade</code> to upgrade all the bits</li>
</ul>

<p>I removed all Qt ports from the system before starting this,
so that it wouldn’t have to deal with much in the way of desktop packages.
There’s still 2GiB to upgrade, though (including LLVM 13 and 19;
I suppose I can clean up some of that).</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">fwget</code> to get WiFi firmware</li>
  <li>Removing unnecessary firmware packages cuts down on the number, but doesn’t save much space (e.g <code class="language-plaintext highlighter-rouge">pkg remove gpu-firmware-amd-*</code> on this specific laptop, which is never going to have a different GPU)</li>
  <li><code class="language-plaintext highlighter-rouge">pkg install kde</code> to get the important things</li>
</ul>

<h3 id="post-install-configuration">Post-install Configuration</h3>

<blockquote>
  <p>The <code class="language-plaintext highlighter-rouge">sysrc(8)</code> commmand should be used to edit <code class="language-plaintext highlighter-rouge">rc.conf</code>; no need to do everything in a cursed fashion.</p>
</blockquote>

<ul>
  <li>Configure the system console keymap by adding <code class="language-plaintext highlighter-rouge">keymap="us.ctrl.kbd"</code> to <code class="language-plaintext highlighter-rouge">/etc/rc.conf</code> (the FreeBSD installer will do this for you, if you pick that keyboard layout, but this is the manual way after installation or when doing cursed upgrades)</li>
  <li>Load the Intel graphics driver by adding <code class="language-plaintext highlighter-rouge">kld_list="i915kms"</code> to <code class="language-plaintext highlighter-rouge">/etc/rc.conf</code></li>
  <li>Re-add the user to group <em>video</em> with <code class="language-plaintext highlighter-rouge">pw groupmod video -m &lt;user&gt;</code> (because that stuff was clobbered, too)</li>
</ul>

<p>I have a couple of extra steps and documentation written down from <a href="https://euroquis.nl/kde/2025/09/07/wayland.html">the last time</a> I tried KDE Plasma Wayland on FreeBSD. Don’t bother with a display manager. SDDM isn’t worth it.</p>

<p>Log out, log back in, run that script,
and here’s KDE Plasma Wayland running on FreeBSD 15 on Intel graphics:</p>

<figure class="image inline-image left">

  <img src="/img/2026/0103-FreeBSD15-Intel.png" alt="KDE Plasma Wayland session information on FreeBSD 15" />

  <figcaption>KDE Plasma Wayland session information on FreeBSD 15</figcaption>
</figure>

<p>This leaves just nVidia graphics to deal with, but for that I need to swap around some hardware in my workstation.</p>]]></content><author><name>adridg</name></author><category term="FreeBSD" /><summary type="html"><![CDATA[This post has the notes I made while upgrading another laptop from FreeBSD 14 to FreeBSD 15. Since my first upgrade was a long and annoying process, I figured I would take notes for the second round. These notes are “how not to do it”, even if the end-result is KDE Plasma Wayland on FreeBSD 15, as desired.]]></summary></entry><entry><title type="html">Oliebollen Recipe</title><link href="https://euroquis.nl/blabla/2026/01/02/oliebollen.html" rel="alternate" type="text/html" title="Oliebollen Recipe" /><published>2026-01-02T00:00:00+01:00</published><updated>2026-01-02T00:00:00+01:00</updated><id>https://euroquis.nl/blabla/2026/01/02/oliebollen</id><content type="html" xml:base="https://euroquis.nl/blabla/2026/01/02/oliebollen.html"><![CDATA[<p>This is a recipe post. Allergens: contains gluten, lactose, and alcohol.</p>

<p>The <em>oliebol</em> is a Dutch thing for new year’s eve. From mid-November you
can find stalls in front of supermarkets, at the home-improvement store,
outside the mattress store, in squares everywhere. The <em>oliebollenkraam</em>.
And then the boxes of Koopman’s Oliebollen Mix start blocking the aisles
at the supermarket, and the 5 litre jugs of frying oil appear on shelves.
More information about <em>oliebollen</em> (and how as a food-product they’re not
limited to the Netherlands) can be <a href="https://en.wikipedia.org/wiki/Oliebol">found on the internet</a>.</p>

<p>It’s a thing.</p>

<p>At new year’s eve, the neighbours at the end of my little street get
together – Adriaan, Adriaan, Antoon, and whoever else shows up –
to fry <em>oliebollen</em> under my car port. Each year our getup gets
a little more fancy, with better screening from the wind, improved
lighting, what have you. There’s a fire to keep us warm,
music (<a href="https://ondergewaardeerdeliedjes.nl/2025/12/17/snob-2000-uit-2025/">Snob 2000</a> is a good pick),
and whatever weird-ass alcoholic beverages we’ve collected this year.
Slovenian “Punch” liqueur? Elster kruitenbitter? Maracuja cream?
Lychee fizz? Pour it.</p>

<p>Here’s what I made this year, since I don’t use the boxes of mix.
The mix is <strong>good enough</strong>, but there’s some joy to be had in
do-it-yourself. Besides, as a daily baker-of-bread I have everything in-house anyway.
Recipe is good for about 20 <em>boils</em>, depending on the size of the spoon used
to spoon the batter into the deep-fryer.</p>

<h3 id="volkoren-herfstbok-oliebollen">Volkoren Herfstbok Oliebollen</h3>

<p><strong>Wets</strong>:</p>
<ul>
  <li>250ml Grolsch Herfstbok, warmed up in the microwave (about 1min at 600W)</li>
  <li>250ml milk, also warmed up</li>
</ul>

<p><strong>Drys</strong>:</p>
<ul>
  <li>pinch of salt</li>
  <li>8g (a small scoop) brown sugar</li>
  <li>6g (a heaping teaspoon) dry yeast</li>
  <li>250g whole wheat flour (for bread; the local windmill adds a little extra gluten and ascorbic acid)</li>
  <li>250g white flour (<em>patentbloem</em> from the supermarket)</li>
</ul>

<p><strong>Lumps</strong>:</p>
<ul>
  <li>125g of raisins or currants, soaked in warm water and then drained</li>
</ul>

<p>Mix the wets. Mix the drys. Mix the drys into the wets and stir to a smooth(-ish) batter.
Stir in the lumps. Let rise for at hour or a little more at 40℃.
Fry spoonfuls (I have a small soup-ladle that yields a nice size) at 180℃ for 5 minutes,
flipping them in the hot oil after about 3 minutes to brown them nicely on both sides.</p>]]></content><author><name>adridg</name></author><category term="BlaBla" /><summary type="html"><![CDATA[This is a recipe post. Allergens: contains gluten, lactose, and alcohol.]]></summary></entry><entry><title type="html">FreeBSD upgrade-to-15</title><link href="https://euroquis.nl/freebsd/2026/01/02/freebsd.html" rel="alternate" type="text/html" title="FreeBSD upgrade-to-15" /><published>2026-01-02T00:00:00+01:00</published><updated>2026-01-02T00:00:00+01:00</updated><id>https://euroquis.nl/freebsd/2026/01/02/freebsd</id><content type="html" xml:base="https://euroquis.nl/freebsd/2026/01/02/freebsd.html"><![CDATA[<p>They say never underestimate the bandwidth of a station-wagon full of tapes,
but a USB 3.2 NVMe enclosure with a 1TB stick in it is pretty slick, also.
I’ve been moving it back-and-forth between FreeBSD machines to get everything
updated, and here’s some notes (for my future-self, mostly).</p>

<h3 id="zpool-is-cool">ZPool is cool</h3>

<p>The stick has a GPT on it, and then a couple of partitions.
I followed the <a href="https://man.freebsd.org/cgi/man.cgi?gpart(8)">example</a> in the
<em>gpart</em>(8) manpage under GPT. That creates a boot-partition, some swap,
and a UFS partition – as if you want to create a bootable FreeBSD disk.</p>

<p>After that I put a rest-of-the-disk partition of type <em>freebsd-zfs</em>.
Using <em>glabel</em>(8) I labeled that partition as <em>zjail</em> (ZFS pools traditionally
start with the letter Z, and this one is going to be mostly-for-jails).</p>

<p>Then <a href="https://man.freebsd.org/cgi/man.cgi?zpool-create(8)">zpool</a>
can be used to create a pool from that labeled partition.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gpart add -t freebsd-zfs da0
glabel label zjail da0p4 
zpool create zjail label/zjail
</code></pre></div></div>

<p>Sure, it’s
not got any redundancy, nothing special, but it’s 1TB I can carry around,
and it’s easier than configuring NFS drives and/or WiFi on the laptop.
To use the space, <code class="language-plaintext highlighter-rouge">zpool import zjail</code> (just don’t forget to <code class="language-plaintext highlighter-rouge">zpool export zjail</code>
before shutting down).</p>

<h3 id="etcupdate-ugh">etcupdate, ugh</h3>

<p>Initially, I had a <code class="language-plaintext highlighter-rouge">zjail/src</code> filesystem, and under that some directories like <code class="language-plaintext highlighter-rouge">src/</code> and <code class="language-plaintext highlighter-rouge">ports/</code>.
It is possible to <code class="language-plaintext highlighter-rouge">buildworld</code> and <code class="language-plaintext highlighter-rouge">buildkernel</code> there, but <code class="language-plaintext highlighter-rouge">etcupdate</code> (which is a tool that
updates the things in <code class="language-plaintext highlighter-rouge">/etc/</code> based on the newly-built world) needs extra handholding
for that, <strong>and</strong> the error message isn’t very informative. I forget what it is, even,
because I ended up re-creating ZFS filesystems <code class="language-plaintext highlighter-rouge">zjail/data/src</code> and <code class="language-plaintext highlighter-rouge">zjail/data/ports</code>
and then setting the <em>mountpoint</em> property for them to mount them in the traditional locations.</p>

<h3 id="amd-graphics">AMD graphics</h3>

<p>The graphics drivers in FreeBSD are imported from Linux. There are some kernel
shims, but basically we run the same graphics stack. However, the shim code
is some tricky PCI-wrangling, and in my case with FreeBSD 15.0 I could get a
text console, but loading the graphics drivers with <code class="language-plaintext highlighter-rouge">kldload amdgpu</code> would panic
the kernel.</p>

<p>There are issues <a href="https://github.com/freebsd/drm-kmod/issues/391">#391</a> and <a href="https://github.com/freebsd/drm-kmod/issues/393">#393</a>
which look similar to the panic that I would see. Bjorn has a <a href="https://reviews.freebsd.org/D53862">proposed patch</a>
which simplifies the PCI-wrangling a little (to my eyes, anyway).
I applied the patch and rebuilt “all the things”, after which
both slightly-older (<em>drm-66-kmod</em>) and newer (<em>drm-latest-kmod</em>, which corresponds to Linux 6.9)
drivers seem to work.</p>

<p>I imagine some fixes will land soon, because “AMD graphics just doesn’t work” does not seem
like a long-term sustainable situation. <strong>With</strong> the fixes applied, I have a working graphics stack,
so …</p>

<h3 id="kde-plasma-wayland-on-freebsd-15">KDE Plasma Wayland on FreeBSD 15</h3>

<p>Assuming the graphics stack works, then KDE Plasma can be installed with <code class="language-plaintext highlighter-rouge">pkg install plasma6-plasma</code> . You can’t do
much with only Plasma and no applications at all, so <code class="language-plaintext highlighter-rouge">pkg install konsole</code> is recommended as well.</p>

<p>After that “it just works”, at least for the way that I use KDE Plasma. It takes a few clicks to change the settings
to what I actually want (e.g. CTRL is next to the letter A) but after that it’s … just the usual KDE Plasma session,
which looks like this in KInfoCenter:</p>

<figure class="image inline-image left">

  <img src="/img/2026/0102-FreeBSD15.png" alt="KDE Plasma Wayland session information on FreeBSD 15" />

  <figcaption>KDE Plasma Wayland session information on FreeBSD 15</figcaption>
</figure>]]></content><author><name>adridg</name></author><category term="FreeBSD" /><summary type="html"><![CDATA[They say never underestimate the bandwidth of a station-wagon full of tapes, but a USB 3.2 NVMe enclosure with a 1TB stick in it is pretty slick, also. I’ve been moving it back-and-forth between FreeBSD machines to get everything updated, and here’s some notes (for my future-self, mostly).]]></summary></entry><entry><title type="html">Recovering a Botched FreeBSD 14 Upgrade</title><link href="https://euroquis.nl/freebsd/2025/12/09/freebsd-upgrade.html" rel="alternate" type="text/html" title="Recovering a Botched FreeBSD 14 Upgrade" /><published>2025-12-09T00:00:00+01:00</published><updated>2025-12-09T00:00:00+01:00</updated><id>https://euroquis.nl/freebsd/2025/12/09/freebsd-upgrade</id><content type="html" xml:base="https://euroquis.nl/freebsd/2025/12/09/freebsd-upgrade.html"><![CDATA[<p>Naïvely, I ran <code class="language-plaintext highlighter-rouge">freebsd-update -r 15.0-STABLE install</code> in my regular FreeBSD desktop.  That was a mistake.</p>

<p>In <strong>principle</strong> <code class="language-plaintext highlighter-rouge">freebsd-update</code> is the way to update the installed system. In principle it works really smoothly, from binary release to binary release:
it has <a href="https://man.freebsd.org/cgi/man.cgi?freebsd-update">a good manpage</a> which tells you you can go from release to release. My FreeBSD laptop
(which also runs Fedora 42 as more of a daily-driver OS)
was running 14.3, so:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">freebsd-update -r 15.0-RELEASE upgrade</code> <em>Fetch all the things.</em></li>
  <li><code class="language-plaintext highlighter-rouge">freebsd-update -r 15.0-RELEASE install</code> <em>Install the new stuff.</em></li>
  <li><code class="language-plaintext highlighter-rouge">reboot</code> <em>Smooth sailing.</em></li>
</ul>

<p>That is the naive and optimistic thing to do.</p>

<p>If you spotted “<em>make sure you read the announcement and release notes</em>”
in the manpage, good for you.</p>

<p>After the reboot, I was dropped into a shell where nearly every command
I typed in resulted in</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ld-elf.so.1: Shared object "libsys.so.7" not found, required by "libc.so.7"
</code></pre></div></div>

<h3 id="good-bug-reports-help">Good Bug Reports Help</h3>

<p>Fortunately, Graham Perrin had <a href="https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=289769">already reported this</a> with basically-the-same steps to get into trouble.</p>

<p>And based on that Matthew and Colin made a fix so that
<strong>other</strong> people could first update their packages
(e.g. <code class="language-plaintext highlighter-rouge">pkg update</code> on the system before using <code class="language-plaintext highlighter-rouge">freebsd-update</code>)
to get the fixes in to the package-manager.</p>

<h3 id="good-workarounds-also">Good Workarounds, Also</h3>

<p>In the same PR (Problem Report), Craig describes a workaround which <strong>almost</strong> worked for me.
Because it’s a laptop, I needed a few extra steps.
As an aside, <code class="language-plaintext highlighter-rouge">/rescue</code> is a directory where statically-linked rescue binaries live, which don’t suffer from shared-library misery.</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">/rescue/kldload if_ure</code> <em>Load the kernel driver for the USB-ethernet port.</em></li>
  <li><code class="language-plaintext highlighter-rouge">/rescue/dhclient ue0</code> <em>DHCP to get some network.</em></li>
</ul>

<p>I have root-on-ZFS, and in single-user mode this comes up read-only,
so switch read-only <strong>off</strong>. This is different from other (e.g. UFS, ext4)
filesystems where <code class="language-plaintext highlighter-rouge">mount -o rw,remount</code> would be the thing to do:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">/rescue/mount</code> <em>To check what the name is of the ZFS mounted on <code class="language-plaintext highlighter-rouge">/</code></em></li>
  <li><code class="language-plaintext highlighter-rouge">/rescue/zfs set readonly=off zroot/ROOT/default</code> <em>Make it read-write.</em></li>
</ul>

<blockquote>
  <p><strong>Edit 2025-12-17:</strong> Fixed typo’s in the path of the commands</p>
</blockquote>

<p>After that, basically Craig’s steps:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">cd /tmp</code></li>
  <li><code class="language-plaintext highlighter-rouge">/rescue/fetch https://download.freebsd.org/releases/amd64/15.0-BETA2/base.txz</code> <em>Fetch the installation tarball.</em></li>
  <li><code class="language-plaintext highlighter-rouge">cd /</code></li>
  <li><code class="language-plaintext highlighter-rouge">/rescue/tar xzf /tmp/base.txz lib/libsys.so.7</code> <em>Extract the missing library.</em></li>
  <li><code class="language-plaintext highlighter-rouge">freebsd-update install</code> <em>This one is the “normal” dynamically-linked one, which works now the missing library is there.</em></li>
</ul>

<h3 id="post-upgrade-mucking-about">Post-Upgrade Mucking About</h3>

<p>Since there wasn’t anything especially configured or complicated
on this machine, I reinstalled the package-manager with a hammer
and then upgraded all the packages:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">pkg-static install pkg</code> <em>Reinstall with a known-good tool.</em></li>
  <li><code class="language-plaintext highlighter-rouge">pkg update</code> <em>Fetch all the things.</em></li>
  <li><code class="language-plaintext highlighter-rouge">pkg upgrade</code> <em>Install all the things.</em></li>
</ul>

<p>Somehow I’ve also gotten myself stuck in a “graphics driver causes kernel panic”,
state. Which kind of limits the graphics side of things this week. <a href="https://freebsdfoundation.org/blog/freebsd-15-why-youll-want-it/">Amusingly</a> AMD GPU stability is listed as a release feature, but <a href="https://github.com/freebsd/drm-kmod/issues/391">#391</a> and <a href="https://github.com/freebsd/drm-kmod/issues/393">#393</a> issues tell a slightly different story. I’m glad of bz@’s proposed fix, although I’ll need to rebuild the kernel to try it (which literally means <code class="language-plaintext highlighter-rouge">make buildkernel installkernel</code> on FreeBSD, it’s that simple).</p>]]></content><author><name>adridg</name></author><category term="FreeBSD" /><summary type="html"><![CDATA[Naïvely, I ran freebsd-update -r 15.0-STABLE install in my regular FreeBSD desktop. That was a mistake.]]></summary></entry></feed>