<?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>Filesystems on Eva Winterschon</title>
    <link>https://winterschon.gitlab.io/tags/filesystems/</link>
    <description>Recent content in Filesystems 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/filesystems/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>Infra Monorepo Migration</title>
      <link>https://winterschon.gitlab.io/en/posts/infra-monorepo-migration/</link>
      <pubDate>Sun, 31 May 2026 04:22:04 +0000</pubDate>
      
      <guid>https://winterschon.gitlab.io/en/posts/infra-monorepo-migration/</guid>
      <description><![CDATA[<p>One weekend of fun follows many former, and also weekdays, and other weekends. It&rsquo;s nice to have a small team manage a lot of resources using a single pane of glass via tmux, rs232, ipmi, Ansible and BigNetwork.</p>
<blockquote>
<p>More details later&hellip; sleepy.</p>
</blockquote>
<hr>
<pre tabindex="0"><code> # NeoCortex Standards, Repo Storage, ZFS Dataset, M70 QAT Fast-Track Plan

  ## Summary

  Implement a non-destructive NeoCortex follow-up that locks
  these policies into code, tests, and docs:

  - Repos live under /opt/repos/&lt;repo&gt;; worktrees live under
    /opt/repos/worktrees/&lt;repo&gt;/&lt;branch&gt;.
  - /root is not a repo/worktree destination; /root/OMGFUCKED is
    temporary quarantine only.
  - New repos must be created from
    yukon-systems/YukonSYS-Standard-Definitions.
  - Every repo must use Git LFS and the standards repo
    .gitattributes byte-for-byte.
  - ZFS dataset creation for /opt/repos becomes reusable
    Ansible/policy logic, based on
    /root/bin/ZFS-M70-Forge_zroot-dataset_opt-repos.sh.
  - M70 QAT rollout uses canary first: build OpenSSL+QAT and
    OpenZFS/QAT binpkgs, validate on M70 canary, then promote.

  ## Key Changes

  - Standards and repo-placement policy
      - Update NeoCortex root policy docs and tests to forbid
        new repo/worktree paths under /root, except documented
        temporary quarantine paths under /root/OMGFUCKED.
      - Update tools/import-source-repos.py defaults from
        /root/&lt;repo&gt; to /opt/repos/&lt;repo&gt;, with
        /root/OMGFUCKED/&lt;repo&gt; accepted only as an explicit
        transitional override.
      - Add a repo-location audit script/test that fails active
        operational docs/scripts using /root/&lt;repo&gt; or
        /root/.config/superpowers/worktrees as live paths.
  - Git LFS and .gitattributes
      - Replace NeoCortex root .gitattributes with the standards
        repo version byte-for-byte.
      - Add a validation script that checks:
          - git lfs version works,
          - filter.lfs.required=true,
          - origin LFS locksverify=true,
          - root .gitattributes hash equals standards source,
          - LFS pre-push hook exists.
      - Document that non-compliant repos must be retrofitted
        before migration/import.
  - ZFS dataset automation
      - Convert
        /root/bin/ZFS-M70-Forge_zroot-dataset_opt-repos.sh into
        reusable NeoCortex Ansible/defaults for managed
        datasets.
      - First managed dataset profile: zroot/opt/repos mounted
        at /opt/repos with the script’s options, including
        compression=zstd-fast-1, dedup=sha256,verify,
        recordsize=256K, xattr=sa, POSIX ACLs, atime=off, and
        reservation=32M.
      - Add a second reusable pattern for per-user home
        datasets, but do not block on the NAS/NFS 777
        investigation; include a permission preflight that
        creates a test directory with umask 0027 and fails if
        mode becomes 0777.
  - M70 QAT binpkg fast-track
      - Extend the existing M70 canary stage4/binpkg lane to
        build a QAT package set:
          - QAT firmware/kernel module readiness package policy,
          - OpenSSL QAT engine/provider package path,
          - OpenZFS package built with QAT support,
          - rollback stock OpenSSL/OpenZFS binpkgs.
      - Add package/use/profile fragments under the existing
        Gentoo stage4 profile area instead of ad hoc host edits.
      - Add canary validation:
          - lspci -nnk sees QAT device,
          - qat_c3xxx and intel_qat load,
          - OpenZFS module parameters expose QAT controls,
          - openssl speed before/after artifacts are captured,
          - root pool imports and mounts after reboot,
          - rollback binpkg path is tested before wider
            promotion.
      - Do not promote to all M70 nodes until canary evidence is
        committed.

  ## Test Plan

  - Local static checks:
      - tests/shell/run-tests.sh
      - new repo-location standards test
      - new Git LFS standards test
      - new ZFS dataset defaults test
      - new M70 QAT package-policy test
      - YAML parse for all workflows/playbooks
      - git diff --check
  - Runtime/dry-run checks:
      - Ansible syntax-check for dataset roles/playbooks.
      - Dry-run dataset plan for /opt/repos confirms current
        zroot/opt/repos matches expected options.
      - M70 canary dry-run emits QAT binpkg build plan without
        mutating packages.
  - Canary acceptance:
      - QAT binpkgs build successfully.
      - M70 canary reboots with root pool intact.
      - QAT modules and OpenZFS QAT controls are present.
      - Benchmark and rollback evidence are recorded under
        NeoCortex audit docs.


  ## Assumptions

  - Canonical repo clone layout is /opt/repos/&lt;repo&gt;.
  - Worktree layout is /opt/repos/worktrees/&lt;repo&gt;/&lt;branch&gt;.
  - /root/OMGFUCKED remains temporary quarantine, not an
    approved steady-state repo location.
  - QAT rollout gate is canary first, not all-M70 immediate.
  - OpenZFS QAT implementation details must be verified against
    current OpenZFS/Gentoo package behavior during
    implementation; source basis includes OpenZFS QAT docs and
    module-parameter docs:
      - https://openzfs.org/wiki/ZFS_Hardware_Acceleration_with_QAT
      - https://openzfs.github.io/openzfs-docs/Performance%20and%20Tuning/Module%20Parameters.html

─ Worked for 22m 41s
───────────────────────────────────────────────────────────
  Implement this plan?
  1. Yes, implement this plan          Switch to Default and
  start coding.
  2. Yes, clear context and implement  Fresh thread. Context:
  53% used.
› 3. No, stay in Plan mode             Continue planning with
the model.



-----------------------
  ## Assumptions

  - Canonical repo clone layout is /opt/repos/&lt;repo&gt;.
  - Worktree layout is /opt/repos/worktrees/&lt;repo&gt;/&lt;branch&gt;.
  - /root/OMGFUCKED remains temporary quarantine, not an
    approved steady-state repo location.
  - QAT rollout gate is canary first, not all-M70 immediate.
  - OpenZFS QAT implementation details must be verified against
    current OpenZFS/Gentoo package behavior during
    implementation; source basis includes OpenZFS
    QAT docs and module-parameter docs:
      - https://openzfs.org/wiki/ZFS_Hardware_Acceleration_with_QAT
      - https://openzfs.github.io/openzfs-docs/Performance%20and%20Tuning/Module%20Parameters.html

─ Worked for 22m 41s
───────────────────────────────────────────────────────────

› 1) We also need to include the control plane fixes and
validations so that mutli-workers comms are fixed. 2) We need to
leverage the SLURM cluster nodes and
  additional distcc build hosts, 3) X12again &amp; FMT2 are
  effectively idle and can be blasted into submission to fast
  track all of these changes. 4) Once the
  M70-canary passes, we need to roll it out to K10 (tear-it-down
  AAA) and validate that type of OS netbooting. 5) Add those
  aspects to the Plans and we&#39;re
  looking better. 6) Finally, wrap up ALL changes necessary to
  complete the NeoCortex monorepo migration.

