<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>NineLives blog</title>
  <subtitle>Short notes as things get decided.</subtitle>
  <link rel="self" type="application/atom+xml" href="https://ninelives.getfelix.dev/blog/feed.xml"/>
  <link rel="alternate" type="text/html" href="https://ninelives.getfelix.dev/blog/"/>
  <id>https://ninelives.getfelix.dev/blog/</id>
  <updated>2026-10-28T00:00:00Z</updated>
  <entry>
    <title>Linux or our own kernel?</title>
    <link rel="alternate" type="text/html" href="https://ninelives.getfelix.dev/blog/linux-or-our-own-kernel/"/>
    <id>https://ninelives.getfelix.dev/blog/linux-or-our-own-kernel/</id>
    <published>2026-10-28T00:00:00Z</published>
    <updated>2026-10-28T00:00:00Z</updated>
    <author><name>Gabriel Loewen</name></author>
    <summary>The first open question, with the case for each side. Nothing is chosen yet.</summary>
    <content type="html">&lt;p&gt;The first question anyone asks is whether NineLives will have its own kernel. There are good Rust crates now, and booting, paging and a basic scheduler are weeks of work, not years. It isn&#39;t decided. I opened &lt;a rel=&quot;external&quot; href=&quot;https://github.com/GetFelix/ninelives/discussions/22&quot;&gt;a discussion&lt;/a&gt; to work it out, and this is the short version of both sides.&lt;/p&gt;
