<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet href="/feed_style.xsl" type="text/xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="https://www.rssboard.org/media-rss">
  <channel>
    <title>Linux on Eva Winterschon</title>
    <link>https://winterschon.gitlab.io/tags/linux/</link>
    <description>Recent content in Linux on Eva Winterschon</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <copyright>Some copyright notice - [my license](https://example.com/license)</copyright>
    <lastBuildDate>Tue, 07 Jul 2026 21:32:56 +0000</lastBuildDate><atom:link href="https://winterschon.gitlab.io/tags/linux/index.xml" rel="self" type="application/rss+xml" /><icon>https://winterschon.gitlab.io/logo.svg</icon>
    
    
    <item>
      <title>A Day with F2FS @ The Pool</title>
      <link>https://winterschon.gitlab.io/en/posts/a-day-with-f2fs-at-the-pool/</link>
      <pubDate>Tue, 07 Jul 2026 21:32:56 +0000</pubDate>
      
      <guid>https://winterschon.gitlab.io/en/posts/a-day-with-f2fs-at-the-pool/</guid>
      <description><![CDATA[<p>Embedded systems are all around us and most people never know about their presence. Most people never give any consideration to the little devices which make modern life possible.</p>
<blockquote>
<p>Data caching at The Edge isn&rsquo;t always from Fastter or Cuntter or Cloudstter or whichever CDN happens to be serving your IG, Safeway, NFL, Reddit, Anthropology, or 338% of the internet&rsquo;s concurrent traffic being pointless traversals like jQuery minified &amp; brotli-fied and sent back and forth endlessly through Internet Exchanges.</p>
<p>Edge caching is not limited to Anthropic or OAI or whoever else&rsquo;s Load-Balancer API-side &ldquo;prompt cache (not yet! after LB!)&rdquo; packets which &ldquo;those people&rdquo; are constantly complaining about, nor the hyperscalers who whitebox big CDN networks under their own headline IP.. those are not what I&rsquo;m talking about when I talk about Edge Caches.</p>
</blockquote>
<p>These little embedded devices which collect climate metrics, air quality data, assembly robotics, municipal awareness and telemetry data, and everything else from a very long list&hellip; they need read-heavy churn-heavy persistent storage on a filesystem optimized for tiny sized industrial NAND.</p>
<p>More examples for the ones of all sizes making modern life possible: that ATM you went to, the parking lot video surveillance systems, traffic light coordinator nodes, telco edge ONT routers and OOBs with SDNs, and a thousand other examples abound that are functionally ignored.</p>
<p>Also, robots. And factory hardware. And factories making robots that make tiny factories? Hopefully so.</p>
<hr>
<h2 id="embeds-reduce-capex--opex-efficiently">Embeds Reduce CAPEX &amp; OPEX Efficiently</h2>
<p>So, those embedded devices usually are designed for efficiency, while not too often designed to be hammering on NAND for write-heavy storage workloads. This has caveats: devices explicitly designed for write heavy I/O on purpose, and therefore not what I&rsquo;m referring to, and cases where the provisioning and/or configuration stages of fleet deployment are improperly aligned to hardware realities.</p>
<p>Why? Low wattage, moderate caches, and a desire to not burn out NAND when the device is located in a difficult-to-get-to location for service techs working on hardware replacement.</p>
<p>Most of all - we want efficient storage for embedded devices so that their operationally collected data can be stored in memory with a ECC write-back cache with <em>&ldquo;operationally consistent&rdquo;</em> garbage collection and non-invasive wear-leveling, all while the <strong>transactions are paged/queued to F2FS before async&rsquo;ing upstream to a centralized data collector for aggregation</strong>.</p>
<h4 id="predator-drones-too">Predator Drones Too?</h4>
<p>Yes and no, they send their comms to LEOSAT before humanity&rsquo;s &ldquo;furthest from the menial and meaningless non-Elysium people&rdquo; edge devices cache, aggregate, and compute roll-up analytics with inline encryption and compression via DPU offload streaming.. all the way down to LANDSAT.</p>
<p>Edge devices have their own little ecosystem separate from the manner in which datacenter storage network-enabled hardware operates. All by design, and always room for improvement.</p>
<p><img src="/content/images/2026/07/dumpster-fire.gif" alt=""></p>
<blockquote>
<p>Many people consider this boring tech, and would rather move fast and break things — your time is limited, people are sick of perfectly workable systems breaking all the fuckin time and they&rsquo;re tired of being A/B tested on in production — doing those things makes your company&rsquo;s testing policy look like an asshole. Everyone, stop being assholes. Thanks!</p>
</blockquote>
<hr>
<h2 id="these-things---why-should-we-care">These Things - Why Should We Care?</h2>
<p>You like your cell phone? How about GPS? SAT-NAV? Skylink? Drones operating up above withour your awareness? How about sector antennas for the police and emergency services? Embedded systems are streaming, caching, processing, and relaying data all over the globe and up into LEO constellations.</p>
<p>You don&rsquo;t have to care, and you shouldn&rsquo;t have to care about FSFS or drones unless you work with that side of tech, or its adjacent use cases - like living in the modern world. <strong>Everyone should care because knowledge is fundamentally important</strong>, if for no other reason at all. Do you know how the light-switch on the wall works? Same deal. Stop making excuses for saying you don&rsquo;t know or don&rsquo;t care or you will be left behind. No one is saving us but ourselves, and we must have knowledge to do so.</p>
<h2 id="recent-adventures-with-standards-definitions">Recent Adventures with Standards-Definitions</h2>
<p>I love automation. In part this is because I prefer efficiency over repetitive manual bullshit. Efficiently handling requirements means more time to do what I love:</p>
<ul>
<li><strong>Hanging out by the pool</strong> with a tablet or waterproof e-ink reader.<br>
Way back in 2018 my e-book tally was 62 novels over the calendar year. That number has dropped off recently for trivial reasons, but the point remains that I love to read, and I love to lay out by the pool.</li>
<li><strong>What I do not love</strong>:<br>
Wasting time when I could be at the pool. ♥‿♥</li>
</ul>
<p><img src="/content/images/2026/06/eva-physique-at-the-pool.960px-1.png" alt=""></p>
<p>there&rsquo;s only room for two hats in my life - and this is the one for sunning</p>
<ul>
<li><strong>What I&rsquo;ll never not love</strong>:<br>
The poem on my torso, dedicated to the manner in which my departed twin lived &amp; loved.</li>
</ul>
<hr>
<h3 id="standards-for-nand-standards-for-sd-nand">Standards for NAND? Standards for SD-NAND!</h3>
<p>To the point, here&rsquo;s a script that had to be blasted out a while back, while imaging so many too many industrial-spec SD/TF-cards for a fleet of distibuted data collectors. These fun little RK3588 based systems have a NPU and only an eMMC drive for the OS.</p>
<p>While the eMMC in question has decent specs, if it fails then it&rsquo;s sadly more expensive to de-solder and re-solder and re-image the OS on eMMC, and so on these systems we use the SD NAND for the following data:</p>
<ul>
<li>Ephemeral scratch space and logs (eg: <code>/var/log</code>, <code>/var/tmp</code>, <code>/tmp</code> - <em>nope, these go to tmpfs</em>)</li>
<li>Cache directories which are aptly named <code>.cache</code> or <code>.Cache</code> סּ_סּ</li>
<li>Files which must be staged locally but have no business being on the OS mount points.</li>
<li>Several other use cases that I don&rsquo;t feel like describing right now; so here&rsquo;s the discussion for those who love to know more more more.</li>
</ul>
<pre tabindex="0"><code>### F2FS - Embedded Filesystem Performance Options

- Ref: https://docs.kernel.org/filesystems/f2fs.html

#### Option Flags and Reasoning

##### For High-Churn I/O
This is less ideal, but sometimes a `tmpfs` overlay isn&#39;t an option, so it&#39;s better than burning out the eMMC. A good industrial SD card has ECC, wear-leveling, checksum validations, write-amplification controls, etc. Don&#39;t care for those features? You may one day...

Example Writes: data persistent log-sync, package builds on-device, container writable layers, time-series compressible metrics, telemetry buffers, or small-file caches, opt for the non-default `-o 10` flag. 

| Option                      | Rationale              |
| --------------------------- | -----------------------|
| `-l DATA`                   | Stable label for `/etc/fstab`; avoids relying on device enumeration order. UUID is an alternative, but requires programmatic parsing of `blkid` output, or manually specifying a UUID to pass to the FS creation process.. or you can simpy use a GPT label. |
| `-o 5`                      | Reserves 5% of the F2FS volume for the F2FS cleaner. `mkfs.f2fs` documents this as hidden overprovision space used by the cleaner. |
| `-t 1`                      | Performs discard/TRIM at format time; defaults discard to enabled, but some card readers/cards mishandle it; use `-t 0` if format stalls or logs errors |
| `extra_attr`                | Required by several modern F2FS features. |
| `inode_checksum`            | Adds inode metadata checksums; useful for removable flash and unattended systems. |
| `sb_checksum`               | Adds superblock checksum support. |
| `flexible_inline_xattr`     | Modern xattr layout; useful with `extra_attr` and future feature expansion. |
| `inode_crtime`              | Adds inode creation-time support; low cost, useful for forensic/debug visibility. |
| `lost_found`                | Creates lost+found support for recovery workflows. |
| `compression`               | Good for compressible write-heavy data; poor fit for already-compressed media, model files, archives, database pages, and random-write workloads. |
| `compress_algorithm=zstd:3` | Validate performance of zstd compression options before using for production purposes. |
| `compress_log_size=%u`      | Support configuring compress cluster size. The size will be `4KB * (1 &lt;&lt; %u)`. The default and minimum sizes are 16KB. |
| `checkpoint_merge`          | Self-describing (or check the refs)  |
| `nocheckpoint_merge`        | Disable checkpoint merge feature. |

- `checkpoint=%s[:%u[%]]`: Set to &#34;disable&#34; to turn off checkpointing. Set to &#34;enable&#34; to re-enable checkpointing. Is enabled by default. 

- `checkpoint_merge`
When checkpoint is enabled, this can be used to create a kernel daemon and make it to merge concurrent checkpoint requests as much as possible to eliminate redundant checkpoint issues. Plus, we can eliminate the sluggish issue caused by slow checkpoint operation when the checkpoint is done in a process context in a cgroup having low i/o budget and cpu shares.

- `compress_algorithm=%s`
- `compress_algorithm=lzo-rle`

Control compress algorithm, currently f2fs supports &#34;lzo&#34;, &#34;lz4&#34;, &#34;zstd&#34; and &#34;lzo-rle&#34; algorithm.

- `compress_algorithm=%s:%d`

Control compress algorithm and its compress level.. only &#34;lz4&#34; and &#34;zstd&#34; support compress level config and those algos may be in your kernel config and may not.. but you&#39;ll find out quickly if you don&#39;t already know the answer.
</code></pre><p>=========      ===========
algorithm      level range
=========      ===========
lz4            3 - 16
zstd           1 - 22
=========      ===========</p>
<pre tabindex="0"><code>
- `compress_log_size=%u`
Support configuring compress cluster size. The size will be `4KB * (1 &lt;&lt; %u)`. The default and minimum sizes are 16KB.

- `compress_extension=%s`

Support adding specified extension, so that f2fs can enable compression on those corresponding files.
If all files with `.ext` has high compression rate, we can set the `.ext` on compression extension list and enable compression on these file by default rather than to enable it via ioctl.

For other files, we can still enable compression via ioctl. Note that, there is one reserved special extension `*`, it can be set to enable compression for all files.

- `nocompress_extension=%s`

Support adding specified extension, so that f2fs can disable compression on those corresponding files, just contrary to compression extension.
If you know exactly which files cannot be compressed, you can use this.

&gt; The same extension name can’t appear in both compress and nocompress extension at the same time.

If the compress extension specifies all files, the types specified by the nocompress extension will be treated as special cases and will not be compressed.
After add nocompress_extension, the priority should be: `dir_flag &lt; comp_extention,nocompress_extension &lt; comp_file_flag,no_comp_file_flag`.

- `compress_chksum`
Support verifying chksum of raw data in compressed cluster.

- `compress_mode=%s`
Control file compression mode: &#34;fs&#34; and &#34;user&#34;. In &#34;fs&#34; mode (default), f2fs does automatic compression on the compression enabled files. In &#34;user&#34; mode, f2fs disables the automaic compression and gives the user discretion of choosing the target file and the timing.

The user can do manual compression/decompression on the compression enabled files using ioctls.

- `compress_cache`
Support to use address space of a filesystem managed inode to cache compressed block, in order to improve cache hit ratio of random read.

- `inlinecrypt`
When possible, encrypt/decrypt the contents of encrypted files using the blk-crypto framework rather than filesystem-layer encryption.
This allows the use of inline encryption hardware. The on-disk format is unaffected.

- `atgc`
Enable age-threshold garbage collection, it provides high effectiveness and efficiency on background GC. No one likes garbage.

- `discard_unit=%s`
Control discard unit, the argument can be &#34;block&#34;, &#34;segment&#34; and &#34;section&#34;, issued discard command’s offset/size will be aligned to the unit, by default, &#34;`discard_unit=block`&#34; is set, so that small discard functionality is enabled.

For blkzoned device, &#34;`discard_unit=section`&#34; will be set by default, it is helpful for large sized (fucccck off with SMR, less fucks to ZNS) devices to reduce memory cost by getting rid of fs metadata supports small discard (ouch, ever get burned by SMR? yeah... just don&#39;t bother).

- `age_extent_cache`
Enable an age extent cache based on rb-tree. It records data block update frequency of the extent per inode, in order to provide better temperature hints for data block allocation.

- `errors=%s`
Specify f2fs behavior on critical errors. This supports modes: &#34;`panic`&#34;, &#34;`continue`&#34; and &#34;`remount-ro`&#34;, respectively, trigger panic immediately, continue without doing anything, and remount the partition in read-only mode.

By default it uses &#34;`continue`&#34; mode, not my choice.
</code></pre><p>====================== ===============<br>
mode                   continue        remount-ro      panic
====================== ===============<br>
access ops             normal          normal          N/A
syscall errors         -EIO            -EROFS          N/A
mount option           rw              ro              N/A
pending dir write      keep            keep            N/A
pending non-dir write  drop            keep            N/A
pending node write     drop            keep            N/A
pending meta write     keep            keep            N/A
====================== ===============</p>
<pre tabindex="0"><code>
- `nat_bits`
Enable nat_bits feature to enhance full/empty nat blocks access, by default it’s disabled.

- `lookup_mode=%s`
Control the directory lookup behavior for case-folded directories. This option has no effect on directories that do not have the casefold feature enabled.
</code></pre><h1 id="value--------------description">========================================
Value              Description</h1>
<h1 id="flag">perf               (Default) Enforces a hash-only lookup.
The linear search fallback is always
disabled, ignoring the on-disk flag.
compat         Enables the linear search fallback for
compatibility with directory entries
created by older kernel that used a
different case-folding algorithm.
This mode ignores the on-disk flag.
auto               F2FS determines the mode based on the
on-disk <code>SB_ENC_NO_COMPAT_FALLBACK_FL</code>
flag.</h1>
<pre tabindex="0"><code>
----

#### Benchmarking F2FS Compression

Always validate the compression algo used before using those options, as performance of one algo vs anther can vary widely across different CPU generation and architectures, as well as for hosts with algo/hash compression offloading engines. We can cover benchmarking these in another script.

&gt; lzo, lz4, zstd, lzo-rle algorithms

##### Create Partitions
</code></pre><p>DEV=/dev/sdX
sgdisk &ndash;zap-all &ldquo;$DEV&rdquo;
sgdisk -a 2048 -n 1:2048:-16G -t 1:8300 -c 1:DATA &ldquo;$DEV&rdquo;
partprobe &ldquo;$DEV&rdquo;</p>
<pre tabindex="0"><code>
##### Create FS
</code></pre><p>mkfs.f2fs -f <br>
-l DATA <br>
-o 10 <br>
-t 1 <br>
-O extra_attr,inode_checksum,sb_checksum,flexible_inline_xattr,inode_crtime,lost_found,compression,compress_algorithm=zstd:3
&ldquo;${DEV}1&rdquo;</p>
<pre tabindex="0"><code>
#### FS Tab Entry

##### Conservative defaults
</code></pre><p>LABEL=DATA /srv/data f2fs rw,noatime,nodiratime,lazytime,nofail,background_gc=on,gc_merge,checkpoint_merge,flush_merge,mode=adaptive,fsync_mode=posix,nodiscard 0 0</p>
<pre tabindex="0"><code>
##### Compression-capable variant
</code></pre><p>LABEL=DATA /srv/data f2fs rw,noatime,nodiratime,lazytime,nofail,background_gc=on,gc_merge,checkpoint_merge,flush_merge,mode=adaptive,fsync_mode=posix,nodiscard,compress_algorithm=lz4,compress_chksum,compress_mode=fs 0 0</p>
<pre tabindex="0"><code>
#### Selectively Mark Compressible Directories
Do not enable compression broadly for LLM model files, videos, archives, SQLite databases, or opaque binary blobs unless benchmarks show a benefit.
</code></pre><p>mkdir -p /srv/data/_logs /srv/data/_caches.compressible
chattr +c /srv/data/_logs /srv/data/_cache.compressible</p>
<pre tabindex="0"><code></code></pre><hr>
<h3 id="so-maybe-this-is-scriptable">So, Maybe This is Scriptable?</h3>
<p>It sure is, or by Ansible playbook, or Salt sync, perhaps even a CFengine golden image.</p>
<h3 id="thats-a-lot-of-blah-blah-blah-how-about-that-script">That&rsquo;s a lot of blah blah blah. How about that script?</h3>
<p>Efficiency, indeed. Here ya go. The benchmarking script is for another day, or you can check out this <a href="https://www.usenix.org/system/files/conference/fast15/fast15-paper-lee.pdf">workload primer about the filesystem from USENIX</a> (<a href="https://www.usenix.org/sites/default/files/conference/protected-files/fast15_slides_lee.pdf">w/ link to slide deck</a>), and a benchmarking script which has been <a href="https://github.com/nicktehrany/msF2FS">customized for F2FS</a>.</p>
<pre tabindex="0"><code>#!/usr/bin/env bash
# -*- mode: sh; sh-basic-offset: 4; sh-shell: bash; coding: utf-8; indent-tabs-mode: nil; -*-
# ----------------------------------------------------------------------- #
set -euo pipefail
# ----------------------------------------------------------------------- #
# Purpose: POSIX-syntax wrapper to partition and format a non-boot SD/microSD card as F2FS with optional compression.
# NAND Profile: embedded I/O, kernel 6.1+, ECC industrial spec controller.
# WARNING: this destroys data on the selected block device, so be aware.
# ----------------------------------------------------------------------- #

usage() {
    cat &lt;&lt;&#39;USAGE&#39;
Usage:
  format-f2fs-sd-data.sh -d /dev/DEVICE [-l LABEL] [-r RESERVE_GIB] [-o F2FS_OP_PERCENT] [-c]

Examples:
# ----------------------------------------------------------------------- #
  ./format-f2fs-sd-data.sh -d /dev/sdX -l DATA -r 16 -o 5
  ./format-f2fs-sd-data.sh -d /dev/mmcblk0 -l DATA -r 24 -o 8 -c

Options:
# ----------------------------------------------------------------------- #
  -d  Whole block device to erase and partition: /dev/sdX -OR- /dev/mmcblk0
  -l  F2FS label. Default: DATA
  -r  GiB left unpartitioned at end for card FTL spare area. Default: 16
  -o  F2FS hidden overprovision percentage for the F2FS cleaner. Default: 5
  -c  Enable F2FS compression feature at format time. Mount options and chattr are still required.

Dependencies:
# ----------------------------------------------------------------------- #
  sgdisk, partprobe, mkfs.f2fs, lsblk
# ----------------------------------------------------------------------- #
USAGE
}

# Basic Variables
# ----------------------------------------------------------------------- #
LABEL=DATA
RESERVE_GIB=16
OP_PERCENT=5
COMPRESS=0
DEVICE=

# Define ARGV Mappings
# ----------------------------------------------------------------------- #
while getopts &#39;d:l:r:o:ch&#39; opt; do
    case &#34;$opt&#34; in
        d) DEVICE=$OPTARG ;;
        l) LABEL=$OPTARG ;;
        r) RESERVE_GIB=$OPTARG ;;
        o) OP_PERCENT=$OPTARG ;;
        c) COMPRESS=1 ;;
        h) usage; exit 0 ;;
        *) usage; exit 2 ;;
    esac