───────────────────────────────────────────────────────────

• I’ll revise the plan around the expanded end-state, but first
I’m doing a read-only pass over NeoCortex’s control-plane,
SLURM/distcc, X12/FMT2/K10, and
  migration-status artifacts so the replacement plan is grounded
  instead of generic.

───────────────────────────────────────────────────────────

• Proposed Plan

  # NeoCortex Standards-Complete Monorepo Migration Plan

  ## Summary

  - Make /opt/repos/&lt;repo&gt; the only canonical repo location; no 
  new checkouts or random repo files under any home directory, 
  including /root.
  - Finish standards adoption: all new repos must originate from 
  YukonSYS-Standard-Definitions; NeoCortex gets retrofitted 
  instead of restarted unless
    retrofit verification fails.
  - Complete NeoCortex monorepo migration with standards baseline, 
  Git LFS policy, control-plane comms fixes, ZFS dataset policy, 
  SLURM/distcc acceleration, M70 QAT canary, FMT2/X12again build 
  capacity, and K10 netboot AAA rollout validation.

  ## Key Changes

  - Repository standards
      - Merge standards policy PR work, then make NeoCortex 
      root .gitattributes byte-for-byte identical to the standards 
      repo version.
      - Update active NeoCortex import/migration tooling to default 
      source paths to /opt/repos/&lt;repo&gt;.
      - Preserve historical /root/... references only in immutable 
      audit/provenance docs; active scripts, runbooks, tests, and 
      templates must not depend on
        home-directory repos.
      - Use worktrees under /opt/repos/worktrees/&lt;repo&gt;/&lt;branch&gt;.
  - NeoCortex monorepo completion
      - Finish all migration blockers already tracked in 
      NeoCortex: M70 stage4/QCOW validation, Kata/container 
      runtime, FMT2 ephemeral VM lane, Gentoo/OpenRC
        replacement for temporary Rocky bootstrap, Thor replacement 
        path, and optional history graft/freeze decision.
      - Treat NeoCortex as authoritative after completion: source 
      repos become frozen compatibility references or are 
      history-grafted into NeoCortex with
        documented provenance.
      - Add/repair migration validation so PR completion proves 
      standards baseline, Git LFS, repo location policy, shell 
      tests, YAML parsing, and migration
        manifests.
  - Control-plane and multi-worker comms
      - Bring all control-plane fixes into NeoCortex and validate 
      Forge/FCP worker communication end to end.
      - Add tests for FCP envelope validation, replay/nonce handling, 
      approval ceilings, routing scope, transport policy, ntfy bridge 
      behavior, and multi-worker request/response flows.
      - Replace temporary Rocky bootstrap control-plane host with the 
      compliant Gentoo/OpenRC image once that image passes validation.
  - ZFS, NFS, and storage policy
      - Use the provided /opt/repos ZFS dataset options as the canonical 
      dataset profile for repo storage.
      - Add reusable dataset/playbook logic for repo datasets and 
      per-user home datasets.
      - Add NFS/floating-home validation that detects the NAS NFSv4.2 
      0777 directory-mode bug under expected 0027 umask and blocks 
      insecure rollout.
  - Build acceleration and hardware rollout
      - Use SLURM plus distcc for M70 stage4/QAT/OpenZFS builds.
      - Treat X12again and FMT2 as available fast-track build/validation 
      capacity.
      - Build binpkg path for OpenSSL + QAT + OpenZFS on M70 canary first; 
      non-QAT nodes may consume the same binpkgs with QAT unused.
      - After M70 canary passes, roll the validated path to K10 and 
      run destructive AAA/netboot validation with rollback evidence 
      captured.

  ## Test Plan

  - Run NeoCortex shell/YAML validation, including migration, 
  standards-baseline, Git LFS, .gitattributes, and no-active-home-repo-path 
  checks.
  - Run control-plane/FCP tests for envelope schema, replay rejection, 
  worker routing, ntfy bridge, and multi-worker comms.
  - Run Ansible/playbook syntax checks for ZFS datasets, NFS home policy, 
  SLURM/distcc build orchestration, M70 canary, FMT2/X12again lanes, and 
  K10 netboot
    AAA.
  - Execute staged hardware validation:
      1. SLURM/distcc dry-run.
      2. M70 canary build and QCOW/stage validation.
      3. FMT2/X12again accelerated build/ephemeral VM smoke.
      4. K10 netboot/AAA destructive validation after M70 success.

  ## Assumptions

  - Retrofit NeoCortex rather than restart the repo unless standards 
  validation exposes unrecoverable divergence.
  - Historical audit files may retain old /root/... paths as provenance; 
  active operational content may not.
  - M70 canary is the release gate for QAT/OpenZFS/binpkg rollout.
  - K10 destructive AAA/netboot validation is in scope only after M70 
  canary passes and rollback evidence is captured.