&lt;h2 id=&quot;the-case-for-stock-linux&quot;&gt;The case for stock Linux&lt;/h2&gt;
&lt;p&gt;What is new in NineLives sits above the kernel: workloads that survive losing a machine, atomic upgrades, system programs that keep their state in the log. None of that obviously needs a new kernel, and all of it is plenty of work. The first thing I want to see is three VMs, one killed, and nothing lost.&lt;/p&gt;
&lt;figure class=&quot;nl-figure&quot;&gt;
  &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;nl-ill&quot; role=&quot;img&quot; aria-label=&quot;Three machines, each running Linux, sit over one log of records. The middle machine is faded and dashed because it died. The cat steps along a curved arrow from it onto the third machine. Every record in the log is still there, and the newest is amber.&quot; viewBox=&quot;0 0 720 480&quot; width=&quot;720&quot; height=&quot;480&quot;&gt;&lt;style&gt;.nl-ill{--f-ink:#0e2a3a;--f-soft:rgba(95,211,239,.22);--f-cat:#0e2a3a;--f-eye:#5fd3ef;--f-label:#46536a;--f-amber-text:#8f4c00}
@media (prefers-color-scheme:dark){.nl-ill{--f-ink:#5fd3ef;--f-soft:rgba(18,163,196,.16);--f-cat:#5fd3ef;--f-eye:#0e2a3a;--f-label:#a9b6c8;--f-amber-text:#f7b13a}}
.nl-k{fill:none;stroke:var(--ill-ink,var(--f-ink));stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.nl-m{fill:var(--ill-soft,var(--f-soft));stroke:var(--ill-line,#12a3c4);stroke-width:2;stroke-linejoin:round}
.nl-o{fill:none;stroke:var(--ill-ink,var(--f-ink));stroke-width:2;stroke-linejoin:round}
.nl-ka{fill:none;stroke:var(--ill-accent,#f5a623);stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.nl-dead{opacity:.35}
.nl-dash{stroke-dasharray:5 6}
.nl-r{fill:var(--ill-line,#12a3c4)}
.nl-new{fill:var(--ill-accent,#f5a623)}
.nl-lost{opacity:.28}
.nl-cat{fill:var(--ill-cat,var(--f-cat));stroke:var(--ill-ink,var(--f-ink));stroke-width:2;stroke-linejoin:round}
.nl-tail-e{fill:none;stroke:var(--ill-ink,var(--f-ink));stroke-width:10;stroke-linecap:round}
.nl-tail{fill:none;stroke:var(--ill-cat,var(--f-cat));stroke-width:6;stroke-linecap:round}
.nl-eye{fill:var(--ill-eye,var(--f-eye))}
.nl-eye-a{fill:var(--ill-accent,#f5a623)}
.nl-lid{fill:none;stroke:var(--ill-eye,var(--f-eye));stroke-width:2.4;stroke-linecap:round}
.nl-t{font-family:var(--mono,&quot;IBM Plex Mono&quot;,ui-monospace,monospace);font-size:13px;fill:var(--ill-label,var(--f-label))}
.nl-ta{fill:var(--ill-accent-text,var(--f-amber-text))}&lt;/style&gt;&lt;rect class=&quot;nl-m&quot; x=&quot;60&quot; y=&quot;190&quot; width=&quot;170&quot; height=&quot;110&quot; rx=&quot;12&quot;/&gt;&lt;path class=&quot;nl-k&quot; d=&quot;M76 208h26M76 218h16&quot;/&gt;&lt;text class=&quot;nl-t&quot; x=&quot;76&quot; y=&quot;284&quot; text-anchor=&quot;start&quot;&gt;vm 1 · linux&lt;/text&gt;&lt;path class=&quot;nl-k&quot; d=&quot;M145 302C145 340 300 346 290 380&quot;/&gt;&lt;g class=&quot;nl-dead&quot;&gt;&lt;rect class=&quot;nl-o nl-dash&quot; x=&quot;275&quot; y=&quot;190&quot; width=&quot;170&quot; height=&quot;110&quot; rx=&quot;12&quot;/&gt;&lt;path class=&quot;nl-k nl-dash&quot; d=&quot;M291 208h26M291 218h16&quot;/&gt;&lt;text class=&quot;nl-t&quot; x=&quot;291&quot; y=&quot;284&quot; text-anchor=&quot;start&quot;&gt;vm 2 · linux&lt;/text&gt;&lt;/g&gt;&lt;g class=&quot;nl-dead&quot;&gt;&lt;path class=&quot;nl-k nl-dash&quot; d=&quot;M360 302C360 340 360 346 360 380&quot;/&gt;&lt;/g&gt;&lt;rect class=&quot;nl-m&quot; x=&quot;490&quot; y=&quot;190&quot; width=&quot;170&quot; height=&quot;110&quot; rx=&quot;12&quot;/&gt;&lt;path class=&quot;nl-k&quot; d=&quot;M506 208h26M506 218h16&quot;/&gt;&lt;text class=&quot;nl-t&quot; x=&quot;506&quot; y=&quot;284&quot; text-anchor=&quot;start&quot;&gt;vm 3 · linux&lt;/text&gt;&lt;path class=&quot;nl-k&quot; d=&quot;M575 302C575 340 420 346 430 380&quot;/&gt;&lt;path class=&quot;nl-k&quot; d=&quot;M330 160C380 70 500 70 542 138M532.2 133.0L542 138L541.9 127.0&quot;/&gt;&lt;rect class=&quot;nl-r&quot; x=&quot;237&quot; y=&quot;390&quot; width=&quot;22&quot; height=&quot;14&quot; rx=&quot;5&quot;/&gt;&lt;rect class=&quot;nl-r&quot; x=&quot;265&quot; y=&quot;390&quot; width=&quot;22&quot; height=&quot;14&quot; rx=&quot;5&quot;/&gt;&lt;rect class=&quot;nl-r&quot; x=&quot;293&quot; y=&quot;390&quot; width=&quot;22&quot; height=&quot;14&quot; rx=&quot;5&quot;/&gt;&lt;rect class=&quot;nl-r&quot; x=&quot;321&quot; y=&quot;390&quot; width=&quot;22&quot; height=&quot;14&quot; rx=&quot;5&quot;/&gt;&lt;rect class=&quot;nl-r&quot; x=&quot;349&quot; y=&quot;390&quot; width=&quot;22&quot; height=&quot;14&quot; rx=&quot;5&quot;/&gt;&lt;rect class=&quot;nl-r&quot; x=&quot;377&quot; y=&quot;390&quot; width=&quot;22&quot; height=&quot;14&quot; rx=&quot;5&quot;/&gt;&lt;rect class=&quot;nl-r&quot; x=&quot;405&quot; y=&quot;390&quot; width=&quot;22&quot; height=&quot;14&quot; rx=&quot;5&quot;/&gt;&lt;rect class=&quot;nl-r&quot; x=&quot;433&quot; y=&quot;390&quot; width=&quot;22&quot; height=&quot;14&quot; rx=&quot;5&quot;/&gt;&lt;rect class=&quot;nl-new&quot; x=&quot;461&quot; y=&quot;390&quot; width=&quot;22&quot; height=&quot;14&quot; rx=&quot;5&quot;/&gt;&lt;text class=&quot;nl-t&quot; x=&quot;222&quot; y=&quot;402&quot; text-anchor=&quot;end&quot;&gt;log&lt;/text&gt;&lt;path class=&quot;nl-tail-e&quot; d=&quot;M592 174C598 192 592 206 578 211&quot;/&gt;&lt;path class=&quot;nl-tail&quot; d=&quot;M592 174C598 192 592 206 578 211&quot;/&gt;&lt;path class=&quot;nl-cat&quot; d=&quot;M557 170C557 159 560 153 563 150L561 136L572 147Q575 146 578 147L589 136L587 150C590 153 593 159 593 170C593 182 585 188 575 188C565 188 557 182 557 170Z&quot;/&gt;&lt;ellipse class=&quot;nl-eye&quot; cx=&quot;568&quot; cy=&quot;169&quot; rx=&quot;4.2&quot; ry=&quot;2.8&quot;/&gt;&lt;ellipse class=&quot;nl-eye&quot; cx=&quot;582&quot; cy=&quot;169&quot; rx=&quot;4.2&quot; ry=&quot;2.8&quot;/&gt;&lt;/svg&gt;
  &lt;figcaption&gt;The first goal on stock Linux: kill one of three VMs and the workload moves to another with every record intact.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The hard part of a kernel is what comes after boot.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Drivers.&lt;/strong&gt; NVMe, real network cards, whatever each cloud exposes. Most of Linux is drivers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage.&lt;/strong&gt; Felix&#39;s durability depends on &lt;code&gt;fsync&lt;/code&gt;, &lt;code&gt;pread&lt;/code&gt; and preallocation behaving exactly as documented. A new kernel would have to earn that trust first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Networking.&lt;/strong&gt; Felix runs on tokio and QUIC over UDP. A scratch kernel needs a network stack and a port of that runtime.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security and many cores.&lt;/strong&gt; Every fix would be ours to write.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-case-for-a-kernel-of-our-own&quot;&gt;The case for a kernel of our own&lt;/h2&gt;
&lt;p&gt;A kernel built for NineLives could give a smaller trusted base, deterministic scheduling that makes replay stronger, and syscalls designed around the log. With today&#39;s crates, booting, paging and a basic scheduler are weeks of work. And nobody else is building an OS with a replicated log at the center, so there&#39;s a real research story. The cost is everything after boot, listed above.&lt;/p&gt;
&lt;figure class=&quot;nl-figure&quot;&gt;
  &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;nl-ill&quot; role=&quot;img&quot; aria-label=&quot;Two stacks side by side, each with the cat on top of a felix and felixd layer, over a kernel, over hardware. In the stock Linux stack the kernel has six filled parts: boot, paging, scheduler, drivers, storage and network. In the own kernel stack boot, paging and scheduler are filled, while drivers, storage and network are empty amber outlines.&quot; viewBox=&quot;0 0 720 480&quot; width=&quot;720&quot; height=&quot;480&quot;&gt;&lt;style&gt;.nl-ill{--f-ink:#0e2a3a;--f-soft:rgba(95,211,239,.22);--f-cat:#0e2a3a;--f-eye:#5fd3ef;--f-label:#46536a;--f-amber-text:#8f4c00}
@media (prefers-color-scheme:dark){.nl-ill{--f-ink:#5fd3ef;--f-soft:rgba(18,163,196,.16);--f-cat:#5fd3ef;--f-eye:#0e2a3a;--f-label:#a9b6c8;--f-amber-text:#f7b13a}}
.nl-k{fill:none;stroke:var(--ill-ink,var(--f-ink));stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.nl-m{fill:var(--ill-soft,var(--f-soft));stroke:var(--ill-line,#12a3c4);stroke-width:2;stroke-linejoin:round}
.nl-o{fill:none;stroke:var(--ill-ink,var(--f-ink));stroke-width:2;stroke-linejoin:round}
.nl-ka{fill:none;stroke:var(--ill-accent,#f5a623);stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.nl-dead{opacity:.35}
.nl-dash{stroke-dasharray:5 6}
.nl-r{fill:var(--ill-line,#12a3c4)}
.nl-new{fill:var(--ill-accent,#f5a623)}
.nl-lost{opacity:.28}
.nl-cat{fill:var(--ill-cat,var(--f-cat));stroke:var(--ill-ink,var(--f-ink));stroke-width:2;stroke-linejoin:round}
.nl-tail-e{fill:none;stroke:var(--ill-ink,var(--f-ink));stroke-width:10;stroke-linecap:round}
.nl-tail{fill:none;stroke:var(--ill-cat,var(--f-cat));stroke-width:6;stroke-linecap:round}
.nl-eye{fill:var(--ill-eye,var(--f-eye))}
.nl-eye-a{fill:var(--ill-accent,#f5a623)}
.nl-lid{fill:none;stroke:var(--ill-eye,var(--f-eye));stroke-width:2.4;stroke-linecap:round}
.nl-t{font-family:var(--mono,&quot;IBM Plex Mono&quot;,ui-monospace,monospace);font-size:13px;fill:var(--ill-label,var(--f-label))}
.nl-ta{fill:var(--ill-accent-text,var(--f-amber-text))}&lt;/style&gt;&lt;text class=&quot;nl-t&quot; x=&quot;190&quot; y=&quot;92&quot; text-anchor=&quot;middle&quot;&gt;stock linux&lt;/text&gt;&lt;path class=&quot;nl-tail-e&quot; d=&quot;M207 158C213 176 207 190 193 195&quot;/&gt;&lt;path class=&quot;nl-tail&quot; d=&quot;M207 158C213 176 207 190 193 195&quot;/&gt;&lt;path class=&quot;nl-cat&quot; d=&quot;M172 154C172 143 175 137 178 134L176 120L187 131Q190 130 193 131L204 120L202 134C205 137 208 143 208 154C208 166 200 172 190 172C180 172 172 166 172 154Z&quot;/&gt;&lt;ellipse class=&quot;nl-eye&quot; cx=&quot;183&quot; cy=&quot;153&quot; rx=&quot;4.2&quot; ry=&quot;2.8&quot;/&gt;&lt;ellipse class=&quot;nl-eye&quot; cx=&quot;197&quot; cy=&quot;153&quot; rx=&quot;4.2&quot; ry=&quot;2.8&quot;/&gt;&lt;rect class=&quot;nl-m&quot; x=&quot;60&quot; y=&quot;180&quot; width=&quot;260&quot; height=&quot;56&quot; rx=&quot;12&quot;/&gt;&lt;text class=&quot;nl-t&quot; x=&quot;76&quot; y=&quot;214&quot; text-anchor=&quot;start&quot;&gt;felix + felixd&lt;/text&gt;&lt;rect class=&quot;nl-m&quot; x=&quot;60&quot; y=&quot;250&quot; width=&quot;260&quot; height=&quot;140&quot; rx=&quot;12&quot;/&gt;&lt;text class=&quot;nl-t&quot; x=&quot;76&quot; y=&quot;274&quot; text-anchor=&quot;start&quot;&gt;kernel&lt;/text&gt;&lt;rect class=&quot;nl-m&quot; x=&quot;68&quot; y=&quot;288&quot; width=&quot;76&quot; height=&quot;38&quot; rx=&quot;8&quot;/&gt;&lt;text class=&quot;nl-t&quot; x=&quot;106&quot; y=&quot;312&quot; text-anchor=&quot;middle&quot;&gt;boot&lt;/text&gt;&lt;rect class=&quot;nl-m&quot; x=&quot;152&quot; y=&quot;288&quot; width=&quot;76&quot; height=&quot;38&quot; rx=&quot;8&quot;/&gt;&lt;text class=&quot;nl-t&quot; x=&quot;190&quot; y=&quot;312&quot; text-anchor=&quot;middle&quot;&gt;paging&lt;/text&gt;&lt;rect class=&quot;nl-m&quot; x=&quot;236&quot; y=&quot;288&quot; width=&quot;76&quot; height=&quot;38&quot; rx=&quot;8&quot;/&gt;&lt;text class=&quot;nl-t&quot; x=&quot;274&quot; y=&quot;312&quot; text-anchor=&quot;middle&quot;&gt;sched&lt;/text&gt;&lt;rect class=&quot;nl-m&quot; x=&quot;68&quot; y=&quot;336&quot; width=&quot;76&quot; height=&quot;38&quot; rx=&quot;8&quot;/&gt;&lt;text class=&quot;nl-t&quot; x=&quot;106&quot; y=&quot;360&quot; text-anchor=&quot;middle&quot;&gt;drivers&lt;/text&gt;&lt;rect class=&quot;nl-m&quot; x=&quot;152&quot; y=&quot;336&quot; width=&quot;76&quot; height=&quot;38&quot; rx=&quot;8&quot;/&gt;&lt;text class=&quot;nl-t&quot; x=&quot;190&quot; y=&quot;360&quot; text-anchor=&quot;middle&quot;&gt;storage&lt;/text&gt;&lt;rect class=&quot;nl-m&quot; x=&quot;236&quot; y=&quot;336&quot; width=&quot;76&quot; height=&quot;38&quot; rx=&quot;8&quot;/&gt;&lt;text class=&quot;nl-t&quot; x=&quot;274&quot; y=&quot;360&quot; text-anchor=&quot;middle&quot;&gt;network&lt;/text&gt;&lt;rect class=&quot;nl-m&quot; x=&quot;60&quot; y=&quot;404&quot; width=&quot;260&quot; height=&quot;40&quot; rx=&quot;12&quot;/&gt;&lt;text class=&quot;nl-t&quot; x=&quot;76&quot; y=&quot;429&quot; text-anchor=&quot;start&quot;&gt;hardware&lt;/text&gt;&lt;text class=&quot;nl-t&quot; x=&quot;530&quot; y=&quot;92&quot; text-anchor=&quot;middle&quot;&gt;own kernel&lt;/text&gt;&lt;path class=&quot;nl-tail-e&quot; d=&quot;M547 158C553 176 547 190 533 195&quot;/&gt;&lt;path class=&quot;nl-tail&quot; d=&quot;M547 158C553 176 547 190 533 195&quot;/&gt;&lt;path class=&quot;nl-cat&quot; d=&quot;M512 154C512 143 515 137 518 134L516 120L527 131Q530 130 533 131L544 120L542 134C545 137 548 143 548 154C548 166 540 172 530 172C520 172 512 166 512 154Z&quot;/&gt;&lt;ellipse class=&quot;nl-eye&quot; cx=&quot;523&quot; cy=&quot;153&quot; rx=&quot;4.2&quot; ry=&quot;2.8&quot;/&gt;&lt;ellipse class=&quot;nl-eye&quot; cx=&quot;537&quot; cy=&quot;153&quot; rx=&quot;4.2&quot; ry=&quot;2.8&quot;/&gt;&lt;rect class=&quot;nl-m&quot; x=&quot;400&quot; y=&quot;180&quot; width=&quot;260&quot; height=&quot;56&quot; rx=&quot;12&quot;/&gt;&lt;text class=&quot;nl-t&quot; x=&quot;416&quot; y=&quot;214&quot; text-anchor=&quot;start&quot;&gt;felix + felixd&lt;/text&gt;&lt;rect class=&quot;nl-m&quot; x=&quot;400&quot; y=&quot;250&quot; width=&quot;260&quot; height=&quot;140&quot; rx=&quot;12&quot;/&gt;&lt;text class=&quot;nl-t&quot; x=&quot;416&quot; y=&quot;274&quot; text-anchor=&quot;start&quot;&gt;kernel&lt;/text&gt;&lt;rect class=&quot;nl-m&quot; x=&quot;408&quot; y=&quot;288&quot; width=&quot;76&quot; height=&quot;38&quot; rx=&quot;8&quot;/&gt;&lt;text class=&quot;nl-t&quot; x=&quot;446&quot; y=&quot;312&quot; text-anchor=&quot;middle&quot;&gt;boot&lt;/text&gt;&lt;rect class=&quot;nl-m&quot; x=&quot;492&quot; y=&quot;288&quot; width=&quot;76&quot; height=&quot;38&quot; rx=&quot;8&quot;/&gt;&lt;text class=&quot;nl-t&quot; x=&quot;530&quot; y=&quot;312&quot; text-anchor=&quot;middle&quot;&gt;paging&lt;/text&gt;&lt;rect class=&quot;nl-m&quot; x=&quot;576&quot; y=&quot;288&quot; width=&quot;76&quot; height=&quot;38&quot; rx=&quot;8&quot;/&gt;&lt;text class=&quot;nl-t&quot; x=&quot;614&quot; y=&quot;312&quot; text-anchor=&quot;middle&quot;&gt;sched&lt;/text&gt;&lt;rect class=&quot;nl-ka&quot; x=&quot;408&quot; y=&quot;336&quot; width=&quot;76&quot; height=&quot;38&quot; rx=&quot;8&quot;/&gt;&lt;text class=&quot;nl-t nl-ta&quot; x=&quot;446&quot; y=&quot;360&quot; text-anchor=&quot;middle&quot;&gt;drivers&lt;/text&gt;&lt;rect class=&quot;nl-ka&quot; x=&quot;492&quot; y=&quot;336&quot; width=&quot;76&quot; height=&quot;38&quot; rx=&quot;8&quot;/&gt;&lt;text class=&quot;nl-t nl-ta&quot; x=&quot;530&quot; y=&quot;360&quot; text-anchor=&quot;middle&quot;&gt;storage&lt;/text&gt;&lt;rect class=&quot;nl-ka&quot; x=&quot;576&quot; y=&quot;336&quot; width=&quot;76&quot; height=&quot;38&quot; rx=&quot;8&quot;/&gt;&lt;text class=&quot;nl-t nl-ta&quot; x=&quot;614&quot; y=&quot;360&quot; text-anchor=&quot;middle&quot;&gt;network&lt;/text&gt;&lt;rect class=&quot;nl-m&quot; x=&quot;400&quot; y=&quot;404&quot; width=&quot;260&quot; height=&quot;40&quot; rx=&quot;12&quot;/&gt;&lt;text class=&quot;nl-t&quot; x=&quot;416&quot; y=&quot;429&quot; text-anchor=&quot;start&quot;&gt;hardware&lt;/text&gt;&lt;/svg&gt;
  &lt;figcaption&gt;Both stacks run the same felix and felixd. Our own kernel gets boot, paging and a scheduler in weeks; drivers, storage and networking are what it would still have to earn.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;There are middle paths. &lt;a rel=&quot;external&quot; href=&quot;https://github.com/asterinas/asterinas&quot;&gt;Asterinas&lt;/a&gt; aims to be compatible with Linux at the syscall level, so felixd could run on it unchanged, which makes it an experiment rather than a rewrite. &lt;a rel=&quot;external&quot; href=&quot;https://github.com/hermit-os/kernel&quot;&gt;Hermit&lt;/a&gt; is a unikernel, and a node that only runs Felix and felixd could be a single image. &lt;a rel=&quot;external&quot; href=&quot;https://gitlab.redox-os.org/redox-os/redox&quot;&gt;Redox&lt;/a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https://github.com/theseus-os/Theseus&quot;&gt;Theseus&lt;/a&gt; are worth studying for their ideas on recovery. &lt;a rel=&quot;external&quot; href=&quot;https://rust-for-linux.com/&quot;&gt;Rust for Linux&lt;/a&gt; is the route if something ever has to live inside Linux.&lt;/p&gt;
&lt;figure class=&quot;nl-figure&quot;&gt;
  &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;nl-ill&quot; role=&quot;img&quot; aria-label=&quot;A line of five stops from stock Linux on the left to our own kernel on the right. They are stock Linux, Rust for Linux, Asterinas with Linux syscalls, Hermit as a unikernel, and our own kernel. The cat sits on stock Linux with amber eyes, and a curved arrow with a question mark arcs from it to the far end. Below, an arrow runs from reuse more to write more.&quot; viewBox=&quot;0 0 720 480&quot; width=&quot;720&quot; height=&quot;480&quot;&gt;&lt;style&gt;.nl-ill{--f-ink:#0e2a3a;--f-soft:rgba(95,211,239,.22);--f-cat:#0e2a3a;--f-eye:#5fd3ef;--f-label:#46536a;--f-amber-text:#8f4c00}
@media (prefers-color-scheme:dark){.nl-ill{--f-ink:#5fd3ef;--f-soft:rgba(18,163,196,.16);--f-cat:#5fd3ef;--f-eye:#0e2a3a;--f-label:#a9b6c8;--f-amber-text:#f7b13a}}
.nl-k{fill:none;stroke:var(--ill-ink,var(--f-ink));stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.nl-m{fill:var(--ill-soft,var(--f-soft));stroke:var(--ill-line,#12a3c4);stroke-width:2;stroke-linejoin:round}
.nl-o{fill:none;stroke:var(--ill-ink,var(--f-ink));stroke-width:2;stroke-linejoin:round}
.nl-ka{fill:none;stroke:var(--ill-accent,#f5a623);stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.nl-dead{opacity:.35}
.nl-dash{stroke-dasharray:5 6}
.nl-r{fill:var(--ill-line,#12a3c4)}
.nl-new{fill:var(--ill-accent,#f5a623)}
.nl-lost{opacity:.28}
.nl-cat{fill:var(--ill-cat,var(--f-cat));stroke:var(--ill-ink,var(--f-ink));stroke-width:2;stroke-linejoin:round}
.nl-tail-e{fill:none;stroke:var(--ill-ink,var(--f-ink));stroke-width:10;stroke-linecap:round}
.nl-tail{fill:none;stroke:var(--ill-cat,var(--f-cat));stroke-width:6;stroke-linecap:round}
.nl-eye{fill:var(--ill-eye,var(--f-eye))}
.nl-eye-a{fill:var(--ill-accent,#f5a623)}
.nl-lid{fill:none;stroke:var(--ill-eye,var(--f-eye));stroke-width:2.4;stroke-linecap:round}
.nl-t{font-family:var(--mono,&quot;IBM Plex Mono&quot;,ui-monospace,monospace);font-size:13px;fill:var(--ill-label,var(--f-label))}
.nl-ta{fill:var(--ill-accent-text,var(--f-amber-text))}&lt;/style&gt;&lt;path class=&quot;nl-k&quot; d=&quot;M90 300H630&quot;/&gt;&lt;rect class=&quot;nl-r&quot; x=&quot;79&quot; y=&quot;293&quot; width=&quot;22&quot; height=&quot;14&quot; rx=&quot;5&quot;/&gt;&lt;text class=&quot;nl-t&quot; x=&quot;90&quot; y=&quot;336&quot; text-anchor=&quot;middle&quot;&gt;stock linux&lt;/text&gt;&lt;rect class=&quot;nl-r&quot; x=&quot;214&quot; y=&quot;293&quot; width=&quot;22&quot; height=&quot;14&quot; rx=&quot;5&quot;/&gt;&lt;text class=&quot;nl-t&quot; x=&quot;225&quot; y=&quot;336&quot; text-anchor=&quot;middle&quot;&gt;rust for&lt;/text&gt;&lt;text class=&quot;nl-t&quot; x=&quot;225&quot; y=&quot;354&quot; text-anchor=&quot;middle&quot;&gt;linux&lt;/text&gt;&lt;rect class=&quot;nl-r&quot; x=&quot;349&quot; y=&quot;293&quot; width=&quot;22&quot; height=&quot;14&quot; rx=&quot;5&quot;/&gt;&lt;text class=&quot;nl-t&quot; x=&quot;360&quot; y=&quot;336&quot; text-anchor=&quot;middle&quot;&gt;asterinas&lt;/text&gt;&lt;text class=&quot;nl-t&quot; x=&quot;360&quot; y=&quot;354&quot; text-anchor=&quot;middle&quot;&gt;linux syscalls&lt;/text&gt;&lt;rect class=&quot;nl-r&quot; x=&quot;484&quot; y=&quot;293&quot; width=&quot;22&quot; height=&quot;14&quot; rx=&quot;5&quot;/&gt;&lt;text class=&quot;nl-t&quot; x=&quot;495&quot; y=&quot;336&quot; text-anchor=&quot;middle&quot;&gt;hermit&lt;/text&gt;&lt;text class=&quot;nl-t&quot; x=&quot;495&quot; y=&quot;354&quot; text-anchor=&quot;middle&quot;&gt;unikernel&lt;/text&gt;&lt;rect class=&quot;nl-r&quot; x=&quot;619&quot; y=&quot;293&quot; width=&quot;22&quot; height=&quot;14&quot; rx=&quot;5&quot;/&gt;&lt;text class=&quot;nl-t&quot; x=&quot;630&quot; y=&quot;336&quot; text-anchor=&quot;middle&quot;&gt;own kernel&lt;/text&gt;&lt;path class=&quot;nl-k&quot; d=&quot;M122 222C220 90 520 90 622 280M612.5 274.4L622 280L622.5 269.0&quot;/&gt;&lt;text class=&quot;nl-t&quot; x=&quot;372&quot; y=&quot;118&quot; text-anchor=&quot;middle&quot;&gt;?&lt;/text&gt;&lt;text class=&quot;nl-t&quot; x=&quot;90&quot; y=&quot;420&quot; text-anchor=&quot;start&quot;&gt;reuse more&lt;/text&gt;&lt;text class=&quot;nl-t&quot; x=&quot;630&quot; y=&quot;420&quot; text-anchor=&quot;end&quot;&gt;write more&lt;/text&gt;&lt;path class=&quot;nl-k&quot; d=&quot;M190 416H530M520 410L530 416L520 422M200 410L190 416L200 422&quot;/&gt;&lt;path class=&quot;nl-tail-e&quot; d=&quot;M107 254C113 272 107 286 93 291&quot;/&gt;&lt;path class=&quot;nl-tail&quot; d=&quot;M107 254C113 272 107 286 93 291&quot;/&gt;&lt;path class=&quot;nl-cat&quot; d=&quot;M72 250C72 239 75 233 78 230L76 216L87 227Q90 226 93 227L104 216L102 230C105 233 108 239 108 250C108 262 100 268 90 268C80 268 72 262 72 250Z&quot;/&gt;&lt;ellipse class=&quot;nl-eye-a&quot; cx=&quot;83&quot; cy=&quot;249&quot; rx=&quot;4.2&quot; ry=&quot;2.8&quot;/&gt;&lt;ellipse class=&quot;nl-eye-a&quot; cx=&quot;97&quot; cy=&quot;249&quot; rx=&quot;4.2&quot; ry=&quot;2.8&quot;/&gt;&lt;/svg&gt;
  &lt;figcaption&gt;The middle paths reuse more of what exists. The open question is whether starting on Linux makes moving along this line harder later.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;what-i-don-t-know-yet&quot;&gt;What I don&#39;t know yet&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Is the first goal a cluster that survives losing a machine, or a kernel designed around the log? The answer probably decides this.&lt;/li&gt;
&lt;li&gt;Would starting on Linux make it harder to move later, or can felixd lean on so little of the kernel that it doesn&#39;t matter?&lt;/li&gt;
&lt;li&gt;Is Asterinas close enough to Linux that trying it is an experiment rather than a rewrite?&lt;/li&gt;
&lt;li&gt;Are single-purpose nodes enough, or does every machine need a general-purpose OS?&lt;/li&gt;
&lt;li&gt;What would we give up in debugging, tooling and hardware support?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you have a view on any of these, or know a project I missed, &lt;a rel=&quot;external&quot; href=&quot;https://github.com/GetFelix/ninelives/discussions/22&quot;&gt;reply in the discussion&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
</feed>