done

# Sanity Checks
# ----------------------------------------------------------------------- #
if [ -z &#34;$DEVICE&#34; ]; then
    usage &gt;&amp;2
    exit 2
fi

case &#34;$DEVICE&#34; in
    /dev/sd?|/dev/sd??|/dev/mmcblk[0-9]|/dev/nvme[0-9]n[0-9]) ;;
    *)
        echo &#34;Refusing suspicious device path: $DEVICE&#34; &gt;&amp;2
        exit 2
        ;;
esac

# Validate Deps &amp; Check Limits
# ----------------------------------------------------------------------- #
for cmd in sgdisk partprobe mkfs.f2fs lsblk; do
    if ! command -v &#34;$cmd&#34; &gt;/dev/null 2&gt;&amp;1; then
        echo &#34;Missing required command: $cmd&#34; &gt;&amp;2
        exit 1
    fi
done

if [ ! -b &#34;$DEVICE&#34; ]; then
    echo &#34;Not a block device: $DEVICE&#34; &gt;&amp;2
    exit 1
fi

case &#34;$RESERVE_GIB&#34; in
    &#39;&#39;|*[!0-9]*) echo &#34;Reserve GiB must be an integer&#34; &gt;&amp;2; exit 2 ;;
esac
case &#34;$OP_PERCENT&#34; in
    &#39;&#39;|*[!0-9]*) echo &#34;F2FS OP percentage must be an integer&#34; &gt;&amp;2; exit 2 ;;
esac

case &#34;$DEVICE&#34; in
    /dev/mmcblk*|/dev/nvme*) PART=${DEVICE}p1 ;;
    *) PART=${DEVICE}1 ;;