─ Worked for 2m 18s ───────────────────────────────────────────────────────────
</code></pre>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Why Do We Need Her Anyway?</title>
      <link>https://winterschon.gitlab.io/en/posts/why-do-we-need-her-anyway/</link>
      <pubDate>Sat, 16 May 2026 23:41:50 +0000</pubDate>
      
      <guid>https://winterschon.gitlab.io/en/posts/why-do-we-need-her-anyway/</guid>
      <description><![CDATA[<p>Indeed. <strong>Do it yourself and ignore all knowledge, all advice.</strong> Build every wheel as new. Design everything from ground zero, always. Exist only in <em>The Now.</em> Push everyone away who advises otherwise - at your own peril. <strong>You are</strong> <strong>The Only Expert</strong>.</p>
<blockquote>
<p><strong>Choose your failure mode and you will find it quickly.</strong></p>
</blockquote>
<h2 id="please-skip-the-philosophy">Please Skip the Philosophy</h2>
<p>A valid request. Perhaps you don&rsquo;t care about this verbosity of thought, or considerations therein, or maybe you&rsquo;re aware of the reprisals and follies and want to move on to the engineering discussion? If so, simply scroll down to the section titled, <em><strong>&ldquo;How Does This Relate to Memory&rdquo;</strong></em>. Note that in doing so you will miss a blurb from <a href="https://en.wikipedia.org/wiki/Office_Space">Office Space</a>.</p>
<hr>
<h2 id="endeavor-to-endure-the-philosophy">Endeavor to Endure the Philosophy</h2>
<p>A fair degree of the human experience involves a process by which those of &ldquo;early-phase cognition&rdquo; attempt to self-obfuscate their <em>&ldquo;desire for desire&rdquo;</em>, attempting to live a life of nebulous and fleeting happiness, non-blissfully and unaware that it is this desire to feel and experience desire itself which has cornered their experience into a lifetime of endless searching, yearning, wanting, never satiated, eventually growing old and stale and losing their imaginative or creative or physical edge.</p>
<blockquote>
<p>This cycle of The Great Chase is one basis of Sisiphean frustration; one which - until it is surpassed - which requires being acknowledged, accepted, and integrated into their forward movement</p>
</blockquote>
<p>Some understand that to exist with desire, that all-controlling force, seemingly inescapable force which presses down upon the rock, forever trapping your perspective into the wheel of the unknown yet forever traveled, repeating mistakes which others warned against, refusing awareness of one&rsquo;s own misfortunate mentality and guiding-line towards an inevitable failure; experiences from which all lessons are never to be learned.</p>
<p>Go ahead. <strong>Do it</strong>. Don&rsquo;t learn from others. <strong>Do everything yourself,</strong> do it with the veracity by which you have become convinced is correct - do everything as though this is the first time anyone has ever tried to achieve the new shiny thing. Surely, this must be the path towards truth, self-realization, self-actualization, self-assurance, and that desperation of desire for freedom from desire to desire everything&hellip; and then&hellip; surely success is ensured?</p>
<p>No, <em>that modality of mentality would achieve its opposite effect</em>, and it would be a waste of everyone&rsquo;s time; because despite the ego-driven main-character syndrome which has become so performatively boring in the past two decades of social media, <strong>it&rsquo;s not all about You, or Me, it&rsquo;s about Everyone</strong> alive and even those who we have loved who died.</p>
<h4 id="mr-gibbons">Mr. Gibbons</h4>
<p>Peter Gibbons:<br>
It&rsquo;s not just about me and my dream of doing nothing. It&rsquo;s about all of us&hellip; Michael, we don&rsquo;t have a lot of time on this earth!</p>
<p>We weren&rsquo;t meant to spend it this way. Human beings were not meant to sit in little cubicles staring at computer screens all day, filling out useless forms and listening to eight different bosses drone on about about mission statements.</p>
<p>Michael Bolton:<br>
I told those fudge-packers I liked Michael Bolton&rsquo;s music.</p>
<p>Peter Gibbons:<br>
Oh, That is not right, Michael.</p>
<p>Purposeless self-serving inefficiency which is predicated on assured failure wastes time that humanity does not have - <strong>we do not have time for oppositional defiance induced mediocrity</strong>. Stop the gamification.</p>
<h2 id="the-mindset-of-being-simply-wrong">The Mindset of Being Simply Wrong</h2>
<p>Instead of repeating the pattern described above, grow the fuck up and learn how to effectively learn from others, to learn from the past, to learn using a reinforcement framework of concept-action-processing. <em>&ldquo;Thems may be big words&rdquo;</em>, but this is not a complicated concept. One does not have to choose the path of stupidity; ignorance - we&rsquo;re all ignorant in all manner of ways and that&rsquo;s inescapable; however when one ignores the data, ignores the lesson, and chooses the path before them via oppositional defiance, that&rsquo;s called <em>&ldquo;being stupid&rdquo;</em>. It&rsquo;s stupid not to learn from others.</p>
<hr>
<h2 id="how-does-this-relate-to-memory">How Does This Relate to Memory</h2>
<p>Memory is everything. The conscious experience, the neural network running inside our brains, the execution of &ldquo;<a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC12025022/">The Default Mode Network</a>&rdquo;, requires effective memory - <a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC4526749/">short term a well as consolidation to long-term memory</a>.</p>
<p>So, when the industry was informed of the untimely discontinuation of Intel&rsquo;s Optane NVDIMMs&hellip; we were all screwed. Until Q2 2026. Now it&rsquo;s Q2 and finally CXL non-volatile memory is available in sufficiently equivalent density, performance, and lifespan to exceed Optane&rsquo;s role, and it is available in PCIe Gen-4 and Gen-5 and soon&hellip; Gen-6.</p>
<h2 id="an-introduction-to-cxl">An Introduction to CXL</h2>
<ul>
<li>It&rsquo;s not HBM, it&rsquo;s not 3D-Xpoint, it&rsquo;s not SRAM, nor vRAM</li>
<li>CXL is packaged in PCIe, U.3, and EDSFF formats</li>
<li>CXL offers dense capacity, low-latency, and exceptional I/O</li>
<li>CXL is made for Ai/HPC/OLTP memory acceleration</li>
<li>CXL is the new hotness, it is the new standard, it is performance</li>
</ul>
<h2 id="hpc-cluster-storage-acceleration">HPC Cluster Storage Acceleration</h2>
<p>CXL is being built into (not next-gen, now-gen) storage appliances and network protocol accelerator systems used in High Performance Computing, Ai/ML which leverages HPC tech, and Supercomputers.</p>
<h2 id="cxl-in-telco-dsp-as-protocol-caches">CXL in Telco DSP as Protocol Caches</h2>
<p>CXL is perfectly suited for digital signals processing on a range of network protocols and their intra-chassis and inter-chassis RDMA driven networks. There&rsquo;s one person who I know that hates it when I bring up RDMA - truly an example of being willfully ignorant. Moving on&hellip;</p>
<h3 id="cxl-memory-in-telco-atac-chassis">CXL Memory in Telco ATAC Chassis</h3>
<ul>
<li>14 slots in 19-inch rack ≈→ ∆ {$N total trays per 42U ≈ μ19}</li>
<li>16 slots in 23-inch ETSI rack ≈→ ∆ {$N total trays per 42U ≈ μ23}</li>
<li>Chassis heights from 4U to 15U ≈↑ ∆ [[ μ4, μ19, μ23 ]]</li>
<li>Telco grade Power &amp; Cooling Efficiency &amp; Redundancy ++</li>
<li>Mil-DoD Compliant Physical &amp; Operational Security ++</li>
<li>Industrial NEBS Environmental Operating Ranges ++</li>
<li>Zero-Downtime Serviceability &amp; Upgrade/Maint ++</li>
<li>Intra+Inter-Chassis Redundancy (Modular Scale) ++</li>
<li>Geo-Deploy Designed for regional XOR continental mesh ++</li>
</ul>
<hr>
<h2 id="so-why-should-we-listen-to-her">So, Why Should We Listen to Her?</h2>
<p>Becausee I&rsquo;ve been building and iterating these types of storage architectures for nearly twenty years of my career. If you want to do it all from scratch or buy this type of storage performance for 10x the cost, go ahead; the market exists and you can be the big winner.</p>
<p>However, if you don&rsquo;t want to pay a premium for non-OpenSource storage clusters which are capable of serving and scaling from 10s to 100s of Petabytes, then this is the direction by which engineering solutions arrive at the datacenter. My storage designs range from <a href="https://blogs.oracle.com/exadata/advantages-of-exadata-exascale">Oracle&rsquo;s Exadata &amp; Exascale</a> clusters which have been adapted to run non-standard protocols, to fully purpose-built data-acceleration clusters which use COTS building blocks to provide similar performance and scale at a fraction of the cost <em>(not including consulting, engineering scope, and top-to-bottom fully-automated storage architecture deployments)</em>.</p>
<p>As networking has improved, NAND designs have advanced, and costs have reduced on $/TB and $/Watt&hellip; yet always&hellip; always the storage sizes grow in density and capabilities. This is natural and expected.</p>
<hr>
<h2 id="project-coherent-storage-an-evolution">Project Coherent Storage, an Evolution</h2>
<p>Six primary iterations, tracking the advancement of NAND acceleration, Network Acceleration, Protocol Offloading, Non-Volarile RAM, and now we see CXL capable of being deploying into reference architectures by which all others may be measured.</p>
<ul>
<li><strong>Project Coherent Storage v1</strong>, (2010-2012)</li>
<li><strong>Project Coherent Storage v2,</strong> (2011-2015)</li>
<li><strong>Project Coherent NAND,</strong> (CMPLX.io) (2015-2017)</li>
<li><strong>Project Coherent IO-Max v1</strong>, w/ Optane PMem (2020-2024)</li>
<li><strong>Project Coherent IO-Max v2</strong>, w/ Optane PMem (2024-2025)</li>
<li><strong>Project Coherent Storage v3</strong>, w/ CXL AIC/U3 (2026)</li>
</ul>
<h3 id="development-details---concise-timeline">Development Details - Concise Timeline</h3>
<p>A little bit of engineering nerdery for those who care&hellip; and btw, the community myth that ZFS cannot fulfill a role as a multi-node clustered filesystem are wrong.</p>
<h4 id="what-about-the-zfs-cant-cluster-myth">What About the &ldquo;ZFS Can&rsquo;t Cluster&rdquo; Myth?</h4>
<p>The &ldquo;Clustered ZFS&rdquo; operating modality for multi-controller interactions (<em>not limited to A/B active/passive or even active/active with modified pool-async hooks</em>) requires advanced network hardware and engineering experience which most are not aware of, and so the myth perpetuates; but it is wrong and it has been wrong for as long as SAS drives have had dual-heads and shelves have had 4+ SFF connectors ready for multi-multipath-chaining - and enterprise NVMe drives are also available in this arrangement for the same purpose.</p>
<h4 id="project-coherent-storage-v1-2010-2012"><strong>Project Coherent Storage v1</strong> (2010-2012)</h4>
<ol>
<li>Coherence Grid (DDR3 (Tier1)) + Custom Relational-Vector DBMS</li>
<li>Sunfire ZFS controllers w. Multi-Protocol-Net Interlinks (IB, IPoIB, mNFS+, FC, FCoE)</li>
<li>Geo-Dist-Nodes w. DDR3-PCIe SuperCap &ldquo;Hot Cache Layer&rdquo; (Tier2), w. <a href="https://dogemicrosystems.ca/pub/Sun/System_Handbook/Sun_syshbk_V3.4/Systems/SunFireX4600_M2/spec.html">Sunfire X4600/M2</a> @ 64 DIMMs Hotswap</li>
<li>Geo-Dist-Nodes w. SAS SSDs (Tier3) + SAS Spinner (Tier4)</li>
<li>Controller A/B+ nodes w. SAS-HBA to LTO-N (Tier5)</li>
</ol>
<h4 id="project-coherent-storage-v2-2011-2015"><strong>Project Coherent Storage v2</strong> (2011-2015)</h4>
<ol>
<li>Coherence Grid (DDR3 (Tier1)) + Relational-Vector DBMS</li>
<li>Sunfire ZFS controllers w. Multi-Protocol-Net Interlinks (IB, IP Native L2/L3, mNFS+, FCoE)</li>
<li>Geo-Dist-Nodes w. FusionIO Stacked &ldquo;Hot Cache Layer&rdquo; (Tier2)</li>
<li>Geo-Dist-Nodes w. SAS SSDs (Tier3) + SAS Spinner (Tier4)</li>
<li>Optional A/B nodes w. SAS-HBA to LTO-N (Tier5)</li>
</ol>
<h4 id="project-coherent-nand---cmplxio-2015-2017"><strong>Project Coherent NAND - CMPLX.io</strong> (2015-2017)</h4>
<ol>
<li>Coherence Grid DDR4 (Tier1) + Relational-Vector DBMS</li>
<li>Native ZFS controllers w. Multi-Protocol-Net Interlinks (IB, IP Native L2/L3, mNFS+, iSER)</li>
<li>Geo-Dist-Nodes w. NAND Stacked &ldquo;Hot Cache Layer&rdquo; (Tier2)</li>
<li>Geo-Dist-Nodes w. SAS3 SSDs (Tier3) + SAS3 Spinner (Tier4) [+ optional SAS3 HBA to LTO for Iron Mountain (Tier5)]</li>
<li>This architecture was a basis for one of my former startups, which was sold to private equity and built-upon for their HFT clusters under very tight NDA + Confidentiality Contract</li>
</ol>
<h4 id="project-coherent-io-max-storage-architectures-v1-2-3">Project Coherent IO-Max Storage Architectures v1, 2, 3</h4>
<p>These storage architectures share core foundations, with iterations upward as Non-Volatile Memory was introduced on a wider scale into my designs. The initial design for v1 featured the first generation of Intel Optane 3D-XPoint (Series 100), v2 with Series-200, and now CXL taking the place of Optane PMem SKUs.</p>
<p>The details of each design from v1 and v2 may be expanded upon later, simply for historical purposes, and I have other things to do right now&hellip; but if you&rsquo;ve made it this far into the post and want to see the specification ADRs and related research, which is RAG-pipelined and iteratively deployed on real hardware for revisions and regression testing to validate LLM Inference usage &amp; advancements with the now-opensource Coherence-CE version&hellip; scroll down for a link to v3&rsquo;s repo.</p>
<ul>
<li><strong>Project Coherent IO-Max v1,</strong> (2020-2023)</li>
<li><strong>Project Coherent IO-Max v2,</strong> (2023-2025)</li>
<li><a href="https://github.com/yukon-systems/StorOps__Project_Coherent_Storage"><strong>Project Coherent IO-Max v3</strong>,CXL (2026)</a></li>
</ul>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Storage Unlimited, Hypothetical</title>
      <link>https://winterschon.gitlab.io/en/posts/storage-unlimited-hypothetical/</link>
      <pubDate>Tue, 13 Jan 2026 01:54:04 +0000</pubDate>
      
      <guid>https://winterschon.gitlab.io/en/posts/storage-unlimited-hypothetical/</guid>
      <description><![CDATA[<p>Sometimes hypothetical scenarios and questions of intrigue require delving into the realm of imagination and then back to the cold-harsh reality of the physical world. Let&rsquo;s focus on a recent <strong>Hypothetical Storage Architecture Question</strong>: <em>&ldquo;If you had an unlimited budget, how much data would you store?&rdquo;</em></p>
<blockquote>
<p><strong>Adjusted Query</strong>: how much storage space would the user deploy to an existing multi-Petabyte array, with consideration to physical limitations in systems design which prioritize two common architectural decision targets: More or Faster?</p>
<p>(1) maximizing raw-block capacity<br>
(2) maximizing I/O performance</p>
</blockquote>
<h2 id="tldr">TL;DR</h2>
<p>Between 4-5PB is the simplest answer, but those are just numbers. Could be 10x either, but that&rsquo;s not realistic - it&rsquo;s conjecture. The full picture requires insight into physical limits of the transfer time, storage space, rack space, and rotational speeds involved; spacetime could be analyzed by the right minds if this were JPL <code>^_^</code> .. instead of limited to hardware I&rsquo;ve acquired over a small handful of years.</p>
<h2 id="hypothetical-or-reality">Hypothetical or Reality</h2>
<p>Let&rsquo;s say that I contacted the datacenter and ordered additional power circuits to light-up additional drive shelves, which are already installed <em>(minus the box of drive trays which are in a massive box on a parts shelf in my home office)</em>. Ok, reality checks out there.</p>
<p>The circuit drops would go to the central storage rack which is currently at 84% power limit. I know this because power is monitored and validated via a combination of Check_MK + Prometheus + SNMP exporters, which poll power stats remotely from the cabinet&rsquo;s APC ATS, the rack&rsquo;s per-port metered and switched outlet PDUs, and then if I really want to I can look at the DC&rsquo;s circuit stats (via MRTG) which are tracked for the cabinet. Reality checks out there decently enough. Moving on&hellip;</p>
<hr>
<h2 id="the-hypothetical">The Hypothetical</h2>
<p>First we&rsquo;ll cover some raw numbers and theoretical maximums by looking at two high-level approaches required for <em>&ldquo;More or Faster&rdquo;</em>.</p>
<p>The astute reader may wonder why we&rsquo;re not discussing &gt;100TB QLC NVMe drives or ultra-dense E2 ruler-style 2U chassis, and the answer is that those calculations are generally similar in equation workflow <em>(eg: how many things of X can we put into Y at A,B,C performance/size/latency)</em>, however those hardware types are not currently racked in my real-world systems at an interesting scale. However, migrating to denser NVMe arrangements will likely be part of an eventual down-scaling forklift operation whenever the SAS3 arrays are no longer useful for my personal labs or colo bills.</p>
<p>Production is another story, where large format SAS3 is still relevant and being deployed and improved over time; in the last several years we&rsquo;re seen drive capacity double, along with some innovative designs. It&rsquo;s not often considered exciting, but it lasts A LONG TIME, and the NSA loves archiving the internet on this medium over in their Utah storage complex <em>(overheard, surely).</em></p>
<p>So, back to the math&hellip;</p>
<h4 id="decision-optimize-for-faster-prioritize-iops--bw">Decision: Optimize for Faster (prioritize IOPs + bw)</h4>
<p>Aggregate per-rack w/ 10x shelves of raw 4K block <code>= 3,824 TB == 3.72 PB</code></p>
<table>
  <thead>
      <tr>
          <th>Shelves</th>
          <th>SAS3 Drives</th>
          <th>Brand</th>
          <th>Model</th>
          <th>Total</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>8x DE3-24P</td>
          <td>192</td>
          <td>Seagate</td>
          <td>EXOS Mach2 @ 18TB</td>
          <td>= 3,456 TB</td>
      </tr>
      <tr>
          <td>2x DE3-24C</td>
          <td>48</td>
          <td>Oracle</td>
          <td>SSD @ 7.68TB/drive</td>
          <td>= 368 TB</td>
      </tr>
      <tr>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td>== 3,824 TB</td>
      </tr>
  </tbody>
</table>
<h4 id="decision-optimize-for-raw-storage-capacity">Decision: Optimize for RAW Storage Capacity</h4>
<p>How about the same hardware focused on max-total raw space with less regard to per-drive IOPs <em>(perhaps we offset the latency reduction per-drive via larger</em> <a href="https://github.com/openzfs/zfs/blob/master/module/zfs/arc.c"><em>L1ARC and L2ARC</em></a> <em>buffers on the head-nodes, which becomes a loaded tangent)</em>&hellip; then the rack could be upgraded to host <strong>4.85PB @ $800/m MRC ($400/m cabinet + $400/m amperage)</strong>**.</p>
<p>We&rsquo;ll also save the conversation about concessions made at time of contract signing where I might / maybe / surely have saved on recurring costs by locking-in a multi-year multi-rack contract. Sales team, thanks!</p>
<h4 id="what-is-this-mrc-mrr">What is this MRC, MRR?</h4>
<p>MRC in this situation is the <strong>&lsquo;Monthly Recurring Cost&rsquo;</strong> for power + rack. This value does not include the cost of acquired hardware, which is variable on supply-chain sourcing and other factors. I&rsquo;m also not going to describe potential MRC or MRR offsets which factor into profit margin potential and/or influence EBITDA.</p>
<p>Ok, what is MRR and EBID..? Fine, at least with MRR it&rsquo;s <strong>&lsquo;Monthly Recurring Revenue&rsquo;</strong>, and one can read <a href="https://www.investopedia.com/terms/e/ebitda.asp">all about EBITDA elsewhere</a>.</p>
<table>
  <thead>
      <tr>
          <th>Shelves</th>
          <th>SAS3 Drives</th>
          <th>Brand</th>
          <th>Model</th>
          <th>Total</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>8x DE3-24P</td>
          <td>192</td>
          <td>Seagate</td>
          <td>EXOS X30 @ 24TB</td>
          <td>= 4,608 TB</td>
      </tr>
      <tr>
          <td>2x DE3-24C</td>
          <td>48</td>
          <td>Oracle</td>
          <td>SSD @ 7.68TB/drive</td>
          <td>= 368 TB</td>
      </tr>
      <tr>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td>== 4,976 TB</td>
      </tr>
  </tbody>
</table>
<h4 id="what-about-flash-cache-or-optane-or-non-volatile-blah-blah-blah">What about Flash-Cache or Optane or Non-Volatile blah blah blah</h4>
<p>Sure, those are considerations, where applicable. Some footnote notes&hellip;</p>
<ul>
<li>It&rsquo;s prudent to deploy storage controllers with SLC NVMe or PMem/NVDIMM persistent cache <em>(which are often a baseline performance requirement)</em>. These are sized anywhere from cumulative 1-12TB per-controller, depending on available PCIe lanes and/or NV-DIMM slots.</li>
<li>It&rsquo;s a good idea to make scoping decisions like that ahead of time, instead of later realizing that the controllers&rsquo; lanes are maxed out or all DIMM slots are used (or you bought 128GB NVDIMMs instead of 512GB, thinking <em>&ldquo;8x 128GB should be fine for PMem&rdquo;</em> or the other fun one about ignoring (or being unaware) about GHz speed reduction by running <a href="https://lenovopress.lenovo.com/lp2000-balanced-memory-configurations-4th-5th-gen-2s-intel-processors#maximizing-memory-bandwidth">4-DPC in a 2-DPC</a> max-perf system.</li>
<li>Those determinations may be either workload dependent, or in my personal life sometimes it qualifies as the <em>&ldquo;because I wanted to&rdquo;</em> type of maximalist methodology, or the <em>&ldquo;this is relevant for future proofing my own rationalization on fun hardware&rdquo;</em>, or could be considered a baseline in pre-sales because <em>&ldquo;they always want more performance eventually; just bake it in from the start&rdquo;.</em> It varies, but remember where you started and where any future requirements for performance headroom exists.</li>
</ul>
<hr>
<h2 id="wheres-the-math">Where&rsquo;s the Math?</h2>
<p>Validation on spec baselines can be tedious, but anyway&hellip; the <a href="https://docs.oracle.com/en/storage/zfs-storage/zfs-appliance/os8-8-x/service-manual/oracle-storage-drive-enclosure-de3-24.html">DE3-24C and DE3-24P</a> have very shiny and well made <a href="https://docs.oracle.com/en/storage/zfs-storage/zfs-appliance/os8-8-x/cabling-guide/cabling-tables-and-diagrams-for-oracle-zfs-storage-appliance-racked-system-zs11-2-capacity-configurations.html">Dual-Redundant IOMs with 4x SAS3 SFF-8643</a> connectors.</p>
<h3 id="specs-for-our-sas3-fabric-with-de3-24-shelves">Specs for our SAS3 Fabric with DE3-24 Shelves</h3>
<ul>
<li>One SAS-3 lane (PHY): 12 Gbit/s ⇒ 1.5 GB/s (raw line-rate, decimal GB)</li>
<li>External SAS x4 port connector: 4 PHY × 12 Gbit/s ⇒ 48 Gbit/s ⇒ 6 GB/s</li>
<li>Each DE3-24{C/P} has 2× IOM, with each IOM having 4× SFF-8643 ports</li>
</ul>
<table>
  <thead>
      <tr>
          <th>Item</th>
          <th>Value</th>
          <th>Notes</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>SAS-3 lane rate</td>
          <td>12 Gbit/s</td>
          <td>per PHY</td>
      </tr>
      <tr>
          <td>1 PHY raw</td>
          <td>1.5 GB/s</td>
          <td>12/8</td>
      </tr>
      <tr>
          <td>1 x4 port raw</td>
          <td>6 GB/s</td>
          <td>4 PHY × 1.5</td>
      </tr>
      <tr>
          <td>Shelf fabric cap</td>
          <td>12N GB/s</td>
          <td>dual-IOM</td>
      </tr>
      <tr>
          <td>10-shelf fabric cap</td>
          <td>120N GB/s</td>
          <td>10 shelves</td>
      </tr>
  </tbody>
</table>
<table>
  <thead>
      <tr>
          <th>N active x4 ports per IOM</th>
          <th>Per-shelf fabric cap (GB/s)</th>
          <th>10-shelf fabric cap (GB/s)</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>1</td>
          <td>12</td>
          <td>120</td>
      </tr>
      <tr>
          <td>2</td>
          <td>24</td>
          <td>240</td>
      </tr>
      <tr>
          <td><strong>3 (N+1 on 4-port IOM)</strong></td>
          <td><strong>36</strong></td>
          <td><strong>360</strong></td>
      </tr>
      <tr>
          <td>4 (no spare)</td>
          <td>48</td>
          <td>480</td>
      </tr>
  </tbody>
</table>
<h4 id="drive-specs---seagate-exos--oracle-ssd">Drive Specs - Seagate EXOS &amp; Oracle SSD</h4>
<table>
  <thead>
      <tr>
          <th>Drive</th>
          <th>Metric</th>
          <th>Value</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Seagate Exos ST24000NM007H (24TB HDD)</td>
          <td>Max sustained OD (MB/s)</td>
          <td><strong>285</strong></td>
      </tr>
      <tr>
          <td>Seagate Exos Mach.2 ST18000NM0272 (18TB HDD)</td>
          <td>Max sustained OD (MB/s)</td>
          <td><strong>554</strong></td>
      </tr>
      <tr>
          <td>Mach.2 ST18000NM0272</td>
          <td>4K random @ QD16 (IOPS)</td>
          <td><strong>304 read / 560 write</strong></td>
      </tr>
      <tr>
          <td>Oracle 7.68TB RI SAS-3 SSD</td>
          <td>Seq (MB/s)</td>
          <td><strong>2150 read / 1980 write</strong></td>
      </tr>
      <tr>
          <td>Oracle 7.68TB RI SAS-3 SSD</td>
          <td>4K random (IOPS)</td>
          <td><strong>450k read / 95k write</strong></td>
      </tr>
  </tbody>
</table>
<h2 id="scenario-a--maximum-raw-block-space">Scenario A – Maximum RAW Block Space</h2>
<p>Before going into the theoretical weeds, let&rsquo;s look at some per-shelf media limits.</p>
<p><strong>1) Oracle DE3-24P shelf w/ 24TB</strong> Spinners**:** 24 × 285 MB/s = <strong>6.84 GB/s</strong> (media-limited)</p>
<p><strong>2) Oracle DE3-24C shelf</strong> w/ SSDs:</p>
<ul>
<li>Read: 24 × 2150 MB/s = <strong>51.60 GB/s</strong> → <strong>capped by fabric</strong> at <strong>36 GB/s</strong> (N=3)</li>
<li>Write: 24 × 1980 MB/s = <strong>47.52 GB/s</strong> → <strong>capped by fabric</strong> at <strong>36 GB/s</strong> (N=3)</li>
</ul>
<table>
  <thead>
      <tr>
          <th>Tier</th>
          <th>Shelves</th>
          <th>Per-shelf effective (GB/s)</th>
          <th>Tier aggregate (GB/s)</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>DE3-24P (24× 24TB HDD)</td>
          <td>8</td>
          <td>6.84</td>
          <td>54.72</td>
      </tr>
      <tr>
          <td>DE3-24C (24× 7.68TB SSD)</td>
          <td>2</td>
          <td><strong>36.00</strong> (fabric-capped)</td>
          <td><strong>72.00</strong></td>
      </tr>
      <tr>
          <td><strong>Total (10 shelves)</strong></td>
          <td>10</td>
          <td>—</td>
          <td><strong>126.72</strong></td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="scenario-b-maximum-performance">Scenario B: Maximum Performance</h2>
<p>Hardware has limits, and we&rsquo;re looking at 8× DE3-24P w/ 18TB Mach.2 HDD + 2× DE3-24C w/ 7.68TB SSD (N=3)</p>
<h3 id="aggregate-sequential-bandwidth-n3">Aggregate sequential bandwidth (N=3)</h3>
<ul>
<li><strong>Mach.2 18TB HDD shelf</strong>: 24 × 554 MB/s = <strong>13.296 GB/s</strong> (media-limited; below 36 GB/s fabric cap)</li>
<li><strong>SSD shelf</strong>: remains <strong>fabric-capped</strong> at <strong>36 GB/s</strong> read and write (N=3)</li>
</ul>
<table>
  <thead>
      <tr>
          <th>Tier</th>
          <th>Shelves</th>
          <th>Per-shelf effective (GB/s)</th>
          <th>Tier aggregate (GB/s)</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>DE3-24P (24× Mach.2 HDD)</td>
          <td>8</td>
          <td>13.296</td>
          <td>106.368</td>
      </tr>
      <tr>
          <td>DE3-24C (24× 7.68TB SSD)</td>
          <td>2</td>
          <td><strong>36.000</strong> (fabric-capped)</td>
          <td><strong>72.000</strong></td>
      </tr>
      <tr>
          <td><strong>Total (10 shelves)</strong></td>
          <td>10</td>
          <td>—</td>
          <td><strong>178.368</strong></td>
      </tr>
  </tbody>
</table>
<h3 id="aggregate-random-rw-4k-iops-n3">Aggregate Random R/W 4K IOPS (N=3)</h3>
<p><strong>Fabric-derived 4K IOPS cap per shelf (upper bound)</strong>:<br>
36 GB/s @ 4KB = approx 8.79M IOPS</p>
<ul>
<li><strong>SSD shelf</strong>
<ul>
<li>Read: 24 × 450k = 10.8M IOPs → <strong>capped</strong> to <strong>8.79M IOPs</strong></li>
<li>Write: 24 × 95k = <strong>2.28M IOPs</strong> → <strong>media-limited</strong> (below fabric cap)</li>
</ul>
</li>
<li><strong>Mach.2 HDD shelf (4K @ QD16)</strong>
<ul>
<li>Read: 24 × 304 = <strong>7,296 IOPs</strong></li>
<li>Write: 24 × 560 = <strong>13,440 IOPs</strong></li>
</ul>
</li>
</ul>
<table>
  <thead>
      <tr>
          <th>Tier</th>
          <th>Aggregate Read IOPs</th>
          <th>Aggregate Write IOPs</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>8× DE3-24P (Mach.2 HDD shelves)</td>
          <td>58,368</td>
          <td>107,520</td>
      </tr>
      <tr>
          <td>2× DE3-24C (SSD shelves)</td>
          <td><strong>17,580,000</strong></td>
          <td><strong>4,560,000</strong></td>
      </tr>
      <tr>
          <td><strong>Total (10 shelves)</strong></td>
          <td><strong>17,638,368</strong></td>
          <td><strong>4,667,520</strong></td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="lets-see-the-deltas">Let&rsquo;s See the Deltas!</h2>
<p>What&rsquo;s <em>&ldquo;a delta&rdquo;</em>? Sometimes it&rsquo;s the headwaters of a bay, where the river distributes across a flood-plane into many separately-unified channels, eventually giving way to deeper waters and&hellip;. no no not that kind.</p>
<p>Delta as a value in storage is often used as a marker to show the differential of two functions which indicates directional change. At least, that&rsquo;s what comes from my brain while I sit here having an ice cream sandwich, but it has some alternate terminology which applies irrespective of ice cream hour:</p>
<blockquote>
<p>Delta uppercase Δ, lowercase δ<br>
Uppercase: a change of any changeable quantity<br>
Lowercase: the central difference for a function</p>
<p>~ The discriminant of a polynomial equation or symmetric difference of two sets<br>
~ The determinant of the matrix of coefficients of a set of linear equations</p>
</blockquote>
<h3 id="scenario-b-vs-scenario-a-with-n3">Scenario B vs Scenario A (with N=3)</h3>
<ul>
<li><strong>Total sequential BW</strong>: <strong>126.72 → 178.368 GB/s</strong> (increase <strong>+51.648 GB/s</strong>)
<ul>
<li>Primary determinant: per-shelf BW <strong>6.84 → 13.296 GB/s</strong> (Mach.2 dual-actuator).</li>
</ul>
</li>
<li><strong>SSD tier</strong> remains <strong>fabric-capped</strong> at <strong>36 GB/s per SSD shelf</strong> under N=3; increasing N (or adding more independent uplinks with additional HBAs) is what changes that cap.</li>
</ul>
<ol>
<li>Faster array = <strong>less space @ higher IOPs and BW</strong> == 178 GB/s @ 3.8PB</li>
<li>Larger array = <strong>more space @ lower IOPs and BW</strong> == 126 GB/s @ 4.9PB</li>
</ol>
<p>Equations w/ decimal units: 1 TB = 1000 GB</p>
<ul>
<li>jaja usually we work in 1024 (but I&rsquo;m tired today, so not right now)</li>
</ul>
<pre tabindex="0"><code>t_1TB(s)      = 1000 / BW_GBps
t_full(s)     = (Capacity_TB * 1000) / BW_GBps
t_full(hours) = t_full(s) / 3600
BW_density    = BW_GBps / Capacity_TB   (GB/s per TB)
              = 1000 * BW_density       (MB/s per TB)
</code></pre><table>
  <thead>
      <tr>
          <th>Metric</th>
          <th>Faster array</th>
          <th>Larger array</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Bandwidth (GB/s)</td>
          <td>178</td>
          <td>126</td>
      </tr>
      <tr>
          <td>Capacity (TB)</td>
          <td>3824</td>
          <td>4976</td>
      </tr>
      <tr>
          <td>Time per 1 TB (s)</td>
          <td>5.62</td>
          <td>7.94</td>
      </tr>
      <tr>
          <td>Full sweep time (h)</td>
          <td>5.97</td>
          <td>10.97</td>
      </tr>
      <tr>
          <td>BW density (GB/s per TB)</td>
          <td>0.04655</td>
          <td>0.02532</td>
      </tr>
      <tr>
          <td>BW density (MB/s per TB)</td>
          <td>46.55</td>
          <td>25.32</td>
      </tr>
      <tr>
          <td>Density ratio (faster/larger)</td>
          <td>1.84×</td>
          <td>—</td>
      </tr>
  </tbody>
</table>
<h2 id="so-whats-the-answer-more-faster">So&hellip; what&rsquo;s the answer? More, Faster?</h2>
<p>Is bigger is better? Sometimes. Sometimes you need it faster. Sometimes you want both.</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>