esac

# Define Default F2FS Options
# ----------------------------------------------------------------------- #
FEATURES=&#39;extra_attr,inode_checksum,sb_checksum,flexible_inline_xattr,inode_crtime,lost_found&#39;
if [ &#34;$COMPRESS&#34; -eq 1 ]; then
    FEATURES=${FEATURES},compression
fi

# Make Sure...
# ----------------------------------------------------------------------- #
echo &#34;About to DESTROY all data on: $DEVICE&#34;
lsblk -o NAME,SIZE,MODEL,SERIAL,TRAN,RM,RO,FSTYPE,MOUNTPOINTS &#34;$DEVICE&#34; || true
echo
echo &#34;New partition: $PART&#34;
echo &#34;Label: $LABEL&#34;
echo &#34;Unpartitioned reserve at end: ${RESERVE_GIB} GiB&#34;
echo &#34;F2FS OP: ${OP_PERCENT}%&#34;
echo &#34;F2FS features: $FEATURES&#34;
echo
printf &#39;Type YES to continue: &#39;
read ans
if [ &#34;$ans&#34; != YES ]; then
    echo &#34;Aborted.&#34;
    exit 1
fi

# Best Effort Unmount for Existing Partitions (please don&#39;t need this)
# ----------------------------------------------------------------------- #
if command -v findmnt &gt;/dev/null 2&gt;&amp;1; then
    findmnt -rn -S &#34;$DEVICE&#34; -o TARGET 2&gt;/dev/null | while IFS= read -r mp; do
        [ -n &#34;$mp&#34; ] &amp;&amp; umount &#34;$mp&#34; || true
    done
fi

# And then...
# ----------------------------------------------------------------------- #
sgdisk --zap-all &#34;$DEVICE&#34;
sgdisk -a 2048 -n &#34;1:2048:-${RESERVE_GIB}G&#34; -t 1:8300 -c &#34;1:${LABEL}&#34; &#34;$DEVICE&#34;
partprobe &#34;$DEVICE&#34; || true
sleep 2

if [ ! -b &#34;$PART&#34; ]; then
    echo &#34;Partition node did not appear: $PART&#34; &gt;&amp;2
    lsblk &#34;$DEVICE&#34; &gt;&amp;2 || true
    exit 1
fi

# OhhhShitHandlers
# ----------------------------------------------------------------------- #
# NOTE: -t 1 performs initial discard when supported; if it&#39;s hanging here, rerun manually with -t 0
mkfs.f2fs -f -l &#34;$LABEL&#34; -o &#34;$OP_PERCENT&#34; -t 1 -O &#34;$FEATURES&#34; &#34;$PART&#34; &amp;&amp; \
sync

# Display Block Devs
# ----------------------------------------------------------------------- #
lsblk -o NAME,SIZE,MODEL,SERIAL,TRAN,RM,RO,FSTYPE,LABEL,UUID,PARTUUID,MOUNTPOINTS &#34;$DEVICE&#34;

echo &#34;[COMPLETE]&#34;
# ----------------------------------------------------------------------- #
# EOF #
# ----------------------------------------------------------------------- #
</code></pre>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Good Morning from the Glossary</title>
      <link>https://winterschon.gitlab.io/en/posts/good-morning-from-the-glossary/</link>
      <pubDate>Fri, 08 Aug 2025 14:19:44 +0000</pubDate>
      
      <guid>https://winterschon.gitlab.io/en/posts/good-morning-from-the-glossary/</guid>
      <description><![CDATA[<p>This content has been migrated to the Lexicon page: <a href="https://prose.winterschon.com/lexicon/">https://prose.winterschon.com/lexicon/</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>The demise of Fedora as a Developer Distro</title>
      <link>https://winterschon.gitlab.io/en/posts/the-demise-of-fedora-as-a-developer-distro/</link>
      <pubDate>Wed, 28 May 2025 22:27:48 +0000</pubDate>
      
      <guid>https://winterschon.gitlab.io/en/posts/the-demise-of-fedora-as-a-developer-distro/</guid>
      <description><![CDATA[<p>The Q4-2024 through Q2-2025 cycle has been one of remarkable instability for Fedora kernels and systemd breaking-changes. F40 through F42 have offered more crashes, more kernel panics, and more core dumps than any triple-set of versions since its dawning into existence - and I&rsquo;ve been running this distro for dev-only boxes since the first release.</p>
<p>In the worst of circumstances, Fedora notified me of a firmware update, which was a hands-off type of &ldquo;reboot to install&rdquo; EFI blob which bricked my Thinkpad X1 Nano laptop just last week. That&rsquo;s an expensive failure and one which has no simple resolution (many hours, many iso to img to efi/cap conversions, and maybe soon a WSOP-8 NAND reprogramming).</p>
<p>I&rsquo;ve been all-in on the RedHat infra train since 1999, having used it at global backbone providers, satellite infra providers, hpc clusters, media conglomerates, gaming networks, streaming services, cloud providers and hyperscalers, and just about everything in-between&hellip; and while I have my qualms on certain technical aspects and corporate strategy over those years, I still consider it one of my favorite Linux distos (top five at least), and it&rsquo;s my first choice for enterprise Linux. So, I&rsquo;m not just hating on the ecosystem here, I&rsquo;m a vested user who&rsquo;s been disappointed too many times by the direction</p>
<p>Unfortunately, with Fedora, I stand behind my position that Redhat has been too hands-off in conducting standards requirement alignment, in requiring a base level of stability upon which serious engineering development can be done, without having to clean up other people&rsquo;s messes every few weeks.</p>
<p>It&rsquo;s just not a great dev platform distro anymore, and yet the org markets the name as if it were a valid OS for all manner of production uses. IoT use? Never, no thanks. Edge devices? Never again. Security? Forget about it.</p>
<p>It&rsquo;s not a &ldquo;bleeding-edge issue&rdquo; - as that&rsquo;s Rawhide&rsquo;s territory where stability of any sort is not expected. The evolving issue with Fedora is that it is uncommonly unstable for a &ldquo;dev env&rdquo;, and one which ships far too much untested code and pushes the equivalent of &ldquo;crowd source fail-tests&rdquo; where they expect the users to &ldquo;just tell us if it doesn&rsquo;t work&rdquo;. Their release engineering and load-testing seems to occur with zero multivariate matrices sequences for all manner of performance, validation, and functional tests. I suppose they consider unit testing to be &ldquo;full coverage&rdquo;, but it is not. Happy to be corrected here, though I will remain disappointed and avoid any further deployments or firmware updates from Fedora.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Non-Controversial Controversy of BTRFS</title>
      <link>https://winterschon.gitlab.io/en/posts/the-non-controversial-controversy-of-btrfs/</link>
      <pubDate>Sun, 11 May 2025 13:34:10 +0000</pubDate>
      
      <guid>https://winterschon.gitlab.io/en/posts/the-non-controversial-controversy-of-btrfs/</guid>
      <description><![CDATA[<p>Some clarifications on some points here about the history of BTRFS as it relates to Oracle, Sun Microsystems, RedHat, ZFS, and a DARPA funded filesystem research project which concluded with a ghastly murder.</p>
<blockquote>
<p>Oracle bought Sun to get the ZFS file system. They have been porting ZFS features into Btrfs. The head of the Ext4 file system project, an Oracle employee, said that Ext4 was just a temporary stepping stone on the way to Btrfs.</p>
</blockquote>
<p>A primary motivation for Oracle&rsquo;s acquisition of Sun was to obtain and control the IP for the MySQL database project, which had been obliterating a large amount of Oracle DB customer licensing and dominating the OSS database landscape.</p>
<p>A primary motivation for Oracle&rsquo;s acquisition of Sun was to obtain their hardware platform for running Oracle DB, Oracle J2EE applications, and their vast middleware stacks. This was everything related to the UltraSparc architecture, Sun Fire line of Opteron based servers, all of the high performance storage technology, and all of Sun&rsquo;s enterprise contracts with the US military, US gov, various nation states, and all manner of other high-end &ldquo;serious business&rdquo; service compute providers.</p>
<p>Sun created Java, nearly all of Oracle&rsquo;s entire stack requires Java, and Larry wanted that as a foundational piece of IP. At the time of the acquisition, the world ran on Java and it was the most profitable and most widely deployed programming language as well as server runtime environment (JDK, JRE). This aspect is also related to various IP lawsuits around Java, see Oracle vs Google later on.</p>
<p>ReiserFS features were ported into Btrfs, not ZFS features. ZFS has always dominated enterprise storage, never btrfs, never ReiserFS. ZFS in an entirely different class of quality, performance, scalability, reliability, and global market penetration.</p>
<p>RedHat was tired of supporting Btrfs after too many customers reported critical data-loss incidents, which could only serve to harm the company&rsquo;s reputation for stability and technical excellence.</p>
<p>ZFS continues to be amazing, Btrfs continues to suck, Oracle still has their own original ZFS source tree separate from the OpenZFS project, Oracle still sells UltraSparc architecture, Oracle still owns Java IP, Oracle still doesn&rsquo;t prioritize Btrfs, nothing important runs on Btrfs.</p>
<p>The only recent news about btrfs and Redhat, which invalidates the original claims about Redhat vs Oracle conspiracy, is that Fedora Linux 33 has Btrfs as a default option along with XFS and Ext4, and we all know that Fedora is upstream development for RedHat Enterprise Linux.</p>
<p>Some timeline details:</p>
<ul>
<li>2007, Btrfs concepts and originated at IBM</li>
<li>2008, rip-off of ReiserFS features started by developer at Oracle, who was a former dev of ReiserFS (before Hans Reiser murdered wife, tried to cover it up, landed in prison, and ReiserFS project basically died too)</li>
<li>Btrfs continues to be experimental for years, cannot complete with ZFS on any important metrics</li>
<li>2008, Oracle Exadata v1 - a specialized hardware platform for running Oracle databases on HP-UX with Itanium procs</li>
<li>2009, Oracle Exadata v2 - now running on Sun hardware, using modified Sun Fire systems with AMD Opteron procs</li>
<li>2010, Oracle acquired Sun which had recently acquired MySQL</li>
<li>2011, Redhat offers Btrfs as experimental in RHEL 6 beta</li>
<li>2012, Btrfs main developer leaves Oracle for Fusion-IO</li>
<li>2012, Oracle and SUSE offer Btrfs in their distro for prod use</li>
<li>2013, Btrfs main developer leaves Fusion-IO for Facebook</li>
<li>2017, Redhat removes Btrfs from inclusion to RHEL 8, switching to XFS (originally from SGI)</li>
<li>2018, Redhat acquisition by IBM</li>
</ul>
<p>Some enjoyable references:</p>
<ul>
<li><a href="https://en.wikipedia.org/wiki/Btrfs">en.wikipedia.org/wiki/Btrf&hellip;</a></li>
<li><a href="https://en.wikipedia.org/wiki/Acquisition_of_Sun_Microsystems_by_Oracle_Corporation">en.wikipedia.org/wiki/Acqu&hellip;</a></li>
<li><a href="https://en.wikipedia.org/wiki/Hans_Reiser">en.wikipedia.org/wiki/Hans&hellip;</a></li>
<li><a href="https://en.wikipedia.org/wiki/ZFS">en.wikipedia.org/wiki/ZFS</a></li>
<li><a href="https://en.wikipedia.org/wiki/XFS">en.wikipedia.org/wiki/XFS</a></li>
<li><a href="https://en.wikipedia.org/wiki/Oracle_Database#Competition">en.wikipedia.org/wiki/Orac&hellip;</a></li>
<li><a href="https://www.oracle.com/webfolder/s/assets/infographics/10-years-of-exadata/index.html">www.oracle.com/webfolder&hellip;</a></li>
<li><a href="https://flashdba.com/history-of-exadata/">flashdba.com/history-o&hellip;</a></li>
</ul>
]]></description>
      
    </item>
    
    
  </channel>
</rss>
