From 1a76ee21ce5119d182464d35aef21c815df7f5bc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Thu, 23 Jan 2025 12:11:57 +0100
Subject: [PATCH 01/78] feat: initial secure boot

---
 .woodpecker/ci.yaml       |  13 +++-
 flake.nix                 |   3 +
 keys/DB.auth              | Bin 0 -> 2092 bytes
 keys/KEK.auth             | Bin 0 -> 2091 bytes
 keys/PK.auth              | Bin 0 -> 2089 bytes
 modules/image/builder.nix |   1 +
 scripts/sbkeys            | 154 ++++++++++++++++++++++++++++++++++++++
 scripts/sign-release.sh   |  19 +++++
 8 files changed, 189 insertions(+), 1 deletion(-)
 create mode 100644 keys/DB.auth
 create mode 100644 keys/KEK.auth
 create mode 100644 keys/PK.auth
 create mode 100755 scripts/sbkeys
 create mode 100755 scripts/sign-release.sh

diff --git a/.woodpecker/ci.yaml b/.woodpecker/ci.yaml
index 3099d84..606a477 100644
--- a/.woodpecker/ci.yaml
+++ b/.woodpecker/ci.yaml
@@ -6,6 +6,17 @@ when:
 
 steps:
   check:
-    image: docker.io/nixpkgs/nix-flakes:nixos-24.05
+    image: docker.io/nixpkgs/nix-flakes:nixos-25.05
     commands:
       - nix flake check
+
+  sign:
+    image: docker.io/nixpkgs/nix-flakes:nixos-25.05
+    environment:
+        DB_KEY:
+          from_secret: secure_boot_key
+        DB_CRT:
+          from_secret: secure_boot_crt
+    commands:
+      - ./scripts/sign-release.sh
+
diff --git a/flake.nix b/flake.nix
index 7648b8b..e5f4787 100644
--- a/flake.nix
+++ b/flake.nix
@@ -80,8 +80,11 @@
 
       devShells.${system}.default = pkgs.mkShell {
         buildInputs = with pkgs; [
+          efitools
           erofs-utils
           just
+          openssl
+          sbsigntool
           self.packages.${system}.qemu-uefi-tpm
           squashfs-tools-ng
         ];
diff --git a/keys/DB.auth b/keys/DB.auth
new file mode 100644
index 0000000000000000000000000000000000000000..d8ce304ab5dcd9eccabe35c4093e7498daa916b0
GIT binary patch
literal 2092
zcmaFK&M3yuWXb>oXIU5+7??it&AqhV>wd;N&#sjwwdP@|%MF@XHZn0X8uA<PvT-J~
zc`&9jvoJBTG8k~PacZ@Bw0-AgWM^E^#H?!2#H?u0#KgIPnTe5!NyO)m#Z3XT_qKkf
z+fOh|++ca=ZBswU2&f)LZdL{Z1w%Ol88+rn7G@sNfW#92V1?k+<kF&41*iP{5(RHp
zZv#1TUL#WjLn9+Y69XetqbPA+V-VK>$|b^tCPpP>YZ+M?n41{+84Q{jxtN+585uU&
zJAIgPe~J0?6)P(JFWidXc=%ZMGL8QWw9?N=gf6PJ{1fs__e;6HxXaT!r7B<TS2{^H
ziI&Ts-(&b@s$u8G0D(<%4QJo4ORF_KEx@PC%R9$ZS!tcqx2t6zM7IgenfyWE-fw>u
z-xBu9m*!Jf@yy>Kd7*8)tMHo#9s3M|yv*nC*ne2uN%bg0cw-OGkG%Z+R);Gww~ZFd
zeUcCQIQ{gB<#%->R<nPxx_o2J)JcZN*H2qrtY9pgoWi#7UZ%yNk5|@B%73y*<CN3;
zy?sxMFLnu;%-c3=>%$`}_NOtWJ&TrT{P*yKcEEep1ztKf3m0+y&*Mv3ck0I6%k|<K
zwSM2!_8!XK`<{uJk%4h>utA`KEE{vEEFX&)i^xmH&OT#jj-xZ@3bx+b8FTU3@$|(8
z@*rtt76}8f2J8y>K?;N!8UM4e8Za|5{zndWZg8+OGEAGFam;CB*O}kK)px9P<BQJ!
zkZ$<6Y|_tJF#@JLgREG#8awQ(jtQ$Ox9RUHTQ0W#<DLU&>RUX2Da$)(>Db*B?d>^G
zk`sLW(Qn-X@#FucMCbBlaoe2vZNzXeeTLS)#O3q;{Ak%cHEssi$vN-e@q2AJ|9tAM
zh2Ez^l4Gl$KKr-QQ!{*8czGAcfx}lkQvRP2iPxCWwDeY`!*<QbZ8sj&K8uJ9D&mtD
z{8?afZhyk!C6oDQbyWPEx{EtI<Ee_&<+XQa+a_w<SuB0YnOny`EN(^gg!xV!+b`bj
z-YfHH*7x-tqHMk@-U6F~j&8m8d*g9Kft%6Ko_a{H6=Mp`mkNutnG*cQu!%9*pouY_
ziILI3f^h1^osE!lA}>5AGBUC<urx6;7$0U}KNoA3`r(42<)?602bS~VKJuUZrkz$e
z!lhtYp!PQAWXZX<i&iYD&GSqi2G8GL^r}a2N@DWvnI0j5eOvw&eV4QS&HL%_{xC(Z
zw6qS%J*+*mbENgcC#jU12)<z~a!M5V@qI$Z%@5LE#w)^#Hf-I_#1^+_>7&O?3nzPX
z3Mrl|ve;Gf?cR@n2_oN^qRJZ=<t(*ppF4Z*kqZ}EH-&46WEns4lWJGL`2N6LC$sz+
zzuf}={c7K~$#aGF*0rgBGUg>Ji=Op!n_WA{$)d+_Q{b9sJJ_0cn={4VEX-QYD(}%;
z{BV=lM4hFxj~lVyZ2x%Cr1_Hi+Kzqik7#S9ZmD|8=CCmGz|tpEmV32tT`d};{h`R8
z8B)v{Gczy<{tjK1Y~|;?JYR|X(4&-ggC=HqgC-_+Xu0K3#wsMaJ9~YH>W1Tdo7j)X
zJv+^gmXZzR4P_0aA?20`X1V3!M6lQ*XaJ#7YxD6dm0IOxI_z49&!3Aq$!hr6f%WRP
zyBn{z9dCW{C@ZpFPUg>7<HZpUHmn`W#`E6o+QY=f7nLt9v?-!d^>^wQQy<gw`75pW
zYD(-~FP)cqt?z-3#G9L+HeLR3DI)Gp;k%F9j@}pO@NcYTdGD?N;MChErpz1fIT_?k
zpI!J(zn4qus{FL9=RR68<|=Y22c&df$Xc@q9G=ksH?2!Vb*_l?hluoomurfIu6&+)
zr*mRz@!}QAX5HS$e+W!-pS>~B>6OB)rJ7ggI~|o&;(fvV^8W3X(@m#;9Gzd7Qxl$@
z9rk=*%7M7AmHRI6Mm^cUkzaSbyY3A0`TO7ZzkJ#~!*OPnx_&LTQfmSGai1Ns*_##k
zB6Q|ttaf*L6Y7gnYGGACOsU2D<^)TlE7xMfDV=P#Z6b%h|8w6Or6x1&%jBL3A6)F#
zPdYh8MB^hT7e|i#Z%OsTDjx0k#Q1fDvlr&7zRT5L^Kr>-!H?BjkFKA&FT*!*QsJo!
z8z-kaZ#F5{SDRThH!o81<SlE_1>#`~e@*A`o-K3d<X`P|eCu{@wRyI2X+UV~FJ_Ct
z(=t1QD<yPQSak1a*==2}D7Vid>EB|Z(zj<O*QD9pSSZZ$CT{cWP^Yimm3wD}=uWtM
zT~<EPwd0**Nthb@#3>(nR<A8)iC{QzOEviO+`xZP9|Vpk&OJQIsnL6N-p6xk&YivP
h>)lPV7PIdAenjzhhNqdB=-<tK&yGnc2tB#m0RWhLMPdK|

literal 0
HcmV?d00001

diff --git a/keys/KEK.auth b/keys/KEK.auth
new file mode 100644
index 0000000000000000000000000000000000000000..1e01cd38364e5af65e068ae38f9f71bc8975cc28
GIT binary patch
literal 2091
zcmaFK&M3yuWXb>or&t&m7??it&AqhV>wd;N&#sjwwdP@|%MF@X)-f?M8uA<PvT-J~
zc`&9jvoJBTG8k~PacZ@Bw0-AgWM^E^#H?)4#4K;n#KgXUnTe5!NhI~;iPure=W7ze
z#U~xse{#6Z;PYmX5l}sh+^h@+@`kbo(rnD3EX+J20f{C4!3x2t$)!c93Qqa?B?<xF
z26E!OMy3XaMn;Av21cevQR2MDAg%$FOW1%WMkQoR8Ce;an;7{S44N3Zn3@<F8P?U^
zF&9uul+4)J6u+T&TfocklM5~DVotN3UGs|RcX4Lp_5&B6M@dI++0hXzb?F4>#j9(#
zABx;^WX_aXrx<OXMyy)0rqb_I<+ZCS-ySZyd?HK1^32|sEFv>?&bIAadEn!B-@d*u
z`8YB8Jdv14d3C3k7Hfph$D9vYUmp3>qW`dDmtTgh-Kre|i!Q&Ew_wgFkBR;lbJa9F
zO<JOCNzt{`mOhaw{h{Yw;+GVCSe4HFV8W3V`|K`!s#?!6>C@|9b)Rl@AMjys77I}n
z;@R+vr|!kitqEJKE0+8}xNGrIcejVjPcX)n>)7Y!KaGDEFhy%!o%@l0DmnWs+Z7dJ
zi_*DU4`$~wF*7nSE)F&bG>~Ou4wdC&5n~b2*l=<4O!<3rcQGvzo+;fladD{sZUcFc
zv@(l?fmj1}1^gfd!i<dnSy&C285#d02Rk=7*cln-y|~6Q^WgWsbtju%yyEloI2Zf1
zP&@f^r7ZIfRi2`W?zRHP@?S3boVI^=MRmr*<3^|V&z-ZRJI`R<buV=T##=gPl264Y
zu3%MqyIB6zgY8et3fJc^TDK&<OyJAM2_Nl$f1Yh;dM|&@l<#FW7tSc1?|8km-;UAv
zZvE~0xwAb|vy%Qsm$q%a^}?}!cg0clioors?`ZPQDJ#BvboZT`ch20{6Yl6@@j2(y
zj2Y#84_xo>v?&$4zbs8o;npfnqqcd`9}Kt7l#!S#{-fQ*pJD2p3f4Efu00B9o4Dq0
z&z!7>?|<bB6c>Hy^I6mTMJ2}Pu0Y2=!NNOVSMhbSu9zQLGdrxNrccqZi80Bbi7}3e
zk<q}MVB*D{hmf-&FFYGEGO{wTG%+#+t3TiMWW`I7w7X$DuO%3yRvE3)zq{nQ=7LXg
zPoCX7bCjuV_WkZ_bN^+{UM?5>Vzv*%vD4>QpUimuVaxeziw?c&x%boPluV_gFwa`%
z#DW!1<-_Ds6^dM@vvi%zH4V1i-X_W8^ftXxF<<@Ce!cDW7am2dxKWy}{$|t4pl!Bq
zj$~~POxnp`@o=A?sl0UFt;K<Bx%@v(_|;^vD=SoTlGBz|w;nzH>iOi&?)&HJpY5u<
z_vuT&k6ZGl$FJt<x>~sI`I*yRIQiSR?Q7KnIQL9kU;35xvXlLL5$i{}tTtbz_gn3p
zp=4Dtd*(g!RSosIY6^~i@0MSlvdjG8<-?n!ukBPb)d=3RF!I3CCsUStwQpT58l(N8
zD3BRa#+foRFbMt*U6yR+=e#^$iTlu_ly-wAW<`T0CQfLf<@3klrhwUdTR+q7Cm1Gf
zusrm(sUIyN8z>mc8OT5iEm6!u%iEQ3sYTcXLdDi5d#4Xm?k_QazG6kC|Akxe8xJ4L
zUZ(MXfmZq%iO@y0mVZK?>3%8K7k7Djr&Q&u{YodvCed>F^Lq^6Of~G>7$C4ouHo$a
zb!oMxrv><Qd3ooUDl4sX`gXPKgXlJ)Ig>vK-23gX;#<OA`O<vqDxUcpBrmjWcNKo~
zpktpwkeB)V9s3W9JE<OJ2yg7+`H`2O-|BEB=C;vdxli&zAE%#QvHY%X#A^00R+n$A
znL5ev`1)z9ixrGzlT+9h-pjN&^zq8NN%>C}X`FI;zqjvc@x?A7lX=@_ZGCuT#r`y=
zv}e&0jsG5g&<=R7y1+}vX5k{P|9N~V>rUO6d%0d*qt@@6+TKIid*5R#wq7!J_8B{K
z9Gy8=u=Uo?n2XPjr!Ph+wy-K7rr4S`KjWCw#;!BJg{$va>BbkG{~_J*aoMDwvtk5H
zcLrIpY&CY+R~-{pRc_PYRkmDg{l`5A&eXSf{!*5A(9*HHE85$0pd=^w`lH{v1>(p5
zONq|q%i^{<^V^8wVEPQLeTmEG{rS<dd1~AYu9I`#zvK7XaQ^w!T?@TWg(SyTJ$?3X
zrKe{2wD9sSjsu6Uc%=M4BNDGMp=s%@N{8*5kK1lMsC^a@8C1k4FZi>-<lO#*#Y-mh
z&+4f7IdvCzcE(c`smp8c%(hL`xU*RLk~6oCeOTOz=n3<kIJRHB+r3xj(X8+5J4D%h
lRlEf@1s&ab@At;zh5|REpFQ=EUMt2FnlBX=X)`7G4FK$eYQO*h

literal 0
HcmV?d00001

diff --git a/keys/PK.auth b/keys/PK.auth
new file mode 100644
index 0000000000000000000000000000000000000000..77ce10ffeb80f9ff109269b36782368b8064f20d
GIT binary patch
literal 2089
zcmaFK&M3yuWXb>or&t&m7??it&AqhV>wd;N&#sjwwdP@|%MF@X)-f?M8uA<PvT-J~
zc`&9jvoJBTG8k~PacZ@Bw0-AgWM^E^#H?)4#4K;n#KgXUnTe5!NhI~;iPure=W7ze
z#U~xse{#6Z;PYmX5l}sh+^h@+@`kbo(rnD3EX+J20f{C4!3x2t$)!c93Qqa?B?<xF
z26E!OMy3XaMn;Av21cevQR2MDAg%$FOW1%WMkQoR8Ce;an;7{S44N3Zn3@<F8P?U^
zF&9uul+4)J6u+T&TfocklM5~DVotN3UGs|RcX4Lp_5&B6M@dI++0hXzb?F4>#j9(#
zABx;^WX_aXrx<OXMyy)0rqb_I<+ZCS-ySZyd?HK1^32|sEFv>?&bIAadEn!B-@d*u
z`8YB8Jdv14d3C3k7Hfph$D9vYUmp3>qW`dDmtTgh-Kre|i!Q&Ew_wgFkBR;lbJa9F
zO<JOCNzt{`mOhaw{h{Yw;+GVCSe4HFV8W3V`|K`!s#?!6>C@|9b)Rl@AMjys77I}n
z;@R+vr|!kitqEJKE0+8}xNGrIcejVjPcX)n>)7Y!KaGDEFhy%!o%@l0DmnWs+Z7dJ
zi_*DU4`$~wF*7nSE)F&bG>~Ou4wdC&5n~b2*l=<4O!<3rcQGvzo+;fladD{sZUcFc
zv@(l?fmj1}1^gfd!i<dnSy&C285#d02Rk=7*cln-y|~6Q^WgWsbtju%yyEloI2Zf1
zP&@f^r7ZIfRi2`W?zRHP@?S3boVI^=MRmr*<3^|V&z-ZRJI`R<buV=T##=gPl264Y
zu3%MqyIB6zgY8et3fJc^TDK&<OyJAM2_Nl$f1Yh;dM|&@l<#FW7tSc1?|8km-;UAv
zZvE~0xwAb|vy%Qsm$q%a^}?}!cg0clioors?`ZPQDJ#BvboZT`ch20{6Yl6@@j2(y
zj2Y#84_xo>v?&$4zbs8o;npfnqqcd`9}Kt7l#!S#{-fQ*pJD2p3f4Efu00B9o4Dq0
z&z!7>?|<bB6c>Hy^I6mTMJ2}Pu0Y2=!NNOVSMhbSu9zQLGdrxNrccqZi80Bbi7}3e
zk<q}MVB*D{hmf-&FFYGEGO{wTG%+$T-P*d;TKrI$+R{&NJ+kh+wPxY}Z!T=prOcxK
zvRU(X1LMu?t%ufy1PD#IbM0Zz$I_1qhhp=(B$VrI@>a8{E{)gJVTrvc#x_qj{G6!;
z|Dx8XQ(p=kTRHdNu}I@hT&gEN8YsJ`nroaCc(F>zI8&u~rDA*Rl<)_u#hUDVR>?Tn
zM{-KCtUuFv`2JJ1{}G$~Zz<guY+A7S{sD&E=|A51%k2M?aXqqOBX9rSeTHGFmz}+q
zZ#e%T{I+F8(`+LJS*@8zQ#84~G^(xD@18#SR!KVYs=y`JxL@HOKkhs2;|g5w;#TQg
zV4#?u(RAF&{KJ<y;ct)J6KJ<7;1j$ptnc2kQMNo_VdR0OPo^yQYTvqAG)DVFkv}t}
lj5B6tU=aKrx-8ks&v|*i68E7;Dea?$)@Y$MT4>=dv;bYNUCjUh

literal 0
HcmV?d00001

diff --git a/modules/image/builder.nix b/modules/image/builder.nix
index f510fe7..65dc08a 100644
--- a/modules/image/builder.nix
+++ b/modules/image/builder.nix
@@ -76,6 +76,7 @@ let
       contents = {
         "/EFI/BOOT/BOOT${lib.toUpper efiArch}.EFI".source = "${pkgs.systemdUkify}/lib/systemd/boot/efi/systemd-boot${efiArch}.efi";
         "/EFI/Linux/${config.system.boot.loader.ukiFile}".source = "${config.system.build.uki}/${config.system.boot.loader.ukiFile}";
+        "/EFI/loader/keys/patos".source = ../../keys;
         "/EFI/memtest86/memtest86.efi".source = "${pkgs.memtest86plus}/memtest.efi";
         "/loader/entries/patos-factory-reset.conf".source = pkgs.writeText "patos-factory-reset.conf" ''
             title Patos Factory Reset
diff --git a/scripts/sbkeys b/scripts/sbkeys
new file mode 100755
index 0000000..a24e215
--- /dev/null
+++ b/scripts/sbkeys
@@ -0,0 +1,154 @@
+#!/usr/bin/env bash
+# Copyright (c) 2015 by Roderick W. Smith
+# Copyright (c) 2020 Corey Hinshaw
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+[ -n "${DEBUG}" ] && set -x
+set -e
+
+usage() {
+  cat <<EOF
+Usage: sbkeys [OPTION]...
+Generate secure boot keys
+
+Options:
+  -h      Print this help text
+  -m      Generate signature database entries for Microsoft certificates
+EOF
+}
+
+generate_keys() {
+  # Do not create new keys if key files already exist
+  KEYS=(
+    PK.key PK.crt PK.cer PK.esl PK.auth
+    KEK.key KEK.crt KEK.cer KEK.esl KEK.auth
+    DB.key DB.crt DB.cer DB.esl DB.auth
+    noPK.esl noPK.auth
+    myGUID.txt
+  )
+  for file in ${KEYS[@]}; do
+    if [ -f ${file} ]; then
+      echo "Skipping key generation: keys already exist in $(pwd)"
+      return
+    fi
+  done
+
+  echo -n "Enter a Common Name to embed in the keys: "
+  read NAME
+
+  # Platform key
+  openssl req -new -x509 \
+      -subj "/CN=${NAME} PK/" -days 3650 -nodes \
+      -newkey rsa:2048 -sha256 \
+      -keyout PK.key -out PK.crt
+  openssl x509 -in PK.crt -out PK.cer -outform DER
+
+  # Key exchange key
+  openssl req -new -x509 \
+      -subj "/CN=${NAME} KEK/" -days 3650 -nodes \
+      -newkey rsa:2048 -sha256 \
+      -keyout KEK.key -out KEK.crt
+  openssl x509 -in KEK.crt -out KEK.cer -outform DER
+
+  # Signature database
+  openssl req -new -x509 \
+      -subj "/CN=${NAME} DB/" -days 3650 -nodes \
+      -newkey rsa:2048 -sha256 \
+      -keyout DB.key -out DB.crt
+  openssl x509 -in DB.crt -out DB.cer -outform DER
+
+  GUID="$(uuidgen -r)"
+  echo ${GUID} > myGUID.txt
+
+  cert-to-efi-sig-list -g ${GUID} PK.crt PK.esl
+  cert-to-efi-sig-list -g ${GUID} KEK.crt KEK.esl
+  cert-to-efi-sig-list -g ${GUID} DB.crt DB.esl
+  rm -f noPK.esl
+  touch noPK.esl
+
+  sign-efi-sig-list \
+      -t "$(date --date='1 second' +'%Y-%m-%d %H:%M:%S')" \
+      -k PK.key -c PK.crt \
+      PK PK.esl PK.auth
+  sign-efi-sig-list \
+      -t "$(date --date='1 second' +'%Y-%m-%d %H:%M:%S')" \
+      -k PK.key -c PK.crt \
+      PK noPK.esl noPK.auth
+  sign-efi-sig-list \
+      -t "$(date --date='1 second' +'%Y-%m-%d %H:%M:%S')" \
+      -k PK.key -c PK.crt \
+      KEK KEK.esl KEK.auth
+  sign-efi-sig-list \
+      -t "$(date --date='1 second' +'%Y-%m-%d %H:%M:%S')" \
+      -k KEK.key -c KEK.crt \
+      DB DB.esl DB.auth
+
+  chmod 0600 *.key
+}
+
+generate_ms_db() {
+  msguid=77fa9abd-0359-4d32-bd60-28f4e78f784b
+
+  msdb="MS_db.esl add_MS_db.auth"
+  for file in $msdb; do
+    if [ -f $file ]; then
+      echo "Microsoft signature lists already exist in $(pwd)"
+      return
+    fi
+  done
+
+  wget --user-agent="Mozilla" https://www.microsoft.com/pkiops/certs/MicWinProPCA2011_2011-10-19.crt
+  wget --user-agent="Mozilla" https://www.microsoft.com/pkiops/certs/MicCorUEFCA2011_2011-06-27.crt
+
+  sbsiglist --owner "$msguid" --type x509 --output MS_Win_db.esl MicWinProPCA2011_2011-10-19.crt
+  sbsiglist --owner "$msguid" --type x509 --output MS_UEFI_db.esl MicCorUEFCA2011_2011-06-27.crt
+  cat MS_Win_db.esl MS_UEFI_db.esl > MS_db.esl
+  sign-efi-sig-list -a -g "$msguid" -k KEK.key -c KEK.crt DB MS_db.esl add_MS_db.auth
+
+  rm MS_Win_db.esl MS_UEFI_db.esl MicWinProPCA2011_2011-10-19.crt MicCorUEFCA2011_2011-06-27.crt
+}
+
+mskeys=0
+
+while getopts ":hm" opt; do
+  case $opt in
+    h)
+      usage
+      cat <<EOF
+
+For use with KeyTool, copy the *.auth and *.esl files to a FAT USB
+flash drive or to your EFI System Partition (ESP).
+For use with most UEFIs' built-in key managers, copy the *.cer files.
+
+To add Microsoft's certificates use KeyTool or UEFI to append
+add_MS_db.auth to the signature database.
+EOF
+      exit 0
+      ;;
+    m)
+      mskeys=1
+      ;;
+    \?)
+      echo "Invalid option: -$OPTARG" >&2
+      usage >&2
+      exit 1
+      ;;
+   esac
+done
+
+generate_keys
+if [ $mskeys -eq 1 ]; then
+  generate_ms_db
+fi
diff --git a/scripts/sign-release.sh b/scripts/sign-release.sh
new file mode 100755
index 0000000..0de9aed
--- /dev/null
+++ b/scripts/sign-release.sh
@@ -0,0 +1,19 @@
+#! /usr/bin/env nix-shell
+#! nix-shell -i bash -p efitools
+
+set -eux
+
+mkdir signed
+cp -L result/* signed/
+
+loopdev=$(sudo losetup -f)
+sudo losetup -P "$loopdev" signed/*.img
+sudo mount "${loopdev}p1" /mnt -t vfat
+
+sudo find signed/ /mnt/ -name "*.efi" -type f -exec sbsign --key <(echo "$DB_KEY") --cert <(echo "$DB_CRT") --output {} {} \;
+
+sudo mkdir -p /mnt/loader/keys/patos
+sudo cp keys/*.auth /mnt/loader/keys/patos/
+
+sudo umount /mnt
+sudo losetup -d "$loopdev"

From 02ae3e58139fd0e5c5e5fd122f8a39f43f6b1de4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Thu, 23 Jan 2025 12:11:57 +0100
Subject: [PATCH 02/78] fix: mount ESP onboot

---
 modules/image/builder.nix | 2 +-
 modules/image/default.nix | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/modules/image/builder.nix b/modules/image/builder.nix
index f510fe7..4f194d8 100644
--- a/modules/image/builder.nix
+++ b/modules/image/builder.nix
@@ -15,7 +15,7 @@ let
         Type = "root";
         Minimize = "best";
         Format = "erofs";
-        MakeDirectories = "/home /root /etc /dev /sys /bin /var /proc /run /usr /usr/bin /srv /tmp /mnt /lib /efi";
+        MakeDirectories = "/home /root /etc /dev /sys /bin /var /proc /run /usr /usr/bin /srv /tmp /mnt /lib /boot";
         Verity = "data";
         VerityMatchKey = "root";
         SplitName = "root";
diff --git a/modules/image/default.nix b/modules/image/default.nix
index dc705e9..20d7fa7 100644
--- a/modules/image/default.nix
+++ b/modules/image/default.nix
@@ -22,6 +22,7 @@
   systemd.repart.partitions = {
     "10-esp" = {
       Type = "esp";
+      UUID = "c12a7328-f81f-11d2-ba4b-00a0c93ec93b"; # Well known
       Format = "vfat";
       SizeMinBytes = "96M";
       SizeMaxBytes = "96M";

From da048fc28d37a9b50b0ca79223bb571ccacf1a5c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Mon, 10 Feb 2025 10:49:11 +0100
Subject: [PATCH 03/78] feat: add support for 9p virtfs

---
 modules/profiles/base.nix | 2 ++
 utils/qemu-uefi-tpm.nix   | 1 +
 2 files changed, 3 insertions(+)

diff --git a/modules/profiles/base.nix b/modules/profiles/base.nix
index 419c55d..bb6b37b 100644
--- a/modules/profiles/base.nix
+++ b/modules/profiles/base.nix
@@ -31,6 +31,8 @@
     "xhci-pci-renesas"
     "nvme"
     "virtio_net"
+    "9p"
+    "9pnet_virtio"
   ];
 
   system.etc.overlay.mutable = lib.mkDefault false;
diff --git a/utils/qemu-uefi-tpm.nix b/utils/qemu-uefi-tpm.nix
index 7cc36c7..bde07ab 100644
--- a/utils/qemu-uefi-tpm.nix
+++ b/utils/qemu-uefi-tpm.nix
@@ -34,6 +34,7 @@ pkgs.writeShellApplication {
         -smp 8 \
         -m 4G \
         -display none \
+        -virtfs "local,path=/tmp,security_model=mapped,mount_tag=shared" \
         -chardev "stdio,id=char0,mux=on,logfile=$state/console.log,signal=off" \
         -serial chardev:char0 \
         -mon chardev=char0 \

From 4702e0dddb86e576a404f384937e41df08acd01e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Mon, 10 Feb 2025 10:49:11 +0100
Subject: [PATCH 04/78] feat(systemd): enabled sysupdated

---
 flake.lock                        |   6 +-
 modules/config/minimal-system.nix |  23 +++---
 modules/image/updater.nix         | 122 +++++++++++++++---------------
 pkgs/systemd.nix                  |  10 ---
 4 files changed, 76 insertions(+), 85 deletions(-)
 delete mode 100644 pkgs/systemd.nix

diff --git a/flake.lock b/flake.lock
index 2cb3583..6ca2bd0 100644
--- a/flake.lock
+++ b/flake.lock
@@ -2,11 +2,11 @@
   "nodes": {
     "nixpkgs": {
       "locked": {
-        "lastModified": 1737469691,
-        "narHash": "sha256-nmKOgAU48S41dTPIXAq0AHZSehWUn6ZPrUKijHAMmIk=",
+        "lastModified": 1739020877,
+        "narHash": "sha256-mIvECo/NNdJJ/bXjNqIh8yeoSjVLAuDuTUzAo7dzs8Y=",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "9e4d5190a9482a1fb9d18adf0bdb83c6e506eaab",
+        "rev": "a79cfe0ebd24952b580b1cf08cd906354996d547",
         "type": "github"
       },
       "original": {
diff --git a/modules/config/minimal-system.nix b/modules/config/minimal-system.nix
index e77476b..c81d7d4 100644
--- a/modules/config/minimal-system.nix
+++ b/modules/config/minimal-system.nix
@@ -6,19 +6,18 @@
 
       composefs = final.callPackage ../../pkgs/composefs.nix { inherit prev; };
       qemu_tiny = final.callPackage ../../pkgs/qemu.nix { inherit prev; };
-      systemdUkify = final.callPackage ../../pkgs/systemd-ukify.nix { inherit prev; };
 
-    # # FIXME: Revisit + refine these below in a future image minimization effort
-    #
-    # util-linux = prev.util-linux.override {
-    #   ncursesSupport = false;
-    #   nlsSupport = false;
-    # };
-    #
-    # dbus = prev.dbus.override {
-    #   enableSystemd = false;
-    #   x11Support = false;
-    # };
+      systemd = prev.systemd.overrideAttrs (oldAttrs: {
+        mesonFlags = oldAttrs.mesonFlags ++ [
+          "-Dsysupdated=enabled"
+        ];
+      });
+      ## minimal inherit from systemd pkg, need to explicitly disable sysupdated
+      systemdMinimal = prev.systemdMinimal.overrideAttrs (oldAttrs: {
+        mesonFlags = oldAttrs.mesonFlags ++ [
+          "-Dsysupdated=disabled"
+        ];
+      });
 
     })
   ];
diff --git a/modules/image/updater.nix b/modules/image/updater.nix
index f3c1226..7602cdc 100644
--- a/modules/image/updater.nix
+++ b/modules/image/updater.nix
@@ -17,71 +17,73 @@
       { assertion = config.system.image.updates.url != null; }
     ];
 
-    systemd.sysupdate.enable = true;
-    systemd.sysupdate.reboot.enable = lib.mkDefault true;
-
-    systemd.sysupdate.transfers = {
-      "10-uki" = {
-        Transfer = {
-          Verify = "no";
-        };
-        Source = {
-          Type = "url-file";
-          Path = "${config.system.image.updates.url}";
-          MatchPattern = "${config.boot.uki.name}_@v.efi";
-        };
-        Target = {
-          Type = "regular-file";
-          Path = "/EFI/Linux";
-          PathRelativeTo = "esp";
-          MatchPattern = "${config.boot.uki.name}_@v+@l-@d.efi ${config.boot.uki.name}_@v+@l.efi ${config.boot.uki.name}_@v.efi";
-          Mode = "0444";
-          TriesLeft = 3;
-          TriesDone = 0;
-          InstancesMax = 2;
-        };
-      };
-      "20-root-verity" = {
-        Transfer = {
-          Verify = "no";
-        };
-        Source = {
-          Type = "url-file";
-          Path = "${config.system.image.updates.url}";
-          MatchPattern = "${config.system.image.id}_@v_@u.verity";
-        };
-        Target = {
-          Type = "partition";
-          Path = "auto";
-          MatchPattern = "verity-@v";
-          MatchPartitionType = "root-verity";
-          ReadOnly = 1;
-        };
-      };
-      "22-root" = {
-        Transfer = {
-          Verify = "no";
-        };
-        Source = {
-          Type = "url-file";
-          Path = "${config.system.image.updates.url}";
-          MatchPattern = "${config.system.image.id}_@v_@u.root";
-        };
-        Target = {
-          Type = "partition";
-          Path = "auto";
-          MatchPattern = "root-@v";
-          MatchPartitionType = "root";
-          ReadOnly = 1;
-        };
-      };
-    };
-
     systemd.additionalUpstreamSystemUnits = [
       "systemd-bless-boot.service"
       "boot-complete.target"
+      "dbus-org.freedesktop.sysupdate1.service"
+      "systemd-sysupdated.service"
     ];
 
+    environment.etc."sysupdate.d/10-uki.transfer" = {
+      text = ''
+        [Source]
+        Path=${config.system.image.updates.url}
+        MatchPattern=${config.boot.uki.name}_@v.efi
+        Type=url-file
+
+        [Target]
+        InstancesMax=2
+        MatchPattern=${config.boot.uki.name}_@v+@l-@d.efi ${config.boot.uki.name}_@v+@l.efi ${config.boot.uki.name}_@v.efi
+        Mode=0444
+        Path=/EFI/Linux
+        PathRelativeTo=esp
+        TriesDone=0
+        TriesLeft=3
+        Type=regular-file
+
+        [Transfer]
+        Verify=no
+        '';
+    };
+
+    environment.etc."sysupdate.d/20-root.transfer" = {
+      text = ''
+        [Source]
+        Type=url-file
+        Path=${config.system.image.updates.url}
+        MatchPattern=${config.system.image.id}_@v_@u.verity
+
+        [Target]
+        Type=partition
+        Path=auto
+        MatchPattern=verity-@v
+        MatchPartitionType=root-verity
+        ReadOnly=1
+
+        [Transfer]
+        Verify=no
+        '';
+    };
+
+    environment.etc."sysupdate.d/22-root.transfer" = {
+      text = ''
+        [Source]
+        Type=url-file
+        Path=${config.system.image.updates.url}
+        MatchPattern=${config.system.image.id}_@v_@u.root
+
+        [Target]
+        Type=partition
+        Path=auto
+        MatchPattern=root-@v
+        MatchPartitionType=root
+        ReadOnly=1
+
+        [Transfer]
+        Verify=no
+        '';
+    };
+
   };
 
 }
diff --git a/pkgs/systemd.nix b/pkgs/systemd.nix
deleted file mode 100644
index 2d52e9a..0000000
--- a/pkgs/systemd.nix
+++ /dev/null
@@ -1,10 +0,0 @@
-{ prev, ... }:
-
-prev.systemd.override {
-  withAcl = false;
-  withApparmor = false;
-  withDocumentation = false;
-  withRemote = false;
-  withShellCompletions = false;
-  withVmspawn = false;
-}

From b784c94d420a2287901117eefe9b1538fb8bdd86 Mon Sep 17 00:00:00 2001
From: Daniel Lundin <dln@arity.se>
Date: Thu, 13 Feb 2025 09:28:16 +0100
Subject: [PATCH 05/78] WIP: Build image from scratch / without NixOS.

An experiment to see if we can minimize the PatOS project even further,
and not have to adapt NixOS packages and config for our needs.
---
 .envrc.recommended                            |    2 +
 flake.lock                                    |   34 +
 flake.nix                                     |  113 +-
 kernel/default.nix                            |   16 +
 kernel/generic.config                         | 2521 +++++++++++++++++
 modules/config/minimal-modules.nix            |   15 -
 modules/config/minimal-system.nix             |   25 -
 modules/default.nix                           |    6 -
 modules/image/builder.nix                     |  196 --
 modules/image/default.nix                     |  137 -
 modules/image/updater.nix                     |   89 -
 modules/image/veritysetup.nix                 |   39 -
 modules/profiles/base.nix                     |   97 -
 modules/profiles/devel.nix                    |   39 -
 modules/profiles/network.nix                  |   65 -
 modules/profiles/server.nix                   |   18 -
 modules/profiles/sysext.nix                   |   23 -
 pkgs/composefs.nix                            |    5 -
 pkgs/linux-firmware.nix                       |   12 -
 pkgs/qemu.nix                                 |   30 -
 pkgs/systemd-ukify.nix                        |   48 -
 ....build-do-not-create-systemdstatedir.patch |   21 +
 systemd/default.nix                           |  315 ++
 systemd/result                                |    1 +
 tests/common.nix                              |  155 -
 tests/lib.nix                                 |    9 -
 tests/podman.nix                              |   22 -
 tests/system-update.nix                       |   45 -
 utils/qemu-uefi-tpm.nix                       |   50 -
 29 files changed, 2947 insertions(+), 1201 deletions(-)
 create mode 100644 kernel/default.nix
 create mode 100644 kernel/generic.config
 delete mode 100644 modules/config/minimal-modules.nix
 delete mode 100644 modules/config/minimal-system.nix
 delete mode 100644 modules/default.nix
 delete mode 100644 modules/image/builder.nix
 delete mode 100644 modules/image/default.nix
 delete mode 100644 modules/image/updater.nix
 delete mode 100644 modules/image/veritysetup.nix
 delete mode 100644 modules/profiles/base.nix
 delete mode 100644 modules/profiles/devel.nix
 delete mode 100644 modules/profiles/network.nix
 delete mode 100644 modules/profiles/server.nix
 delete mode 100644 modules/profiles/sysext.nix
 delete mode 100644 pkgs/composefs.nix
 delete mode 100644 pkgs/linux-firmware.nix
 delete mode 100644 pkgs/qemu.nix
 delete mode 100644 pkgs/systemd-ukify.nix
 create mode 100644 systemd/0017-meson.build-do-not-create-systemdstatedir.patch
 create mode 100644 systemd/default.nix
 create mode 120000 systemd/result
 delete mode 100644 tests/common.nix
 delete mode 100644 tests/lib.nix
 delete mode 100644 tests/podman.nix
 delete mode 100644 tests/system-update.nix
 delete mode 100644 utils/qemu-uefi-tpm.nix

diff --git a/.envrc.recommended b/.envrc.recommended
index 3550a30..3e08e17 100644
--- a/.envrc.recommended
+++ b/.envrc.recommended
@@ -1 +1,3 @@
+nix_direnv_manual_reload
 use flake
+dotenv_if_exists
diff --git a/flake.lock b/flake.lock
index 6ca2bd0..85be38f 100644
--- a/flake.lock
+++ b/flake.lock
@@ -1,5 +1,23 @@
 {
   "nodes": {
+    "flake-utils": {
+      "inputs": {
+        "systems": "systems"
+      },
+      "locked": {
+        "lastModified": 1731533236,
+        "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
     "nixpkgs": {
       "locked": {
         "lastModified": 1739020877,
@@ -18,8 +36,24 @@
     },
     "root": {
       "inputs": {
+        "flake-utils": "flake-utils",
         "nixpkgs": "nixpkgs"
       }
+    },
+    "systems": {
+      "locked": {
+        "lastModified": 1681028828,
+        "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+        "owner": "nix-systems",
+        "repo": "default",
+        "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-systems",
+        "repo": "default",
+        "type": "github"
+      }
     }
   },
   "root": "root",
diff --git a/flake.nix b/flake.nix
index 7648b8b..6a4e60f 100644
--- a/flake.nix
+++ b/flake.nix
@@ -2,90 +2,51 @@
   description = "PatOS is a minimal, immutable Linux distribution specialized for the Patagia Platform.";
 
   inputs = {
+    flake-utils.url = "github:numtide/flake-utils";
     nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
   };
 
   outputs =
-    { self, nixpkgs }:
-    let
-      releaseVersion = "0.0.1";
-      system = "x86_64-linux";
-      updateUrl = "https://images.dl.patagia.dev/patos/";
-      pkgs = import nixpkgs { inherit system; };
-    in
     {
-      nixosModules.devel.imports = [
-        ./modules/profiles/devel.nix
-      ];
+      self,
+      flake-utils,
+      nixpkgs,
+    }:
+    flake-utils.lib.eachDefaultSystem (
+      system:
+      let
+        pkgs = import nixpkgs { inherit system; };
+      in
+      {
+        packages = {
+          default = self.packages.${system}.image;
+          image = pkgs.writeShellScriptBin "image" ''
+            echo "make image here..."
+          '';
 
-      nixosModules.server.imports = [
-        ./modules/profiles/server.nix
-      ];
+          kernel = pkgs.callPackage ./kernel { };
+          systemd = pkgs.callPackage ./systemd { };
+        };
 
-      nixosModules.image.imports = [
-        ./modules
-        ./modules/profiles/base.nix
-        ./modules/image
-      ];
+        checks = {
+          simple-test = pkgs.runCommand "simple-test" { } ''
+            ${self.packages.${system}.default}/bin/my-program
+            touch $out
+          '';
+        };
 
-      packages.${system} = {
-        devel =
-          (nixpkgs.lib.nixosSystem {
-            modules = [
-              (
-                { ... }:
-                {
-                  nixpkgs.hostPlatform = system;
-                  system.stateVersion = "25.05";
-                }
-              )
-              {
-                system.image.updates.url = "${updateUrl}";
-                system.image.id = "patos";
-                system.image.version = releaseVersion;
-                image.compress = false;
-              }
-              self.nixosModules.image
-              self.nixosModules.devel
-            ];
-          }).config.system.build.updatePackage;
+        formatter = pkgs.nixpkgs-fmt;
 
-        patos =
-          (nixpkgs.lib.nixosSystem {
-            modules = [
-              (
-                { ... }:
-                {
-                  nixpkgs.hostPlatform = system;
-                  system.stateVersion = "25.05";
-                }
-              )
-              {
-                system.image.updates.url = "${updateUrl}";
-                system.image.id = "patos";
-                system.image.version = releaseVersion;
-              }
-              self.nixosModules.image
-              self.nixosModules.server
-            ];
-          }).config.system.build.updatePackage;
+        devShells.default = pkgs.mkShell {
+          buildInputs = with pkgs; [
+            erofs-utils
+            just
+            nixd
+            nixfmt-rfc-style
+            squashfs-tools-ng
+          ];
+        };
 
-        qemu-uefi-tpm = pkgs.callPackage ./utils/qemu-uefi-tpm.nix { inherit pkgs; };
-      };
-
-      checks.${system} = {
-        podman = import ./tests/podman.nix { inherit pkgs self; };
-        system-update = import ./tests/system-update.nix { inherit pkgs self; };
-      };
-
-      devShells.${system}.default = pkgs.mkShell {
-        buildInputs = with pkgs; [
-          erofs-utils
-          just
-          self.packages.${system}.qemu-uefi-tpm
-          squashfs-tools-ng
-        ];
-      };
-
-    };
+      }
+    );
 }
diff --git a/kernel/default.nix b/kernel/default.nix
new file mode 100644
index 0000000..e10d25b
--- /dev/null
+++ b/kernel/default.nix
@@ -0,0 +1,16 @@
+{ pkgs, ... }:
+let
+  version = "6.13.2";
+in
+pkgs.linuxPackagesFor (
+  pkgs.linuxManualConfig {
+    version = "${version}-patos1";
+    modDirVersion = version;
+    src = pkgs.fetchurl {
+      url = "https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-${version}.tar.xz";
+      hash = "sha256-zfYpgZBru+lwGutzxPn8yAegmEbCiHMWY9YnF+0a5wU=";
+    };
+    configfile = ./generic.config;
+    allowImportFromDerivation = true;
+  }
+)
diff --git a/kernel/generic.config b/kernel/generic.config
new file mode 100644
index 0000000..2073cdf
--- /dev/null
+++ b/kernel/generic.config
@@ -0,0 +1,2521 @@
+CONFIG_64BIT=y
+CONFIG_ACPI_AC=y
+CONFIG_ACPI_BATTERY=y
+CONFIG_ACPI_BUTTON=y
+CONFIG_ACPI_CONTAINER=y
+CONFIG_ACPI_CPPC_LIB=y
+CONFIG_ACPI_CPU_FREQ_PSS=y
+CONFIG_ACPI_FAN=y
+CONFIG_ACPI_HOTPLUG_CPU=y
+CONFIG_ACPI_HOTPLUG_IOAPIC=y
+CONFIG_ACPI_I2C_OPREGION=y
+CONFIG_ACPI_IPMI=y
+CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y
+CONFIG_ACPI_LPIT=y
+CONFIG_ACPI_MDIO=y
+CONFIG_ACPI_NUMA=y
+CONFIG_ACPI_PCC=y
+CONFIG_ACPI_PRMT=y
+CONFIG_ACPI_PROCESSOR_CSTATE=y
+CONFIG_ACPI_PROCESSOR_IDLE=y
+CONFIG_ACPI_PROCESSOR=y
+CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y
+CONFIG_ACPI_SLEEP=y
+CONFIG_ACPI_SPCR_TABLE=y
+CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y
+CONFIG_ACPI_TABLE_UPGRADE=y
+CONFIG_ACPI_THERMAL=y
+CONFIG_ACPI_VIDEO=y
+CONFIG_ACPI_WATCHDOG=y
+CONFIG_ACPI_WMI=y
+CONFIG_ACPI=y
+CONFIG_ADDRESS_MASKING=y
+CONFIG_ADVISE_SYSCALLS=y
+CONFIG_AF_UNIX_OOB=y
+CONFIG_AIO=y
+CONFIG_ALLOW_DEV_COREDUMP=y
+CONFIG_ALX=m
+CONFIG_AMD_IOMMU_V2=y
+CONFIG_AMD_IOMMU=y
+CONFIG_AMD_NB=y
+CONFIG_AMD_NUMA=y
+CONFIG_AMD_PMC=m
+CONFIG_APERTURE_HELPERS=y
+CONFIG_AQTION=m
+CONFIG_ARCH_CLOCKSOURCE_INIT=y
+CONFIG_ARCH_CONFIGURES_CPU_MITIGATIONS=y
+CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y
+CONFIG_ARCH_CPUIDLE_HALTPOLL=y
+CONFIG_ARCH_DMA_ADDR_T_64BIT=y
+CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION=y
+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y
+CONFIG_ARCH_HAS_ACPI_TABLE_UPGRADE=y
+CONFIG_ARCH_HAS_ADD_PAGES=y
+CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
+CONFIG_ARCH_HAS_COPY_MC=y
+CONFIG_ARCH_HAS_CPU_CACHE_INVALIDATE_MEMREGION=y
+CONFIG_ARCH_HAS_CPU_FINALIZE_INIT=y
+CONFIG_ARCH_HAS_CPU_RELAX=y
+CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y
+CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y
+CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y
+CONFIG_ARCH_HAS_DEBUG_WX=y
+CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y
+CONFIG_ARCH_HAS_ELFCORE_COMPAT=y
+CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
+CONFIG_ARCH_HAS_FAST_MULTIPLIER=y
+CONFIG_ARCH_HAS_FORTIFY_SOURCE=y
+CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
+CONFIG_ARCH_HAS_GIGANTIC_PAGE=y
+CONFIG_ARCH_HAS_KCOV=y
+CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y
+CONFIG_ARCH_HAS_MEM_ENCRYPT=y
+CONFIG_ARCH_HAS_NMI_SAFE_THIS_CPU_OPS=y
+CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y
+CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y
+CONFIG_ARCH_HAS_PARANOID_L1D_FLUSH=y
+CONFIG_ARCH_HAS_PKEYS=y
+CONFIG_ARCH_HAS_PMEM_API=y
+CONFIG_ARCH_HAS_PTE_DEVMAP=y
+CONFIG_ARCH_HAS_PTE_SPECIAL=y
+CONFIG_ARCH_HAS_SET_DIRECT_MAP=y
+CONFIG_ARCH_HAS_SET_MEMORY=y
+CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y
+CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y
+CONFIG_ARCH_HAS_SYNC_CORE_BEFORE_USERMODE=y
+CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y
+CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y
+CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y
+CONFIG_ARCH_HAS_ZONE_DMA_SET=y
+CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
+CONFIG_ARCH_HIBERNATION_POSSIBLE=y
+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y
+CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y
+CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
+CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y
+CONFIG_ARCH_MMAP_RND_BITS=28
+CONFIG_ARCH_MMAP_RND_BITS_MAX=32
+CONFIG_ARCH_MMAP_RND_BITS_MIN=28
+CONFIG_ARCH_MMAP_RND_COMPAT_BITS=8
+CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16
+CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=8
+CONFIG_ARCH_SELECTS_KEXEC_FILE=y
+CONFIG_ARCH_SPARSEMEM_DEFAULT=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_STACKWALK=y
+CONFIG_ARCH_SUPPORTS_ACPI=y
+CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
+CONFIG_ARCH_SUPPORTS_CFI_CLANG=y
+CONFIG_ARCH_SUPPORTS_CRASH_DUMP=y
+CONFIG_ARCH_SUPPORTS_CRASH_HOTPLUG=y
+CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
+CONFIG_ARCH_SUPPORTS_INT128=y
+CONFIG_ARCH_SUPPORTS_KEXEC_BZIMAGE_VERIFY_SIG=y
+CONFIG_ARCH_SUPPORTS_KEXEC_FILE=y
+CONFIG_ARCH_SUPPORTS_KEXEC_JUMP=y
+CONFIG_ARCH_SUPPORTS_KEXEC_PURGATORY=y
+CONFIG_ARCH_SUPPORTS_KEXEC_SIG_FORCE=y
+CONFIG_ARCH_SUPPORTS_KEXEC_SIG=y
+CONFIG_ARCH_SUPPORTS_KEXEC=y
+CONFIG_ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP=y
+CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y
+CONFIG_ARCH_SUPPORTS_LTO_CLANG=y
+CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y
+CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y
+CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y
+CONFIG_ARCH_SUPPORTS_PER_VMA_LOCK=y
+CONFIG_ARCH_SUPPORTS_UPROBES=y
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+CONFIG_ARCH_USE_BUILTIN_BSWAP=y
+CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y
+CONFIG_ARCH_USE_MEMREMAP_PROT=y
+CONFIG_ARCH_USE_MEMTEST=y
+CONFIG_ARCH_USE_QUEUED_RWLOCKS=y
+CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y
+CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y
+CONFIG_ARCH_USES_PG_UNCACHED=y
+CONFIG_ARCH_USE_SYM_ANNOTATIONS=y
+CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y
+CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y
+CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y
+CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
+CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y
+CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y
+CONFIG_ARCH_WANT_OLD_COMPAT_IPC=y
+CONFIG_ARCH_WANT_OPTIMIZE_DAX_VMEMMAP=y
+CONFIG_ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP=y
+CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y
+CONFIG_ARCH_WANTS_NO_INSTR=y
+CONFIG_ARCH_WANTS_THP_SWAP=y
+CONFIG_AS_AVX512=y
+CONFIG_AS_GFNI=y
+CONFIG_AS_HAS_NON_CONST_LEB128=y
+CONFIG_AS_IS_GNU=y
+CONFIG_ASM_MODVERSIONS=y
+CONFIG_ASN1=y
+CONFIG_AS_SHA1_NI=y
+CONFIG_AS_SHA256_NI=y
+CONFIG_ASSOCIATIVE_ARRAY=y
+CONFIG_AS_TPAUSE=y
+CONFIG_AS_VERSION=24200
+CONFIG_AS_WRUSS=y
+CONFIG_ASYMMETRIC_KEY_TYPE=y
+CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y
+CONFIG_ASYNC_CORE=m
+CONFIG_ASYNC_MEMCPY=m
+CONFIG_ASYNC_PQ=m
+CONFIG_ASYNC_RAID6_RECOV=m
+CONFIG_ASYNC_XOR=m
+CONFIG_ATA_ACPI=y
+CONFIG_ATA_BMDMA=y
+CONFIG_ATA_FORCE=y
+CONFIG_ATA_PIIX=y
+CONFIG_ATA_SFF=y
+CONFIG_ATA_VERBOSE_ERROR=y
+CONFIG_ATA=y
+CONFIG_ATM_DRIVERS=y
+CONFIG_ATM=y
+CONFIG_AUDIT_ARCH=y
+CONFIG_AUDITSYSCALL=y
+CONFIG_AUDIT=y
+CONFIG_AUTOFS_FS=y
+CONFIG_AUXILIARY_BUS=y
+CONFIG_AX88796B_PHY=m
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_BALLOON_COMPACTION=y
+CONFIG_BASE_FULL=y
+CONFIG_BASE_SMALL=0
+CONFIG_BCMA_POSSIBLE=y
+CONFIG_BE2NET_BE2=y
+CONFIG_BE2NET_BE3=y
+CONFIG_BE2NET_HWMON=y
+CONFIG_BE2NET_LANCER=y
+CONFIG_BE2NET=m
+CONFIG_BE2NET_SKYHAWK=y
+CONFIG_BFQ_GROUP_IOSCHED=y
+CONFIG_BINARY_PRINTF=y
+CONFIG_BINFMT_ELF=y
+CONFIG_BINFMT_MISC=m
+CONFIG_BINFMT_SCRIPT=y
+CONFIG_BITREVERSE=y
+CONFIG_BLK_CGROUP_PUNT_BIO=y
+CONFIG_BLK_CGROUP_RWSTAT=y
+CONFIG_BLK_CGROUP=y
+CONFIG_BLK_DEBUG_FS=y
+CONFIG_BLK_DEV_BSG_COMMON=y
+CONFIG_BLK_DEV_BSGLIB=y
+CONFIG_BLK_DEV_BSG=y
+CONFIG_BLK_DEV_DM_BUILTIN=y
+CONFIG_BLK_DEV_DM=y
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_BLK_DEV_IO_TRACE=y
+CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_MD=y
+CONFIG_BLK_DEV_NBD=m
+CONFIG_BLK_DEV_NVME=m
+CONFIG_BLK_DEV_RBD=y
+CONFIG_BLK_DEV_SD=y
+CONFIG_BLK_DEV_SR=y
+CONFIG_BLK_DEV_THROTTLING=y
+CONFIG_BLK_DEV=y
+CONFIG_BLK_ICQ=y
+CONFIG_BLK_MQ_PCI=y
+CONFIG_BLK_MQ_STACKING=y
+CONFIG_BLK_MQ_VIRTIO=y
+CONFIG_BLK_PM=y
+CONFIG_BLOCK_HOLDER_DEPRECATED=y
+CONFIG_BLOCK_LEGACY_AUTOLOAD=y
+CONFIG_BLOCK=y
+CONFIG_BNX2=m
+CONFIG_BNX2X=m
+CONFIG_BNX2X_SRIOV=y
+CONFIG_BNXT_FLOWER_OFFLOAD=y
+CONFIG_BNXT_HWMON=y
+CONFIG_BNXT=m
+CONFIG_BNXT_SRIOV=y
+CONFIG_BONDING=y
+CONFIG_BOOT_VESA_SUPPORT=y
+CONFIG_BPF_EVENTS=y
+CONFIG_BPF_JIT_ALWAYS_ON=y
+CONFIG_BPF_JIT_DEFAULT_ON=y
+CONFIG_BPF_JIT=y
+CONFIG_BPF_LSM=y
+CONFIG_BPF_STREAM_PARSER=y
+CONFIG_BPF_SYSCALL=y
+CONFIG_BPF_UNPRIV_DEFAULT_OFF=y
+CONFIG_BPF=y
+CONFIG_BQL=y
+CONFIG_BRANCH_PROFILE_NONE=y
+CONFIG_BRIDGE_EBT_802_3=y
+CONFIG_BRIDGE_EBT_AMONG=y
+CONFIG_BRIDGE_EBT_ARPREPLY=y
+CONFIG_BRIDGE_EBT_ARP=y
+CONFIG_BRIDGE_EBT_BROUTE=y
+CONFIG_BRIDGE_EBT_DNAT=y
+CONFIG_BRIDGE_EBT_IP6=y
+CONFIG_BRIDGE_EBT_IP=y
+CONFIG_BRIDGE_EBT_LIMIT=y
+CONFIG_BRIDGE_EBT_LOG=y
+CONFIG_BRIDGE_EBT_MARK_T=y
+CONFIG_BRIDGE_EBT_MARK=y
+CONFIG_BRIDGE_EBT_NFLOG=y
+CONFIG_BRIDGE_EBT_PKTTYPE=y
+CONFIG_BRIDGE_EBT_REDIRECT=y
+CONFIG_BRIDGE_EBT_SNAT=y
+CONFIG_BRIDGE_EBT_STP=y
+CONFIG_BRIDGE_EBT_T_FILTER=y
+CONFIG_BRIDGE_EBT_T_NAT=y
+CONFIG_BRIDGE_EBT_VLAN=y
+CONFIG_BRIDGE_IGMP_SNOOPING=y
+CONFIG_BRIDGE_NETFILTER=y
+CONFIG_BRIDGE_NF_EBTABLES=y
+CONFIG_BRIDGE_VLAN_FILTERING=y
+CONFIG_BRIDGE=y
+CONFIG_BSD_DISKLABEL=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BTRFS_FS=m
+CONFIG_BTRFS_FS_POSIX_ACL=y
+CONFIG_BUFFER_HEAD=y
+CONFIG_BUG_ON_DATA_CORRUPTION=y
+CONFIG_BUG=y
+CONFIG_BUILD_SALT=""
+CONFIG_BUILDTIME_MCOUNT_SORT=y
+CONFIG_BUILDTIME_TABLE_SORT=y
+CONFIG_CACHESTAT_SYSCALL=y
+CONFIG_CALL_DEPTH_TRACKING=y
+CONFIG_CALL_PADDING=y
+CONFIG_CALL_THUNKS=y
+CONFIG_CAVIUM_PTP=m
+CONFIG_CC10001_ADC=m
+CONFIG_CC_CAN_LINK=y
+CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y
+CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y
+CONFIG_CC_HAS_ASM_INLINE=y
+CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y
+CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y
+CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y
+CONFIG_CC_HAS_ENTRY_PADDING=y
+CONFIG_CC_HAS_IBT=y
+CONFIG_CC_HAS_INT128=y
+CONFIG_CC_HAS_KASAN_GENERIC=y
+CONFIG_CC_HAS_NAMED_AS_FIXED_SANITIZERS=y
+CONFIG_CC_HAS_NAMED_AS=y
+CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y
+CONFIG_CC_HAS_RETURN_THUNK=y
+CONFIG_CC_HAS_SANCOV_TRACE_PC=y
+CONFIG_CC_HAS_SANE_STACKPROTECTOR=y
+CONFIG_CC_HAS_SLS=y
+CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y
+CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y
+CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5"
+CONFIG_CC_IS_GCC=y
+CONFIG_CC_NO_ARRAY_BOUNDS=y
+CONFIG_CC_NO_STRINGOP_OVERFLOW=y
+CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y
+CONFIG_CCS811=m
+CONFIG_CC_VERSION_TEXT="gcc (GCC) 13.3.0"
+CONFIG_CDROM=y
+CONFIG_CEPH_FS_POSIX_ACL=y
+CONFIG_CEPH_FS=y
+CONFIG_CEPH_LIB=y
+CONFIG_CFS_BANDWIDTH=y
+CONFIG_CGROUP_BPF=y
+CONFIG_CGROUP_CPUACCT=y
+CONFIG_CGROUP_DEVICE=y
+CONFIG_CGROUP_FREEZER=y
+CONFIG_CGROUP_HUGETLB=y
+CONFIG_CGROUP_MISC=y
+CONFIG_CGROUP_NET_CLASSID=y
+CONFIG_CGROUP_NET_PRIO=y
+CONFIG_CGROUP_PERF=y
+CONFIG_CGROUP_PIDS=y
+CONFIG_CGROUP_SCHED=y
+CONFIG_CGROUPS=y
+CONFIG_CGROUP_WRITEBACK=y
+CONFIG_CHECK_SIGNATURE=y
+CONFIG_CHELSIO_INLINE_CRYPTO=y
+CONFIG_CHELSIO_IPSEC_INLINE=m
+CONFIG_CHELSIO_T1=m
+CONFIG_CHELSIO_T3=m
+CONFIG_CHELSIO_T4=m
+CONFIG_CHELSIO_T4VF=m
+CONFIG_CHR_DEV_SG=y
+CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y
+CONFIG_CIFS_DEBUG=y
+CONFIG_CIFS_DFS_UPCALL=y
+CONFIG_CIFS_UPCALL=y
+CONFIG_CIFS_XATTR=y
+CONFIG_CIFS=y
+CONFIG_CLANG_VERSION=0
+CONFIG_CLKBLD_I8253=y
+CONFIG_CLKEVT_I8253=y
+CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=y
+CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US=100
+CONFIG_CLOCKSOURCE_WATCHDOG=y
+CONFIG_CLZ_TAB=y
+CONFIG_COMMON_CLK=y
+CONFIG_COMPACTION=y
+CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1
+CONFIG_COMPAT_32BIT_TIME=y
+CONFIG_COMPAT_32=y
+CONFIG_COMPAT_BINFMT_ELF=y
+CONFIG_COMPAT_FOR_U64_ALIGNMENT=y
+CONFIG_COMPAT_OLD_SIGACTION=y
+CONFIG_COMPAT=y
+CONFIG_CONFIGFS_FS=y
+CONFIG_CONNECTOR=y
+CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7
+CONFIG_CONSOLE_LOGLEVEL_QUIET=4
+CONFIG_CONSOLE_TRANSLATIONS=y
+CONFIG_CONTEXT_SWITCH_TRACER=y
+CONFIG_CONTEXT_TRACKING_IDLE=y
+CONFIG_CONTEXT_TRACKING=y
+CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
+CONFIG_COREDUMP=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y
+CONFIG_CPU_FREQ_GOV_ATTR_SET=y
+CONFIG_CPU_FREQ_GOV_COMMON=y
+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_IBPB_ENTRY=y
+CONFIG_CPU_IBRS_ENTRY=y
+CONFIG_CPU_IDLE_GOV_HALTPOLL=y
+CONFIG_CPU_IDLE_GOV_MENU=y
+CONFIG_CPU_IDLE=y
+CONFIG_CPU_ISOLATION=y
+CONFIG_CPU_MITIGATIONS=y
+CONFIG_CPU_RMAP=y
+CONFIG_CPUSETS=y
+CONFIG_CPU_SRSO=y
+CONFIG_CPU_SUP_AMD=y
+CONFIG_CPU_SUP_CENTAUR=y
+CONFIG_CPU_SUP_HYGON=y
+CONFIG_CPU_SUP_INTEL=y
+CONFIG_CPU_SUP_ZHAOXIN=y
+CONFIG_CPU_UNRET_ENTRY=y
+CONFIG_CRASH_CORE=y
+CONFIG_CRASH_DUMP=y
+CONFIG_CRASH_HOTPLUG=y
+CONFIG_CRASH_MAX_MEMORY_RANGES=8192
+CONFIG_CRC16=y
+CONFIG_CRC32_SLICEBY8=y
+CONFIG_CRC32=y
+CONFIG_CRC8=y
+CONFIG_CRC_CCITT=y
+CONFIG_CRC_ITU_T=y
+CONFIG_CROSS_MEMORY_ATTACH=y
+CONFIG_CRYPTO_ACOMP2=y
+CONFIG_CRYPTO_ADIANTUM=y
+CONFIG_CRYPTO_AEAD2=y
+CONFIG_CRYPTO_AEAD=y
+CONFIG_CRYPTO_AES_NI_INTEL=y
+CONFIG_CRYPTO_AES=y
+CONFIG_CRYPTO_AKCIPHER2=y
+CONFIG_CRYPTO_AKCIPHER=y
+CONFIG_CRYPTO_ALGAPI2=y
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_ARC4=y
+CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S=y
+CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y
+CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519=y
+CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y
+CONFIG_CRYPTO_AUTHENC=y
+CONFIG_CRYPTO_BLAKE2B=m
+CONFIG_CRYPTO_BLAKE2S_X86=y
+CONFIG_CRYPTO_CBC=y
+CONFIG_CRYPTO_CCM=y
+CONFIG_CRYPTO_CHACHA20_X86_64=y
+CONFIG_CRYPTO_CHACHA20=y
+CONFIG_CRYPTO_CMAC=y
+CONFIG_CRYPTO_CRC32C=y
+CONFIG_CRYPTO_CRC32C_INTEL=y
+CONFIG_CRYPTO_CRC32=y
+CONFIG_CRYPTO_CRYPTD=y
+CONFIG_CRYPTO_CTR=y
+CONFIG_CRYPTO_CURVE25519_X86=y
+CONFIG_CRYPTO_DEFLATE=y
+CONFIG_CRYPTO_DES=y
+CONFIG_CRYPTO_DEV_VIRTIO=y
+CONFIG_CRYPTO_DH_RFC7919_GROUPS=y
+CONFIG_CRYPTO_DH=y
+CONFIG_CRYPTO_DRBG_HMAC=y
+CONFIG_CRYPTO_DRBG_MENU=y
+CONFIG_CRYPTO_DRBG=y
+CONFIG_CRYPTO_ECB=y
+CONFIG_CRYPTO_ECHAINIV=y
+CONFIG_CRYPTO_ENGINE=y
+CONFIG_CRYPTO_ESSIV=y
+CONFIG_CRYPTO_GCM=y
+CONFIG_CRYPTO_GENIV=y
+CONFIG_CRYPTO_GHASH=y
+CONFIG_CRYPTO_HASH2=y
+CONFIG_CRYPTO_HASH_INFO=y
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_HMAC=y
+CONFIG_CRYPTO_HW=y
+CONFIG_CRYPTO_JITTERENTROPY=y
+CONFIG_CRYPTO_KPP2=y
+CONFIG_CRYPTO_KPP=y
+CONFIG_CRYPTO_LIB_AES=y
+CONFIG_CRYPTO_LIB_ARC4=y
+CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y
+CONFIG_CRYPTO_LIB_CHACHA20POLY1305=y
+CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y
+CONFIG_CRYPTO_LIB_CHACHA=y
+CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=y
+CONFIG_CRYPTO_LIB_CURVE25519=y
+CONFIG_CRYPTO_LIB_DES=y
+CONFIG_CRYPTO_LIB_GF128MUL=y
+CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y
+CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11
+CONFIG_CRYPTO_LIB_POLY1305=y
+CONFIG_CRYPTO_LIB_SHA1=y
+CONFIG_CRYPTO_LIB_SHA256=y
+CONFIG_CRYPTO_LIB_UTILS=y
+CONFIG_CRYPTO_LZO=y
+CONFIG_CRYPTO_MANAGER2=y
+CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_MD4=y
+CONFIG_CRYPTO_MD5=y
+CONFIG_CRYPTO_NHPOLY1305_AVX2=y
+CONFIG_CRYPTO_NHPOLY1305_SSE2=y
+CONFIG_CRYPTO_NHPOLY1305=y
+CONFIG_CRYPTO_NULL2=y
+CONFIG_CRYPTO_NULL=y
+CONFIG_CRYPTO_POLY1305_X86_64=y
+CONFIG_CRYPTO_RNG2=y
+CONFIG_CRYPTO_RNG_DEFAULT=y
+CONFIG_CRYPTO_RNG=y
+CONFIG_CRYPTO_RSA=y
+CONFIG_CRYPTO_SEQIV=y
+CONFIG_CRYPTO_SHA1=y
+CONFIG_CRYPTO_SHA256=y
+CONFIG_CRYPTO_SHA3=y
+CONFIG_CRYPTO_SHA512=y
+CONFIG_CRYPTO_SIG2=y
+CONFIG_CRYPTO_SIG=y
+CONFIG_CRYPTO_SIMD=y
+CONFIG_CRYPTO_SKCIPHER2=y
+CONFIG_CRYPTO_SKCIPHER=y
+CONFIG_CRYPTO_USER_API_AEAD=y
+CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y
+CONFIG_CRYPTO_USER_API_HASH=y
+CONFIG_CRYPTO_USER_API_SKCIPHER=y
+CONFIG_CRYPTO_USER_API=y
+CONFIG_CRYPTO_XTS=y
+CONFIG_CRYPTO_XXHASH=m
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ZSTD=m
+CONFIG_DAX=y
+CONFIG_DCACHE_WORD_ACCESS=y
+CONFIG_DCA=y
+CONFIG_DCB=y
+CONFIG_DEBUG_BOOT_PARAMS=y
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_ENTRY=y
+CONFIG_DEBUG_FS_ALLOW_ALL=y
+CONFIG_DEBUG_FS=y
+CONFIG_DEBUG_INFO_BTF_MODULES=y
+CONFIG_DEBUG_INFO_BTF=y
+CONFIG_DEBUG_INFO_COMPRESSED_NONE=y
+CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y
+CONFIG_DEBUG_INFO=y
+CONFIG_DEBUG_KERNEL=y
+CONFIG_DEBUG_LIST=y
+CONFIG_DEBUG_MISC=y
+CONFIG_DEBUG_WX=y
+CONFIG_DECOMPRESS_BZIP2=y
+CONFIG_DECOMPRESS_GZIP=y
+CONFIG_DECOMPRESS_LZ4=y
+CONFIG_DECOMPRESS_LZMA=y
+CONFIG_DECOMPRESS_LZO=y
+CONFIG_DECOMPRESS_XZ=y
+CONFIG_DECOMPRESS_ZSTD=y
+CONFIG_DEFAULT_CUBIC=y
+CONFIG_DEFAULT_FQ_CODEL=y
+CONFIG_DEFAULT_HOSTNAME="(none)"
+CONFIG_DEFAULT_INIT=""
+CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
+CONFIG_DEFAULT_NET_SCH="fq_codel"
+CONFIG_DEFAULT_PFIFO_FAST=y
+CONFIG_DEFAULT_SECURITY_DAC=y
+CONFIG_DEFAULT_SECURITY_APPARMOR=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+CONFIG_DEVPORT=y
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_DIMLIB=y
+CONFIG_DMA_ACPI=y
+CONFIG_DMADEVICES=y
+CONFIG_DMA_ENGINE_RAID=y
+CONFIG_DMA_ENGINE=y
+CONFIG_DMA_OPS=y
+CONFIG_DMAR_TABLE=y
+CONFIG_DMA_SHARED_BUFFER=y
+CONFIG_DM_AUDIT=y
+CONFIG_DMA_VIRTUAL_CHANNELS=y
+CONFIG_DM_BIO_PRISON=m
+CONFIG_DM_BUFIO=y
+CONFIG_DM_CACHE=m
+CONFIG_DM_CACHE_SMQ=m
+CONFIG_DM_CLONE=m
+CONFIG_DM_CRYPT=y
+CONFIG_DM_DELAY=m
+CONFIG_DM_DUST=m
+CONFIG_DM_EBS=m
+CONFIG_DM_ERA=m
+CONFIG_DM_FLAKEY=m
+CONFIG_DMIID=y
+CONFIG_DM_INTEGRITY=m
+CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y
+CONFIG_DMI=y
+CONFIG_DM_LOG_USERSPACE=m
+CONFIG_DM_LOG_WRITES=m
+CONFIG_DM_MIRROR=y
+CONFIG_DM_MULTIPATH_HST=m
+CONFIG_DM_MULTIPATH_IOA=m
+CONFIG_DM_MULTIPATH=m
+CONFIG_DM_MULTIPATH_QL=m
+CONFIG_DM_MULTIPATH_ST=m
+CONFIG_DM_PERSISTENT_DATA=m
+CONFIG_DM_RAID=m
+CONFIG_DM_SNAPSHOT=y
+CONFIG_DM_SWITCH=m
+CONFIG_DM_THIN_PROVISIONING=m
+CONFIG_DM_UNSTRIPED=m
+CONFIG_DM_VDO=m
+CONFIG_DM_VERITY=m
+CONFIG_DM_WRITECACHE=m
+CONFIG_DM_ZERO=y
+CONFIG_DM_ZONED=m
+CONFIG_DNOTIFY=y
+CONFIG_DNS_RESOLVER=y
+CONFIG_DQL=y
+CONFIG_DST_CACHE=y
+CONFIG_DUMMY_CONSOLE_COLUMNS=80
+CONFIG_DUMMY_CONSOLE_ROWS=25
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_DUMMY=y
+CONFIG_DW_DMAC_CORE=y
+CONFIG_DYNAMIC_EVENTS=y
+CONFIG_DYNAMIC_FTRACE_WITH_ARGS=y
+CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y
+CONFIG_DYNAMIC_FTRACE_WITH_REGS=y
+CONFIG_DYNAMIC_FTRACE=y
+CONFIG_DYNAMIC_MEMORY_LAYOUT=y
+CONFIG_DYNAMIC_SIGFRAME=y
+CONFIG_E1000E_HWTS=y
+CONFIG_E1000E=m
+CONFIG_E1000=m
+CONFIG_EARLY_PRINTK_DBGP=y
+CONFIG_EARLY_PRINTK_USB=y
+CONFIG_EARLY_PRINTK=y
+CONFIG_ECRYPT_FS=m
+CONFIG_EDAC_ATOMIC_SCRUB=y
+CONFIG_EDAC_DECODE_MCE=y
+CONFIG_EDAC_LEGACY_SYSFS=y
+CONFIG_EDAC_SUPPORT=y
+CONFIG_EDAC=y
+CONFIG_EFI_BOOTLOADER_CONTROL=m
+CONFIG_EFI_CAPSULE_LOADER=m
+CONFIG_EFI_COCO_SECRET=y
+CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y
+CONFIG_EFI_DEV_PATH_PARSER=y
+CONFIG_EFI_DXE_MEM_ATTRIBUTES=y
+CONFIG_EFI_EARLYCON=y
+CONFIG_EFI_ESRT=y
+CONFIG_EFI_HANDOVER_PROTOCOL=y
+CONFIG_EFI_MIXED=y
+CONFIG_EFI_PARTITION=y
+CONFIG_EFI_RUNTIME_MAP=y
+CONFIG_EFI_RUNTIME_WRAPPERS=y
+CONFIG_EFI_SECRET=m
+CONFIG_EFI_SOFT_RESERVE=y
+CONFIG_EFI_STUB=y
+CONFIG_EFIVAR_FS=y
+CONFIG_EFI_VARS_PSTORE=m
+CONFIG_EFI=y
+CONFIG_ELF_CORE=y
+CONFIG_ELFCORE=y
+CONFIG_ENA_ETHERNET=y
+CONFIG_ENCLOSURE_SERVICES=y
+CONFIG_ENCRYPTED_KEYS=m
+CONFIG_ENIC=m
+CONFIG_EPOLL=y
+CONFIG_EROFS_FS_POSIX_ACL=y
+CONFIG_EROFS_FS_SECURITY=y
+CONFIG_EROFS_FS_XATTR=y
+CONFIG_EROFS_FS=y
+CONFIG_EROFS_FS_ZIP=y
+CONFIG_EROFS_FS_ZIP_ZSTD=y
+CONFIG_ETHERNET=y
+CONFIG_ETHTOOL_NETLINK=y
+CONFIG_EVENTFD=y
+CONFIG_EVENT_TRACING=y
+CONFIG_EXCLUSIVE_SYSTEM_RAM=y
+CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8"
+CONFIG_EXFAT_FS=m
+CONFIG_EXPERT=y
+CONFIG_EXPORTFS=y
+CONFIG_EXT4_FS_POSIX_ACL=y
+CONFIG_EXT4_FS_SECURITY=y
+CONFIG_EXT4_FS=y
+CONFIG_EXT4_USE_FOR_EXT2=y
+CONFIG_EXTRA_FIRMWARE=""
+CONFIG_FAILOVER=y
+CONFIG_FAIR_GROUP_SCHED=y
+CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y
+CONFIG_FANOTIFY=y
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+CONFIG_FAT_FS=y
+CONFIG_FHANDLE=y
+CONFIG_FIB_RULES=y
+CONFIG_FILE_LOCKING=y
+CONFIG_FIRMWARE_MEMMAP=y
+CONFIG_FIX_EARLYCON_MEM=y
+CONFIG_FIXED_PHY=y
+CONFIG_FONT_8x16=y
+CONFIG_FONT_SUPPORT=y
+CONFIG_FONTS=y
+CONFIG_FONT_TER16x32=y
+CONFIG_FORCEDETH=y
+CONFIG_FORTIFY_SOURCE=y
+CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAME_WARN=2048
+CONFIG_FREEZER=y
+CONFIG_FS_ENCRYPTION_ALGS=m
+CONFIG_FS_ENCRYPTION=y
+CONFIG_FS_IOMAP=y
+CONFIG_FS_MBCACHE=y
+CONFIG_FSNOTIFY=y
+CONFIG_FS_POSIX_ACL=y
+CONFIG_FTRACE_MCOUNT_RECORD=y
+CONFIG_FTRACE_MCOUNT_USE_CC=y
+CONFIG_FTRACE_SYSCALLS=y
+CONFIG_FTRACE=y
+CONFIG_FUNCTION_ALIGNMENT=16
+CONFIG_FUNCTION_ALIGNMENT_16B=y
+CONFIG_FUNCTION_ALIGNMENT_4B=y
+CONFIG_FUNCTION_ERROR_INJECTION=y
+CONFIG_FUNCTION_GRAPH_TRACER=y
+CONFIG_FUNCTION_PADDING_BYTES=16
+CONFIG_FUNCTION_PADDING_CFI=11
+CONFIG_FUNCTION_TRACER=y
+CONFIG_FUSE_FS=y
+CONFIG_FUTEX_PI=y
+CONFIG_FUTEX=y
+CONFIG_FW_ATTR_CLASS=m
+CONFIG_FW_CACHE=y
+CONFIG_FW_CFG_SYSFS=m
+CONFIG_FW_CS_DSP=m
+CONFIG_FW_LOADER_COMPRESS=y
+CONFIG_FW_LOADER_COMPRESS_ZSTD=y
+CONFIG_FW_LOADER_DEBUG=y
+CONFIG_FW_LOADER_PAGED_BUF=y
+CONFIG_FW_LOADER_SYSFS=y
+CONFIG_FW_LOADER_USER_HELPER=y
+CONFIG_FW_LOADER=y
+CONFIG_FW_UPLOAD=y
+CONFIG_FWNODE_MDIO=y
+CONFIG_GCC10_NO_ARRAY_BOUNDS=y
+CONFIG_GCC_ASM_GOTO_OUTPUT_WORKAROUND=y
+CONFIG_GCC_PLUGIN_LATENT_ENTROPY=y
+CONFIG_GCC_PLUGIN_STACKLEAK=y
+CONFIG_GCC_PLUGINS=y
+CONFIG_GCC_VERSION=130200
+CONFIG_GENERIC_ALLOCATOR=y
+CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
+CONFIG_GENERIC_BUG=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
+CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_GENERIC_CMOS_UPDATE=y
+CONFIG_GENERIC_CPU_AUTOPROBE=y
+CONFIG_GENERIC_CPU_VULNERABILITIES=y
+CONFIG_GENERIC_CPU=y
+CONFIG_GENERIC_EARLY_IOREMAP=y
+CONFIG_GENERIC_ENTRY=y
+CONFIG_GENERIC_GETTIMEOFDAY=y
+CONFIG_GENERIC_IOMAP=y
+CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y
+CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y
+CONFIG_GENERIC_IRQ_MIGRATION=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_GENERIC_IRQ_RESERVATION_MODE=y
+CONFIG_GENERIC_IRQ_SHOW=y
+CONFIG_GENERIC_ISA_DMA=y
+CONFIG_GENERIC_MSI_IRQ=y
+CONFIG_GENERIC_NET_UTILS=y
+CONFIG_GENERIC_PCI_IOMAP=y
+CONFIG_GENERIC_PENDING_IRQ=y
+CONFIG_GENERIC_PTDUMP=y
+CONFIG_GENERIC_SMP_IDLE_THREAD=y
+CONFIG_GENERIC_STRNCPY_FROM_USER=y
+CONFIG_GENERIC_STRNLEN_USER=y
+CONFIG_GENERIC_TIME_VSYSCALL=y
+CONFIG_GENERIC_TRACER=y
+CONFIG_GENERIC_VDSO_TIME_NS=y
+CONFIG_GENEVE=y
+CONFIG_GLOB=y
+CONFIG_GRACE_PERIOD=y
+CONFIG_GRO_CELLS=y
+CONFIG_GUEST_PERF_EVENTS=y
+CONFIG_GVE=m
+CONFIG_HALTPOLL_CPUIDLE=y
+CONFIG_HARDENED_USERCOPY=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y
+CONFIG_HAS_DMA=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT_MAP=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAVE_ACPI_APEI_NMI=y
+CONFIG_HAVE_ACPI_APEI=y
+CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y
+CONFIG_HAVE_ARCH_AUDITSYSCALL=y
+CONFIG_HAVE_ARCH_COMPAT_MMAP_BASES=y
+CONFIG_HAVE_ARCH_HUGE_VMALLOC=y
+CONFIG_HAVE_ARCH_HUGE_VMAP=y
+CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y
+CONFIG_HAVE_ARCH_JUMP_LABEL=y
+CONFIG_HAVE_ARCH_KASAN_VMALLOC=y
+CONFIG_HAVE_ARCH_KASAN=y
+CONFIG_HAVE_ARCH_KCSAN=y
+CONFIG_HAVE_ARCH_KFENCE=y
+CONFIG_HAVE_ARCH_KGDB=y
+CONFIG_HAVE_ARCH_KMSAN=y
+CONFIG_HAVE_ARCH_MMAP_RND_BITS=y
+CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y
+CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y
+CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y
+CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
+CONFIG_HAVE_ARCH_SECCOMP=y
+CONFIG_HAVE_ARCH_SOFT_DIRTY=y
+CONFIG_HAVE_ARCH_STACKLEAK=y
+CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y
+CONFIG_HAVE_ARCH_TRACEHOOK=y
+CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y
+CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y
+CONFIG_HAVE_ARCH_VMAP_STACK=y
+CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y
+CONFIG_HAVE_ASM_MODVERSIONS=y
+CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y
+CONFIG_HAVE_CALL_THUNKS=y
+CONFIG_HAVE_CLK_PREPARE=y
+CONFIG_HAVE_CLK=y
+CONFIG_HAVE_CMPXCHG_DOUBLE=y
+CONFIG_HAVE_CMPXCHG_LOCAL=y
+CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK=y
+CONFIG_HAVE_CONTEXT_TRACKING_USER=y
+CONFIG_HAVE_C_RECORDMCOUNT=y
+CONFIG_HAVE_DEBUG_KMEMLEAK=y
+CONFIG_HAVE_DMA_CONTIGUOUS=y
+CONFIG_HAVE_DYNAMIC_FTRACE_NO_PATCHABLE=y
+CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y
+CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y
+CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y
+CONFIG_HAVE_DYNAMIC_FTRACE=y
+CONFIG_HAVE_EBPF_JIT=y
+CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
+CONFIG_HAVE_EISA=y
+CONFIG_HAVE_EXIT_THREAD=y
+CONFIG_HAVE_FAST_GUP=y
+CONFIG_HAVE_FENTRY=y
+CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
+CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y
+CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y
+CONFIG_HAVE_FUNCTION_GRAPH_RETVAL=y
+CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
+CONFIG_HAVE_FUNCTION_TRACER=y
+CONFIG_HAVE_GCC_PLUGINS=y
+CONFIG_HAVE_GENERIC_VDSO=y
+CONFIG_HAVE_HARDLOCKUP_DETECTOR_BUDDY=y
+CONFIG_HAVE_HARDLOCKUP_DETECTOR_PERF=y
+CONFIG_HAVE_HW_BREAKPOINT=y
+CONFIG_HAVE_IMA_KEXEC=y
+CONFIG_HAVE_INTEL_TXT=y
+CONFIG_HAVE_IOREMAP_PROT=y
+CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y
+CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
+CONFIG_HAVE_JUMP_LABEL_HACK=y
+CONFIG_HAVE_KCSAN_COMPILER=y
+CONFIG_HAVE_KERNEL_BZIP2=y
+CONFIG_HAVE_KERNEL_GZIP=y
+CONFIG_HAVE_KERNEL_LZ4=y
+CONFIG_HAVE_KERNEL_LZMA=y
+CONFIG_HAVE_KERNEL_LZO=y
+CONFIG_HAVE_KERNEL_XZ=y
+CONFIG_HAVE_KERNEL_ZSTD=y
+CONFIG_HAVE_KPROBES_ON_FTRACE=y
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y
+CONFIG_HAVE_KVM_DIRTY_RING_ACQ_REL=y
+CONFIG_HAVE_KVM_DIRTY_RING_TSO=y
+CONFIG_HAVE_KVM_DIRTY_RING=y
+CONFIG_HAVE_KVM_EVENTFD=y
+CONFIG_HAVE_KVM_IRQ_BYPASS=y
+CONFIG_HAVE_KVM_IRQCHIP=y
+CONFIG_HAVE_KVM_IRQFD=y
+CONFIG_HAVE_KVM_IRQ_ROUTING=y
+CONFIG_HAVE_KVM_MSI=y
+CONFIG_HAVE_KVM_NO_POLL=y
+CONFIG_HAVE_KVM_PFNCACHE=y
+CONFIG_HAVE_KVM_PM_NOTIFIER=y
+CONFIG_HAVE_KVM=y
+CONFIG_HAVE_LIVEPATCH=y
+CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y
+CONFIG_HAVE_MMIOTRACE_SUPPORT=y
+CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
+CONFIG_HAVE_MOVE_PMD=y
+CONFIG_HAVE_MOVE_PUD=y
+CONFIG_HAVE_NMI=y
+CONFIG_HAVE_NOINSTR_HACK=y
+CONFIG_HAVE_NOINSTR_VALIDATION=y
+CONFIG_HAVE_OBJTOOL_MCOUNT=y
+CONFIG_HAVE_OBJTOOL_NOP_MCOUNT=y
+CONFIG_HAVE_OBJTOOL=y
+CONFIG_HAVE_OPTPROBES=y
+CONFIG_HAVE_PCI=y
+CONFIG_HAVE_PCSPKR_PLATFORM=y
+CONFIG_HAVE_PERF_EVENTS_NMI=y
+CONFIG_HAVE_PERF_EVENTS=y
+CONFIG_HAVE_PERF_REGS=y
+CONFIG_HAVE_PERF_USER_STACK_DUMP=y
+CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y
+CONFIG_HAVE_PREEMPT_DYNAMIC_CALL=y
+CONFIG_HAVE_PREEMPT_DYNAMIC=y
+CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
+CONFIG_HAVE_RELIABLE_STACKTRACE=y
+CONFIG_HAVE_RETHOOK=y
+CONFIG_HAVE_RSEQ=y
+CONFIG_HAVE_RUST=y
+CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y
+CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y
+CONFIG_HAVE_SETUP_PER_CPU_AREA=y
+CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y
+CONFIG_HAVE_STACKPROTECTOR=y
+CONFIG_HAVE_STACK_VALIDATION=y
+CONFIG_HAVE_STATIC_CALL_INLINE=y
+CONFIG_HAVE_STATIC_CALL=y
+CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
+CONFIG_HAVE_UACCESS_VALIDATION=y
+CONFIG_HAVE_UID16=y
+CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y
+CONFIG_HAVE_USER_RETURN_NOTIFIER=y
+CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
+CONFIG_HDMI=y
+CONFIG_HIBERNATE_CALLBACKS=y
+CONFIG_HID_A4TECH=m
+CONFIG_HID_APPLE=m
+CONFIG_HID_BELKIN=m
+CONFIG_HID_CHERRY=m
+CONFIG_HID_CHICONY=m
+CONFIG_HID_CORSAIR=m
+CONFIG_HID_CYPRESS=m
+CONFIG_HID_EZKEY=m
+CONFIG_HID_GENERIC=y
+CONFIG_HID_GYRATION=m
+CONFIG_HID_ITE=m
+CONFIG_HID_KENSINGTON=m
+CONFIG_HID_LENOVO=m
+CONFIG_HID_LOGITECH_DJ=m
+CONFIG_HID_LOGITECH_HIDPP=m
+CONFIG_HID_LOGITECH=m
+CONFIG_HID_MICROSOFT=m
+CONFIG_HID_MONTEREY=m
+CONFIG_HID_PANTHERLORD=m
+CONFIG_HID_PETALYNX=m
+CONFIG_HIDRAW=y
+CONFIG_HID_REDRAGON=y
+CONFIG_HID_ROCCAT=y
+CONFIG_HID_SAMSUNG=m
+CONFIG_HID_SUNPLUS=m
+CONFIG_HID_SUPPORT=y
+CONFIG_HID_TOPSEED=m
+CONFIG_HID=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_HMM_MIRROR=y
+CONFIG_HOTPLUG_CORE_SYNC_DEAD=y
+CONFIG_HOTPLUG_CORE_SYNC_FULL=y
+CONFIG_HOTPLUG_CORE_SYNC=y
+CONFIG_HOTPLUG_CPU=y
+CONFIG_HOTPLUG_PARALLEL=y
+CONFIG_HOTPLUG_PCI_ACPI=y
+CONFIG_HOTPLUG_PCI_PCIE=y
+CONFIG_HOTPLUG_PCI=y
+CONFIG_HOTPLUG_SMT=y
+CONFIG_HOTPLUG_SPLIT_STARTUP=y
+CONFIG_HPET_EMULATE_RTC=y
+CONFIG_HPET_TIMER=y
+CONFIG_HPET=y
+CONFIG_HP_ILO=m
+CONFIG_HSA_AMD=y
+CONFIG_HSR=y
+CONFIG_HSU_DMA=y
+CONFIG_HUGETLBFS=y
+CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y
+CONFIG_HUGETLB_PAGE=y
+CONFIG_HVC_DRIVER=y
+CONFIG_HVC_IRQ=y
+CONFIG_HVC_XEN_FRONTEND=y
+CONFIG_HVC_XEN=y
+CONFIG_HW_CONSOLE=y
+CONFIG_HWMON=y
+CONFIG_HW_RANDOM_TPM=y
+CONFIG_HW_RANDOM_VIA=y
+CONFIG_HW_RANDOM_VIRTIO=y
+CONFIG_HW_RANDOM=y
+CONFIG_HYPERV_BALLOON=y
+CONFIG_HYPERV_IOMMU=y
+CONFIG_HYPERVISOR_GUEST=y
+CONFIG_HYPERV_KEYBOARD=y
+CONFIG_HYPERV_NET=y
+CONFIG_HYPERV_STORAGE=y
+CONFIG_HYPERV_TIMER=y
+CONFIG_HYPERV_UTILS=y
+CONFIG_HYPERV_VSOCKETS=y
+CONFIG_HYPERV=y
+CONFIG_HZ=250
+CONFIG_HZ_250=y
+CONFIG_I2C_ALGOBIT=m
+CONFIG_I2C_BOARDINFO=y
+CONFIG_I2C_COMPAT=y
+CONFIG_I2C_HELPER_AUTO=y
+CONFIG_I2C_HID=y
+CONFIG_I2C_I801=m
+CONFIG_I2C_SMBUS=m
+CONFIG_I2C=y
+CONFIG_I40E=m
+CONFIG_I40EVF=m
+CONFIG_I6300ESB_WDT=m
+CONFIG_I8253_LOCK=y
+CONFIG_IA32_EMULATION=y
+CONFIG_IA32_FEAT_CTL=y
+CONFIG_IAVF=m
+CONFIG_ICE_HWTS=y
+CONFIG_ICE=m
+CONFIG_ICE_SWITCHDEV=y
+CONFIG_IGB_DCA=y
+CONFIG_IGB_HWMON=y
+CONFIG_IGB=m
+CONFIG_IGBVF=m
+CONFIG_IGC=m
+CONFIG_IKCONFIG_PROC=y
+CONFIG_IKCONFIG=y
+CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
+CONFIG_IMA_APPRAISE_BOOTPARAM=y
+CONFIG_IMA_APPRAISE=y
+CONFIG_IMA_ARCH_POLICY=y
+CONFIG_IMA_DEFAULT_HASH="sha512"
+CONFIG_IMA_DEFAULT_HASH_SHA512=y
+CONFIG_IMA_DEFAULT_TEMPLATE="ima-ng"
+CONFIG_IMA_LSM_RULES=y
+CONFIG_IMA_MEASURE_ASYMMETRIC_KEYS=y
+CONFIG_IMA_MEASURE_PCR_IDX=10
+CONFIG_IMA_NG_TEMPLATE=y
+CONFIG_IMA_QUEUE_EARLY_BOOT_KEYS=y
+CONFIG_IMA_READ_POLICY=y
+CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT=y
+CONFIG_IMA_WRITE_POLICY=y
+CONFIG_IMA=y
+CONFIG_INET6_AH=y
+CONFIG_INET6_ESP_OFFLOAD=y
+CONFIG_INET6_ESP=y
+CONFIG_INET6_IPCOMP=y
+CONFIG_INET6_TUNNEL=y
+CONFIG_INET6_XFRM_TUNNEL=y
+CONFIG_INET_AH=y
+CONFIG_INET_ESP=y
+CONFIG_INET_IPCOMP=y
+CONFIG_INET_TABLE_PERTURB_ORDER=16
+CONFIG_INET_TUNNEL=y
+CONFIG_INET_XFRM_TUNNEL=y
+CONFIG_INET=y
+CONFIG_INFINIBAND_ADDR_TRANS_CONFIGFS=y
+CONFIG_INFINIBAND_ADDR_TRANS=y
+CONFIG_INFINIBAND_IPOIB_DEBUG=y
+CONFIG_INFINIBAND_IPOIB=y
+CONFIG_INFINIBAND_VIRT_DMA=y
+CONFIG_INFINIBAND=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y
+CONFIG_INITRAMFS_PRESERVE_MTIME=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_INIT_STACK_ALL_ZERO=y
+CONFIG_INLINE_READ_UNLOCK_IRQ=y
+CONFIG_INLINE_READ_UNLOCK=y
+CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
+CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
+CONFIG_INLINE_WRITE_UNLOCK=y
+CONFIG_INOTIFY_USER=y
+CONFIG_INPUT_EVDEV=y
+CONFIG_INPUT_FF_MEMLESS=y
+CONFIG_INPUT_JOYSTICK=y
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_INPUT_LEDS=y
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSE=y
+CONFIG_INPUT_SPARSEKMAP=y
+CONFIG_INPUT_TABLET=y
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_INPUT_VIVALDIFMAP=y
+CONFIG_INPUT_XEN_KBDDEV_FRONTEND=y
+CONFIG_INPUT=y
+CONFIG_INSTRUCTION_DECODER=y
+CONFIG_INTEGRITY_ASYMMETRIC_KEYS=y
+CONFIG_INTEGRITY_AUDIT=y
+CONFIG_INTEGRITY_PLATFORM_KEYRING=y
+CONFIG_INTEGRITY_SIGNATURE=y
+CONFIG_INTEGRITY_TRUSTED_KEYRING=y
+CONFIG_INTEGRITY=y
+CONFIG_INTEL_GTT=y
+CONFIG_INTEL_IDLE=y
+CONFIG_INTEL_IOATDMA=y
+CONFIG_INTEL_IOMMU_DEFAULT_ON=y
+CONFIG_INTEL_IOMMU_FLOPPY_WA=y
+CONFIG_INTEL_IOMMU_PERF_EVENTS=y
+CONFIG_INTEL_IOMMU_SVM=y
+CONFIG_INTEL_IOMMU=y
+CONFIG_INTEL_PMC_CORE=m
+CONFIG_INTEL_TCC=y
+CONFIG_INTERVAL_TREE=y
+CONFIG_IO_DELAY_0X80=y
+CONFIG_IOMMU_API=y
+CONFIG_IOMMU_DEFAULT_DMA_STRICT=y
+CONFIG_IOMMU_DMA=y
+CONFIG_IOMMU_IO_PGTABLE=y
+CONFIG_IOMMU_IOVA=y
+CONFIG_IOMMU_SUPPORT=y
+CONFIG_IOMMU_SVA=y
+CONFIG_IOSCHED_BFQ=y
+CONFIG_IOSF_MBI=y
+CONFIG_IO_URING=y
+CONFIG_IO_WQ=y
+CONFIG_IP6_NF_FILTER=y
+CONFIG_IP6_NF_IPTABLES=y
+CONFIG_IP6_NF_MANGLE=y
+CONFIG_IP6_NF_MATCH_AH=y
+CONFIG_IP6_NF_MATCH_EUI64=y
+CONFIG_IP6_NF_MATCH_FRAG=y
+CONFIG_IP6_NF_MATCH_HL=y
+CONFIG_IP6_NF_MATCH_IPV6HEADER=y
+CONFIG_IP6_NF_MATCH_MH=y
+CONFIG_IP6_NF_MATCH_OPTS=y
+CONFIG_IP6_NF_MATCH_RPFILTER=y
+CONFIG_IP6_NF_MATCH_RT=y
+CONFIG_IP6_NF_NAT=y
+CONFIG_IP6_NF_RAW=y
+CONFIG_IP6_NF_SECURITY=y
+CONFIG_IP6_NF_TARGET_HL=y
+CONFIG_IP6_NF_TARGET_REJECT=y
+CONFIG_IP6_NF_TARGET_SYNPROXY=y
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_IPC_NS=y
+CONFIG_IP_DCCP_CCID3=y
+CONFIG_IP_DCCP_TFRC_LIB=y
+CONFIG_IP_DCCP=y
+CONFIG_IPMI_DEVICE_INTERFACE=y
+CONFIG_IPMI_DMI_DECODE=y
+CONFIG_IPMI_HANDLER=y
+CONFIG_IPMI_PLAT_DATA=y
+CONFIG_IPMI_POWEROFF=y
+CONFIG_IPMI_SI=y
+CONFIG_IPMI_WATCHDOG=m
+CONFIG_IP_MROUTE_COMMON=y
+CONFIG_IP_MROUTE=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_MULTIPLE_TABLES=y
+CONFIG_IP_NF_FILTER=y
+CONFIG_IP_NF_IPTABLES=y
+CONFIG_IP_NF_MANGLE=y
+CONFIG_IP_NF_MATCH_RPFILTER=y
+CONFIG_IP_NF_NAT=y
+CONFIG_IP_NF_RAW=y
+CONFIG_IP_NF_TARGET_MASQUERADE=y
+CONFIG_IP_NF_TARGET_NETMAP=y
+CONFIG_IP_NF_TARGET_REDIRECT=y
+CONFIG_IP_NF_TARGET_REJECT=y
+CONFIG_IP_PIMSM_V1=y
+CONFIG_IP_PIMSM_V2=y
+CONFIG_IP_PNP_BOOTP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_RARP=y
+CONFIG_IP_PNP=y
+CONFIG_IP_ROUTE_CLASSID=y
+CONFIG_IP_ROUTE_MULTIPATH=y
+CONFIG_IP_ROUTE_VERBOSE=y
+CONFIG_IP_SCTP=y
+CONFIG_IP_SET_BITMAP_IPMAC=y
+CONFIG_IP_SET_BITMAP_IP=y
+CONFIG_IP_SET_BITMAP_PORT=y
+CONFIG_IP_SET_HASH_IPMAC=y
+CONFIG_IP_SET_HASH_IPMARK=y
+CONFIG_IP_SET_HASH_IPPORTIP=y
+CONFIG_IP_SET_HASH_IPPORTNET=y
+CONFIG_IP_SET_HASH_IPPORT=y
+CONFIG_IP_SET_HASH_IP=y
+CONFIG_IP_SET_HASH_MAC=y
+CONFIG_IP_SET_HASH_NETIFACE=y
+CONFIG_IP_SET_HASH_NETNET=y
+CONFIG_IP_SET_HASH_NETPORTNET=y
+CONFIG_IP_SET_HASH_NETPORT=y
+CONFIG_IP_SET_HASH_NET=y
+CONFIG_IP_SET_LIST_SET=y
+CONFIG_IP_SET_MAX=256
+CONFIG_IP_SET=y
+CONFIG_IPV6_FOU_TUNNEL=y
+CONFIG_IPV6_FOU=y
+CONFIG_IPV6_ILA=y
+CONFIG_IPV6_MIP6=y
+CONFIG_IPV6_MULTIPLE_TABLES=y
+CONFIG_IPV6_NDISC_NODETYPE=y
+CONFIG_IPV6_ROUTE_INFO=y
+CONFIG_IPV6_ROUTER_PREF=y
+CONFIG_IPV6_SIT=y
+CONFIG_IPV6_TUNNEL=y
+CONFIG_IPV6=y
+CONFIG_IPVLAN_L3S=y
+CONFIG_IPVLAN=y
+CONFIG_IP_VS_IPV6=y
+CONFIG_IP_VS_LC=y
+CONFIG_IP_VS_MH_TAB_INDEX=12
+CONFIG_IP_VS_NFCT=y
+CONFIG_IP_VS_PROTO_TCP=y
+CONFIG_IP_VS_PROTO_UDP=y
+CONFIG_IP_VS_RR=y
+CONFIG_IP_VS_SH_TAB_BITS=8
+CONFIG_IP_VS_SH=y
+CONFIG_IP_VS_TAB_BITS=12
+CONFIG_IP_VS_WRR=y
+CONFIG_IP_VS=y
+CONFIG_IRQ_BYPASS_MANAGER=y
+CONFIG_IRQ_DOMAIN_HIERARCHY=y
+CONFIG_IRQ_DOMAIN=y
+CONFIG_IRQ_FORCED_THREADING=y
+CONFIG_IRQ_MSI_IOMMU=y
+CONFIG_IRQ_POLL=y
+CONFIG_IRQ_REMAP=y
+CONFIG_IRQ_WORK=y
+CONFIG_ISA_DMA_API=y
+CONFIG_ISCSI_TCP=y
+CONFIG_ISO9660_FS=y
+CONFIG_ITCO_VENDOR_SUPPORT=y
+CONFIG_ITCO_WDT=m
+CONFIG_IXGBE_DCA=y
+CONFIG_IXGBE_HWMON=y
+CONFIG_IXGBE_IPSEC=y
+CONFIG_IXGBE=m
+CONFIG_IXGBEVF_IPSEC=y
+CONFIG_IXGBEVF=m
+CONFIG_JBD2=y
+CONFIG_JOLIET=y
+CONFIG_JUMP_LABEL=y
+CONFIG_KALLSYMS_ABSOLUTE_PERCPU=y
+CONFIG_KALLSYMS_BASE_RELATIVE=y
+CONFIG_KALLSYMS=y
+CONFIG_KARMA_PARTITION=y
+CONFIG_KCMP=y
+CONFIG_KERNEL_ZSTD=y
+CONFIG_KERNFS=y
+CONFIG_KEXEC_BZIMAGE_VERIFY_SIG=y
+CONFIG_KEXEC_CORE=y
+CONFIG_KEXEC_FILE=y
+CONFIG_KEXEC_SIG=y
+CONFIG_KEYBOARD_ATKBD=y
+CONFIG_KEYS=y
+CONFIG_KFENCE_NUM_OBJECTS=255
+CONFIG_KFENCE_SAMPLE_INTERVAL=100
+CONFIG_KFENCE_STRESS_TEST_FAULTS=0
+CONFIG_KFENCE=y
+CONFIG_KPROBE_EVENTS=y
+CONFIG_KPROBES_ON_FTRACE=y
+CONFIG_KPROBES=y
+CONFIG_KRETPROBE_ON_RETHOOK=y
+CONFIG_KRETPROBES=y
+CONFIG_KVM_AMD=y
+CONFIG_KVM_AMD_SEV=y
+CONFIG_KVM_ASYNC_PF=y
+CONFIG_KVM_COMPAT=y
+CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y
+CONFIG_KVM_GENERIC_HARDWARE_ENABLING=y
+CONFIG_KVM_GUEST=y
+CONFIG_KVM_INTEL=y
+CONFIG_KVM_MMIO=y
+CONFIG_KVM_SMM=y
+CONFIG_KVM_VFIO=y
+CONFIG_KVM_WERROR=y
+CONFIG_KVM_XFER_TO_GUEST_WORK=y
+CONFIG_KVM=y
+CONFIG_L2TP=y
+CONFIG_LAPB=y
+CONFIG_LD_IS_BFD=y
+CONFIG_LD_ORPHAN_WARN_LEVEL="warn"
+CONFIG_LD_ORPHAN_WARN=y
+CONFIG_LD_VERSION=24200
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEGACY_DIRECT_IO=y
+CONFIG_LEGACY_VSYSCALL_NONE=y
+CONFIG_LIBCRC32C=y
+CONFIG_LINEAR_RANGES=y
+CONFIG_LIST_HARDENED=y
+CONFIG_LLC2=y
+CONFIG_LLC=y
+CONFIG_LLD_VERSION=0
+CONFIG_LOAD_UEFI_KEYS=y
+#CONFIG_LOCALVERSION="-patagia"
+CONFIG_LOCK_DEBUGGING_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_LOCK_DOWN_KERNEL_FORCE_NONE=y
+CONFIG_LOCKD_V4=y
+CONFIG_LOCKD=y
+CONFIG_LOCK_MM_AND_FIND_VMA=y
+CONFIG_LOCK_SPIN_ON_OWNER=y
+CONFIG_LOG_BUF_SHIFT=18
+CONFIG_LOG_CPU_MAX_BUF_SHIFT=12
+CONFIG_LOGITECH_FF=y
+CONFIG_LOGIWHEELS_FF=y
+CONFIG_LOGO_LINUX_CLUT224=y
+CONFIG_LOGO=y
+CONFIG_LPC_ICH=m
+CONFIG_LRU_CACHE=m
+CONFIG_LRU_GEN_ENABLED=y
+CONFIG_LRU_GEN_WALKS_MMU=y
+CONFIG_LRU_GEN=y
+CONFIG_LSM="yama,loadpin,safesetid,integrity,bpf,apparmor"
+CONFIG_LTO_NONE=y
+CONFIG_LWTUNNEL_BPF=y
+CONFIG_LWTUNNEL=y
+CONFIG_LZ4_COMPRESS=m
+CONFIG_LZ4_DECOMPRESS=y
+CONFIG_LZ4HC_COMPRESS=m
+CONFIG_LZO_COMPRESS=y
+CONFIG_LZO_DECOMPRESS=y
+CONFIG_MAC80211_STA_HASH_MAX_SIZE=0
+CONFIG_MAC_PARTITION=y
+CONFIG_MACVLAN=y
+CONFIG_MACVTAP=y
+CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x0
+CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE=""
+CONFIG_MAGIC_SYSRQ_SERIAL=y
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_MAILBOX=y
+CONFIG_MARVELL_10G_PHY=y
+CONFIG_MARVELL_PHY=y
+CONFIG_MAX_SKB_FRAGS=17
+CONFIG_MD_AUTODETECT=y
+CONFIG_MD_BITMAP_FILE=y
+CONFIG_MDIO_BUS=y
+CONFIG_MDIO_DEVICE=y
+CONFIG_MDIO_DEVRES=y
+CONFIG_MDIO=m
+CONFIG_MD_RAID0=y
+CONFIG_MD_RAID10=y
+CONFIG_MD_RAID1=y
+CONFIG_MD_RAID456=m
+CONFIG_MD=y
+CONFIG_MEGARAID_SAS=m
+CONFIG_MEMBARRIER=y
+CONFIG_MEMCG_KMEM=y
+CONFIG_MEMCG=y
+CONFIG_MEMFD_CREATE=y
+CONFIG_MEMORY_BALLOON=y
+CONFIG_MEMORY_FAILURE=y
+CONFIG_MEMORY_HOTPLUG=y
+CONFIG_MEMORY_HOTREMOVE=y
+CONFIG_MEMORY_ISOLATION=y
+CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4
+CONFIG_MFD_CORE=m
+CONFIG_MFD_INTEL_PMC_BXT=m
+CONFIG_MICROCODE=y
+CONFIG_MIGRATION=y
+CONFIG_MII=m
+CONFIG_MINIX_SUBPARTITION=y
+CONFIG_MISC_FILESYSTEMS=y
+CONFIG_MITIGATION_RFDS=y
+CONFIG_MITIGATION_SPECTRE_BHI=y
+CONFIG_MLX4_CORE_GEN2=y
+CONFIG_MLX4_CORE=m
+CONFIG_MLX4_DEBUG=y
+CONFIG_MLX4_EN_DCB=y
+CONFIG_MLX4_EN=m
+CONFIG_MLX4_INFINIBAND=m
+CONFIG_MLX5_BRIDGE=y
+CONFIG_MLX5_CORE_EN_DCB=y
+CONFIG_MLX5_CORE_EN=y
+CONFIG_MLX5_CORE_IPOIB=y
+CONFIG_MLX5_CORE=m
+CONFIG_MLX5_EN_ARFS=y
+CONFIG_MLX5_EN_RXNFC=y
+CONFIG_MLX5_ESWITCH=y
+CONFIG_MLX5_FPGA=y
+CONFIG_MLX5_INFINIBAND=m
+CONFIG_MLX5_MPFS=y
+CONFIG_MLX5_SW_STEERING=y
+CONFIG_MLXFW=m
+CONFIG_MLXSW_CORE_HWMON=y
+CONFIG_MLXSW_CORE=m
+CONFIG_MLXSW_CORE_THERMAL=y
+CONFIG_MLXSW_I2C=m
+CONFIG_MLXSW_MINIMAL=m
+CONFIG_MLXSW_PCI=m
+CONFIG_MLXSW_SPECTRUM_DCB=y
+CONFIG_MLXSW_SPECTRUM=m
+CONFIG_MMC_BLOCK_MINORS=32
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_CQHCI=y
+CONFIG_MMCONF_FAM10H=y
+CONFIG_MMC_RICOH_MMC=y
+CONFIG_MMC_SDHCI_ACPI=m
+CONFIG_MMC_SDHCI_F_SDH30=m
+CONFIG_MMC_SDHCI_IO_ACCESSORS=y
+CONFIG_MMC_SDHCI_PCI=m
+CONFIG_MMC_SDHCI_PLTFM=m
+CONFIG_MMC_SDHCI_XENON=m
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC=y
+CONFIG_MMU_GATHER_MERGE_VMAS=y
+CONFIG_MMU_GATHER_RCU_TABLE_FREE=y
+CONFIG_MMU_GATHER_TABLE_FREE=y
+CONFIG_MMU_LAZY_TLB_REFCOUNT=y
+CONFIG_MMU_NOTIFIER=y
+CONFIG_MMU=y
+CONFIG_MODPROBE_PATH="/sbin/modprobe"
+CONFIG_MODULE_COMPRESS_ZSTD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+CONFIG_MODULE_SIG_ALL=y
+CONFIG_MODULE_SIG_FORCE=y
+CONFIG_MODULE_SIG_FORMAT=y
+CONFIG_MODULE_SIG_HASH="sha512"
+CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"
+CONFIG_MODULE_SIG_KEY_TYPE_RSA=y
+CONFIG_MODULE_SIG_SHA512=y
+CONFIG_MODULE_SIG=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULES_TREE_LOOKUP=y
+CONFIG_MODULES_USE_ELF_RELA=y
+CONFIG_MODULES=y
+CONFIG_MODVERSIONS=y
+CONFIG_MPILIB=y
+CONFIG_MPLS=y
+CONFIG_MQ_IOSCHED_DEADLINE=y
+CONFIG_MQ_IOSCHED_KYBER=y
+CONFIG_MSDOS_FS=y
+CONFIG_MSDOS_PARTITION=y
+CONFIG_MTRR=y
+CONFIG_MULTIUSER=y
+CONFIG_MUTEX_SPIN_ON_OWNER=y
+CONFIG_NAMESPACES=y
+CONFIG_NEED_DMA_MAP_STATE=y
+CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y
+CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y
+CONFIG_NEED_SG_DMA_FLAGS=y
+CONFIG_NEED_SG_DMA_LENGTH=y
+CONFIG_NET_ACT_BPF=y
+CONFIG_NET_ACT_CSUM=y
+CONFIG_NET_ACT_GACT=y
+CONFIG_NET_ACT_IFE=y
+CONFIG_NET_ACT_IPT=y
+CONFIG_NET_ACT_MIRRED=y
+CONFIG_NET_ACT_NAT=y
+CONFIG_NET_ACT_PEDIT=y
+CONFIG_NET_ACT_POLICE=y
+CONFIG_NET_ACT_SAMPLE=y
+CONFIG_NET_ACT_SIMP=y
+CONFIG_NET_ACT_SKBEDIT=y
+CONFIG_NET_ACT_SKBMOD=y
+CONFIG_NET_ACT_TUNNEL_KEY=y
+CONFIG_NET_ACT_VLAN=y
+CONFIG_NET_CLS_ACT=y
+CONFIG_NET_CLS_BASIC=y
+CONFIG_NET_CLS_BPF=y
+CONFIG_NET_CLS_CGROUP=y
+CONFIG_NET_CLS_FLOWER=y
+CONFIG_NET_CLS_FLOW=y
+CONFIG_NET_CLS_FW=y
+CONFIG_NET_CLS_MATCHALL=y
+CONFIG_NET_CLS_ROUTE4=y
+CONFIG_NET_CLS_U32=y
+CONFIG_NET_CLS=y
+CONFIG_NETCONSOLE=y
+CONFIG_NET_CORE=y
+CONFIG_NETDEVICES=y
+CONFIG_NET_DEVLINK=y
+CONFIG_NET_DSA=y
+CONFIG_NET_EGRESS=y
+CONFIG_NET_EMATCH_CMP=y
+CONFIG_NET_EMATCH_IPSET=y
+CONFIG_NET_EMATCH_META=y
+CONFIG_NET_EMATCH_NBYTE=y
+CONFIG_NET_EMATCH_STACK=32
+CONFIG_NET_EMATCH_TEXT=y
+CONFIG_NET_EMATCH_U32=y
+CONFIG_NET_EMATCH=y
+CONFIG_NET_FAILOVER=y
+CONFIG_NETFILTER_ADVANCED=y
+CONFIG_NETFILTER_BPF_LINK=y
+CONFIG_NETFILTER_CONNCOUNT=y
+CONFIG_NETFILTER_EGRESS=y
+CONFIG_NETFILTER_FAMILY_BRIDGE=y
+CONFIG_NETFILTER_INGRESS=y
+CONFIG_NETFILTER_NETLINK_ACCT=y
+CONFIG_NETFILTER_NETLINK_GLUE_CT=y
+CONFIG_NETFILTER_NETLINK_LOG=y
+CONFIG_NETFILTER_NETLINK_OSF=y
+CONFIG_NETFILTER_NETLINK_QUEUE=y
+CONFIG_NETFILTER_NETLINK=y
+CONFIG_NETFILTER_SKIP_EGRESS=y
+CONFIG_NETFILTER_SYNPROXY=y
+CONFIG_NETFILTER_XTABLES_COMPAT=y
+CONFIG_NETFILTER_XTABLES=y
+CONFIG_NETFILTER_XT_CONNMARK=y
+CONFIG_NETFILTER_XT_MARK=y
+CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=y
+CONFIG_NETFILTER_XT_MATCH_BPF=y
+CONFIG_NETFILTER_XT_MATCH_CGROUP=y
+CONFIG_NETFILTER_XT_MATCH_CLUSTER=y
+CONFIG_NETFILTER_XT_MATCH_COMMENT=y
+CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y
+CONFIG_NETFILTER_XT_MATCH_CONNLABEL=y
+CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y
+CONFIG_NETFILTER_XT_MATCH_CONNMARK=y
+CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
+CONFIG_NETFILTER_XT_MATCH_CPU=y
+CONFIG_NETFILTER_XT_MATCH_DCCP=y
+CONFIG_NETFILTER_XT_MATCH_DEVGROUP=y
+CONFIG_NETFILTER_XT_MATCH_DSCP=y
+CONFIG_NETFILTER_XT_MATCH_ECN=y
+CONFIG_NETFILTER_XT_MATCH_ESP=y
+CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y
+CONFIG_NETFILTER_XT_MATCH_HELPER=y
+CONFIG_NETFILTER_XT_MATCH_HL=y
+CONFIG_NETFILTER_XT_MATCH_IPCOMP=y
+CONFIG_NETFILTER_XT_MATCH_IPRANGE=y
+CONFIG_NETFILTER_XT_MATCH_IPVS=y
+CONFIG_NETFILTER_XT_MATCH_L2TP=y
+CONFIG_NETFILTER_XT_MATCH_LENGTH=y
+CONFIG_NETFILTER_XT_MATCH_LIMIT=y
+CONFIG_NETFILTER_XT_MATCH_MAC=y
+CONFIG_NETFILTER_XT_MATCH_MARK=y
+CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y
+CONFIG_NETFILTER_XT_MATCH_NFACCT=y
+CONFIG_NETFILTER_XT_MATCH_OSF=y
+CONFIG_NETFILTER_XT_MATCH_OWNER=y
+CONFIG_NETFILTER_XT_MATCH_PHYSDEV=y
+CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y
+CONFIG_NETFILTER_XT_MATCH_POLICY=y
+CONFIG_NETFILTER_XT_MATCH_QUOTA=y
+CONFIG_NETFILTER_XT_MATCH_RATEEST=y
+CONFIG_NETFILTER_XT_MATCH_REALM=y
+CONFIG_NETFILTER_XT_MATCH_RECENT=y
+CONFIG_NETFILTER_XT_MATCH_SCTP=y
+CONFIG_NETFILTER_XT_MATCH_SOCKET=y
+CONFIG_NETFILTER_XT_MATCH_STATE=y
+CONFIG_NETFILTER_XT_MATCH_STATISTIC=y
+CONFIG_NETFILTER_XT_MATCH_STRING=y
+CONFIG_NETFILTER_XT_MATCH_TCPMSS=y
+CONFIG_NETFILTER_XT_MATCH_TIME=y
+CONFIG_NETFILTER_XT_MATCH_U32=y
+CONFIG_NETFILTER_XT_NAT=y
+CONFIG_NETFILTER_XT_SET=y
+CONFIG_NETFILTER_XT_TARGET_AUDIT=y
+CONFIG_NETFILTER_XT_TARGET_CHECKSUM=y
+CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y
+CONFIG_NETFILTER_XT_TARGET_CONNMARK=y
+CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y
+CONFIG_NETFILTER_XT_TARGET_CT=y
+CONFIG_NETFILTER_XT_TARGET_DSCP=y
+CONFIG_NETFILTER_XT_TARGET_HL=y
+CONFIG_NETFILTER_XT_TARGET_HMARK=y
+CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y
+CONFIG_NETFILTER_XT_TARGET_LED=y
+CONFIG_NETFILTER_XT_TARGET_LOG=y
+CONFIG_NETFILTER_XT_TARGET_MARK=y
+CONFIG_NETFILTER_XT_TARGET_MASQUERADE=y
+CONFIG_NETFILTER_XT_TARGET_NETMAP=y
+CONFIG_NETFILTER_XT_TARGET_NFLOG=y
+CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y
+CONFIG_NETFILTER_XT_TARGET_RATEEST=y
+CONFIG_NETFILTER_XT_TARGET_REDIRECT=y
+CONFIG_NETFILTER_XT_TARGET_SECMARK=y
+CONFIG_NETFILTER_XT_TARGET_TCPMSS=y
+CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=y
+CONFIG_NETFILTER_XT_TARGET_TEE=y
+CONFIG_NETFILTER_XT_TARGET_TPROXY=y
+CONFIG_NETFILTER=y
+CONFIG_NET_FLOW_LIMIT=y
+CONFIG_NET_FOU_IP_TUNNELS=y
+CONFIG_NET_FOU=y
+CONFIG_NETFS_SUPPORT=y
+CONFIG_NET_HANDSHAKE=y
+CONFIG_NET_IFE=y
+CONFIG_NET_INGRESS=y
+CONFIG_NET_IPGRE_DEMUX=y
+CONFIG_NET_IPGRE=m
+CONFIG_NET_IPIP=y
+CONFIG_NET_IP_TUNNEL=y
+CONFIG_NET_L3_MASTER_DEV=y
+CONFIG_NETLABEL=y
+CONFIG_NETLINK_DIAG=y
+CONFIG_NET_MPLS_GSO=y
+CONFIG_NET_NCSI=y
+CONFIG_NET_NSH=y
+CONFIG_NET_NS=y
+CONFIG_NET_POLL_CONTROLLER=y
+CONFIG_NETPOLL=y
+CONFIG_NET_PTP_CLASSIFY=y
+CONFIG_NET_RX_BUSY_POLL=y
+CONFIG_NET_SCH_CHOKE=y
+CONFIG_NET_SCH_CODEL=y
+CONFIG_NET_SCH_DEFAULT=y
+CONFIG_NET_SCH_DRR=y
+CONFIG_NET_SCHED=y
+CONFIG_NET_SCH_FIFO=y
+CONFIG_NET_SCH_FQ_CODEL=y
+CONFIG_NET_SCH_FQ=y
+CONFIG_NET_SCH_GRED=y
+CONFIG_NET_SCH_HFSC=y
+CONFIG_NET_SCH_HHF=y
+CONFIG_NET_SCH_HTB=y
+CONFIG_NET_SCH_INGRESS=y
+CONFIG_NET_SCH_MQPRIO_LIB=y
+CONFIG_NET_SCH_MQPRIO=y
+CONFIG_NET_SCH_MULTIQ=y
+CONFIG_NET_SCH_NETEM=y
+CONFIG_NET_SCH_PIE=y
+CONFIG_NET_SCH_PLUG=y
+CONFIG_NET_SCH_PRIO=y
+CONFIG_NET_SCH_QFQ=y
+CONFIG_NET_SCH_RED=y
+CONFIG_NET_SCH_SFB=y
+CONFIG_NET_SCH_SFQ=y
+CONFIG_NET_SCH_TBF=y
+CONFIG_NET_SCH_TEQL=y
+CONFIG_NET_SELFTESTS=y
+CONFIG_NET_SOCK_MSG=y
+CONFIG_NET_SWITCHDEV=y
+CONFIG_NET_TULIP=y
+CONFIG_NET_UDP_TUNNEL=y
+CONFIG_NET_VENDOR_3COM=y
+CONFIG_NET_VENDOR_8390=y
+CONFIG_NET_VENDOR_ADAPTEC=y
+CONFIG_NET_VENDOR_AGERE=y
+CONFIG_NET_VENDOR_ALACRITECH=y
+CONFIG_NET_VENDOR_ALTEON=y
+CONFIG_NET_VENDOR_AMAZON=y
+CONFIG_NET_VENDOR_AMD=y
+CONFIG_NET_VENDOR_AQUANTIA=y
+CONFIG_NET_VENDOR_ARC=y
+CONFIG_NET_VENDOR_ASIX=y
+CONFIG_NET_VENDOR_ATHEROS=y
+CONFIG_NET_VENDOR_BROADCOM=y
+CONFIG_NET_VENDOR_BROCADE=y
+CONFIG_NET_VENDOR_CADENCE=y
+CONFIG_NET_VENDOR_CAVIUM=y
+CONFIG_NET_VENDOR_CHELSIO=y
+CONFIG_NET_VENDOR_CISCO=y
+CONFIG_NET_VENDOR_CORTINA=y
+CONFIG_NET_VENDOR_DAVICOM=y
+CONFIG_NET_VENDOR_DEC=y
+CONFIG_NET_VENDOR_DLINK=y
+CONFIG_NET_VENDOR_EMULEX=y
+CONFIG_NET_VENDOR_ENGLEDER=y
+CONFIG_NET_VENDOR_EZCHIP=y
+CONFIG_NET_VENDOR_FUNGIBLE=y
+CONFIG_NET_VENDOR_GOOGLE=y
+CONFIG_NET_VENDOR_HUAWEI=y
+CONFIG_NET_VENDOR_I825XX=y
+CONFIG_NET_VENDOR_INTEL=y
+CONFIG_NET_VENDOR_LITEX=y
+CONFIG_NET_VENDOR_MARVELL=y
+CONFIG_NET_VENDOR_MELLANOX=y
+CONFIG_NET_VENDOR_MICREL=y
+CONFIG_NET_VENDOR_MICROCHIP=y
+CONFIG_NET_VENDOR_MICROSEMI=y
+CONFIG_NET_VENDOR_MICROSOFT=y
+CONFIG_NET_VENDOR_MYRI=y
+CONFIG_NET_VENDOR_NATSEMI=y
+CONFIG_NET_VENDOR_NETERION=y
+CONFIG_NET_VENDOR_NETRONOME=y
+CONFIG_NET_VENDOR_NI=y
+CONFIG_NET_VENDOR_NVIDIA=y
+CONFIG_NET_VENDOR_OKI=y
+CONFIG_NET_VENDOR_PACKET_ENGINES=y
+CONFIG_NET_VENDOR_PENSANDO=y
+CONFIG_NET_VENDOR_QLOGIC=y
+CONFIG_NET_VENDOR_QUALCOMM=y
+CONFIG_NET_VENDOR_RDC=y
+CONFIG_NET_VENDOR_REALTEK=y
+CONFIG_NET_VENDOR_RENESAS=y
+CONFIG_NET_VENDOR_ROCKER=y
+CONFIG_NET_VENDOR_SAMSUNG=y
+CONFIG_NET_VENDOR_SEEQ=y
+CONFIG_NET_VENDOR_SILAN=y
+CONFIG_NET_VENDOR_SIS=y
+CONFIG_NET_VENDOR_SMSC=y
+CONFIG_NET_VENDOR_SOCIONEXT=y
+CONFIG_NET_VENDOR_SOLARFLARE=y
+CONFIG_NET_VENDOR_STMICRO=y
+CONFIG_NET_VENDOR_SUN=y
+CONFIG_NET_VENDOR_SYNOPSYS=y
+CONFIG_NET_VENDOR_TEHUTI=y
+CONFIG_NET_VENDOR_TI=y
+CONFIG_NET_VENDOR_VERTEXCOM=y
+CONFIG_NET_VENDOR_VIA=y
+CONFIG_NET_VENDOR_WANGXUN=y
+CONFIG_NET_VENDOR_WIZNET=y
+CONFIG_NET_VENDOR_XILINX=y
+CONFIG_NET_VRF=m
+CONFIG_NETWORK_FILESYSTEMS=y
+CONFIG_NETWORK_SECMARK=y
+CONFIG_NETXEN_NIC=m
+CONFIG_NET_XGRESS=y
+CONFIG_NET=y
+CONFIG_NEW_LEDS=y
+CONFIG_NF_CONNTRACK_BROADCAST=y
+CONFIG_NF_CONNTRACK_EVENTS=y
+CONFIG_NF_CONNTRACK_FTP=y
+CONFIG_NF_CONNTRACK_LABELS=y
+CONFIG_NF_CONNTRACK_MARK=y
+CONFIG_NF_CONNTRACK_NETBIOS_NS=y
+CONFIG_NF_CONNTRACK_OVS=y
+CONFIG_NF_CONNTRACK_PPTP=y
+CONFIG_NF_CONNTRACK_PROCFS=y
+CONFIG_NF_CONNTRACK_SANE=y
+CONFIG_NF_CONNTRACK_SECMARK=y
+CONFIG_NF_CONNTRACK_SIP=y
+CONFIG_NF_CONNTRACK_SNMP=y
+CONFIG_NF_CONNTRACK_TFTP=y
+CONFIG_NF_CONNTRACK_TIMEOUT=y
+CONFIG_NF_CONNTRACK_TIMESTAMP=y
+CONFIG_NF_CONNTRACK=y
+CONFIG_NF_CONNTRACK_ZONES=y
+CONFIG_NF_CT_NETLINK=y
+CONFIG_NF_CT_PROTO_GRE=y
+CONFIG_NF_CT_PROTO_SCTP=y
+CONFIG_NF_DEFRAG_IPV4=y
+CONFIG_NF_DEFRAG_IPV6=y
+CONFIG_NF_DUP_IPV4=y
+CONFIG_NF_DUP_IPV6=y
+CONFIG_NF_DUP_NETDEV=y
+CONFIG_NF_LOG_ARP=y
+CONFIG_NF_LOG_IPV4=y
+CONFIG_NF_LOG_IPV6=y
+CONFIG_NF_LOG_SYSLOG=y
+CONFIG_NF_NAT_FTP=y
+CONFIG_NF_NAT_MASQUERADE=y
+CONFIG_NF_NAT_OVS=y
+CONFIG_NF_NAT_PPTP=y
+CONFIG_NF_NAT_REDIRECT=y
+CONFIG_NF_NAT_SIP=y
+CONFIG_NF_NAT_SNMP_BASIC=y
+CONFIG_NF_NAT_TFTP=y
+CONFIG_NF_NAT=y
+CONFIG_NF_REJECT_IPV4=y
+CONFIG_NF_REJECT_IPV6=y
+CONFIG_NFS_ACL_SUPPORT=m
+CONFIG_NFS_COMMON=y
+CONFIG_NFS_DEBUG=y
+CONFIG_NFS_DISABLE_UDP_SUPPORT=y
+CONFIG_NFSD_LEGACY_CLIENT_TRACKING=y
+CONFIG_NFSD=m
+CONFIG_NFSD_V3_ACL=y
+CONFIG_NFSD_V4_SECURITY_LABEL=y
+CONFIG_NFSD_V4=y
+CONFIG_NFS_FSCACHE=y
+CONFIG_NFS_FS=m
+CONFIG_NFS_USE_KERNEL_DNS=y
+CONFIG_NFS_V2=m
+CONFIG_NFS_V3_ACL=y
+CONFIG_NFS_V3=m
+CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org"
+CONFIG_NFS_V4_1=y
+CONFIG_NFS_V4_2_READ_PLUS=y
+CONFIG_NFS_V4_2_SSC_HELPER=y
+CONFIG_NFS_V4_2=y
+CONFIG_NFS_V4=m
+CONFIG_NFS_V4_SECURITY_LABEL=y
+CONFIG_NF_TABLES_INET=y
+CONFIG_NF_TABLES_IPV4=y
+CONFIG_NF_TABLES_IPV6=y
+CONFIG_NF_TABLES_NETDEV=y
+CONFIG_NF_TABLES=y
+CONFIG_NFT_COMPAT=y
+CONFIG_NFT_CT=y
+CONFIG_NFT_DUP_NETDEV=y
+CONFIG_NFT_FIB_INET=y
+CONFIG_NFT_FIB_IPV4=y
+CONFIG_NFT_FIB_IPV6=y
+CONFIG_NFT_FIB=y
+CONFIG_NFT_FWD_NETDEV=y
+CONFIG_NFT_HASH=y
+CONFIG_NFT_LIMIT=y
+CONFIG_NFT_LOG=y
+CONFIG_NFT_MASQ=y
+CONFIG_NFT_NAT=y
+CONFIG_NFT_NUMGEN=y
+CONFIG_NF_TPROXY_IPV4=y
+CONFIG_NF_TPROXY_IPV6=y
+CONFIG_NFT_QUEUE=y
+CONFIG_NFT_QUOTA=y
+CONFIG_NFT_REDIR=y
+CONFIG_NFT_REJECT_INET=y
+CONFIG_NFT_REJECT_IPV4=y
+CONFIG_NFT_REJECT_IPV6=y
+CONFIG_NFT_REJECT=y
+CONFIG_NFT_TPROXY=y
+CONFIG_NITRO_ENCLAVES=y
+CONFIG_NLATTR=y
+CONFIG_NLS_ASCII=y
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_UCS2_UTILS=y
+CONFIG_NLS_UTF8=y
+CONFIG_NLS=y
+CONFIG_NODES_SHIFT=6
+CONFIG_NO_HZ_COMMON=y
+CONFIG_NO_HZ_IDLE=y
+CONFIG_NO_HZ=y
+CONFIG_NOP_TRACER=y
+CONFIG_NR_CPUS=512
+CONFIG_NR_CPUS_DEFAULT=64
+CONFIG_NR_CPUS_RANGE_BEGIN=2
+CONFIG_NR_CPUS_RANGE_END=512
+CONFIG_NUMA=y
+CONFIG_NVME_AUTH=y
+CONFIG_NVME_COMMON=y
+CONFIG_NVME_CORE=y
+CONFIG_NVME_FABRICS=y
+CONFIG_NVME_FC=y
+CONFIG_NVME_HWMON=y
+CONFIG_NVMEM_SYSFS=y
+CONFIG_NVME_MULTIPATH=y
+CONFIG_NVMEM=y
+CONFIG_NVME_RDMA=m
+CONFIG_NVME_TARGET_AUTH=y
+CONFIG_NVME_TARGET_FC=m
+CONFIG_NVME_TARGET_LOOP=m
+CONFIG_NVME_TARGET=m
+CONFIG_NVME_TARGET_PASSTHRU=y
+CONFIG_NVME_TARGET_RDMA=m
+CONFIG_NVME_TARGET_TCP=m
+CONFIG_NVME_TCP=y
+CONFIG_NVRAM=y
+CONFIG_OBJAGG=m
+CONFIG_OBJTOOL=y
+CONFIG_OID_REGISTRY=y
+CONFIG_OLD_SIGSUSPEND3=y
+CONFIG_OPENVSWITCH_GENEVE=y
+CONFIG_OPENVSWITCH_GRE=m
+CONFIG_OPENVSWITCH_VXLAN=y
+CONFIG_OPENVSWITCH=y
+CONFIG_OPTPROBES=y
+CONFIG_OSF_PARTITION=y
+CONFIG_OUTPUT_FORMAT="elf64-x86-64"
+CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y
+CONFIG_OVERLAY_FS=y
+CONFIG_P2SB=y
+CONFIG_PACKET=y
+CONFIG_PAGE_COUNTER=y
+CONFIG_PAGE_POISONING=y
+CONFIG_PAGE_POOL=y
+CONFIG_PAGE_REPORTING=y
+CONFIG_PAGE_SIZE_LESS_THAN_256KB=y
+CONFIG_PAGE_SIZE_LESS_THAN_64KB=y
+CONFIG_PAGE_TABLE_ISOLATION=y
+CONFIG_PAHOLE_HAS_LANG_EXCLUDE=y
+CONFIG_PAHOLE_HAS_SPLIT_BTF=y
+CONFIG_PAHOLE_VERSION=126
+CONFIG_PANIC_ON_OOPS_VALUE=1
+CONFIG_PANIC_ON_OOPS=y
+CONFIG_PANIC_TIMEOUT=-1
+CONFIG_PANTHERLORD_FF=y
+CONFIG_PARAVIRT_CLOCK=y
+CONFIG_PARAVIRT_XXL=y
+CONFIG_PARAVIRT=y
+CONFIG_PARMAN=m
+CONFIG_PARTITION_ADVANCED=y
+CONFIG_PATA_AMD=m
+CONFIG_PATA_MARVELL=m
+CONFIG_PATA_OLDPIIX=m
+CONFIG_PATA_SCH=m
+CONFIG_PATA_TIMINGS=y
+CONFIG_PCC=y
+CONFIG_PCI_ATS=y
+CONFIG_PCI_DIRECT=y
+CONFIG_PCI_DOMAINS=y
+CONFIG_PCIEAER=y
+CONFIG_PCIEASPM_DEFAULT=y
+CONFIG_PCIEASPM=y
+CONFIG_PCIE_BUS_DEFAULT=y
+CONFIG_PCIE_PME=y
+CONFIG_PCIEPORTBUS=y
+CONFIG_PCI_HYPERV_INTERFACE=y
+CONFIG_PCI_HYPERV=y
+CONFIG_PCI_IOV=y
+CONFIG_PCI_LABEL=y
+CONFIG_PCI_LOCKLESS_CONFIG=y
+CONFIG_PCI_MMCONFIG=y
+CONFIG_PCI_MSI=y
+CONFIG_PCI_PASID=y
+CONFIG_PCI_PRI=y
+CONFIG_PCI_QUIRKS=y
+CONFIG_PCI_XEN=y
+CONFIG_PCI=y
+CONFIG_PCPU_DEV_REFCNT=y
+CONFIG_PCSPKR_PLATFORM=y
+CONFIG_PERF_EVENTS_AMD_UNCORE=y
+CONFIG_PERF_EVENTS_INTEL_CSTATE=y
+CONFIG_PERF_EVENTS_INTEL_RAPL=y
+CONFIG_PERF_EVENTS_INTEL_UNCORE=y
+CONFIG_PERF_EVENTS=y
+CONFIG_PER_VMA_LOCK=y
+CONFIG_PGTABLE_LEVELS=4
+CONFIG_PHONET=y
+CONFIG_PHYLIB=y
+CONFIG_PHYLINK=y
+CONFIG_PHYS_ADDR_T_64BIT=y
+CONFIG_PHYSICAL_ALIGN=0x200000
+CONFIG_PHYSICAL_START=0x1000000
+CONFIG_PID_NS=y
+CONFIG_PKCS7_MESSAGE_PARSER=y
+CONFIG_PLDMFW=y
+CONFIG_PM_CLK=y
+CONFIG_PM_DEBUG=y
+CONFIG_PM_SLEEP_DEBUG=y
+CONFIG_PM_SLEEP_SMP=y
+CONFIG_PM_SLEEP=y
+CONFIG_PM_TRACE_RTC=y
+CONFIG_PM_TRACE=y
+CONFIG_PM=y
+CONFIG_PNFS_BLOCK=y
+CONFIG_PNFS_FILE_LAYOUT=y
+CONFIG_PNFS_FLEXFILE_LAYOUT=y
+CONFIG_PNPACPI=y
+CONFIG_PNP_DEBUG_MESSAGES=y
+CONFIG_PNP=y
+CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y
+CONFIG_POSIX_MQUEUE_SYSCTL=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_POSIX_TIMERS=y
+CONFIG_POWER_SUPPLY_HWMON=y
+CONFIG_POWER_SUPPLY=y
+CONFIG_PPS=y
+CONFIG_PREEMPT_NONE_BUILD=y
+CONFIG_PREEMPT_NONE=y
+CONFIG_PREEMPT_NOTIFIERS=y
+CONFIG_PREFIX_SYMBOLS=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_PRINTK_TIME=y
+CONFIG_PRINTK=y
+CONFIG_PROBE_EVENTS_BTF_ARGS=y
+CONFIG_PROBE_EVENTS=y
+CONFIG_PROC_CHILDREN=y
+CONFIG_PROC_EVENTS=y
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_PROC_PID_ARCH_STATUS=y
+CONFIG_PROC_PID_CPUSET=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_PROC_VMCORE=y
+CONFIG_PROFILING=y
+CONFIG_PROVIDE_OHCI1394_DMA_INIT=y
+CONFIG_PSAMPLE=y
+CONFIG_PSI=y
+CONFIG_PTDUMP_CORE=y
+CONFIG_PTP_1588_CLOCK_KVM=y
+CONFIG_PTP_1588_CLOCK_OPTIONAL=y
+CONFIG_PTP_1588_CLOCK=y
+CONFIG_PWM_SYSFS=y
+CONFIG_PWM=y
+CONFIG_QEDE=m
+CONFIG_QED=m
+CONFIG_QED_SRIOV=y
+CONFIG_QFMT_V2=y
+CONFIG_QLCNIC_DCB=y
+CONFIG_QLCNIC_HWMON=y
+CONFIG_QLCNIC=m
+CONFIG_QLCNIC_SRIOV=y
+CONFIG_QUEUED_RWLOCKS=y
+CONFIG_QUEUED_SPINLOCKS=y
+CONFIG_QUOTACTL=y
+CONFIG_QUOTA_NETLINK_INTERFACE=y
+CONFIG_QUOTA_TREE=y
+CONFIG_QUOTA=y
+CONFIG_R8169=m
+CONFIG_RAID6_PQ_BENCHMARK=y
+CONFIG_RAID6_PQ=m
+CONFIG_RAID_ATTRS=y
+CONFIG_RANDOMIZE_BASE=y
+CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT=y
+CONFIG_RANDOMIZE_KSTACK_OFFSET=y
+CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING=0x0
+CONFIG_RANDOMIZE_MEMORY=y
+CONFIG_RANDSTRUCT_NONE=y
+CONFIG_RAS=y
+CONFIG_RATIONAL=y
+CONFIG_RCU_CPU_STALL_TIMEOUT=21
+CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0
+CONFIG_RCU_NEED_SEGCBLIST=y
+CONFIG_RCU_STALL_COMMON=y
+CONFIG_RDMA_RXE=m
+CONFIG_RDS=y
+CONFIG_RD_XZ=y
+CONFIG_RD_ZSTD=y
+CONFIG_REALTEK_PHY=y
+CONFIG_REGMAP_I2C=y
+CONFIG_REGMAP=y
+CONFIG_REGULATOR_FIXED_VOLTAGE=y
+CONFIG_REGULATOR_MP8859=y
+CONFIG_REGULATOR_PWM=y
+CONFIG_REGULATOR=y
+CONFIG_RELAY=y
+CONFIG_RELOCATABLE=y
+CONFIG_RESET_ATTACK_MITIGATION=y
+CONFIG_RETHOOK=y
+CONFIG_RETHUNK=y
+CONFIG_RETPOLINE=y
+CONFIG_RFS_ACCEL=y
+CONFIG_RING_BUFFER=y
+CONFIG_ROOT_NFS=y
+CONFIG_RPCSEC_GSS_KRB5=y
+CONFIG_RPMSG_NS=y
+CONFIG_RPMSG_VIRTIO=y
+CONFIG_RPMSG=y
+CONFIG_RPS=y
+CONFIG_RSEQ=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_DRV_CMOS=y
+CONFIG_RTC_I2C_AND_SPI=y
+CONFIG_RTC_INTF_DEV=y
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_LIB=y
+CONFIG_RTC_MC146818_LIB=y
+CONFIG_RTC_NVMEM=y
+CONFIG_RTC_SYSTOHC_DEVICE="rtc0"
+CONFIG_RTC_SYSTOHC=y
+CONFIG_RT_GROUP_SCHED=y
+CONFIG_RT_MUTEXES=y
+CONFIG_RUNTIME_TESTING_MENU=y
+CONFIG_RWSEM_SPIN_ON_OWNER=y
+CONFIG_SATA_AHCI=m
+CONFIG_SATA_HOST=y
+CONFIG_SATA_MOBILE_LPM_POLICY=0
+CONFIG_SATA_NV=m
+CONFIG_SATA_PMP=y
+CONFIG_SATA_SIS=y
+CONFIG_SATA_SVW=m
+CONFIG_SATA_ULI=m
+CONFIG_SATA_VIA=m
+CONFIG_SATA_VITESSE=m
+CONFIG_SBITMAP=y
+CONFIG_SCHED_CLUSTER=y
+CONFIG_SCHED_CORE=y
+CONFIG_SCHED_HRTICK=y
+CONFIG_SCHED_INFO=y
+CONFIG_SCHED_MC_PRIO=y
+CONFIG_SCHED_MC=y
+CONFIG_SCHED_MM_CID=y
+CONFIG_SCHED_OMIT_FRAME_POINTER=y
+CONFIG_SCHED_SMT=y
+CONFIG_SCHED_STACK_END_CHECK=y
+CONFIG_SCHEDSTATS=y
+CONFIG_SCSI_AACRAID=m
+CONFIG_SCSI_COMMON=y
+CONFIG_SCSI_CONSTANTS=y
+CONFIG_SCSI_DMA=y
+CONFIG_SCSI_ENCLOSURE=y
+CONFIG_SCSI_HPSA=m
+CONFIG_SCSI_ISCI=m
+CONFIG_SCSI_ISCSI_ATTRS=y
+CONFIG_SCSI_LOWLEVEL=y
+CONFIG_SCSI_MOD=y
+CONFIG_SCSI_MPT2SAS_MAX_SGE=128
+CONFIG_SCSI_MPT3SAS=m
+CONFIG_SCSI_MPT3SAS_MAX_SGE=128
+CONFIG_SCSI_PMCRAID=m
+CONFIG_SCSI_PROC_FS=y
+CONFIG_SCSI_SAS_ATA=y
+CONFIG_SCSI_SAS_ATTRS=y
+CONFIG_SCSI_SAS_HOST_SMP=y
+CONFIG_SCSI_SAS_LIBSAS=y
+CONFIG_SCSI_SMARTPQI=m
+CONFIG_SCSI_SPI_ATTRS=y
+CONFIG_SCSI_VIRTIO=y
+CONFIG_SCSI=y
+CONFIG_SCTP_COOKIE_HMAC_MD5=y
+CONFIG_SCTP_DEFAULT_COOKIE_HMAC_MD5=y
+CONFIG_SECCOMP_FILTER=y
+CONFIG_SECCOMP=y
+CONFIG_SECRETMEM=y
+CONFIG_SECTION_MISMATCH_WARN_ONLY=y
+CONFIG_SECURITY_APPARMOR_EXPORT_BINARY=y
+CONFIG_SECURITY_APPARMOR_HASH_DEFAULT=y
+CONFIG_SECURITY_APPARMOR_HASH=y
+CONFIG_SECURITY_APPARMOR_INTROSPECT_POLICY=y
+CONFIG_SECURITY_APPARMOR_PARANOID_LOAD=y
+CONFIG_SECURITY_APPARMOR=y
+CONFIG_SECURITY_DMESG_RESTRICT=y
+CONFIG_SECURITYFS=y
+CONFIG_SECURITY_LANDLOCK=y
+CONFIG_SECURITY_LOCKDOWN_LSM_EARLY=y
+CONFIG_SECURITY_LOCKDOWN_LSM=y
+CONFIG_SECURITY_NETWORK_XFRM=y
+CONFIG_SECURITY_NETWORK=y
+CONFIG_SECURITY_PATH=y
+CONFIG_SECURITY=y
+CONFIG_SECURITY_YAMA=y
+CONFIG_SENSORS_ACPI_POWER=y
+CONFIG_SENSORS_CORETEMP=y
+CONFIG_SENSORS_DRIVETEMP=y
+CONFIG_SENSORS_FAM15H_POWER=m
+CONFIG_SENSORS_I5500=m
+CONFIG_SENSORS_I5K_AMB=m
+CONFIG_SENSORS_K10TEMP=m
+CONFIG_SENSORS_K8TEMP=m
+CONFIG_SENSORS_NCT6683=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y
+CONFIG_SERIAL_8250_DETECT_IRQ=y
+CONFIG_SERIAL_8250_DMA=y
+CONFIG_SERIAL_8250_DWLIB=y
+CONFIG_SERIAL_8250_EXAR=y
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_LPSS=y
+CONFIG_SERIAL_8250_MANY_PORTS=y
+CONFIG_SERIAL_8250_MID=y
+CONFIG_SERIAL_8250_NR_UARTS=32
+CONFIG_SERIAL_8250_PCILIB=y
+CONFIG_SERIAL_8250_PCI=y
+CONFIG_SERIAL_8250_PERICOM=y
+CONFIG_SERIAL_8250_PNP=y
+CONFIG_SERIAL_8250_RSA=y
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_EARLYCON=y
+CONFIG_SERIAL_NONSTANDARD=y
+CONFIG_SERIO_I8042=y
+CONFIG_SERIO_LIBPS2=y
+CONFIG_SERIO_PCIPS2=m
+CONFIG_SERIO_SERPORT=y
+CONFIG_SERIO=y
+CONFIG_SFC=m
+CONFIG_SFC_MCDI_LOGGING=y
+CONFIG_SFC_MCDI_MON=y
+CONFIG_SFC_SIENA=m
+CONFIG_SFC_SIENA_MCDI_LOGGING=y
+CONFIG_SFC_SIENA_MCDI_MON=y
+CONFIG_SFC_SIENA_SRIOV=y
+CONFIG_SFC_SRIOV=y
+CONFIG_SGETMASK_SYSCALL=y
+CONFIG_SGI_PARTITION=y
+CONFIG_SGL_ALLOC=y
+CONFIG_SG_POOL=y
+CONFIG_SHMEM=y
+CONFIG_SHUFFLE_PAGE_ALLOCATOR=y
+CONFIG_SIGNALFD=y
+CONFIG_SIGNATURE=y
+CONFIG_SIGNED_PE_FILE_VERIFICATION=y
+CONFIG_SKB_EXTENSIONS=y
+CONFIG_SKY2=m
+CONFIG_SLAB_FREELIST_HARDENED=y
+CONFIG_SLAB_FREELIST_RANDOM=y
+CONFIG_SLAB_MERGE_DEFAULT=y
+CONFIG_SLS=y
+CONFIG_SLUB_CPU_PARTIAL=y
+CONFIG_SLUB_DEBUG=y
+CONFIG_SLUB=y
+CONFIG_SMBFS=y
+CONFIG_SMP=y
+CONFIG_SMSC_PHY=m
+CONFIG_SOCK_CGROUP_DATA=y
+CONFIG_SOCK_RX_QUEUE_MAPPING=y
+CONFIG_SOFTIRQ_ON_OWN_STACK=y
+CONFIG_SOLARIS_X86_PARTITION=y
+CONFIG_SP5100_TCO=m
+CONFIG_SPARSE_IRQ=y
+CONFIG_SPARSEMEM_EXTREME=y
+CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
+CONFIG_SPARSEMEM_VMEMMAP=y
+CONFIG_SPARSEMEM=y
+CONFIG_SPLIT_PTLOCK_CPUS=4
+CONFIG_SQUASHFS_COMPILE_DECOMP_SINGLE=y
+CONFIG_SQUASHFS_DECOMP_SINGLE=y
+CONFIG_SQUASHFS_FILE_DIRECT=y
+CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
+CONFIG_SQUASHFS_XATTR=y
+CONFIG_SQUASHFS_XZ=y
+CONFIG_SQUASHFS=y
+CONFIG_SQUASHFS_ZSTD=y
+CONFIG_SSB_POSSIBLE=y
+CONFIG_STACKDEPOT=y
+CONFIG_STACKLEAK_TRACK_MIN_SIZE=100
+CONFIG_STACKPROTECTOR_STRONG=y
+CONFIG_STACKPROTECTOR=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_STACKTRACE=y
+CONFIG_STANDALONE=y
+CONFIG_STP=y
+CONFIG_STREAM_PARSER=y
+CONFIG_STRICT_KERNEL_RWX=y
+CONFIG_STRICT_MODULE_RWX=y
+CONFIG_SUN_PARTITION=y
+CONFIG_SUNRPC_BACKCHANNEL=y
+CONFIG_SUNRPC_GSS=y
+CONFIG_SUNRPC_XPRT_RDMA=y
+CONFIG_SUNRPC=y
+CONFIG_SURFACE_PLATFORMS=y
+CONFIG_SUSPEND_FREEZER=y
+CONFIG_SUSPEND=y
+CONFIG_SWAP=y
+CONFIG_SWIOTLB_XEN=y
+CONFIG_SWIOTLB=y
+CONFIG_SWPHY=y
+CONFIG_SYMBOLIC_ERRNAME=y
+CONFIG_SYNC_FILE=y
+CONFIG_SYN_COOKIES=y
+CONFIG_SYSCTL_EXCEPTION_TRACE=y
+CONFIG_SYSCTL=y
+CONFIG_SYSFB=y
+CONFIG_SYSFS_SYSCALL=y
+CONFIG_SYSFS=y
+CONFIG_SYS_HYPERVISOR=y
+CONFIG_SYSTEM_BLACKLIST_HASH_LIST=""
+CONFIG_SYSTEM_BLACKLIST_KEYRING=y
+CONFIG_SYSTEM_DATA_VERIFICATION=y
+CONFIG_SYSTEM_TRUSTED_KEYRING=y
+CONFIG_SYSTEM_TRUSTED_KEYS=""
+CONFIG_SYSVIPC_COMPAT=y
+CONFIG_SYSVIPC_SYSCTL=y
+CONFIG_SYSVIPC=y
+CONFIG_TAP=y
+CONFIG_TASK_DELAY_ACCT=y
+CONFIG_TASK_IO_ACCOUNTING=y
+CONFIG_TASKS_RCU_GENERIC=y
+CONFIG_TASKS_RUDE_RCU=y
+CONFIG_TASKSTATS=y
+CONFIG_TASKS_TRACE_RCU=y
+CONFIG_TASK_XACCT=y
+CONFIG_TCG_CRB=y
+CONFIG_TCG_TIS_CORE=y
+CONFIG_TCG_TIS=y
+CONFIG_TCG_TPM=y
+CONFIG_TCP_CONG_ADVANCED=y
+CONFIG_TCP_CONG_BBR=y
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_TCP_MD5SIG=y
+CONFIG_TEXTSEARCH_BM=y
+CONFIG_TEXTSEARCH_FSM=y
+CONFIG_TEXTSEARCH_KMP=y
+CONFIG_TEXTSEARCH=y
+CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
+CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0
+CONFIG_THERMAL_GOV_STEP_WISE=y
+CONFIG_THERMAL_GOV_USER_SPACE=y
+CONFIG_THERMAL_HWMON=y
+CONFIG_THERMAL_WRITABLE_TRIPS=y
+CONFIG_THERMAL=y
+CONFIG_THREAD_INFO_IN_TASK=y
+CONFIG_TICK_CPU_ACCOUNTING=y
+CONFIG_TICK_ONESHOT=y
+CONFIG_TIGON3_HWMON=y
+CONFIG_TIGON3=m
+CONFIG_TIME_NS=y
+CONFIG_TIMERFD=y
+CONFIG_TLS=m
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_TMPFS_XATTR=y
+CONFIG_TMPFS=y
+CONFIG_TOOLS_SUPPORT_RELR=y
+CONFIG_TRACE_CLOCK=y
+CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_TRACEPOINTS=y
+CONFIG_TRACING_SUPPORT=y
+CONFIG_TRACING=y
+CONFIG_TREE_RCU=y
+CONFIG_TREE_SRCU=y
+CONFIG_TTY=y
+CONFIG_TTY_PRINTK_LEVEL=6
+CONFIG_TTY_PRINTK=m
+CONFIG_TUN=y
+CONFIG_UBSAN_BOOL=y
+CONFIG_UBSAN_BOUNDS_STRICT=y
+CONFIG_UBSAN_BOUNDS=y
+CONFIG_UBSAN_ENUM=y
+CONFIG_UBSAN_SANITIZE_ALL=y
+CONFIG_UBSAN_SHIFT=y
+CONFIG_UBSAN=y
+CONFIG_UCS2_STRING=y
+CONFIG_UDF_FS=y
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_UEVENT_HELPER=y
+CONFIG_UID16=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_UNIX_SCM=y
+CONFIG_UNIXWARE_DISKLABEL=y
+CONFIG_UNIX=y
+CONFIG_UNWINDER_ORC=y
+CONFIG_UPROBE_EVENTS=y
+CONFIG_UPROBES=y
+CONFIG_USB4=m
+CONFIG_USB4_NET=m
+CONFIG_USB_ACM=y
+CONFIG_USB_ALI_M5632=y
+CONFIG_USB_AN2720=y
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARMLINUX=y
+CONFIG_USB_AUTOSUSPEND_DELAY=2
+CONFIG_USB_BELKIN=y
+CONFIG_USB_CDC_PHONET=m
+CONFIG_USB_COMMON=y
+CONFIG_USB_DEFAULT_PERSIST=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_PCI=y
+CONFIG_USB_EHCI_TT_NEWSCHED=y
+CONFIG_USB_HID=y
+CONFIG_USB_KC2190=y
+CONFIG_USB_NET_AQC111=m
+CONFIG_USB_NET_AX88179_178A=m
+CONFIG_USB_NET_AX8817X=m
+CONFIG_USB_NET_CDC_EEM=m
+CONFIG_USB_NET_CDCETHER=m
+CONFIG_USB_NET_CDC_MBIM=m
+CONFIG_USB_NET_CDC_NCM=m
+CONFIG_USB_NET_CDC_SUBSET_ENABLE=m
+CONFIG_USB_NET_CDC_SUBSET=m
+CONFIG_USB_NET_CX82310_ETH=m
+CONFIG_USB_NET_DM9601=m
+CONFIG_USB_NET_DRIVERS=y
+CONFIG_USB_NET_GL620A=m
+CONFIG_USB_NET_HUAWEI_CDC_NCM=m
+CONFIG_USB_NET_INT51X1=m
+CONFIG_USB_NET_KALMIA=m
+CONFIG_USB_NET_MCS7830=m
+CONFIG_USB_NET_NET1080=m
+CONFIG_USB_NET_PLUSB=m
+CONFIG_USB_NET_QMI_WWAN=m
+CONFIG_USB_NET_RNDIS_HOST=m
+CONFIG_USB_NET_SMSC75XX=m
+CONFIG_USB_NET_SMSC95XX=m
+CONFIG_USB_NET_SR9700=m
+CONFIG_USB_NET_SR9800=m
+CONFIG_USB_NET_ZAURUS=m
+CONFIG_USB_OHCI_HCD=m
+CONFIG_USB_OHCI_HCD_PCI=m
+CONFIG_USB_OHCI_HCD_PLATFORM=m
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+CONFIG_USB_PCI=y
+CONFIG_USB_RTL8152=m
+CONFIG_USB_RTL8153_ECM=m
+CONFIG_USB_SERIAL_CH341=m
+CONFIG_USB_SERIAL_CONSOLE=y
+CONFIG_USB_SERIAL_CP210X=m
+CONFIG_USB_SERIAL_FTDI_SIO=m
+CONFIG_USB_SERIAL_GENERIC=y
+CONFIG_USB_SERIAL_OPTION=m
+CONFIG_USB_SERIAL_PL2303=m
+CONFIG_USB_SERIAL_WWAN=m
+CONFIG_USB_SERIAL=y
+CONFIG_USB_SIERRA_NET=m
+CONFIG_USB_STORAGE=y
+CONFIG_USB_SUPPORT=y
+CONFIG_USB_UAS=y
+CONFIG_USB_UHCI_HCD=m
+CONFIG_USB_USBNET=m
+CONFIG_USB_VL600=m
+CONFIG_USB_WDM=m
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_XHCI_PCI=y
+CONFIG_USB_XHCI_PLATFORM=y
+CONFIG_USB=y
+CONFIG_USELIB=y
+CONFIG_USE_PERCPU_NUMA_NODE_ID=y
+CONFIG_USER_NS=y
+CONFIG_USER_RETURN_NOTIFIER=y
+CONFIG_USER_STACKTRACE_SUPPORT=y
+CONFIG_UTS_NS=y
+CONFIG_UVC_COMMON=m
+CONFIG_VETH=y
+CONFIG_VFAT_FS=y
+CONFIG_VFIO_CONTAINER=y
+CONFIG_VFIO_GROUP=y
+CONFIG_VFIO_IOMMU_TYPE1=m
+CONFIG_VFIO=m
+CONFIG_VFIO_MDEV=m
+CONFIG_VFIO_PCI_CORE=m
+CONFIG_VFIO_PCI_IGD=y
+CONFIG_VFIO_PCI_INTX=y
+CONFIG_VFIO_PCI=m
+CONFIG_VFIO_PCI_MMAP=y
+CONFIG_VFIO_PCI_VGA=y
+CONFIG_VFIO_VIRQFD=y
+CONFIG_VGA_ARB_MAX_GPUS=16
+CONFIG_VGA_ARB=y
+CONFIG_VGA_CONSOLE=y
+CONFIG_VGASTATE=y
+CONFIG_VHOST_IOTLB=y
+CONFIG_VHOST_MENU=y
+CONFIG_VHOST_NET=y
+CONFIG_VHOST_TASK=y
+CONFIG_VHOST_VSOCK=y
+CONFIG_VHOST=y
+CONFIG_VIRT_DRIVERS=y
+CONFIG_VIRTIO_ANCHOR=y
+CONFIG_VIRTIO_BALLOON=m
+CONFIG_VIRTIO_BLK=y
+CONFIG_VIRTIO_CONSOLE=y
+CONFIG_VIRTIO_DMA_SHARED_BUFFER=y
+CONFIG_VIRTIO_FS=y
+CONFIG_VIRTIO_INPUT=m
+CONFIG_VIRTIO_MENU=y
+CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y
+CONFIG_VIRTIO_MMIO=m
+CONFIG_VIRTIO_NET=y
+CONFIG_VIRTIO_PCI_LEGACY=y
+CONFIG_VIRTIO_PCI_LIB_LEGACY=m
+CONFIG_VIRTIO_PCI_LIB=m
+CONFIG_VIRTIO_PCI=m
+CONFIG_VIRTIO_VSOCKETS_COMMON=y
+CONFIG_VIRTIO_VSOCKETS=y
+CONFIG_VIRTIO=y
+CONFIG_VIRTUALIZATION=y
+CONFIG_VLAN_8021Q=y
+CONFIG_VMAP_PFN=y
+CONFIG_VMAP_STACK=y
+CONFIG_VMD=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_VMGENID=y
+CONFIG_VSOCKETS_DIAG=y
+CONFIG_VSOCKETS_LOOPBACK=y
+CONFIG_VSOCKETS=y
+CONFIG_VT_CONSOLE_SLEEP=y
+CONFIG_VT_CONSOLE=y
+CONFIG_VT_HW_CONSOLE_BINDING=y
+CONFIG_VT=y
+CONFIG_VXLAN=y
+CONFIG_WATCHDOG_CORE=m
+CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y
+CONFIG_WATCHDOG_OPEN_TIMEOUT=0
+CONFIG_WATCHDOG_SYSFS=y
+CONFIG_WATCHDOG=y
+CONFIG_WDAT_WDT=m
+CONFIG_WIREGUARD=y
+CONFIG_WIRELESS=y
+CONFIG_WMI_BMOF=y
+CONFIG_X509_CERTIFICATE_PARSER=y
+CONFIG_X86_64_ACPI_NUMA=y
+CONFIG_X86_64_SMP=y
+CONFIG_X86_64=y
+CONFIG_X86_ACPI_CPUFREQ_CPB=y
+CONFIG_X86_ACPI_CPUFREQ=y
+CONFIG_X86_AMD_PSTATE_DEFAULT_MODE=3
+CONFIG_X86_AMD_PSTATE=y
+CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK=y
+CONFIG_X86_CET=y
+CONFIG_X86_CHECK_BIOS_CORRUPTION=y
+CONFIG_X86_CMOV=y
+CONFIG_X86_CMPXCHG64=y
+CONFIG_X86_CPUID=y
+CONFIG_X86_DEBUGCTLMSR=y
+CONFIG_X86_DEBUG_FPU=y
+CONFIG_X86_DIRECT_GBPAGES=y
+CONFIG_X86_EXTENDED_PLATFORM=y
+CONFIG_X86_HV_CALLBACK_VECTOR=y
+CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS=y
+CONFIG_X86_INTEL_PSTATE=y
+CONFIG_X86_INTEL_TSX_MODE_OFF=y
+CONFIG_X86_INTERNODE_CACHE_SHIFT=6
+CONFIG_X86_IO_APIC=y
+CONFIG_X86_IOPL_IOPERM=y
+CONFIG_X86_KERNEL_IBT=y
+CONFIG_X86_L1_CACHE_SHIFT=6
+CONFIG_X86_LOCAL_APIC=y
+CONFIG_X86_MCE_AMD=y
+CONFIG_X86_MCE_INTEL=y
+CONFIG_X86_MCE_THRESHOLD=y
+CONFIG_X86_MCE=y
+CONFIG_X86_MEM_ENCRYPT=y
+CONFIG_X86_MINIMUM_CPU_FAMILY=64
+CONFIG_X86_MPPARSE=y
+CONFIG_X86_NEED_RELOCS=y
+CONFIG_X86_PAT=y
+CONFIG_X86_PCC_CPUFREQ=m
+CONFIG_X86_PKG_TEMP_THERMAL=y
+CONFIG_X86_PLATFORM_DEVICES=y
+CONFIG_X86_PM_TIMER=y
+CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
+CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y
+CONFIG_X86_THERMAL_VECTOR=y
+CONFIG_X86_TSC=y
+CONFIG_X86_UMIP=y
+CONFIG_X86_VERBOSE_BOOTUP=y
+CONFIG_X86_VMX_FEATURE_NAMES=y
+CONFIG_X86_VSYSCALL_EMULATION=y
+CONFIG_X86_X2APIC=y
+CONFIG_X86=y
+CONFIG_XDP_SOCKETS=y
+CONFIG_XFRM_AH=y
+CONFIG_XFRM_ALGO=y
+CONFIG_XFRM_ESP=y
+CONFIG_XFRM_IPCOMP=y
+CONFIG_XFRM_OFFLOAD=y
+CONFIG_XFRM_USER=y
+CONFIG_XFRM=y
+CONFIG_XFS_DRAIN_INTENTS=y
+CONFIG_XFS_FS=m
+CONFIG_XFS_LIVE_HOOKS=y
+CONFIG_XFS_MEMORY_BUFS=y
+CONFIG_XFS_ONLINE_SCRUB_STATS=y
+CONFIG_XFS_ONLINE_SCRUB=y
+CONFIG_XFS_POSIX_ACL=y
+CONFIG_XFS_QUOTA=y
+CONFIG_XFS_RT=y
+CONFIG_XFS_SUPPORT_ASCII_CI=y
+CONFIG_XFS_SUPPORT_V4=y
+CONFIG_XOR_BLOCKS=m
+CONFIG_XPS=y
+CONFIG_XXHASH=y
+CONFIG_XZ_DEC_ARMTHUMB=y
+CONFIG_XZ_DEC_ARM=y
+CONFIG_XZ_DEC_BCJ=y
+CONFIG_XZ_DEC_IA64=y
+CONFIG_XZ_DEC_POWERPC=y
+CONFIG_XZ_DEC_X86=y
+CONFIG_XZ_DEC=y
+CONFIG_ZISOFS=y
+CONFIG_ZLIB_DEFLATE=y
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZONE_DEVICE=y
+CONFIG_ZONE_DMA32=y
+CONFIG_ZONE_DMA=y
+CONFIG_ZONEFS_FS=m
+CONFIG_ZRAM_DEF_COMP="zstd"
+CONFIG_ZRAM_DEF_COMP_ZSTD=y
+CONFIG_ZRAM=m
+CONFIG_ZRAM_MULTI_COMP=y
+CONFIG_ZRAM_WRITEBACK=y
+CONFIG_ZSTD_COMMON=y
+CONFIG_ZSTD_COMPRESS=y
+CONFIG_ZSTD_DECOMPRESS=y
diff --git a/modules/config/minimal-modules.nix b/modules/config/minimal-modules.nix
deleted file mode 100644
index 45bdb1f..0000000
--- a/modules/config/minimal-modules.nix
+++ /dev/null
@@ -1,15 +0,0 @@
-{ config, ... }:
-{
-  boot = {
-    bootspec.enable = false;
-    initrd.kernelModules = config.boot.kernelModules;
-    kernel.enable = false; # No kernel or modules in the rootfs
-    modprobeConfig.enable = false;
-  };
-
-  system.build = {
-    inherit (config.boot.kernelPackages) kernel;
-  };
-
-  system.modulesTree = [ config.boot.kernelPackages.kernel ] ++ config.boot.extraModulePackages;
-}
diff --git a/modules/config/minimal-system.nix b/modules/config/minimal-system.nix
deleted file mode 100644
index c81d7d4..0000000
--- a/modules/config/minimal-system.nix
+++ /dev/null
@@ -1,25 +0,0 @@
-{ ... }:
-{
-
-  nixpkgs.overlays = [
-    (final: prev: {
-
-      composefs = final.callPackage ../../pkgs/composefs.nix { inherit prev; };
-      qemu_tiny = final.callPackage ../../pkgs/qemu.nix { inherit prev; };
-
-      systemd = prev.systemd.overrideAttrs (oldAttrs: {
-        mesonFlags = oldAttrs.mesonFlags ++ [
-          "-Dsysupdated=enabled"
-        ];
-      });
-      ## minimal inherit from systemd pkg, need to explicitly disable sysupdated
-      systemdMinimal = prev.systemdMinimal.overrideAttrs (oldAttrs: {
-        mesonFlags = oldAttrs.mesonFlags ++ [
-          "-Dsysupdated=disabled"
-        ];
-      });
-
-    })
-  ];
-
-}
diff --git a/modules/default.nix b/modules/default.nix
deleted file mode 100644
index 0a1a5e0..0000000
--- a/modules/default.nix
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  imports = [
-    ./config/minimal-modules.nix
-    ./config/minimal-system.nix
-  ];
-}
diff --git a/modules/image/builder.nix b/modules/image/builder.nix
deleted file mode 100644
index 4f194d8..0000000
--- a/modules/image/builder.nix
+++ /dev/null
@@ -1,196 +0,0 @@
-{
-  config,
-  lib,
-  options,
-  pkgs,
-  ...
-}:
-let
-  inherit (pkgs.stdenv.hostPlatform) efiArch;
-
-  initialPartitions = {
-    "10-root" = {
-      storePaths = [ config.system.build.toplevel ];
-      repartConfig = {
-        Type = "root";
-        Minimize = "best";
-        Format = "erofs";
-        MakeDirectories = "/home /root /etc /dev /sys /bin /var /proc /run /usr /usr/bin /srv /tmp /mnt /lib /boot";
-        Verity = "data";
-        VerityMatchKey = "root";
-        SplitName = "root";
-      };
-    };
-
-    "20-root-verity" = {
-      repartConfig = {
-        Type = "root-verity";
-        Minimize = "best";
-        Verity = "hash";
-        VerityMatchKey = "root";
-        SplitName = "verity";
-      };
-    };
-  };
-
-  # TODO: We don't need a combined image here - add dry-run flag to repart invocation
-  verityRepart = import (pkgs.path + "/nixos/lib/eval-config.nix") {
-    inherit lib pkgs;
-    system = null;
-    modules = [
-      (
-        { modulesPath, ... }:
-        {
-          imports = [ (modulesPath + "/image/repart.nix") ];
-          image.repart = {
-            name = "verity";
-            split = true;
-            mkfsOptions = lib.mkIf config.image.compress {
-              erofs = [
-                "-zlz4hc,level=12"
-                "-Efragments,dedupe,ztailpacking"
-              ];
-            };
-            partitions = initialPartitions;
-          };
-        }
-      )
-    ];
-  };
-
-  rootPart = "${verityRepart.config.system.build.image}/${verityRepart.config.image.repart.imageFileBasename}.root.raw";
-  verityPart = "${verityRepart.config.system.build.image}/${verityRepart.config.image.repart.imageFileBasename}.verity.raw";
-
-  verityImgAttrs = builtins.fromJSON (
-    builtins.readFile "${verityRepart.config.system.build.image}/repart-output.json"
-  );
-  rootAttrs = builtins.elemAt verityImgAttrs 0;
-  verityAttrs = builtins.elemAt verityImgAttrs 1;
-
-  rootUuid = rootAttrs.uuid;
-  verityUuid = verityAttrs.uuid;
-  verityRootHash = rootAttrs.roothash;
-
-  finalPartitions = {
-    "10-esp" = {
-      contents = {
-        "/EFI/BOOT/BOOT${lib.toUpper efiArch}.EFI".source = "${pkgs.systemdUkify}/lib/systemd/boot/efi/systemd-boot${efiArch}.efi";
-        "/EFI/Linux/${config.system.boot.loader.ukiFile}".source = "${config.system.build.uki}/${config.system.boot.loader.ukiFile}";
-        "/EFI/memtest86/memtest86.efi".source = "${pkgs.memtest86plus}/memtest.efi";
-        "/loader/entries/patos-factory-reset.conf".source = pkgs.writeText "patos-factory-reset.conf" ''
-            title Patos Factory Reset
-            efi /EFI/Linux/${config.system.boot.loader.ukiFile}
-            options ${toString config.boot.kernelParams} systemd.factory_reset=yes
-            sort-key z_factory_reset
-          '';
-        "/loader/entries/memtest86.conf".source = pkgs.writeText "memtest86.conf" ''
-            title Memtest86+
-            efi /EFI/memtest86/memtest86.efi
-            options console=ttyS0
-            sort-key z_memtest
-          '';
-        "/loader/loader.conf".source = pkgs.writeText "loader.conf" ''
-            timeout 2
-          '';
-      };
-      repartConfig = {
-        Type = "esp";
-        Format = "vfat";
-        SizeMinBytes = "96M";
-        SizeMaxBytes = "96M";
-        SplitName = "-";
-      };
-    };
-    "20-root-verity-a" = {
-      repartConfig = {
-        Type = "root-verity";
-        Label = "verity-${config.system.image.version}";
-        CopyBlocks = "${verityPart}";
-        SplitName = "-";
-        SizeMinBytes = "64M";
-        SizeMaxBytes = "64M";
-        UUID = "${verityUuid}";
-        ReadOnly = 1;
-      };
-    };
-    # TODO: Add signature partition for systemd-nspawn
-    "22-root-a" = {
-      repartConfig = {
-        Type = "root";
-        Label = "root-${config.system.image.version}";
-        CopyBlocks = "${rootPart}";
-        SplitName = "-";
-        UUID = "${rootUuid}";
-        ReadOnly = 1;
-      };
-    };
-  };
-
-  finalRepart = import (pkgs.path + "/nixos/lib/eval-config.nix") {
-    inherit lib pkgs;
-    system = null;
-    modules = [
-      (
-        { modulesPath, ... }:
-        {
-          imports = [ (modulesPath + "/image/repart.nix") ];
-          image.repart = {
-            name = "${config.system.image.id}";
-            partitions = finalPartitions;
-          };
-        }
-      )
-    ];
-  };
-
-in
-{
-
-  # This fields is immutable by default, but can be overridden.
-  options.system.nixos.codeName = lib.mkOption { readOnly = false; };
-  options.system.nixos.release = lib.mkOption { readOnly = false; };
-
-  # FIXME: Should be configured somehow
-  config.system.nixos = {
-    codeName = "Finn";
-    distroId = "patos";
-    distroName = "PatOS";
-    release = "2024-11";
-    variant_id = "server";
-    variantName = "Server";
-    vendorName = "PatOS";
-  };
-
-  options.image.compress = lib.mkEnableOption "image compression" // {
-    default = true;
-  };
-
-  config.system.build = {
-    inherit verityRootHash;
-
-    image =
-      (pkgs.linkFarm "image-release" [
-        {
-          name = "${config.system.image.id}_${config.system.image.version}.efi";
-          path = "${config.system.build.uki}/${config.system.boot.loader.ukiFile}";
-        }
-        {
-          name = "${config.system.image.id}_${config.system.image.version}_${verityUuid}.verity";
-          path = "${verityRepart.config.system.build.image}/${verityRepart.config.image.repart.imageFileBasename}.verity.raw";
-        }
-        {
-          name = "${config.system.image.id}_${config.system.image.version}_${rootUuid}.root";
-          path = "${verityRepart.config.system.build.image}/${verityRepart.config.image.repart.imageFileBasename}.root.raw";
-        }
-        {
-          name = "${config.system.image.id}_${config.system.image.version}.img";
-          path = "${finalRepart.config.system.build.image}/${finalRepart.config.image.repart.imageFileBasename}.raw";
-        }
-      ])
-      // {
-        imageFile = "${config.system.image.id}_${config.system.image.version}.img";
-      };
-
-  };
-
-}
diff --git a/modules/image/default.nix b/modules/image/default.nix
deleted file mode 100644
index 20d7fa7..0000000
--- a/modules/image/default.nix
+++ /dev/null
@@ -1,137 +0,0 @@
-{
-  config,
-  lib,
-  pkgs,
-  ...
-}:
-{
-
-  imports = [
-    ./updater.nix
-    ./builder.nix
-    ./veritysetup.nix
-  ];
-
-  system.build.updatePackage = pkgs.runCommand "update-package" { } ''
-    mkdir "$out"
-    cd "$out"
-    cp "${config.system.build.image}"/* .
-    ${pkgs.coreutils}/bin/sha256sum * > SHA256SUMS
-  '';
-
-  systemd.repart.partitions = {
-    "10-esp" = {
-      Type = "esp";
-      UUID = "c12a7328-f81f-11d2-ba4b-00a0c93ec93b"; # Well known
-      Format = "vfat";
-      SizeMinBytes = "96M";
-      SizeMaxBytes = "96M";
-    };
-    "20-root-verity-a" = {
-      Type = "root-verity";
-      SizeMinBytes = "64M";
-      SizeMaxBytes = "64M";
-    };
-    "22-root-a" = {
-      Type = "root";
-      SizeMinBytes = "512M";
-      SizeMaxBytes = "512M";
-    };
-    "30-root-verity-b" = {
-      Type = "root-verity";
-      SizeMinBytes = "64M";
-      SizeMaxBytes = "64M";
-      Label = "_empty";
-      ReadOnly = 1;
-    };
-    "32-root-b" = {
-      Type = "root";
-      SizeMinBytes = "512M";
-      SizeMaxBytes = "512M";
-      Label = "_empty";
-      ReadOnly = 1;
-    };
-    "40-var" = {
-      Type = "var";
-      UUID = "4d21b016-b534-45c2-a9fb-5c16e091fd2d"; # Well known
-      Format = "btrfs";
-      Label = "patos-state";
-      Minimize = "off";
-      FactoryReset = "yes";
-      Encrypt = "tpm2";
-      SizeMinBytes = "2G";
-      SplitName = "-";
-    };
-  };
-
-  boot.loader.grub.enable = false;
-  boot.loader.efi.canTouchEfiVariables = true;
-  boot.loader.systemd-boot.enable = true;
-  boot.uki.name = "patos";
-
-  boot.initrd = {
-    compressor = "zstd";
-    compressorArgs = [ "-8" ];
-
-    luks.forceLuksSupportInInitrd = true;
-    kernelModules = [
-      "dm_mod"
-      "dm_crypt"
-    ] ++ config.boot.initrd.luks.cryptoModules;
-
-    supportedFilesystems = {
-      btrfs = true;
-      erofs = true;
-    };
-
-    systemd.enable = true;
-    systemd.repart.enable = true;
-    systemd.services.systemd-repart = {
-      after = lib.mkForce [ "sysroot.mount" ];
-      requires = [ "sysroot.mount" ];
-      serviceConfig.Environment = [
-        "SYSTEMD_REPART_MKFS_OPTIONS_BTRFS=--nodiscard"
-      ];
-    };
-  };
-
-  system.etc.overlay.mutable = false;
-  users.mutableUsers = false;
-
-  boot.kernelParams = [
-    "rootfstype=erofs"
-    "rootflags=ro"
-    "roothash=${config.system.build.verityRootHash}"
-  ];
-
-  fileSystems =
-    let
-      parts = config.systemd.repart.partitions;
-    in
-    {
-      "/var" = {
-        fsType = parts."40-var".Format;
-        device = "/dev/mapper/var";
-        encrypted = {
-          enable = true;
-          blkDev = "/dev/disk/by-partuuid/${parts."40-var".UUID}";
-          label = "var";
-        };
-      };
-    };
-
-  # Required to mount the efi partition
-  boot.kernelModules = [
-    "vfat"
-    "nls_cp437"
-    "nls_iso8859-1"
-  ];
-
-  environment.etc."machine-id" = {
-    text = "";
-    mode = "0755";
-  };
-
-  # Refuse to boot on mount failure
-  systemd.targets."sysinit".requires = [ "local-fs.target" ];
-}
diff --git a/modules/image/updater.nix b/modules/image/updater.nix
deleted file mode 100644
index 7602cdc..0000000
--- a/modules/image/updater.nix
+++ /dev/null
@@ -1,89 +0,0 @@
-{ config, lib, ... }:
-{
-
-  options.system.image.updates = {
-    enable = lib.mkEnableOption "system updates via systemd-sysupdate" // {
-      default = config.system.image.updates.url != null;
-    };
-    url = lib.mkOption {
-      type = lib.types.nullOr lib.types.str;
-      default = null;
-    };
-  };
-
-  config = lib.mkIf config.system.image.updates.enable {
-
-    assertions = [
-      { assertion = config.system.image.updates.url != null; }
-    ];
-
-    systemd.additionalUpstreamSystemUnits = [
-      "systemd-bless-boot.service"
-      "boot-complete.target"
-      "dbus-org.freedesktop.sysupdate1.service"
-      "systemd-sysupdated.service"
-    ];
-
-    environment.etc."sysupdate.d/10-uki.transfer" = {
-      text = ''
-        [Source]
-        Path=${config.system.image.updates.url}
-        MatchPattern=${config.boot.uki.name}_@v.efi
-        Type=url-file
-
-        [Target]
-        InstancesMax=2
-        MatchPattern=${config.boot.uki.name}_@v+@l-@d.efi ${config.boot.uki.name}_@v+@l.efi ${config.boot.uki.name}_@v.efi
-        Mode=0444
-        Path=/EFI/Linux
-        PathRelativeTo=esp
-        TriesDone=0
-        TriesLeft=3
-        Type=regular-file
-
-        [Transfer]
-        Verify=no
-        '';
-    };
-
-    environment.etc."sysupdate.d/20-root.transfer" = {
-      text = ''
-        [Source]
-        Type=url-file
-        Path=${config.system.image.updates.url}
-        MatchPattern=${config.system.image.id}_@v_@u.verity
-
-        [Target]
-        Type=partition
-        Path=auto
-        MatchPattern=verity-@v
-        MatchPartitionType=root-verity
-        ReadOnly=1
-
-        [Transfer]
-        Verify=no
-        '';
-    };
-
-    environment.etc."sysupdate.d/22-root.transfer" = {
-      text = ''
-        [Source]
-        Type=url-file
-        Path=${config.system.image.updates.url}
-        MatchPattern=${config.system.image.id}_@v_@u.root
-
-        [Target]
-        Type=partition
-        Path=auto
-        MatchPattern=root-@v
-        MatchPartitionType=root
-        ReadOnly=1
-
-        [Transfer]
-        Verify=no
-        '';
-    };
-
-  };
-
-}
diff --git a/modules/image/veritysetup.nix b/modules/image/veritysetup.nix
deleted file mode 100644
index 1505b45..0000000
--- a/modules/image/veritysetup.nix
+++ /dev/null
@@ -1,39 +0,0 @@
-{ config, lib, ... }:
-{
-
-  options.boot.initrd.systemd.root = lib.mkOption {
-    type = lib.types.enum [
-      "fstab"
-      "gpt-auto"
-      ""
-    ];
-  };
-
-  config.boot.initrd = {
-
-    kernelModules = [
-      "dm_mod"
-      "dm_verity"
-    ];
-
-    systemd = {
-
-      # Required to activate systemd-fstab-generator
-      root = "";
-
-      additionalUpstreamUnits = [
-        "veritysetup-pre.target"
-        "veritysetup.target"
-        "remote-veritysetup.target"
-      ];
-
-      storePaths = [
-        "${config.boot.initrd.systemd.package}/lib/systemd/systemd-veritysetup"
-        "${config.boot.initrd.systemd.package}/lib/systemd/system-generators/systemd-veritysetup-generator"
-      ];
-
-    };
-
-  };
-
-}
diff --git a/modules/profiles/base.nix b/modules/profiles/base.nix
deleted file mode 100644
index bb6b37b..0000000
--- a/modules/profiles/base.nix
+++ /dev/null
@@ -1,97 +0,0 @@
-{
-  config,
-  lib,
-  pkgs,
-  modulesPath,
-  ...
-}:
-{
-  imports = [
-    (modulesPath + "/profiles/image-based-appliance.nix")
-    (modulesPath + "/profiles/perlless.nix")
-    (modulesPath + "/profiles/qemu-guest.nix")
-  ];
-
-  # system.forbiddenDependenciesRegexes = lib.mkForce [ ];
-
-  nixpkgs.flake.setNixPath = false;
-  nixpkgs.flake.setFlakeRegistry = false;
-  boot.enableContainers = false;
-
-  boot.kernelModules = [
-    "zram"
-    "usb_storage"
-    "uas"
-    "sd_mod"
-    "r8169"
-    "ehci-hcd"
-    "ehci-pci"
-    "xhci-hcd"
-    "xhci-pci"
-    "xhci-pci-renesas"
-    "nvme"
-    "virtio_net"
-    "9p"
-    "9pnet_virtio"
-  ];
-
-  system.etc.overlay.mutable = lib.mkDefault false;
-
-  systemd.watchdog = lib.mkDefault {
-    runtimeTime = "10s";
-    rebootTime = "30s";
-  };
-
-  zramSwap.enable = true;
-
-  # FIXME: fstrim should only be enabled for virtual machine images?
-  services.fstrim.enable = true;
-
-  users.allowNoPasswordLogin = true;
-  users.users.root.home = lib.mkForce "/";
-
-  security.sudo.enable = lib.mkDefault false;
-
-  security.polkit = {
-    enable = true;
-    extraConfig = ''
-      polkit.addRule(function(action, subject) {
-        if (subject.isInGroup("wheel")) {
-          return polkit.Result.YES;
-        }
-      });
-    '';
-  };
-
-  i18n.supportedLocales = [ "en_US.UTF-8/UTF-8" ];
-
-  # Console
-
-  systemd.enableEmergencyMode = false;
-  boot.consoleLogLevel = lib.mkDefault 1;
-  boot.kernelParams = [
-    "panic=1"
-    "boot.panic_on_fail"
-    # "nomodeset"
-    "console=ttyS0,115200n8"
-    "earlyprintk=ttyS0,115200n8"
-    "systemd.mask=systemd-vconsole-setup.service"  # FIXME: Figure out why vconsole-setup fails when loading keymap
-  ];
-
-  # This is vi country
-  programs.nano.enable = false;
-  programs.vim.enable = true;
-  programs.vim.defaultEditor = lib.mkDefault true;
-
-  # Temporary file
-  boot.tmp.useTmpfs = true;
-
-  # Logging
-  services.journald = {
-    storage = "volatile";
-    extraConfig = ''
-      SystemMaxUse=10M
-    '';
-  };
-
-}
diff --git a/modules/profiles/devel.nix b/modules/profiles/devel.nix
deleted file mode 100644
index 011f773..0000000
--- a/modules/profiles/devel.nix
+++ /dev/null
@@ -1,39 +0,0 @@
-{
-  modulesPath,
-  ...
-}:
-{
-
-  imports = [ ./server.nix ];
-
-  boot.kernel.sysctl = {
-    "net.ipv4.ip_unprivileged_port_start" = 0;
-  };
-
-  boot.kernelParams = [
-    "systemd.log_level=info"
-    "systemd.log_target=console"
-    "systemd.journald.forward_to_console"
-  ];
-
-  users.users."admin" = {
-    isNormalUser = true;
-    linger = true;
-    extraGroups = [ "wheel" ];
-    home = "/var/home/admin";
-  };
-
-  environment.etc = {
-    subuid = {
-      text = "admin:100000:65536";
-      mode = "0644";
-    };
-
-    subgid = {
-      text = "admin:100000:65536";
-      mode = "0644";
-    };
-  };
-
-  services.getty.autologinUser = "admin";
-}
diff --git a/modules/profiles/network.nix b/modules/profiles/network.nix
deleted file mode 100644
index ccc21cb..0000000
--- a/modules/profiles/network.nix
+++ /dev/null
@@ -1,65 +0,0 @@
-{ lib, ... }:
-{
-  # Use networkd
-  networking.useNetworkd = true;
-  systemd.network.wait-online.enable = true;
-
-  # Firewall
-  networking.firewall.enable = false;
-  networking.nftables.enable = lib.mkDefault true;
-
-  # DNS
-  services.resolved = {
-    fallbackDns = [ ]; # Disable fallback DNS. DNS will fail if resolvers are unconfigured
-    extraConfig = ''
-      DNSStubListener=no
-    '';
-
-  };
-
-  # Configuration
-  networking.hostName = "";
-
-  # Kernel
-  boot.kernel.sysctl = {
-    "net.core.default_qdisc" = "fq";                # FIXME: manage these with networkd?
-    "net.ipv4.tcp_congestion_control" = "bbr";
-  };
-
-  # Modules
-  boot.kernelModules = [
-    "ip_tables"
-    "x_tables"
-    "nf_tables"
-    "nft_ct"
-    "nft_log"
-    "nf_log_syslog"
-    "nft_fib"
-    "nft_fib_inet"
-    "nft_compat"
-    "nft_nat"
-    "nft_chain_nat"
-    "nft_masq"
-    "nfnetlink"
-    "xt_conntrack"
-    "nf_conntrack"
-    "nf_log_syslog"
-    "nf_nat"
-    "af_packet"
-    "bridge"
-    "veth"
-    "tcp_bbr"
-    "sch_fq_codel"
-    "ipt_rpfilter"
-    "ip6t_rpfilter"
-    "sch_fq"
-    "tun"
-    "tap"
-    "xt_MASQUERADE"
-    "xt_mark"
-    "xt_comment"
-    "xt_multiport"
-    "xt_addrtype"
-  ];
-
-}
diff --git a/modules/profiles/server.nix b/modules/profiles/server.nix
deleted file mode 100644
index 830762e..0000000
--- a/modules/profiles/server.nix
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  modulesPath,
-  ...
-}:
-{
-
-  imports = [
-    (modulesPath + "/profiles/minimal.nix")
-    ./network.nix
-    ./sysext.nix
-  ];
-
-  boot.kernelParams = [
-    "quiet"
-  ];
-
-  virtualisation.podman.enable = true;
-}
diff --git a/modules/profiles/sysext.nix b/modules/profiles/sysext.nix
deleted file mode 100644
index c356747..0000000
--- a/modules/profiles/sysext.nix
+++ /dev/null
@@ -1,23 +0,0 @@
-{ ... }:
-{
-  system.activationScripts.sysext = ''
-    mkdir -p /var/lib/confexts
-    mkdir -p /var/lib/extensions
-    mkdir -p /etc/systemd/extensions
-  '';
-
-  systemd.additionalUpstreamSystemUnits = [
-    "systemd-confext.service"
-    "systemd-sysext.service"
-  ];
-
-  # systemd.services."systemd-confext" = {
-  #   enable = true;
-  #   wantedBy = [ "multi-user.target" ];
-  # };
-
-  # systemd.services."systemd-sysext.service" = {
-  #   enable = true;
-  #   wantedBy = [ "multi-user.target" ];
-  # };
-}
diff --git a/pkgs/composefs.nix b/pkgs/composefs.nix
deleted file mode 100644
index 91e8443..0000000
--- a/pkgs/composefs.nix
+++ /dev/null
@@ -1,5 +0,0 @@
-{ prev, ... }:
-
-prev.composefs.overrideAttrs (final: prev: {
-  doCheck = false;
-})
diff --git a/pkgs/linux-firmware.nix b/pkgs/linux-firmware.nix
deleted file mode 100644
index 8f03d8c..0000000
--- a/pkgs/linux-firmware.nix
+++ /dev/null
@@ -1,12 +0,0 @@
-{ stdenv, lib
-, linux-firmware
-, fwDirs
-}: stdenv.mkDerivation {
-  pname = "linux-firmware-minimal";
-  version = linux-firmware.version;
-  buildCommand = lib.concatStringsSep "\n" (
-  [''mkdir -p "$out/lib/firmware"'']
-  ++ (map (name: ''
-    cp -r "${linux-firmware}/lib/firmware/${name}" "$out/lib/firmware/${name}"
-  '') fwDirs));
-}
diff --git a/pkgs/qemu.nix b/pkgs/qemu.nix
deleted file mode 100644
index 93e67dd..0000000
--- a/pkgs/qemu.nix
+++ /dev/null
@@ -1,30 +0,0 @@
-{ prev, pkgs, ... }:
-
-(prev.qemu_test.override {
-  enableDocs = false;
-  capstoneSupport = false;
-  guestAgentSupport = false;
-  tpmSupport = false;
-  libiscsiSupport = false;
-  usbredirSupport = false;
-  canokeySupport = false;
-  hostCpuTargets = [ "x86_64-softmmu" ];
-}).overrideDerivation (old: {
-  postFixup = ''
-    rm -r "$out/share/icons"
-    cp "${pkgs.OVMF.fd + "/FV/OVMF.fd"}" "$out/share/qemu/"
-  '';
-  configureFlags = old.configureFlags ++ [
-    "--disable-tcg"
-    "--disable-tcg-interpreter"
-    "--disable-docs"
-    "--disable-install-blobs"
-    "--disable-slirp"
-    "--disable-virtfs"
-    "--disable-virtfs-proxy-helper"
-    "--disable-vhost-user-blk-server"
-    "--without-default-features"
-    "--enable-kvm"
-    "--disable-tools"
-  ];
-})
diff --git a/pkgs/systemd-ukify.nix b/pkgs/systemd-ukify.nix
deleted file mode 100644
index b8e9d55..0000000
--- a/pkgs/systemd-ukify.nix
+++ /dev/null
@@ -1,48 +0,0 @@
-{ prev, ... }:
-
-prev.systemd.override {
-  withAcl = false;
-  withAnalyze = false;
-  withApparmor = false;
-  withAudit = false;
-  withEfi = true;
-  withCompression = false;
-  withCoredump = false;
-  withCryptsetup = false;
-  withRepart = false;
-  withDocumentation = false;
-  withFido2 = false;
-  withFirstboot = false;
-  withHomed = false;
-  withHostnamed = false;
-  withHwdb = false;
-  withImportd = false;
-  withIptables = false;
-  withKmod = false;
-  withLibBPF = false;
-  withLibidn2 = false;
-  withLocaled = false;
-  withLogind = false;
-  withMachined = false;
-  withNetworkd = false;
-  withNss = false;
-  withOomd = false;
-  withPam = false;
-  withPasswordQuality = false;
-  withPCRE2 = false;
-  withPolkit = false;
-  withPortabled = false;
-  withQrencode = false;
-  withRemote = false;
-  withResolved = false;
-  withShellCompletions = false;
-  withSysusers = false;
-  withSysupdate = false;
-  withTimedated = false;
-  withTimesyncd = false;
-  withTpm2Tss = false;
-  withUkify = true;
-  withUserDb = false;
-  withUtmp = false;
-  withVmspawn = false;
-}
diff --git a/systemd/0017-meson.build-do-not-create-systemdstatedir.patch b/systemd/0017-meson.build-do-not-create-systemdstatedir.patch
new file mode 100644
index 0000000..debcaab
--- /dev/null
+++ b/systemd/0017-meson.build-do-not-create-systemdstatedir.patch
@@ -0,0 +1,21 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: nikstur <nikstur@outlook.com>
+Date: Mon, 6 Nov 2023 22:51:38 +0100
+Subject: [PATCH] meson.build: do not create systemdstatedir
+
+---
+ meson.build | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/meson.build b/meson.build
+index bffda86845..cb5dcec0f9 100644
+--- a/meson.build
++++ b/meson.build
+@@ -2781,7 +2781,6 @@ install_data('LICENSE.GPL2',
+ install_subdir('LICENSES',
+                install_dir : docdir)
+ 
+-install_emptydir(systemdstatedir)
+ 
+ #####################################################################
+ 
diff --git a/systemd/default.nix b/systemd/default.nix
new file mode 100644
index 0000000..653296d
--- /dev/null
+++ b/systemd/default.nix
@@ -0,0 +1,315 @@
+{
+  fetchFromGitHub,
+  lib,
+  pkgs,
+  stdenv,
+  targetPackages,
+  ...
+}:
+let
+  version = "257.3";
+
+  # Use the command below to update `releaseTimestamp` on every (major) version
+  # change. More details in the commentary at mesonFlags.
+  # command:
+  #  $ curl -s https://api.github.com/repos/systemd/systemd/releases/latest | \
+  #     jq '.created_at|strptime("%Y-%m-%dT%H:%M:%SZ")|mktime'
+  releaseTimestamp = "1734643670";
+
+  pname = "systemd";
+in
+stdenv.mkDerivation (finalAttrs: {
+  inherit version;
+
+  pname = pname;
+
+  src = fetchFromGitHub {
+    owner = "systemd";
+    repo = "systemd";
+    rev = "v${version}";
+    hash = "sha256-GvRn55grHWR6M+tA86RMzqinuXNpPZzRB4ApuGN/ZvU=";
+  };
+
+  patches = [
+    ./0017-meson.build-do-not-create-systemdstatedir.patch
+  ];
+
+  nativeBuildInputs = with pkgs; [
+    bash
+    pkg-config
+    makeBinaryWrapper
+    gperf
+    ninja
+    meson
+    glibcLocales
+    getent
+    m4
+    autoPatchelfHook
+
+    intltool
+    gettext
+
+    libxslt
+    docbook_xsl
+    docbook_xml_dtd_42
+    docbook_xml_dtd_45
+    bash
+    (buildPackages.python3Packages.python.withPackages (
+      ps: with ps; [
+        lxml
+        jinja2
+        ps.pyelftools
+      ]
+    ))
+
+    bpftools
+    buildPackages.llvmPackages.clang
+    buildPackages.llvmPackages.libllvm
+  ];
+
+  outputs = [
+    "out"
+    "dev"
+  ];
+
+  separateDebugInfo = true;
+
+  autoPatchelfFlags = [ "--keep-libc" ];
+
+  hardeningDisable = [
+    # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111523
+    "trivialautovarinit"
+    # breaks clang -target bpf; should be fixed to filter target?
+    "zerocallusedregs"
+    "shadowstack"
+  ];
+
+  buildInputs = with pkgs; [
+    libxcrypt
+    libcap
+    libuuid
+    linuxHeaders
+    bashInteractive # for patch shebangs
+    libgcrypt
+    libgpg-error
+    openssl
+    acl
+    libapparmor
+    audit
+    zlib
+    bzip2
+    lz4
+    xz
+    zstd
+    elfutils
+    kexec-tools
+    kmod
+    libidn2
+    libseccomp
+    libselinux
+    iptables
+    p11-kit
+    libfido2
+    pam
+    pcre2
+    libbpf
+    tpm2-tss
+    qrencode
+    libarchive
+    (lib.getDev curl)
+    (lib.getDev cryptsetup.dev)
+    (python3Packages.python.withPackages (ps: with ps; [ pefile ]))
+    (llvmPackages.compiler-rt.override {
+      doFakeLibgcc = true;
+    })
+  ];
+
+  mesonBuildType = "release";
+
+  doCheck = false; # fails a bunch of tests
+
+  preConfigure = ''
+    mesonFlagsArray+=(-Dntp-servers="0.europe.pool.ntp.org 1.europe.pool.ntp.org 2.europe.pool.ntp.org 3.europe.pool.ntp.org")
+    export LC_ALL="en_US.UTF-8";
+  '';
+
+  postPatch =
+    ''
+      substituteInPlace src/basic/path-util.h --replace "@defaultPathNormal@" "${placeholder "out"}/bin/"
+    ''
+    + ''
+      substituteInPlace meson.build \
+        --replace "find_program('clang'" "find_program('${stdenv.cc.targetPrefix}clang'"
+    ''
+    + ''
+      substituteInPlace src/ukify/ukify.py \
+        --replace \
+        "'readelf'" \
+        "'${targetPackages.stdenv.cc.bintools.targetPrefix}readelf'" \
+        --replace \
+        "/usr/lib/systemd/boot/efi" \
+        "$out/lib/systemd/boot/efi"
+    ''
+    # Finally, patch shebangs in scripts used at build time. This must not patch
+    # scripts that will end up in the output, to avoid build platform references
+    # when cross-compiling.
+    + ''
+      shopt -s extglob
+      patchShebangs tools test src/!(rpm|kernel-install|ukify) src/kernel-install/test-kernel-install.sh
+    '';
+
+  # trigger the test -n "$DESTDIR" || mutate in upstreams build system
+  preInstall = ''
+    export DESTDIR=/
+  '';
+
+  mesonFlags = [
+
+    "--prefix=${placeholder "out"}"
+
+    # Options
+
+    # We bump this attribute on every (major) version change to ensure that we
+    # have known-good value for a timestamp that is in the (not so distant)
+    # past. This serves as a lower bound for valid system timestamps during
+    # startup. Systemd will reset the system timestamp if this date is +- 15
+    # years from the system time.
+    # See the systemd v250 release notes for further details:
+    #   https://github.com/systemd/systemd/blob/60e930fc3e6eb8a36fbc184773119eb8d2f30364/NEWS#L258-L266
+    (lib.mesonOption "time-epoch" releaseTimestamp)
+
+    (lib.mesonOption "version-tag" version)
+    (lib.mesonOption "mode" "release")
+    (lib.mesonOption "tty-gid" "3") # tty in NixOS has gid 3
+
+    (lib.mesonOption "debug-shell" "${pkgs.bashInteractive}/bin/bash")
+    (lib.mesonOption "pamconfdir" "${placeholder "out"}/etc/pam.d")
+    (lib.mesonOption "shellprofiledir" "${placeholder "out"}/etc/profile.d")
+    (lib.mesonOption "kmod-path" "${pkgs.kmod}/bin/kmod")
+    (lib.mesonOption "dbuspolicydir" "${placeholder "out"}/share/dbus-1/system.d")
+    (lib.mesonOption "dbussessionservicedir" "${placeholder "out"}/share/dbus-1/services")
+    (lib.mesonOption "dbussystemservicedir" "${placeholder "out"}/share/dbus-1/system-services")
+    # pkgconfig
+    (lib.mesonOption "pkgconfiglibdir" "${placeholder "dev"}/lib/pkgconfig")
+    (lib.mesonOption "pkgconfigdatadir" "${placeholder "dev"}/share/pkgconfig")
+
+    # SBAT
+    (lib.mesonOption "sbat-distro" "patos")
+    (lib.mesonOption "sbat-distro-summary" "PatOS")
+    (lib.mesonOption "sbat-distro-url" "https://patagia.io/")
+    (lib.mesonOption "sbat-distro-pkgname" pname)
+    (lib.mesonOption "sbat-distro-version" version)
+
+    # Users
+    (lib.mesonOption "system-uid-max" "999")
+    (lib.mesonOption "system-gid-max" "999")
+
+    # SysVinit
+    (lib.mesonOption "sysvinit-path" "")
+    (lib.mesonOption "sysvrcnd-path" "")
+
+    # SSH
+    # Disabled for now until someone makes this work.
+    (lib.mesonOption "sshconfdir" "no")
+    (lib.mesonOption "sshdconfdir" "no")
+
+    # Features
+
+    # Tests
+    (lib.mesonBool "tests" false)
+    (lib.mesonEnable "glib" false)
+    (lib.mesonEnable "dbus" false)
+
+    # Compression
+    (lib.mesonEnable "bzip2" true)
+    (lib.mesonEnable "lz4" true)
+    (lib.mesonEnable "xz" true)
+    (lib.mesonEnable "zstd" true)
+    (lib.mesonEnable "zlib" true)
+
+    # NSS
+    (lib.mesonEnable "nss-resolve" true)
+    (lib.mesonBool "nss-myhostname" true)
+    (lib.mesonBool "nss-systemd" true)
+
+    # Cryptsetup
+    (lib.mesonEnable "libcryptsetup" true)
+    (lib.mesonEnable "libcryptsetup-plugins" true)
+    (lib.mesonEnable "p11kit" true)
+
+    # FIDO2
+    (lib.mesonEnable "libfido2" true)
+    (lib.mesonEnable "openssl" true)
+
+    # Password Quality
+    (lib.mesonEnable "pwquality" false)
+    (lib.mesonEnable "passwdqc" false)
+
+    # Remote
+    (lib.mesonEnable "remote" false)
+    (lib.mesonEnable "microhttpd" false)
+
+    (lib.mesonEnable "pam" true)
+    (lib.mesonEnable "acl" true)
+    (lib.mesonEnable "audit" true)
+    (lib.mesonEnable "apparmor" true)
+    (lib.mesonEnable "gcrypt" true)
+    (lib.mesonEnable "importd" true)
+    (lib.mesonEnable "homed" true)
+    (lib.mesonEnable "polkit" true)
+    (lib.mesonEnable "elfutils" true)
+    (lib.mesonEnable "libcurl" true)
+    (lib.mesonEnable "libidn" false)
+    (lib.mesonEnable "libidn2" true)
+    (lib.mesonEnable "libiptc" true)
+    (lib.mesonEnable "repart" true)
+    (lib.mesonEnable "sysupdate" true)
+    (lib.mesonEnable "seccomp" true)
+    (lib.mesonEnable "selinux" true)
+    (lib.mesonEnable "tpm2" true)
+    (lib.mesonEnable "pcre2" true)
+    (lib.mesonEnable "bpf-framework" true)
+    (lib.mesonEnable "bootloader" true)
+    (lib.mesonEnable "ukify" true)
+    (lib.mesonEnable "kmod" true)
+    (lib.mesonEnable "qrencode" true)
+    (lib.mesonEnable "vmspawn" true)
+    (lib.mesonEnable "libarchive" true)
+    (lib.mesonEnable "xenctrl" false)
+    (lib.mesonEnable "gnutls" false)
+    (lib.mesonEnable "xkbcommon" false)
+    (lib.mesonEnable "man" true)
+
+    (lib.mesonBool "analyze" true)
+    (lib.mesonBool "logind" true)
+    (lib.mesonBool "localed" true)
+    (lib.mesonBool "hostnamed" true)
+    (lib.mesonBool "machined" true)
+    (lib.mesonBool "networkd" true)
+    (lib.mesonBool "oomd" true)
+    (lib.mesonBool "portabled" true)
+    (lib.mesonBool "hwdb" true)
+    (lib.mesonBool "timedated" true)
+    (lib.mesonBool "timesyncd" true)
+    (lib.mesonBool "userdb" true)
+    (lib.mesonBool "coredump" true)
+    (lib.mesonBool "firstboot" true)
+    (lib.mesonBool "resolve" true)
+    (lib.mesonBool "sysusers" true)
+    (lib.mesonBool "efi" true)
+    (lib.mesonBool "utmp" true)
+    (lib.mesonBool "log-trace" true)
+
+    (lib.mesonBool "kernel-install" true)
+    (lib.mesonBool "quotacheck" false)
+    (lib.mesonBool "ldconfig" false)
+    (lib.mesonBool "install-sysconfdir" false)
+    (lib.mesonBool "create-log-dirs" false)
+    (lib.mesonBool "smack" true)
+    (lib.mesonBool "b_pie" true)
+
+    (lib.mesonOption "bashcompletiondir" "no")
+    (lib.mesonOption "zshcompletiondir" "no")
+  ];
+
+})
diff --git a/systemd/result b/systemd/result
new file mode 120000
index 0000000..f1d0e21
--- /dev/null
+++ b/systemd/result
@@ -0,0 +1 @@
+/nix/store/jw8923rfwly76yb8ynp5r65cvg4g9m0f-systemd-257.3
\ No newline at end of file
diff --git a/tests/common.nix b/tests/common.nix
deleted file mode 100644
index 8e1c9af..0000000
--- a/tests/common.nix
+++ /dev/null
@@ -1,155 +0,0 @@
-{
-  self,
-  lib,
-  pkgs,
-  ...
-}:
-
-with import (pkgs.path + "/nixos/lib/testing-python.nix") {
-  inherit pkgs;
-  inherit (pkgs.hostPlatform) system;
-};
-
-let
-  qemu-common = import (pkgs.path + "/nixos/lib/qemu-common.nix") { inherit lib pkgs; };
-
-in
-rec {
-
-  makeSystem =
-    extraConfig:
-    (import (pkgs.path + "/nixos/lib/eval-config.nix")) {
-      inherit pkgs lib;
-      system = null;
-      modules = [
-        {
-          nixpkgs.hostPlatform = pkgs.hostPlatform;
-        }
-        {
-          users.allowNoPasswordLogin = true;
-          system.stateVersion = lib.versions.majorMinor lib.version;
-          system.image.id = lib.mkDefault "test";
-          system.image.version = lib.mkDefault "1";
-          networking.hosts."10.0.2.1" = [ "server.test" ];
-        }
-        {
-          boot.kernelParams = [
-            "console=ttyS0,115200n8"
-            "systemd.journald.forward_to_console=1"
-          ];
-          image.compress = false;
-          boot.uki.name = lib.mkForce "test";
-          boot.initrd.compressor = lib.mkForce "zstd";
-          boot.initrd.compressorArgs = lib.mkForce [ "-8" ];
-        }
-        (pkgs.path + "/nixos/modules/testing/test-instrumentation.nix")
-        self.nixosModules.devel
-        self.nixosModules.image
-        extraConfig
-      ];
-    };
-
-  makeImage =
-    extraConfig:
-    let
-      system = makeSystem extraConfig;
-    in
-    "${system.config.system.build.image}/${system.config.system.build.image.imageFile}";
-
-  makeUpdatePackage =
-    extraConfig:
-    let
-      system = makeSystem extraConfig;
-    in
-    "${system.config.system.build.updatePackage}";
-
-  makeImageTest =
-    {
-      name,
-      image,
-      script,
-      httpRoot ? null,
-    }:
-    let
-      qemu = qemu-common.qemuBinary pkgs.qemu_test;
-      flags = [
-        "-m"
-        "512M"
-        "-drive"
-        "if=pflash,format=raw,unit=0,readonly=on,file=${pkgs.OVMF.firmware}"
-        "-drive"
-        "if=pflash,format=raw,unit=1,readonly=on,file=${pkgs.OVMF.variables}"
-        "-drive"
-        "if=virtio,file=${mutableImage}"
-        "-chardev"
-        "socket,id=chrtpm,path=${tpmFolder}/swtpm-sock"
-        "-tpmdev"
-        "emulator,id=tpm0,chardev=chrtpm"
-        "-device"
-        "tpm-tis,tpmdev=tpm0"
-        "-netdev"
-        (
-          "'user,id=net0"
-          + (lib.optionalString (
-            httpRoot != null
-          ) ",guestfwd=tcp:10.0.2.1:80-cmd:${pkgs.micro-httpd}/bin/micro_httpd ${httpRoot}")
-          + "'"
-        )
-        "-device"
-        "virtio-net-pci,netdev=net0"
-      ];
-      flagsStr = lib.concatStringsSep " " flags;
-      startCommand = "${qemu} ${flagsStr}";
-      mutableImage = "/tmp/linked-image.qcow2";
-      tpmFolder = "/tmp/emulated_tpm";
-      indentLines = str: lib.concatLines (map (s: "  " + s) (lib.splitString "\n" str));
-    in
-    makeTest {
-      inherit name;
-      nodes = { };
-      testScript =
-        ''
-          import os
-          import subprocess
-
-          subprocess.check_call(
-              [
-                  "qemu-img",
-                  "create",
-                  "-f",
-                  "qcow2",
-                  "-F",
-                  "raw",
-                  "-b",
-                  "${image}",
-                  "${mutableImage}",
-              ]
-          )
-          subprocess.check_call(["qemu-img", "resize", "${mutableImage}", "4G"])
-
-          os.mkdir("${tpmFolder}")
-          os.mkdir("${tpmFolder}/swtpm")
-
-          def start_tpm():
-            subprocess.Popen(
-                [
-                    "${pkgs.swtpm}/bin/swtpm",
-                    "socket",
-                    "--tpmstate", "dir=${tpmFolder}/swtpm",
-                    "--ctrl", "type=unixio,path=${tpmFolder}/swtpm-sock",
-                    "--tpm2"
-                ]
-            )
-
-          machine = create_machine("${startCommand}")
-
-          try:
-        ''
-        + indentLines script
-        + ''
-          finally:
-            machine.shutdown()
-        '';
-    };
-
-}
diff --git a/tests/lib.nix b/tests/lib.nix
deleted file mode 100644
index 4b905fa..0000000
--- a/tests/lib.nix
+++ /dev/null
@@ -1,9 +0,0 @@
-test:
-{ pkgs, self }:
-  let nixos-lib = import (pkgs.path + "/nixos/lib") {};
-in (nixos-lib.runTest {
-  hostPkgs = pkgs;
-  defaults.documentation.enable = false;
-  node.specialArgs = { inherit self; };
-  imports = [ test ];
-}).config.result
diff --git a/tests/podman.nix b/tests/podman.nix
deleted file mode 100644
index 0a3747f..0000000
--- a/tests/podman.nix
+++ /dev/null
@@ -1,22 +0,0 @@
-{ pkgs, self }: let
-
-  lib = pkgs.lib;
-  test-common = import ./common.nix { inherit self lib pkgs; };
-
-  image = test-common.makeImage { };
-
-in test-common.makeImageTest {
-  name = "podman";
-  inherit image;
-  script = ''
-    start_tpm()
-    machine.start()
-
-    machine.wait_for_unit("multi-user.target")
-    machine.wait_for_unit("network-online.target")
-
-    machine.succeed("tar cv --files-from /dev/null | su admin -l -c 'podman import - scratchimg'")
-
-    machine.succeed("su admin -l -c 'podman run --rm -v /nix/store:/nix/store -v /run/current-system/sw/bin:/bin scratchimg true'")
-  '';
-}
diff --git a/tests/system-update.nix b/tests/system-update.nix
deleted file mode 100644
index 26f793e..0000000
--- a/tests/system-update.nix
+++ /dev/null
@@ -1,45 +0,0 @@
-{ pkgs, self }: let
-
-  lib = pkgs.lib;
-  test-common = import ./common.nix { inherit self lib pkgs; };
-
-  initialImage = test-common.makeImage {
-    system.image.version = "1";
-    system.image.updates.url = "http://server.test/";
-    # The default root-b is too small for uncompressed test images
-    systemd.repart.partitions."32-root-b" = {
-      SizeMinBytes = lib.mkForce "1G";
-      SizeMaxBytes = lib.mkForce "1G";
-    };
-  };
-
-  updatePackage = test-common.makeUpdatePackage {
-    system.image.version = "2";
-    system.image.updates.url = "http://server.test/";
-  };
-
-in test-common.makeImageTest {
-  name = "system-update";
-  image = initialImage;
-  httpRoot = updatePackage;
-  script = ''
-    start_tpm()
-    machine.start()
-
-    machine.wait_for_unit("multi-user.target")
-    machine.wait_for_unit("network-online.target")
-
-    machine.succeed("/run/current-system/sw/lib/systemd/systemd-sysupdate update")
-
-    machine.shutdown()
-
-    start_tpm()
-    machine.start()
-
-    machine.wait_for_unit("multi-user.target")
-
-    machine.succeed('. /etc/os-release; [ "$IMAGE_VERSION" == "2" ]')
-
-    machine.wait_for_unit("systemd-bless-boot.service")
-  '';
-}
diff --git a/utils/qemu-uefi-tpm.nix b/utils/qemu-uefi-tpm.nix
deleted file mode 100644
index bde07ab..0000000
--- a/utils/qemu-uefi-tpm.nix
+++ /dev/null
@@ -1,50 +0,0 @@
-{
-  config,
-  pkgs,
-  ...
-}:
-pkgs.writeShellApplication {
-  name = "qemu-uefi-tpm";
-
-  runtimeInputs = with pkgs; [
-    qemu
-    swtpm
-  ];
-
-  text =
-    let
-      tpmOVMF = pkgs.OVMF.override { tpmSupport = true; };
-    in
-    ''
-      set -ex
-      state="/tmp/patos-qemu-$USER"
-      rm -rf "$state"
-      mkdir -m 700 "$state"
-      qemu-img create -f qcow2 -F raw -b "$(readlink -e "$1")" "$state/disk.qcow2" 10G
-
-      swtpm socket -d --tpmstate dir="$state" \
-        --ctrl type=unixio,path="$state/swtpm-sock" \
-        --tpm2 \
-        --log level=20
-
-      qemu-system-x86_64 \
-        -enable-kvm \
-        -machine q35,accel=kvm \
-        -cpu host \
-        -smp 8 \
-        -m 4G \
-        -display none \
-        -virtfs "local,path=/tmp,security_model=mapped,mount_tag=shared" \
-        -chardev "stdio,id=char0,mux=on,logfile=$state/console.log,signal=off" \
-        -serial chardev:char0 \
-        -mon chardev=char0 \
-        -drive "if=pflash,format=raw,unit=0,readonly=on,file=${tpmOVMF.firmware}" \
-        -drive "if=pflash,format=raw,unit=1,readonly=on,file=${tpmOVMF.variables}" \
-        -chardev socket,id=chrtpm,path="$state/swtpm-sock" \
-        -tpmdev emulator,id=tpm0,chardev=chrtpm \
-        -device tpm-tis,tpmdev=tpm0 \
-        -netdev id=net00,type=user,hostfwd=tcp::2222-:22 \
-        -device virtio-net-pci,netdev=net00 \
-        -drive "format=qcow2,file=$state/disk.qcow2"
-    '';
-}

From faf5fce8a407a0469ae475f773cba2e9e1145c3f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Mon, 17 Feb 2025 09:17:58 +0100
Subject: [PATCH 06/78] chore(systemd): remove nix store ref and disable some
 features

---
 systemd/default.nix | 42 +++++++++++++++++++++---------------------
 systemd/result      |  1 -
 2 files changed, 21 insertions(+), 22 deletions(-)
 delete mode 120000 systemd/result

diff --git a/systemd/default.nix b/systemd/default.nix
index 653296d..99e4684 100644
--- a/systemd/default.nix
+++ b/systemd/default.nix
@@ -30,6 +30,8 @@ stdenv.mkDerivation (finalAttrs: {
     hash = "sha256-GvRn55grHWR6M+tA86RMzqinuXNpPZzRB4ApuGN/ZvU=";
   };
 
+  dontCheckForBrokenSymlinks = true;
+
   patches = [
     ./0017-meson.build-do-not-create-systemdstatedir.patch
   ];
@@ -160,12 +162,18 @@ stdenv.mkDerivation (finalAttrs: {
 
   # trigger the test -n "$DESTDIR" || mutate in upstreams build system
   preInstall = ''
-    export DESTDIR=/
+    export DESTDIR=${placeholder "out"}
   '';
 
   mesonFlags = [
 
-    "--prefix=${placeholder "out"}"
+    "--prefix=/usr"
+    "--sysconfdir=/etc"
+    "--localstatedir=/var"
+    "--libdir=/usr/lib"
+    "--bindir=/bin"
+    "--includedir=/usr/include"
+    "--localedir=/usr/share/locale"
 
     # Options
 
@@ -182,16 +190,7 @@ stdenv.mkDerivation (finalAttrs: {
     (lib.mesonOption "mode" "release")
     (lib.mesonOption "tty-gid" "3") # tty in NixOS has gid 3
 
-    (lib.mesonOption "debug-shell" "${pkgs.bashInteractive}/bin/bash")
-    (lib.mesonOption "pamconfdir" "${placeholder "out"}/etc/pam.d")
-    (lib.mesonOption "shellprofiledir" "${placeholder "out"}/etc/profile.d")
-    (lib.mesonOption "kmod-path" "${pkgs.kmod}/bin/kmod")
-    (lib.mesonOption "dbuspolicydir" "${placeholder "out"}/share/dbus-1/system.d")
-    (lib.mesonOption "dbussessionservicedir" "${placeholder "out"}/share/dbus-1/services")
-    (lib.mesonOption "dbussystemservicedir" "${placeholder "out"}/share/dbus-1/system-services")
-    # pkgconfig
-    (lib.mesonOption "pkgconfiglibdir" "${placeholder "dev"}/lib/pkgconfig")
-    (lib.mesonOption "pkgconfigdatadir" "${placeholder "dev"}/share/pkgconfig")
+    (lib.mesonOption "kmod-path" "/bin/kmod")
 
     # SBAT
     (lib.mesonOption "sbat-distro" "patos")
@@ -249,13 +248,13 @@ stdenv.mkDerivation (finalAttrs: {
     (lib.mesonEnable "remote" false)
     (lib.mesonEnable "microhttpd" false)
 
-    (lib.mesonEnable "pam" true)
+    (lib.mesonEnable "pam" false)
     (lib.mesonEnable "acl" true)
     (lib.mesonEnable "audit" true)
     (lib.mesonEnable "apparmor" true)
     (lib.mesonEnable "gcrypt" true)
     (lib.mesonEnable "importd" true)
-    (lib.mesonEnable "homed" true)
+    (lib.mesonEnable "homed" false)
     (lib.mesonEnable "polkit" true)
     (lib.mesonEnable "elfutils" true)
     (lib.mesonEnable "libcurl" true)
@@ -264,6 +263,7 @@ stdenv.mkDerivation (finalAttrs: {
     (lib.mesonEnable "libiptc" true)
     (lib.mesonEnable "repart" true)
     (lib.mesonEnable "sysupdate" true)
+    (lib.mesonEnable "sysupdated" true)
     (lib.mesonEnable "seccomp" true)
     (lib.mesonEnable "selinux" true)
     (lib.mesonEnable "tpm2" true)
@@ -273,16 +273,16 @@ stdenv.mkDerivation (finalAttrs: {
     (lib.mesonEnable "ukify" true)
     (lib.mesonEnable "kmod" true)
     (lib.mesonEnable "qrencode" true)
-    (lib.mesonEnable "vmspawn" true)
+    (lib.mesonEnable "vmspawn" false)
     (lib.mesonEnable "libarchive" true)
     (lib.mesonEnable "xenctrl" false)
     (lib.mesonEnable "gnutls" false)
     (lib.mesonEnable "xkbcommon" false)
-    (lib.mesonEnable "man" true)
+    (lib.mesonEnable "man" false)
 
     (lib.mesonBool "analyze" true)
-    (lib.mesonBool "logind" true)
-    (lib.mesonBool "localed" true)
+    (lib.mesonBool "logind" false)
+    (lib.mesonBool "localed" false)
     (lib.mesonBool "hostnamed" true)
     (lib.mesonBool "machined" true)
     (lib.mesonBool "networkd" true)
@@ -291,7 +291,7 @@ stdenv.mkDerivation (finalAttrs: {
     (lib.mesonBool "hwdb" true)
     (lib.mesonBool "timedated" true)
     (lib.mesonBool "timesyncd" true)
-    (lib.mesonBool "userdb" true)
+    (lib.mesonBool "userdb" false)
     (lib.mesonBool "coredump" true)
     (lib.mesonBool "firstboot" true)
     (lib.mesonBool "resolve" true)
@@ -303,8 +303,8 @@ stdenv.mkDerivation (finalAttrs: {
     (lib.mesonBool "kernel-install" true)
     (lib.mesonBool "quotacheck" false)
     (lib.mesonBool "ldconfig" false)
-    (lib.mesonBool "install-sysconfdir" false)
-    (lib.mesonBool "create-log-dirs" false)
+    (lib.mesonBool "install-sysconfdir" true)
+    (lib.mesonBool "create-log-dirs" true)
     (lib.mesonBool "smack" true)
     (lib.mesonBool "b_pie" true)
 
diff --git a/systemd/result b/systemd/result
deleted file mode 120000
index f1d0e21..0000000
--- a/systemd/result
+++ /dev/null
@@ -1 +0,0 @@
-/nix/store/jw8923rfwly76yb8ynp5r65cvg4g9m0f-systemd-257.3
\ No newline at end of file

From dbd4e729ded250d7ddb8993e6e2fd6486a3988ed Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Mon, 17 Feb 2025 15:15:24 +0100
Subject: [PATCH 07/78] silly uki image with the systemd-ukify tooling

---
 .gitignore            |   2 +
 flake.nix             | 151 +++++++++++++++++++++++++++++++++++++++++-
 glibc/default.nix     |  57 ++++++++++++++++
 kernel/generic.config |   8 ---
 systemd/default.nix   |  23 +++++--
 5 files changed, 225 insertions(+), 16 deletions(-)
 create mode 100644 glibc/default.nix

diff --git a/.gitignore b/.gitignore
index 08acf41..6833589 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,8 @@
 .task
 /result
 /target
+/out
+/initrd.gz
 .*.swp
 .*.swo
 .nixos-test-history
diff --git a/flake.nix b/flake.nix
index 6a4e60f..866ed43 100644
--- a/flake.nix
+++ b/flake.nix
@@ -21,11 +21,160 @@
         packages = {
           default = self.packages.${system}.image;
           image = pkgs.writeShellScriptBin "image" ''
-            echo "make image here..."
+            echo "make UKI..."
+            echo ${self.packages.${system}.kernel.kernel}/bzImage
+            ${self.packages.${system}.systemd.out}/usr/bin/ukify build \
+            --linux ${self.packages.${system}.kernel.kernel}/bzImage \
+            --initrd ./initrd.gz \
+            --cmdline "console=ttyS0" \
+            -o patos.efi
           '';
 
           kernel = pkgs.callPackage ./kernel { };
+          glibc = pkgs.callPackage ./glibc { };
           systemd = pkgs.callPackage ./systemd { };
+
+          mkinitrd = pkgs.writeShellScriptBin "mkinitrd" ''
+            echo "make initrd..."
+            mkdir -p out
+
+            # copy systemd
+            cp -Pr ${self.packages.${system}.systemd.out}/* out/
+            pushd out
+
+            find . -type d -exec chmod 755 {} \;
+
+            # Copy kernel modules
+            cp -Pr ${self.packages.${system}.kernel.kernel}/lib/modules ./usr/lib/
+            find usr/lib/modules -type d -exec chmod 755 {} \;
+
+            mkdir -p dev proc sys tmp root
+            ln -sf usr/bin bin
+            ln -sf usr/bin sbin
+            ln -sf usr/lib lib
+            ln -sf usr/lib lib64
+
+            ln -sf ../proc/self/mounts etc/mtab
+            ln -sf ../usr/lib/systemd/systemd init
+
+            echo patos > ./etc/hostname
+            cat <<EOF > ./etc/os-release
+            NAME="PatOS"
+            PRETTY_NAME="PatOS Platform"
+            ID=patos
+            EOF
+
+            cat <<EOF > ./etc/passwd
+            root::0:0:root:/root:/bin/sh
+            bin:x:1:1:bin:/bin:/usr/bin/nologin
+            daemon:x:2:2:daemon:/:/usr/bin/nologin
+            mail:x:8:12:mail:/var/spool/mail:/usr/bin/nologin
+            ftp:x:14:11:ftp:/srv/ftp:/usr/bin/nologin
+            http:x:33:33:http:/srv/http:/usr/bin/nologin
+            uuidd:x:68:68:uuidd:/:/usr/bin/nologin
+            dbus:x:81:81:dbus:/:/usr/bin/nologin
+            nobody:x:99:99:nobody:/:/usr/bin/nologin
+            EOF
+            chmod 644 ./etc/passwd
+
+            cat <<EOF > ./etc/group
+            root:x:0:root
+            bin:x:1:root,bin,daemon
+            daemon:x:2:root,bin,daemon
+            sys:x:3:root,bin
+            adm:x:4:root,daemon
+            tty:x:5:
+            disk:x:6:root
+            lp:x:7:daemon
+            mem:x:8:
+            kmem:x:9:
+            wheel:x:10:root
+            ftp:x:11:
+            mail:x:12:
+            uucp:x:14:
+            log:x:19:root
+            utmp:x:20:
+            locate:x:21:
+            rfkill:x:24:
+            smmsp:x:25:
+            proc:x:26:
+            http:x:33:
+            games:x:50:
+            lock:x:54:
+            uuidd:x:68:
+            dbus:x:81:
+            network:x:90:
+            video:x:91:
+            audio:x:92:
+            optical:x:93:
+            floppy:x:94:
+            storage:x:95:
+            scanner:x:96:
+            input:x:97:
+            power:x:98:
+            nobody:x:99:
+            EOF
+            chmod 644 ./etc/group
+
+            # FIXME: remove this
+            cat <<EOF > usr/lib/systemd/system/demo.service
+            [Unit]
+            Description=Debug Shell (/bin/sulogin)
+            Conflicts=shutdown.target
+            Before=shutdown.target
+
+            [Service]
+            Environment=HOME=/root
+            WorkingDirectory=/root
+            ExecStart=/bin/sulogin
+            Type=idle
+            StandardInput=tty-force
+            StandardOutput=inherit
+            StandardError=inherit
+            KillMode=process
+            IgnoreSIGPIPE=no
+            SendSIGHUP=yes
+            Restart=always
+
+            [Install]
+            WantedBy=basic.target
+            EOF
+            mkdir usr/lib/systemd/system/basic.target.wants
+            ln -sf ../demo.service usr/lib/systemd/system/basic.target.wants/demo.service
+
+            # set default target
+            ln -sf basic.target usr/lib/systemd/system/default.target
+            # remove first boot
+            rm -f usr/lib/systemd/system/sysinit.target.wants/systemd-firstboot.service
+            # remove vconsole setup
+            rm -f usr/lib/udev/rules.d/90-vconsole.rules
+
+            # install busybox
+            cp ${pkgs.busybox.out}/bin/busybox usr/bin/
+            usr/bin/busybox --list | xargs -I {} ln -sf busybox usr/bin/{}
+
+            # install lib kmod
+            cp -P ${pkgs.kmod.lib}/lib/* ./usr/lib
+            cp -P ${pkgs.kmod.out}/bin/* ./usr/bin
+            cp -P ${pkgs.libbpf.out}/lib/libbpf* ./usr/lib
+
+            # get shared libs
+            find . -type f -executable | xargs ldd 2> /dev/null | awk '{print $3}' | grep -v systemd | sort -u | xargs cp -t usr/lib
+            find . -type f -executable | xargs chmod 755
+
+            # FIXME: hacky(?) ELF patching. Is there a better way????????
+            find . -type f -executable -print | xargs -I {} ${pkgs.lib.getExe pkgs.patchelf} --set-rpath /lib:/usr/lib:/usr/lib/systemd {} 2> /dev/null
+            find . -type f -executable -print | xargs -I {} ${pkgs.lib.getExe pkgs.patchelf} --set-interpreter /lib/ld-linux-x86-64.so.2 {} 2> /dev/null
+            cp ${
+              self.packages.${system}.glibc.out
+            }/lib/ld-linux-x86-64.so.2 lib/ && ${pkgs.lib.getExe pkgs.patchelf} --remove-rpath lib/ld-linux-x86-64.so.2
+
+            # strip binaries
+            find . -type f -executable | xargs strip 2> /dev/null
+
+            # gen initrd
+            find . -print0 | ${pkgs.lib.getExe pkgs.cpio} --null --owner=root:root -o --format=newc | ${pkgs.lib.getExe pkgs.gzip} -9 > ../initrd.gz
+          '';
         };
 
         checks = {
diff --git a/glibc/default.nix b/glibc/default.nix
new file mode 100644
index 0000000..65bebc3
--- /dev/null
+++ b/glibc/default.nix
@@ -0,0 +1,57 @@
+{
+  fetchurl,
+  pkgs,
+  stdenv,
+
+  ...
+}:
+let
+  version = "2.40";
+  pname = "glibcStandalone";
+in
+stdenv.mkDerivation (finalAttrs: {
+  inherit version;
+
+  pname = pname;
+
+  src = fetchurl {
+    url = "mirror://gnu/glibc/glibc-${version}.tar.xz";
+    sha256 = "sha256-GaiQF16SY9dI9ieZPeb0sa+c0h4D8IDkv7Oh+sECBaI=";
+  };
+
+  enableParallelBuilding = true;
+
+  configureFlags = [
+    "--prefix=/"
+    "--libdir=/lib"
+    "--bindir=/bin"
+    "--sysconfdir=/etc"
+  ];
+
+  preConfigure =
+    ''
+      export PWD_P=$(type -tP pwd)
+      for i in configure io/ftwtest-sh; do
+          sed -i "$i" -e "s^/bin/pwd^$PWD_P^g"
+      done
+
+      mkdir ../build
+      cd ../build
+
+      configureScript="`pwd`/../$sourceRoot/configure"
+    '';
+
+  nativeBuildInputs = with pkgs; [
+      bison
+      python3Minimal
+  ];
+
+  outputs = [
+    "out"
+  ];
+
+  preInstall = ''
+    export DESTDIR=${placeholder "out"}
+  '';
+
+})
diff --git a/kernel/generic.config b/kernel/generic.config
index 2073cdf..7e0325c 100644
--- a/kernel/generic.config
+++ b/kernel/generic.config
@@ -1397,14 +1397,6 @@ CONFIG_MMU=y
 CONFIG_MODPROBE_PATH="/sbin/modprobe"
 CONFIG_MODULE_COMPRESS_ZSTD=y
 CONFIG_MODULE_FORCE_UNLOAD=y
-CONFIG_MODULE_SIG_ALL=y
-CONFIG_MODULE_SIG_FORCE=y
-CONFIG_MODULE_SIG_FORMAT=y
-CONFIG_MODULE_SIG_HASH="sha512"
-CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"
-CONFIG_MODULE_SIG_KEY_TYPE_RSA=y
-CONFIG_MODULE_SIG_SHA512=y
-CONFIG_MODULE_SIG=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_MODULE_UNLOAD=y
 CONFIG_MODULES_TREE_LOOKUP=y
diff --git a/systemd/default.nix b/systemd/default.nix
index 99e4684..3174f0f 100644
--- a/systemd/default.nix
+++ b/systemd/default.nix
@@ -137,9 +137,6 @@ stdenv.mkDerivation (finalAttrs: {
 
   postPatch =
     ''
-      substituteInPlace src/basic/path-util.h --replace "@defaultPathNormal@" "${placeholder "out"}/bin/"
-    ''
-    + ''
       substituteInPlace meson.build \
         --replace "find_program('clang'" "find_program('${stdenv.cc.targetPrefix}clang'"
     ''
@@ -150,7 +147,7 @@ stdenv.mkDerivation (finalAttrs: {
         "'${targetPackages.stdenv.cc.bintools.targetPrefix}readelf'" \
         --replace \
         "/usr/lib/systemd/boot/efi" \
-        "$out/lib/systemd/boot/efi"
+        "$out/usr/lib/systemd/boot/efi"
     ''
     # Finally, patch shebangs in scripts used at build time. This must not patch
     # scripts that will end up in the output, to avoid build platform references
@@ -171,7 +168,7 @@ stdenv.mkDerivation (finalAttrs: {
     "--sysconfdir=/etc"
     "--localstatedir=/var"
     "--libdir=/usr/lib"
-    "--bindir=/bin"
+    "--bindir=/usr/bin"
     "--includedir=/usr/include"
     "--localedir=/usr/share/locale"
 
@@ -190,7 +187,19 @@ stdenv.mkDerivation (finalAttrs: {
     (lib.mesonOption "mode" "release")
     (lib.mesonOption "tty-gid" "3") # tty in NixOS has gid 3
 
-    (lib.mesonOption "kmod-path" "/bin/kmod")
+    (lib.mesonOption "kmod-path" "/usr/bin/kmod")
+    (lib.mesonOption "debug-shell" "/usr/bin/sh")
+    (lib.mesonOption "pamconfdir" "/etc/pam.d")
+    (lib.mesonOption "shellprofiledir" "/etc/profile.d")
+    (lib.mesonOption "dbuspolicydir" "/usr/share/dbus-1/system.d")
+    (lib.mesonOption "dbussessionservicedir" "/usr/share/dbus-1/services")
+    (lib.mesonOption "dbussystemservicedir" "/usr/share/dbus-1/system-services")
+    (lib.mesonOption "setfont-path" "/usr/bin/setfont")
+    (lib.mesonOption "loadkeys-path" "/usr/bin/loadkeys")
+    (lib.mesonOption "sulogin-path"  "/usr/bin/sulogin")
+    (lib.mesonOption "nologin-path" "/usr/bin/nologin")
+    (lib.mesonOption "mount-path" "/usr/bin/mount")
+    (lib.mesonOption "umount-path" "/usr/bin/umount")
 
     # SBAT
     (lib.mesonOption "sbat-distro" "patos")
@@ -281,7 +290,7 @@ stdenv.mkDerivation (finalAttrs: {
     (lib.mesonEnable "man" false)
 
     (lib.mesonBool "analyze" true)
-    (lib.mesonBool "logind" false)
+    (lib.mesonBool "logind" true)
     (lib.mesonBool "localed" false)
     (lib.mesonBool "hostnamed" true)
     (lib.mesonBool "machined" true)

From 0dfda7560fe6c86cf1108f1751af5f1d337caf09 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Thu, 20 Feb 2025 10:40:53 +0100
Subject: [PATCH 08/78] chore: add dbus-broker

---
 dbus-broker/default.nix | 165 ++++++++++++++++++++++++++++++++++++++
 flake.nix               | 153 +++---------------------------------
 glibc/default.nix       |  16 ++--
 utils/mkinitrd.nix      | 170 ++++++++++++++++++++++++++++++++++++++++
 utils/qemu-uefi-tpm.nix |  50 ++++++++++++
 5 files changed, 401 insertions(+), 153 deletions(-)
 create mode 100644 dbus-broker/default.nix
 create mode 100644 utils/mkinitrd.nix
 create mode 100644 utils/qemu-uefi-tpm.nix

diff --git a/dbus-broker/default.nix b/dbus-broker/default.nix
new file mode 100644
index 0000000..cad66af
--- /dev/null
+++ b/dbus-broker/default.nix
@@ -0,0 +1,165 @@
+{
+  lib,
+  stdenv,
+  fetchFromGitHub,
+  pkgs,
+  ...
+}:
+
+let
+  meta = {
+    maintainers = with lib.maintainers; [ peterhoeg ];
+    platforms = lib.platforms.linux;
+  };
+
+  dep =
+    {
+      pname,
+      version,
+      hash,
+      rev ? "v${version}",
+      buildInputs ? [ ],
+    }:
+    stdenv.mkDerivation {
+      inherit pname version;
+      src = fetchFromGitHub {
+        owner = "c-util";
+        repo = pname;
+        inherit hash rev;
+      };
+      nativeBuildInputs = with pkgs; [
+        meson
+        ninja
+        pkg-config
+      ];
+      inherit buildInputs;
+      meta = meta // {
+        description = "The C-Util Project is a collection of utility libraries for the C11 language.";
+        homepage = "https://c-util.github.io/";
+        license = [
+          lib.licenses.asl20
+          lib.licenses.lgpl21Plus
+        ];
+      };
+    };
+
+  # These libraries are not used outside of dbus-broker.
+  #
+  # If that changes, we can always break them out, but they are essentially
+  # part of the dbus-broker project, just in separate repositories.
+  c-dvar = dep {
+    pname = "c-dvar";
+    version = "1.1.0";
+    hash = "sha256-p/C+BktclVseCtZJ1Q/YK03vP2ClnYRLB1Vmj2OQJD4=";
+    buildInputs = [
+      c-stdaux
+      c-utf8
+    ];
+  };
+  c-ini = dep {
+    pname = "c-ini";
+    version = "1.1.0";
+    hash = "sha256-wa7aNl20hkb/83c4AkQ/0YFDdmBs4XGW+WLUtBWIC98=";
+    buildInputs = [
+      c-list
+      c-rbtree
+      c-stdaux
+      c-utf8
+    ];
+  };
+  c-list = dep {
+    pname = "c-list";
+    version = "3.1.0";
+    hash = "sha256-fp3EAqcbFCLaT2EstLSzwP2X13pi2EFpFAullhoCtpw=";
+  };
+  c-rbtree = dep {
+    pname = "c-rbtree";
+    version = "3.2.0";
+    hash = "sha256-dTMeawhPLRtHvMXfXCrT5iCdoh7qS3v+raC6c+t+X38=";
+    buildInputs = [ c-stdaux ];
+  };
+  c-shquote = dep {
+    pname = "c-shquote";
+    version = "1.1.0";
+    hash = "sha256-z6hpQ/kpCYAngMNfxLkfsxaGtvP4yBMigX1lGpIIzMQ=";
+    buildInputs = [ c-stdaux ];
+  };
+  c-stdaux = dep {
+    pname = "c-stdaux";
+    version = "1.5.0";
+    hash = "sha256-MsnuEyVCmOIr/q6I1qyPsNXp48jxIEcXoYLHbOAZtW0=";
+  };
+  c-utf8 = dep {
+    pname = "c-utf8";
+    version = "1.1.0";
+    hash = "sha256-9vBYylbt1ypJwIAQJd/oiAueh+4VYcn/KzofQuhUea0=";
+    buildInputs = [ c-stdaux ];
+  };
+
+in
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "dbus-broker";
+  version = "36";
+
+  src = fetchFromGitHub {
+    owner = "bus1";
+    repo = "dbus-broker";
+    rev = "v${finalAttrs.version}";
+    hash = "sha256-5dAMKjybqrHG57vArbtWEPR/svSj2ION75JrjvnnpVM=";
+  };
+
+  nativeBuildInputs = with pkgs; [
+    docutils
+    meson
+    ninja
+    pkg-config
+  ];
+
+  buildInputs = [
+    c-dvar
+    c-ini
+    c-list
+    c-rbtree
+    c-shquote
+    c-stdaux
+    c-utf8
+    pkgs.dbus
+    pkgs.linuxHeaders
+    pkgs.systemd
+  ];
+
+  mesonFlags = [
+    # while we technically support 4.9 and 4.14, the NixOS module will throw an
+    # error when using a kernel that's too old
+    "--prefix=/"
+    "--bindir=/usr/bin"
+    "-D=linux-4-17=true"
+    "-D=system-console-users=gdm,sddm,lightdm"
+  ];
+
+  PKG_CONFIG_SYSTEMD_SYSTEMDSYSTEMUNITDIR = "/usr/lib/systemd/system";
+  PKG_CONFIG_SYSTEMD_SYSTEMDUSERUNITDIR = "/usr/lib/systemd/user";
+  PKG_CONFIG_SYSTEMD_CATALOGDIR = "/usr/lib/systemd/catalog";
+
+  preInstall = ''
+    export DESTDIR=${placeholder "out"}
+  '';
+
+  postInstall = ''
+    mkdir -p $out/usr/share
+    cp -Pr ${pkgs.dbus.out}/share/* $out/usr/share/
+    cp ${pkgs.dbus.out}/etc/systemd/system/dbus.socket $out/usr/lib/systemd/system/
+    find $out/usr/share/ -type d -exec chmod 755 {} \;
+    sed -i 's#/nix/store.*/share#/usr/share#' $out/usr/share/xml/dbus-1/catalog.xml
+    sed -i 's#/nix/store.*/libexec#/usr/bin#' $out/usr/share/dbus-1/system.conf
+  '';
+
+  doCheck = false;
+
+  meta = meta // {
+    description = "Linux D-Bus Message Broker";
+    homepage = "https://github.com/bus1/dbus-broker/wiki";
+    license = lib.licenses.asl20;
+  };
+})
diff --git a/flake.nix b/flake.nix
index 866ed43..221d203 100644
--- a/flake.nix
+++ b/flake.nix
@@ -16,165 +16,30 @@
       system:
       let
         pkgs = import nixpkgs { inherit system; };
+        patosPkgs = self.packages.${system};
       in
       {
         packages = {
           default = self.packages.${system}.image;
           image = pkgs.writeShellScriptBin "image" ''
+            set -ex
             echo "make UKI..."
-            echo ${self.packages.${system}.kernel.kernel}/bzImage
+
+            mkdir -p patos/efi/boot
             ${self.packages.${system}.systemd.out}/usr/bin/ukify build \
             --linux ${self.packages.${system}.kernel.kernel}/bzImage \
             --initrd ./initrd.gz \
             --cmdline "console=ttyS0" \
-            -o patos.efi
+            -o patos/efi/boot/bootx64.efi
           '';
 
           kernel = pkgs.callPackage ./kernel { };
           glibc = pkgs.callPackage ./glibc { };
           systemd = pkgs.callPackage ./systemd { };
+          dbus-broker = pkgs.callPackage ./dbus-broker { };
 
-          mkinitrd = pkgs.writeShellScriptBin "mkinitrd" ''
-            echo "make initrd..."
-            mkdir -p out
-
-            # copy systemd
-            cp -Pr ${self.packages.${system}.systemd.out}/* out/
-            pushd out
-
-            find . -type d -exec chmod 755 {} \;
-
-            # Copy kernel modules
-            cp -Pr ${self.packages.${system}.kernel.kernel}/lib/modules ./usr/lib/
-            find usr/lib/modules -type d -exec chmod 755 {} \;
-
-            mkdir -p dev proc sys tmp root
-            ln -sf usr/bin bin
-            ln -sf usr/bin sbin
-            ln -sf usr/lib lib
-            ln -sf usr/lib lib64
-
-            ln -sf ../proc/self/mounts etc/mtab
-            ln -sf ../usr/lib/systemd/systemd init
-
-            echo patos > ./etc/hostname
-            cat <<EOF > ./etc/os-release
-            NAME="PatOS"
-            PRETTY_NAME="PatOS Platform"
-            ID=patos
-            EOF
-
-            cat <<EOF > ./etc/passwd
-            root::0:0:root:/root:/bin/sh
-            bin:x:1:1:bin:/bin:/usr/bin/nologin
-            daemon:x:2:2:daemon:/:/usr/bin/nologin
-            mail:x:8:12:mail:/var/spool/mail:/usr/bin/nologin
-            ftp:x:14:11:ftp:/srv/ftp:/usr/bin/nologin
-            http:x:33:33:http:/srv/http:/usr/bin/nologin
-            uuidd:x:68:68:uuidd:/:/usr/bin/nologin
-            dbus:x:81:81:dbus:/:/usr/bin/nologin
-            nobody:x:99:99:nobody:/:/usr/bin/nologin
-            EOF
-            chmod 644 ./etc/passwd
-
-            cat <<EOF > ./etc/group
-            root:x:0:root
-            bin:x:1:root,bin,daemon
-            daemon:x:2:root,bin,daemon
-            sys:x:3:root,bin
-            adm:x:4:root,daemon
-            tty:x:5:
-            disk:x:6:root
-            lp:x:7:daemon
-            mem:x:8:
-            kmem:x:9:
-            wheel:x:10:root
-            ftp:x:11:
-            mail:x:12:
-            uucp:x:14:
-            log:x:19:root
-            utmp:x:20:
-            locate:x:21:
-            rfkill:x:24:
-            smmsp:x:25:
-            proc:x:26:
-            http:x:33:
-            games:x:50:
-            lock:x:54:
-            uuidd:x:68:
-            dbus:x:81:
-            network:x:90:
-            video:x:91:
-            audio:x:92:
-            optical:x:93:
-            floppy:x:94:
-            storage:x:95:
-            scanner:x:96:
-            input:x:97:
-            power:x:98:
-            nobody:x:99:
-            EOF
-            chmod 644 ./etc/group
-
-            # FIXME: remove this
-            cat <<EOF > usr/lib/systemd/system/demo.service
-            [Unit]
-            Description=Debug Shell (/bin/sulogin)
-            Conflicts=shutdown.target
-            Before=shutdown.target
-
-            [Service]
-            Environment=HOME=/root
-            WorkingDirectory=/root
-            ExecStart=/bin/sulogin
-            Type=idle
-            StandardInput=tty-force
-            StandardOutput=inherit
-            StandardError=inherit
-            KillMode=process
-            IgnoreSIGPIPE=no
-            SendSIGHUP=yes
-            Restart=always
-
-            [Install]
-            WantedBy=basic.target
-            EOF
-            mkdir usr/lib/systemd/system/basic.target.wants
-            ln -sf ../demo.service usr/lib/systemd/system/basic.target.wants/demo.service
-
-            # set default target
-            ln -sf basic.target usr/lib/systemd/system/default.target
-            # remove first boot
-            rm -f usr/lib/systemd/system/sysinit.target.wants/systemd-firstboot.service
-            # remove vconsole setup
-            rm -f usr/lib/udev/rules.d/90-vconsole.rules
-
-            # install busybox
-            cp ${pkgs.busybox.out}/bin/busybox usr/bin/
-            usr/bin/busybox --list | xargs -I {} ln -sf busybox usr/bin/{}
-
-            # install lib kmod
-            cp -P ${pkgs.kmod.lib}/lib/* ./usr/lib
-            cp -P ${pkgs.kmod.out}/bin/* ./usr/bin
-            cp -P ${pkgs.libbpf.out}/lib/libbpf* ./usr/lib
-
-            # get shared libs
-            find . -type f -executable | xargs ldd 2> /dev/null | awk '{print $3}' | grep -v systemd | sort -u | xargs cp -t usr/lib
-            find . -type f -executable | xargs chmod 755
-
-            # FIXME: hacky(?) ELF patching. Is there a better way????????
-            find . -type f -executable -print | xargs -I {} ${pkgs.lib.getExe pkgs.patchelf} --set-rpath /lib:/usr/lib:/usr/lib/systemd {} 2> /dev/null
-            find . -type f -executable -print | xargs -I {} ${pkgs.lib.getExe pkgs.patchelf} --set-interpreter /lib/ld-linux-x86-64.so.2 {} 2> /dev/null
-            cp ${
-              self.packages.${system}.glibc.out
-            }/lib/ld-linux-x86-64.so.2 lib/ && ${pkgs.lib.getExe pkgs.patchelf} --remove-rpath lib/ld-linux-x86-64.so.2
-
-            # strip binaries
-            find . -type f -executable | xargs strip 2> /dev/null
-
-            # gen initrd
-            find . -print0 | ${pkgs.lib.getExe pkgs.cpio} --null --owner=root:root -o --format=newc | ${pkgs.lib.getExe pkgs.gzip} -9 > ../initrd.gz
-          '';
+          mkinitrd = pkgs.callPackage ./utils/mkinitrd.nix { inherit patosPkgs; };
+          qemu-uefi-tpm = pkgs.callPackage ./utils/qemu-uefi-tpm.nix { };
         };
 
         checks = {
@@ -193,6 +58,8 @@
             nixd
             nixfmt-rfc-style
             squashfs-tools-ng
+            self.packages.${system}.qemu-uefi-tpm
+            self.packages.${system}.mkinitrd
           ];
         };
 
diff --git a/glibc/default.nix b/glibc/default.nix
index 65bebc3..b5028c0 100644
--- a/glibc/default.nix
+++ b/glibc/default.nix
@@ -1,25 +1,21 @@
 {
-  fetchurl,
   pkgs,
   stdenv,
 
   ...
 }:
 let
-  version = "2.40";
-  pname = "glibcStandalone";
+  version = pkgs.glibc.version;
+  src = pkgs.glibc.src;
+  pname = "glibcPatos";
 in
 stdenv.mkDerivation (finalAttrs: {
   inherit version;
-
-  pname = pname;
-
-  src = fetchurl {
-    url = "mirror://gnu/glibc/glibc-${version}.tar.xz";
-    sha256 = "sha256-GaiQF16SY9dI9ieZPeb0sa+c0h4D8IDkv7Oh+sECBaI=";
-  };
+  inherit src;
+  inherit pname;
 
   enableParallelBuilding = true;
+  dontPatchShebangs = true;
 
   configureFlags = [
     "--prefix=/"
diff --git a/utils/mkinitrd.nix b/utils/mkinitrd.nix
new file mode 100644
index 0000000..0bd234c
--- /dev/null
+++ b/utils/mkinitrd.nix
@@ -0,0 +1,170 @@
+{
+  pkgs,
+  patosPkgs,
+  ...
+}:
+pkgs.writeShellApplication {
+  name = "mkinitrd";
+
+  runtimeInputs = with pkgs; [
+    patchelf
+    cpio
+    gzip
+  ];
+
+  text = ''
+    echo "Building initram disk"
+    mkdir -p root
+    pushd root
+
+    ### create directories
+    mkdir -p etc dev proc sys tmp root
+    ln -sf usr/bin bin
+    ln -sf usr/bin sbin
+    ln -sf usr/lib lib
+    ln -sf usr/lib lib64
+    ln -sf ../proc/self/mounts etc/mtab
+    ln -sf ../usr/lib/systemd/systemd init
+
+    ### install systemd
+    cp -Pr ${patosPkgs.systemd.out}/* ./
+    find . -type d -exec chmod 755 {} \;
+    rm -rf ./usr/include
+    rm -rf ./usr/sbin
+    # set default target to basic
+    mkdir usr/lib/systemd/system/basic.target.wants
+    ln -sf basic.target usr/lib/systemd/system/default.target
+    # remove first boot
+    rm -f usr/lib/systemd/system/sysinit.target.wants/systemd-firstboot.service
+    # remove vconsole setup
+    rm -f usr/lib/udev/rules.d/90-vconsole.rules
+
+    ### install PatOS glibc
+    cp -Pr ${patosPkgs.glibc.out}/lib/*.so* ./usr/lib/
+
+    ### install kernel modules
+    cp -Pr ${patosPkgs.kernel.kernel}/lib/modules ./usr/lib/
+    find usr/lib/modules -type d -exec chmod 755 {} \;
+
+    ### install busybox
+    cp ${pkgs.busybox.out}/bin/busybox ./usr/bin/
+    usr/bin/busybox --list | xargs -I {} ln -sf busybox usr/bin/{}
+
+    ### install dbus broker
+    cp -r ${patosPkgs.dbus-broker.out}/* ./
+    ln -sf ../dbus-broker.service usr/lib/systemd/system/basic.target.wants/dbus.service
+    ln -sf ../dbus.socket usr/lib/systemd/system/sockets.target.wants/dbus.socket
+
+    ### install lib kmod
+    cp -P ${pkgs.kmod.lib}/lib/* ./usr/lib
+    cp -P ${pkgs.kmod.out}/bin/* ./usr/bin
+
+    ### install libbpf
+    cp -P ${pkgs.libbpf.out}/lib/libbpf* ./usr/lib
+
+    ### Find and install all shared libs
+    find . -type f -executable -exec ldd {} \; 2> /dev/null | awk '{print $3}' | grep -v systemd | grep -v glibc | sort -u | xargs cp -t usr/lib
+    find . -type f -executable -exec chmod 755 {} \;
+
+
+    ### Create needed files
+    echo patos > ./etc/hostname
+    cat <<EOF > ./etc/os-release
+    NAME="PatOS"
+    PRETTY_NAME="PatOS Platform"
+    ID=patos
+    EOF
+
+    cat <<EOF > ./etc/passwd
+    root::0:0:root:/root:/bin/sh
+    bin:x:1:1:bin:/bin:/usr/bin/nologin
+    daemon:x:2:2:daemon:/:/usr/bin/nologin
+    mail:x:8:12:mail:/var/spool/mail:/usr/bin/nologin
+    ftp:x:14:11:ftp:/srv/ftp:/usr/bin/nologin
+    http:x:33:33:http:/srv/http:/usr/bin/nologin
+    uuidd:x:68:68:uuidd:/:/usr/bin/nologin
+    messagebus:x:81:81:messagebus:/:/usr/bin/nologin
+    nobody:x:99:99:nobody:/:/usr/bin/nologin
+    EOF
+    chmod 644 ./etc/passwd
+
+    cat <<EOF > ./etc/group
+    root:x:0:root
+    bin:x:1:root,bin,daemon
+    daemon:x:2:root,bin,daemon
+    sys:x:3:root,bin
+    adm:x:4:root,daemon
+    tty:x:5:
+    disk:x:6:root
+    lp:x:7:daemon
+    mem:x:8:
+    kmem:x:9:
+    wheel:x:10:root
+    ftp:x:11:
+    mail:x:12:
+    uucp:x:14:
+    log:x:19:root
+    utmp:x:20:
+    locate:x:21:
+    rfkill:x:24:
+    smmsp:x:25:
+    proc:x:26:
+    http:x:33:
+    games:x:50:
+    lock:x:54:
+    uuidd:x:68:
+    messagebus:x:81:
+    network:x:90:
+    video:x:91:
+    audio:x:92:
+    optical:x:93:
+    floppy:x:94:
+    storage:x:95:
+    scanner:x:96:
+    input:x:97:
+    power:x:98:
+    nobody:x:99:
+    EOF
+    chmod 644 ./etc/group
+
+    # FIXME: remove this later (just to get a shell in the initramfs)
+    cat <<EOF > usr/lib/systemd/system/demo.service
+    [Unit]
+    Description=Debug Shell (/bin/sulogin)
+    Conflicts=shutdown.target
+    Before=shutdown.target
+
+    [Service]
+    Environment=HOME=/root
+    WorkingDirectory=/root
+    ExecStart=/bin/sulogin
+    Type=idle
+    StandardInput=tty-force
+    StandardOutput=inherit
+    StandardError=inherit
+    KillMode=process
+    IgnoreSIGPIPE=no
+    SendSIGHUP=yes
+    Restart=always
+
+    [Install]
+    WantedBy=basic.target
+    EOF
+    ln -sf ../demo.service usr/lib/systemd/system/basic.target.wants/demo.service
+
+    # FIXME: ELF patching. Is there a better way?
+    find . -type f -executable -exec patchelf --set-rpath /lib:/usr/lib:/usr/lib/systemd {} \; 2> /dev/null
+    find . -type f -executable -exec patchelf --set-interpreter /lib/ld-linux-x86-64.so.2 {} \; 2> /dev/null
+    patchelf --remove-rpath ./usr/lib/ld-linux-x86-64.so.2
+
+    # strip binaries
+    find . -type f -executable -exec strip {} \; 2> /dev/null
+    find . -type d -exec chmod 755 {} \;
+
+    # gen initrd
+    find . -print0 | cpio --null --owner=root:root -o --format=newc | gzip -9 > ../initrd.gz
+
+    popd
+    rm -rf root
+  '';
+}
diff --git a/utils/qemu-uefi-tpm.nix b/utils/qemu-uefi-tpm.nix
new file mode 100644
index 0000000..e6a27f9
--- /dev/null
+++ b/utils/qemu-uefi-tpm.nix
@@ -0,0 +1,50 @@
+{
+  pkgs,
+  ...
+}:
+pkgs.writeShellApplication {
+  name = "qemu-uefi-tpm";
+
+  runtimeInputs = with pkgs; [
+    qemu
+    swtpm
+  ];
+
+  text =
+    let
+      tpmOVMF = pkgs.OVMF.override { tpmSupport = true; };
+    in
+    ''
+      set -ex
+      state="/tmp/patos-qemu-$USER"
+      rm -rf "$state"
+      mkdir -m 700 "$state"
+      truncate -s 1G "$state/disk.raw"
+
+      swtpm socket -d --tpmstate dir="$state" \
+        --ctrl type=unixio,path="$state/swtpm-sock" \
+        --tpm2 \
+        --log level=20
+
+      qemu-system-x86_64 \
+        -enable-kvm \
+        -machine q35,accel=kvm \
+        -cpu host \
+        -smp 8 \
+        -m 4G \
+        -display none \
+        -nographic \
+        -chardev "stdio,id=char0,mux=on,logfile=$state/console.log,signal=off" \
+        -serial chardev:char0 \
+        -mon chardev=char0 \
+        -drive "if=pflash,format=raw,unit=0,readonly=on,file=${tpmOVMF.firmware}" \
+        -drive "if=pflash,format=raw,unit=1,readonly=on,file=${tpmOVMF.variables}" \
+        -chardev socket,id=chrtpm,path="$state/swtpm-sock" \
+        -tpmdev emulator,id=tpm0,chardev=chrtpm \
+        -device tpm-tis,tpmdev=tpm0 \
+        -netdev id=net00,type=user,hostfwd=tcp::2222-:22 \
+        -device virtio-net-pci,netdev=net00 \
+        -drive "file=fat:rw:patos/,format=raw" \
+        -drive "format=raw,file=$state/disk.raw"
+    '';
+}

From a689fa9925e76da6000a171764c14f25a43cce60 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Fri, 21 Feb 2025 12:22:21 +0100
Subject: [PATCH 09/78] chore: rootfs pkg

---
 flake.nix          |  1 +
 rootfs/default.nix | 30 +++++++++++++++++++++++++
 rootfs/mkrootfs.sh | 54 +++++++++++++++++++++++++++++++++++++++++++++
 utils/mkinitrd.nix | 55 +++++-----------------------------------------
 4 files changed, 90 insertions(+), 50 deletions(-)
 create mode 100644 rootfs/default.nix
 create mode 100644 rootfs/mkrootfs.sh

diff --git a/flake.nix b/flake.nix
index 221d203..90fe634 100644
--- a/flake.nix
+++ b/flake.nix
@@ -37,6 +37,7 @@
           glibc = pkgs.callPackage ./glibc { };
           systemd = pkgs.callPackage ./systemd { };
           dbus-broker = pkgs.callPackage ./dbus-broker { };
+          rootfs = pkgs.callPackage ./rootfs { inherit patosPkgs; };
 
           mkinitrd = pkgs.callPackage ./utils/mkinitrd.nix { inherit patosPkgs; };
           qemu-uefi-tpm = pkgs.callPackage ./utils/qemu-uefi-tpm.nix { };
diff --git a/rootfs/default.nix b/rootfs/default.nix
new file mode 100644
index 0000000..755050f
--- /dev/null
+++ b/rootfs/default.nix
@@ -0,0 +1,30 @@
+{
+  pkgs,
+  stdenvNoCC,
+  patosPkgs,
+  ...
+}:
+let
+  version = "0.0.1";
+  pname = "patos-rootfs";
+in
+stdenvNoCC.mkDerivation (finalAttrs: {
+  inherit version;
+  inherit pname;
+
+  buildInputs = with pkgs; [
+    glibc
+    binutils
+  ];
+
+  glibcPatos = patosPkgs.glibc.out;
+  systemd = patosPkgs.systemd.out;
+  dbusBroker = patosPkgs.dbus-broker.out;
+  kernel = patosPkgs.kernel.kernel;
+  busybox = pkgs.busybox.out;
+  kmodLibs = pkgs.kmod.lib;
+  kmodBin = pkgs.kmod.out;
+  libbpf = pkgs.libbpf.out;
+
+  builder = ./mkrootfs.sh;
+})
diff --git a/rootfs/mkrootfs.sh b/rootfs/mkrootfs.sh
new file mode 100644
index 0000000..b850129
--- /dev/null
+++ b/rootfs/mkrootfs.sh
@@ -0,0 +1,54 @@
+set -ex -o pipefail
+
+mkdir -p $out
+mkdir -p $out/etc $out/dev $out/proc $out/sys $out/tmp $out/root
+ln -sf ../usr/bin $out/bin
+ln -sf ../usr/bin $out/sbin
+ln -sf ../usr/lib $out/lib
+ln -sf ../usr/lib $out/lib64
+ln -sf ../proc/self/mounts $out/etc/mtab
+
+### install systemd
+echo "Installing systemd"
+cp -Pr $systemd/* $out/
+find $out -type d -exec chmod 755 {} \;
+rm -rf $out/usr/include
+rm -rf $out/usr/sbin
+rm -f $out/usr/lib/systemd/system/sysinit.target.wants/systemd-firstboot.service
+# remove vconsole setup
+rm -f $out/usr/lib/udev/rules.d/90-vconsole.rules
+
+### install PatOS glibc
+cp -P $glibcPatos/lib/*.so* $out/usr/lib/
+
+### install kernel modules
+cp -r $kernel/lib/modules $out/usr/lib/
+find $out/usr/lib/modules -type d -exec chmod 755 {} \;
+
+### install busybox
+cp $busybox/bin/busybox $out/usr/bin/
+$out/usr/bin/busybox --list | xargs -I {} ln -sf busybox $out/usr/bin/{}
+
+### install dbus broker
+cp -r $dbusBroker/* $out/
+
+### install lib kmod
+cp -P $kmodLibs/lib/* $out/usr/lib
+cp -P $kmodBin/bin/* $out/usr/bin
+
+### install libbpf
+cp -P $libbpf/lib/libbpf* $out/usr/lib
+
+### Find and install all shared libs
+find $out -type f -executable -exec ldd {} \; | awk '{print $3}' | grep -v systemd | grep -v glibc | sort -u | xargs cp -t $out/usr/lib
+find $out -type f -executable -exec chmod 755 {} \;
+
+# FIXME: ELF patching. Is there a better way?
+find $out -type f -executable -exec patchelf --set-rpath /lib:/usr/lib:/usr/lib/systemd {} \;
+find $out -type f -executable -exec patchelf --set-interpreter /lib/ld-linux-x86-64.so.2 {} \;
+patchelf --remove-rpath $out/usr/lib/ld-linux-x86-64.so.2
+
+# strip binaries
+find $out -type f -executable -exec strip {} \;
+find $out -type d -exec chmod 755 {} \;
+
diff --git a/utils/mkinitrd.nix b/utils/mkinitrd.nix
index 0bd234c..47f7f30 100644
--- a/utils/mkinitrd.nix
+++ b/utils/mkinitrd.nix
@@ -7,7 +7,6 @@ pkgs.writeShellApplication {
   name = "mkinitrd";
 
   runtimeInputs = with pkgs; [
-    patchelf
     cpio
     gzip
   ];
@@ -17,56 +16,21 @@ pkgs.writeShellApplication {
     mkdir -p root
     pushd root
 
+    ### copy rootfs
+    cp -prP ${patosPkgs.rootfs}/* .
+    find . -type d -exec chmod 755 {} \;
+
     ### create directories
-    mkdir -p etc dev proc sys tmp root
-    ln -sf usr/bin bin
-    ln -sf usr/bin sbin
-    ln -sf usr/lib lib
-    ln -sf usr/lib lib64
-    ln -sf ../proc/self/mounts etc/mtab
     ln -sf ../usr/lib/systemd/systemd init
 
-    ### install systemd
-    cp -Pr ${patosPkgs.systemd.out}/* ./
-    find . -type d -exec chmod 755 {} \;
-    rm -rf ./usr/include
-    rm -rf ./usr/sbin
     # set default target to basic
     mkdir usr/lib/systemd/system/basic.target.wants
     ln -sf basic.target usr/lib/systemd/system/default.target
-    # remove first boot
-    rm -f usr/lib/systemd/system/sysinit.target.wants/systemd-firstboot.service
-    # remove vconsole setup
-    rm -f usr/lib/udev/rules.d/90-vconsole.rules
 
-    ### install PatOS glibc
-    cp -Pr ${patosPkgs.glibc.out}/lib/*.so* ./usr/lib/
-
-    ### install kernel modules
-    cp -Pr ${patosPkgs.kernel.kernel}/lib/modules ./usr/lib/
-    find usr/lib/modules -type d -exec chmod 755 {} \;
-
-    ### install busybox
-    cp ${pkgs.busybox.out}/bin/busybox ./usr/bin/
-    usr/bin/busybox --list | xargs -I {} ln -sf busybox usr/bin/{}
-
-    ### install dbus broker
-    cp -r ${patosPkgs.dbus-broker.out}/* ./
+    # enable dbus broker
     ln -sf ../dbus-broker.service usr/lib/systemd/system/basic.target.wants/dbus.service
     ln -sf ../dbus.socket usr/lib/systemd/system/sockets.target.wants/dbus.socket
 
-    ### install lib kmod
-    cp -P ${pkgs.kmod.lib}/lib/* ./usr/lib
-    cp -P ${pkgs.kmod.out}/bin/* ./usr/bin
-
-    ### install libbpf
-    cp -P ${pkgs.libbpf.out}/lib/libbpf* ./usr/lib
-
-    ### Find and install all shared libs
-    find . -type f -executable -exec ldd {} \; 2> /dev/null | awk '{print $3}' | grep -v systemd | grep -v glibc | sort -u | xargs cp -t usr/lib
-    find . -type f -executable -exec chmod 755 {} \;
-
-
     ### Create needed files
     echo patos > ./etc/hostname
     cat <<EOF > ./etc/os-release
@@ -152,15 +116,6 @@ pkgs.writeShellApplication {
     EOF
     ln -sf ../demo.service usr/lib/systemd/system/basic.target.wants/demo.service
 
-    # FIXME: ELF patching. Is there a better way?
-    find . -type f -executable -exec patchelf --set-rpath /lib:/usr/lib:/usr/lib/systemd {} \; 2> /dev/null
-    find . -type f -executable -exec patchelf --set-interpreter /lib/ld-linux-x86-64.so.2 {} \; 2> /dev/null
-    patchelf --remove-rpath ./usr/lib/ld-linux-x86-64.so.2
-
-    # strip binaries
-    find . -type f -executable -exec strip {} \; 2> /dev/null
-    find . -type d -exec chmod 755 {} \;
-
     # gen initrd
     find . -print0 | cpio --null --owner=root:root -o --format=newc | gzip -9 > ../initrd.gz
 

From 9ff916d0a3fbdc615b4fc989da26b2b082992efe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Mon, 24 Feb 2025 09:14:11 +0100
Subject: [PATCH 10/78] chore: xz compressed initrd and remove systemd patch

---
 .gitignore                                    |  3 ++-
 flake.nix                                     |  2 +-
 ....build-do-not-create-systemdstatedir.patch | 21 -------------------
 systemd/default.nix                           |  6 +-----
 utils/mkinitrd.nix                            |  4 ++--
 5 files changed, 6 insertions(+), 30 deletions(-)
 delete mode 100644 systemd/0017-meson.build-do-not-create-systemdstatedir.patch

diff --git a/.gitignore b/.gitignore
index 6833589..8cfe0d4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,7 +5,8 @@
 /result
 /target
 /out
-/initrd.gz
+/initrd*
+/patos*
 .*.swp
 .*.swo
 .nixos-test-history
diff --git a/flake.nix b/flake.nix
index 90fe634..9e95404 100644
--- a/flake.nix
+++ b/flake.nix
@@ -28,7 +28,7 @@
             mkdir -p patos/efi/boot
             ${self.packages.${system}.systemd.out}/usr/bin/ukify build \
             --linux ${self.packages.${system}.kernel.kernel}/bzImage \
-            --initrd ./initrd.gz \
+            --initrd ./initrd.xz \
             --cmdline "console=ttyS0" \
             -o patos/efi/boot/bootx64.efi
           '';
diff --git a/systemd/0017-meson.build-do-not-create-systemdstatedir.patch b/systemd/0017-meson.build-do-not-create-systemdstatedir.patch
deleted file mode 100644
index debcaab..0000000
--- a/systemd/0017-meson.build-do-not-create-systemdstatedir.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: nikstur <nikstur@outlook.com>
-Date: Mon, 6 Nov 2023 22:51:38 +0100
-Subject: [PATCH] meson.build: do not create systemdstatedir
-
----
- meson.build | 1 -
- 1 file changed, 1 deletion(-)
-
-diff --git a/meson.build b/meson.build
-index bffda86845..cb5dcec0f9 100644
---- a/meson.build
-+++ b/meson.build
-@@ -2781,7 +2781,6 @@ install_data('LICENSE.GPL2',
- install_subdir('LICENSES',
-                install_dir : docdir)
- 
--install_emptydir(systemdstatedir)
- 
- #####################################################################
- 
diff --git a/systemd/default.nix b/systemd/default.nix
index 3174f0f..4daf9ed 100644
--- a/systemd/default.nix
+++ b/systemd/default.nix
@@ -32,10 +32,6 @@ stdenv.mkDerivation (finalAttrs: {
 
   dontCheckForBrokenSymlinks = true;
 
-  patches = [
-    ./0017-meson.build-do-not-create-systemdstatedir.patch
-  ];
-
   nativeBuildInputs = with pkgs; [
     bash
     pkg-config
@@ -196,7 +192,7 @@ stdenv.mkDerivation (finalAttrs: {
     (lib.mesonOption "dbussystemservicedir" "/usr/share/dbus-1/system-services")
     (lib.mesonOption "setfont-path" "/usr/bin/setfont")
     (lib.mesonOption "loadkeys-path" "/usr/bin/loadkeys")
-    (lib.mesonOption "sulogin-path"  "/usr/bin/sulogin")
+    (lib.mesonOption "sulogin-path" "/usr/bin/sulogin")
     (lib.mesonOption "nologin-path" "/usr/bin/nologin")
     (lib.mesonOption "mount-path" "/usr/bin/mount")
     (lib.mesonOption "umount-path" "/usr/bin/umount")
diff --git a/utils/mkinitrd.nix b/utils/mkinitrd.nix
index 47f7f30..201d14c 100644
--- a/utils/mkinitrd.nix
+++ b/utils/mkinitrd.nix
@@ -8,7 +8,7 @@ pkgs.writeShellApplication {
 
   runtimeInputs = with pkgs; [
     cpio
-    gzip
+    xz
   ];
 
   text = ''
@@ -117,7 +117,7 @@ pkgs.writeShellApplication {
     ln -sf ../demo.service usr/lib/systemd/system/basic.target.wants/demo.service
 
     # gen initrd
-    find . -print0 | cpio --null --owner=root:root -o --format=newc | gzip -9 > ../initrd.gz
+    find . -print0 | cpio --null --owner=root:root -o --format=newc | xz -9 --check=crc32 > ../initrd.xz
 
     popd
     rm -rf root

From e7470498e5d109c044e52868c192076892cdb371 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Mon, 24 Feb 2025 15:01:03 +0100
Subject: [PATCH 11/78] fix: create derivation for initrd creation

---
 flake.nix           |   8 +--
 rootfs/mkinitrd.nix |  23 ++++++++
 rootfs/mkinitrd.sh  | 110 ++++++++++++++++++++++++++++++++++++++
 utils/mkinitrd.nix  | 125 --------------------------------------------
 4 files changed, 137 insertions(+), 129 deletions(-)
 create mode 100644 rootfs/mkinitrd.nix
 create mode 100644 rootfs/mkinitrd.sh
 delete mode 100644 utils/mkinitrd.nix

diff --git a/flake.nix b/flake.nix
index 9e95404..146376c 100644
--- a/flake.nix
+++ b/flake.nix
@@ -26,9 +26,9 @@
             echo "make UKI..."
 
             mkdir -p patos/efi/boot
-            ${self.packages.${system}.systemd.out}/usr/bin/ukify build \
-            --linux ${self.packages.${system}.kernel.kernel}/bzImage \
-            --initrd ./initrd.xz \
+            ${patosPkgs.systemd.out}/usr/bin/ukify build \
+            --linux ${patosPkgs.kernel.kernel}/bzImage \
+            --initrd ${patosPkgs.initrd.out}/initrd.xz \
             --cmdline "console=ttyS0" \
             -o patos/efi/boot/bootx64.efi
           '';
@@ -38,8 +38,8 @@
           systemd = pkgs.callPackage ./systemd { };
           dbus-broker = pkgs.callPackage ./dbus-broker { };
           rootfs = pkgs.callPackage ./rootfs { inherit patosPkgs; };
+          initrd = pkgs.callPackage ./rootfs/mkinitrd.nix { inherit patosPkgs; };
 
-          mkinitrd = pkgs.callPackage ./utils/mkinitrd.nix { inherit patosPkgs; };
           qemu-uefi-tpm = pkgs.callPackage ./utils/qemu-uefi-tpm.nix { };
         };
 
diff --git a/rootfs/mkinitrd.nix b/rootfs/mkinitrd.nix
new file mode 100644
index 0000000..f564813
--- /dev/null
+++ b/rootfs/mkinitrd.nix
@@ -0,0 +1,23 @@
+{
+  pkgs,
+  stdenvNoCC,
+  patosPkgs,
+  ...
+}:
+let
+  version = "0.0.1";
+  pname = "patos-ramdisk";
+in
+stdenvNoCC.mkDerivation (finalAttrs: {
+  inherit version;
+  inherit pname;
+
+  buildInputs = with pkgs; [
+    cpio
+    xz
+  ];
+
+  rootfs = patosPkgs.rootfs.out;
+
+  builder = ./mkinitrd.sh;
+})
diff --git a/rootfs/mkinitrd.sh b/rootfs/mkinitrd.sh
new file mode 100644
index 0000000..2fe7770
--- /dev/null
+++ b/rootfs/mkinitrd.sh
@@ -0,0 +1,110 @@
+set -ex -p pipefail
+echo "Building initram disk"
+mkdir -p $out/root
+pushd $out/root
+
+### copy rootfs
+cp -prP $rootfs/* .
+find . -type d -exec chmod 755 {} \;
+
+### create directories
+ln -sf ../usr/lib/systemd/systemd init
+
+# set default target to basic
+mkdir usr/lib/systemd/system/basic.target.wants
+ln -sf basic.target usr/lib/systemd/system/default.target
+
+# enable dbus broker
+ln -sf ../dbus-broker.service usr/lib/systemd/system/basic.target.wants/dbus-broker.service
+ln -sf ../dbus.socket usr/lib/systemd/system/sockets.target.wants/dbus.socket
+
+### Create needed files
+echo patos > ./etc/hostname
+cat <<EOF > ./etc/os-release
+NAME="PatOS"
+PRETTY_NAME="PatOS Platform"
+ID=patos
+EOF
+
+cat <<EOF > ./etc/passwd
+root::0:0:root:/root:/bin/sh
+bin:x:1:1:bin:/bin:/usr/bin/nologin
+daemon:x:2:2:daemon:/:/usr/bin/nologin
+mail:x:8:12:mail:/var/spool/mail:/usr/bin/nologin
+ftp:x:14:11:ftp:/srv/ftp:/usr/bin/nologin
+http:x:33:33:http:/srv/http:/usr/bin/nologin
+uuidd:x:68:68:uuidd:/:/usr/bin/nologin
+messagebus:x:81:81:messagebus:/:/usr/bin/nologin
+nobody:x:99:99:nobody:/:/usr/bin/nologin
+EOF
+chmod 644 ./etc/passwd
+
+cat <<EOF > ./etc/group
+root:x:0:root
+bin:x:1:root,bin,daemon
+daemon:x:2:root,bin,daemon
+sys:x:3:root,bin
+adm:x:4:root,daemon
+tty:x:5:
+disk:x:6:root
+lp:x:7:daemon
+mem:x:8:
+kmem:x:9:
+wheel:x:10:root
+ftp:x:11:
+mail:x:12:
+uucp:x:14:
+log:x:19:root
+utmp:x:20:
+locate:x:21:
+rfkill:x:24:
+smmsp:x:25:
+proc:x:26:
+http:x:33:
+games:x:50:
+lock:x:54:
+uuidd:x:68:
+messagebus:x:81:
+network:x:90:
+video:x:91:
+audio:x:92:
+optical:x:93:
+floppy:x:94:
+storage:x:95:
+scanner:x:96:
+input:x:97:
+power:x:98:
+nobody:x:99:
+EOF
+chmod 644 ./etc/group
+
+# FIXME: remove this later (just to get a shell in the initramfs)
+cat <<EOF > usr/lib/systemd/system/demo.service
+[Unit]
+Description=Debug Shell (/bin/sulogin)
+Conflicts=shutdown.target
+Before=shutdown.target
+
+[Service]
+Environment=HOME=/root
+WorkingDirectory=/root
+ExecStart=/bin/sulogin
+Type=idle
+StandardInput=tty-force
+StandardOutput=inherit
+StandardError=inherit
+KillMode=process
+IgnoreSIGPIPE=no
+SendSIGHUP=yes
+Restart=always
+
+[Install]
+WantedBy=basic.target
+EOF
+ln -sf ../demo.service usr/lib/systemd/system/basic.target.wants/demo.service
+
+# gen initrd
+find . -print0 | cpio --null --owner=root:root -o --format=newc | xz -9 --check=crc32 > ../initrd.xz
+
+popd
+rm -rf $out/root
diff --git a/utils/mkinitrd.nix b/utils/mkinitrd.nix
deleted file mode 100644
index 201d14c..0000000
--- a/utils/mkinitrd.nix
+++ /dev/null
@@ -1,125 +0,0 @@
-{
-  pkgs,
-  patosPkgs,
-  ...
-}:
-pkgs.writeShellApplication {
-  name = "mkinitrd";
-
-  runtimeInputs = with pkgs; [
-    cpio
-    xz
-  ];
-
-  text = ''
-    echo "Building initram disk"
-    mkdir -p root
-    pushd root
-
-    ### copy rootfs
-    cp -prP ${patosPkgs.rootfs}/* .
-    find . -type d -exec chmod 755 {} \;
-
-    ### create directories
-    ln -sf ../usr/lib/systemd/systemd init
-
-    # set default target to basic
-    mkdir usr/lib/systemd/system/basic.target.wants
-    ln -sf basic.target usr/lib/systemd/system/default.target
-
-    # enable dbus broker
-    ln -sf ../dbus-broker.service usr/lib/systemd/system/basic.target.wants/dbus.service
-    ln -sf ../dbus.socket usr/lib/systemd/system/sockets.target.wants/dbus.socket
-
-    ### Create needed files
-    echo patos > ./etc/hostname
-    cat <<EOF > ./etc/os-release
-    NAME="PatOS"
-    PRETTY_NAME="PatOS Platform"
-    ID=patos
-    EOF
-
-    cat <<EOF > ./etc/passwd
-    root::0:0:root:/root:/bin/sh
-    bin:x:1:1:bin:/bin:/usr/bin/nologin
-    daemon:x:2:2:daemon:/:/usr/bin/nologin
-    mail:x:8:12:mail:/var/spool/mail:/usr/bin/nologin
-    ftp:x:14:11:ftp:/srv/ftp:/usr/bin/nologin
-    http:x:33:33:http:/srv/http:/usr/bin/nologin
-    uuidd:x:68:68:uuidd:/:/usr/bin/nologin
-    messagebus:x:81:81:messagebus:/:/usr/bin/nologin
-    nobody:x:99:99:nobody:/:/usr/bin/nologin
-    EOF
-    chmod 644 ./etc/passwd
-
-    cat <<EOF > ./etc/group
-    root:x:0:root
-    bin:x:1:root,bin,daemon
-    daemon:x:2:root,bin,daemon
-    sys:x:3:root,bin
-    adm:x:4:root,daemon
-    tty:x:5:
-    disk:x:6:root
-    lp:x:7:daemon
-    mem:x:8:
-    kmem:x:9:
-    wheel:x:10:root
-    ftp:x:11:
-    mail:x:12:
-    uucp:x:14:
-    log:x:19:root
-    utmp:x:20:
-    locate:x:21:
-    rfkill:x:24:
-    smmsp:x:25:
-    proc:x:26:
-    http:x:33:
-    games:x:50:
-    lock:x:54:
-    uuidd:x:68:
-    messagebus:x:81:
-    network:x:90:
-    video:x:91:
-    audio:x:92:
-    optical:x:93:
-    floppy:x:94:
-    storage:x:95:
-    scanner:x:96:
-    input:x:97:
-    power:x:98:
-    nobody:x:99:
-    EOF
-    chmod 644 ./etc/group
-
-    # FIXME: remove this later (just to get a shell in the initramfs)
-    cat <<EOF > usr/lib/systemd/system/demo.service
-    [Unit]
-    Description=Debug Shell (/bin/sulogin)
-    Conflicts=shutdown.target
-    Before=shutdown.target
-
-    [Service]
-    Environment=HOME=/root
-    WorkingDirectory=/root
-    ExecStart=/bin/sulogin
-    Type=idle
-    StandardInput=tty-force
-    StandardOutput=inherit
-    StandardError=inherit
-    KillMode=process
-    IgnoreSIGPIPE=no
-    SendSIGHUP=yes
-    Restart=always
-
-    [Install]
-    WantedBy=basic.target
-    EOF
-    ln -sf ../demo.service usr/lib/systemd/system/basic.target.wants/demo.service
-
-    # gen initrd
-    find . -print0 | cpio --null --owner=root:root -o --format=newc | xz -9 --check=crc32 > ../initrd.xz
-
-    popd
-    rm -rf root
-  '';
-}

From af78f1c930fa6788a81b229ddf608798a1594819 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Mon, 24 Feb 2025 16:13:43 +0100
Subject: [PATCH 12/78] feat(systemd-repart): build image

---
 .gitignore              |  2 --
 flake.nix               | 14 +----------
 image/default.nix       | 27 +++++++++++++++++++++
 image/mkimage.sh        | 52 +++++++++++++++++++++++++++++++++++++++++
 utils/qemu-uefi-tpm.nix |  5 ++--
 5 files changed, 82 insertions(+), 18 deletions(-)
 create mode 100644 image/default.nix
 create mode 100644 image/mkimage.sh

diff --git a/.gitignore b/.gitignore
index 8cfe0d4..97ab6ac 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,8 +5,6 @@
 /result
 /target
 /out
-/initrd*
-/patos*
 .*.swp
 .*.swo
 .nixos-test-history
diff --git a/flake.nix b/flake.nix
index 146376c..2e4eafa 100644
--- a/flake.nix
+++ b/flake.nix
@@ -21,18 +21,7 @@
       {
         packages = {
           default = self.packages.${system}.image;
-          image = pkgs.writeShellScriptBin "image" ''
-            set -ex
-            echo "make UKI..."
-
-            mkdir -p patos/efi/boot
-            ${patosPkgs.systemd.out}/usr/bin/ukify build \
-            --linux ${patosPkgs.kernel.kernel}/bzImage \
-            --initrd ${patosPkgs.initrd.out}/initrd.xz \
-            --cmdline "console=ttyS0" \
-            -o patos/efi/boot/bootx64.efi
-          '';
-
+          image = pkgs.callPackage ./image { inherit patosPkgs; };
           kernel = pkgs.callPackage ./kernel { };
           glibc = pkgs.callPackage ./glibc { };
           systemd = pkgs.callPackage ./systemd { };
@@ -60,7 +49,6 @@
             nixfmt-rfc-style
             squashfs-tools-ng
             self.packages.${system}.qemu-uefi-tpm
-            self.packages.${system}.mkinitrd
           ];
         };
 
diff --git a/image/default.nix b/image/default.nix
new file mode 100644
index 0000000..b4394c2
--- /dev/null
+++ b/image/default.nix
@@ -0,0 +1,27 @@
+{
+  pkgs,
+  stdenvNoCC,
+  patosPkgs,
+  ...
+}:
+let
+  version = "0.0.1";
+  pname = "patos-image";
+in
+stdenvNoCC.mkDerivation (finalAttrs: {
+  inherit version;
+  inherit pname;
+
+  buildInputs = with pkgs; [
+    erofs-utils
+    dosfstools
+    mtools
+  ];
+
+  systemd = patosPkgs.systemd.out;
+  kernel = patosPkgs.kernel.kernel;
+  initrd = patosPkgs.initrd.out;
+  rootfs = patosPkgs.rootfs.out;
+
+  builder = ./mkimage.sh;
+})
diff --git a/image/mkimage.sh b/image/mkimage.sh
new file mode 100644
index 0000000..c7473d7
--- /dev/null
+++ b/image/mkimage.sh
@@ -0,0 +1,52 @@
+set -ex -o pipefail
+
+mkdir -p $out/repart.d $out/boot
+pushd $out
+
+# Don't seem to work just to create a symlink to rootfs derivation?
+# ln -sf $rootfs rootfs
+mkdir rootfs
+cp -prP $rootfs/* rootfs/
+find rootfs/ -type d -exec chmod 755 {} \;
+
+$systemd/usr/bin/ukify build \
+  --os-release rootfs/etc/os-release \
+  --linux $kernel/bzImage \
+  --initrd $initrd/initrd.xz \
+  --cmdline "console=ttyS0" \
+  -o boot/patos-x64.efi
+
+cp ${systemd}/usr/lib/systemd/boot/efi/systemd-bootx64.efi boot/
+
+cat <<EOF > repart.d/10-esp.conf
+[Partition]
+Type=esp
+Format=vfat
+SizeMinBytes=96M
+SizeMaxBytes=96M
+SplitName=-
+CopyFiles=/boot/patos-x64.efi:/EFI/Linux/patos-x64.efi
+CopyFiles=/boot/systemd-bootx64.efi:/EFI/BOOT/BOOTX64.EFI
+EOF
+
+cat <<EOF > repart.d/10-root.conf
+[Partition]
+Type=root
+Format=erofs
+CopyFiles=/rootfs:/
+Minimize=best
+SplitName=root
+EOF
+
+$systemd/usr/bin/systemd-repart \
+  --no-pager \
+  --empty=create \
+  --size=1G \
+  --definitions=./repart.d \
+  --root=$out \
+  patos-$version.raw
+
+rm -rf rootfs
+rm -rf boot
+
+popd
diff --git a/utils/qemu-uefi-tpm.nix b/utils/qemu-uefi-tpm.nix
index e6a27f9..d05fbb2 100644
--- a/utils/qemu-uefi-tpm.nix
+++ b/utils/qemu-uefi-tpm.nix
@@ -19,7 +19,7 @@ pkgs.writeShellApplication {
       state="/tmp/patos-qemu-$USER"
       rm -rf "$state"
       mkdir -m 700 "$state"
-      truncate -s 1G "$state/disk.raw"
+      qemu-img create -f qcow2 -F raw -b "$(readlink -e "$1")" "$state/disk.qcow2" 2G
 
       swtpm socket -d --tpmstate dir="$state" \
         --ctrl type=unixio,path="$state/swtpm-sock" \
@@ -44,7 +44,6 @@ pkgs.writeShellApplication {
         -device tpm-tis,tpmdev=tpm0 \
         -netdev id=net00,type=user,hostfwd=tcp::2222-:22 \
         -device virtio-net-pci,netdev=net00 \
-        -drive "file=fat:rw:patos/,format=raw" \
-        -drive "format=raw,file=$state/disk.raw"
+        -drive "format=qcow2,file=$state/disk.qcow2"
     '';
 }

From 6899203860db2e2f24724089d74adde6a341aa74 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Mon, 24 Feb 2025 23:51:46 +0100
Subject: [PATCH 13/78] feat(systemd-repart): fix ESP. now its booting

---
 image/default.nix       |  4 ++++
 image/mkimage.sh        | 10 +++++++---
 utils/qemu-uefi-tpm.nix |  1 -
 3 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/image/default.nix b/image/default.nix
index b4394c2..3d7049b 100644
--- a/image/default.nix
+++ b/image/default.nix
@@ -18,6 +18,10 @@ stdenvNoCC.mkDerivation (finalAttrs: {
     mtools
   ];
 
+  env = {
+    SYSTEMD_REPART_MKFS_OPTIONS_VFAT = "-S 512 -c";
+  };
+
   systemd = patosPkgs.systemd.out;
   kernel = patosPkgs.kernel.kernel;
   initrd = patosPkgs.initrd.out;
diff --git a/image/mkimage.sh b/image/mkimage.sh
index c7473d7..2ec259f 100644
--- a/image/mkimage.sh
+++ b/image/mkimage.sh
@@ -18,15 +18,19 @@ $systemd/usr/bin/ukify build \
 
 cp ${systemd}/usr/lib/systemd/boot/efi/systemd-bootx64.efi boot/
 
+echo "timeout 1" > boot/loader.conf
+echo -e "title PatOS Platform\nefi /EFI/Linux/patos-linux.efi" > boot/patos.conf
+
 cat <<EOF > repart.d/10-esp.conf
 [Partition]
 Type=esp
 Format=vfat
 SizeMinBytes=96M
 SizeMaxBytes=96M
-SplitName=-
-CopyFiles=/boot/patos-x64.efi:/EFI/Linux/patos-x64.efi
 CopyFiles=/boot/systemd-bootx64.efi:/EFI/BOOT/BOOTX64.EFI
+CopyFiles=/boot/patos-x64.efi:/EFI/Linux/patos-linux.efi
+CopyFiles=/boot/loader.conf:/loader/loader.conf
+CopyFiles=/boot/patos.conf:/loader/entries/patos.conf
 EOF
 
 cat <<EOF > repart.d/10-root.conf
@@ -41,7 +45,7 @@ EOF
 $systemd/usr/bin/systemd-repart \
   --no-pager \
   --empty=create \
-  --size=1G \
+  --size=auto \
   --definitions=./repart.d \
   --root=$out \
   patos-$version.raw
diff --git a/utils/qemu-uefi-tpm.nix b/utils/qemu-uefi-tpm.nix
index d05fbb2..bb151c5 100644
--- a/utils/qemu-uefi-tpm.nix
+++ b/utils/qemu-uefi-tpm.nix
@@ -33,7 +33,6 @@ pkgs.writeShellApplication {
         -smp 8 \
         -m 4G \
         -display none \
-        -nographic \
         -chardev "stdio,id=char0,mux=on,logfile=$state/console.log,signal=off" \
         -serial chardev:char0 \
         -mon chardev=char0 \

From e196cf729c066b585e0c89d4b29ec49e5507c219 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Tue, 25 Feb 2025 11:40:34 +0100
Subject: [PATCH 14/78] feat(image): switching root

---
 dbus-broker/default.nix |   1 +
 image/default.nix       |   5 ++
 image/mkimage.sh        | 112 +++++++++++++++++++++++++++++++++++++---
 rootfs/mkinitrd.sh      |  50 +++++-------------
 rootfs/mkrootfs.sh      |  12 ++++-
 5 files changed, 135 insertions(+), 45 deletions(-)

diff --git a/dbus-broker/default.nix b/dbus-broker/default.nix
index cad66af..156c490 100644
--- a/dbus-broker/default.nix
+++ b/dbus-broker/default.nix
@@ -150,6 +150,7 @@ stdenv.mkDerivation (finalAttrs: {
     mkdir -p $out/usr/share
     cp -Pr ${pkgs.dbus.out}/share/* $out/usr/share/
     cp ${pkgs.dbus.out}/etc/systemd/system/dbus.socket $out/usr/lib/systemd/system/
+    mv $out/usr/lib/systemd/system/dbus-broker.service $out/usr/lib/systemd/system/dbus.service
     find $out/usr/share/ -type d -exec chmod 755 {} \;
     sed -i 's#/nix/store.*/share#/usr/share#' $out/usr/share/xml/dbus-1/catalog.xml
     sed -i 's#/nix/store.*/libexec#/usr/bin#' $out/usr/share/dbus-1/system.conf
diff --git a/image/default.nix b/image/default.nix
index 3d7049b..e116625 100644
--- a/image/default.nix
+++ b/image/default.nix
@@ -16,9 +16,11 @@ stdenvNoCC.mkDerivation (finalAttrs: {
     erofs-utils
     dosfstools
     mtools
+    e2fsprogs
   ];
 
   env = {
+    # vfat options won't efi won't find the fs otherwise.
     SYSTEMD_REPART_MKFS_OPTIONS_VFAT = "-S 512 -c";
   };
 
@@ -27,5 +29,8 @@ stdenvNoCC.mkDerivation (finalAttrs: {
   initrd = patosPkgs.initrd.out;
   rootfs = patosPkgs.rootfs.out;
 
+  #FIXME: use roothash instead of device.
+  kernelCmdLine = "root=/dev/sda2 console=ttyS0";
+
   builder = ./mkimage.sh;
 })
diff --git a/image/mkimage.sh b/image/mkimage.sh
index 2ec259f..fc80f9d 100644
--- a/image/mkimage.sh
+++ b/image/mkimage.sh
@@ -9,17 +9,117 @@ mkdir rootfs
 cp -prP $rootfs/* rootfs/
 find rootfs/ -type d -exec chmod 755 {} \;
 
+# set default target to basic
+mkdir rootfs/usr/lib/systemd/system/basic.target.wants
+ln -sf basic.target rootfs/usr/lib/systemd/system/default.target
+
+# enable dbus
+ln -sf ../dbus.service rootfs/usr/lib/systemd/system/basic.target.wants/dbus.service
+ln -sf ../dbus.socket rootfs/usr/lib/systemd/system/sockets.target.wants/dbus.socket
+
+# generate machine-id
+$systemd/usr/bin/systemd-machine-id-setup --root=rootfs/
+
+cat <<EOF > rootfs/etc/passwd
+root::0:0:root:/root:/bin/sh
+bin:x:1:1:bin:/bin:/usr/bin/nologin
+daemon:x:2:2:daemon:/:/usr/bin/nologin
+mail:x:8:12:mail:/var/spool/mail:/usr/bin/nologin
+ftp:x:14:11:ftp:/srv/ftp:/usr/bin/nologin
+http:x:33:33:http:/srv/http:/usr/bin/nologin
+uuidd:x:68:68:uuidd:/:/usr/bin/nologin
+messagebus:x:81:81:messagebus:/:/usr/bin/nologin
+nobody:x:99:99:nobody:/:/usr/bin/nologin
+systemd-coredump:x:151:992::/var/empty:/usr/bin/nologin
+systemd-network:x:152:152::/var/empty:/usr/bin/nologin
+systemd-resolve:x:153:153::/var/empty:/usr/bin/nologin
+systemd-timesync:x:154:154::/var/empty:/usr/bin/nologin
+EOF
+chmod 644 rootfs/etc/passwd
+
+cat <<EOF > rootfs/etc/group
+root:x:0:root
+bin:x:1:root,bin,daemon
+daemon:x:2:root,bin,daemon
+sys:x:3:root,bin
+adm:x:4:root,daemon
+tty:x:5:
+disk:x:6:root
+lp:x:7:daemon
+mem:x:8:
+kmem:x:9:
+wheel:x:10:root
+ftp:x:11:
+mail:x:12:
+uucp:x:14:
+log:x:19:root
+utmp:x:20:
+locate:x:21:
+rfkill:x:24:
+smmsp:x:25:
+proc:x:26:
+http:x:33:
+games:x:50:
+lock:x:54:
+uuidd:x:68:
+messagebus:x:81:
+systemd-journal:x:62:
+systemd-network:x:152:
+systemd-resolve:x:153:
+systemd-timesync:x:154:
+systemd-oom:x:991:
+systemd-coredump:x:992:
+network:x:90:
+video:x:91:
+audio:x:92:
+optical:x:93:
+floppy:x:94:
+storage:x:95:
+scanner:x:96:
+input:x:97:
+power:x:98:
+nobody:x:99:
+EOF
+chmod 644 rootfs/etc/group
+
+# FIXME: remove this later (just to get a shell in the initramfs)
+cat <<EOF > rootfs/usr/lib/systemd/system/demo.service
+[Unit]
+Description=Debug Shell (/bin/sulogin)
+Conflicts=shutdown.target
+Before=shutdown.target
+
+[Service]
+Environment=HOME=/root
+WorkingDirectory=/root
+ExecStart=/bin/sulogin
+Type=idle
+StandardInput=tty-force
+StandardOutput=inherit
+StandardError=inherit
+KillMode=process
+IgnoreSIGPIPE=no
+SendSIGHUP=yes
+Restart=always
+
+[Install]
+WantedBy=basic.target
+EOF
+ln -sf ../demo.service rootfs/usr/lib/systemd/system/basic.target.wants/demo.service
+
+
 $systemd/usr/bin/ukify build \
-  --os-release rootfs/etc/os-release \
   --linux $kernel/bzImage \
   --initrd $initrd/initrd.xz \
-  --cmdline "console=ttyS0" \
-  -o boot/patos-x64.efi
+  --os-release rootfs/etc/os-release \
+  --stub $systemd/usr/lib/systemd/boot/efi/linuxx64.efi.stub \
+  --cmdline "$kernelCmdLine" \
+  -o boot/patos.efi
 
 cp ${systemd}/usr/lib/systemd/boot/efi/systemd-bootx64.efi boot/
 
 echo "timeout 1" > boot/loader.conf
-echo -e "title PatOS Platform\nefi /EFI/Linux/patos-linux.efi" > boot/patos.conf
+echo -e "title PatOS Platform\nefi /EFI/Linux/patos.efi" > boot/patos.conf
 
 cat <<EOF > repart.d/10-esp.conf
 [Partition]
@@ -28,7 +128,7 @@ Format=vfat
 SizeMinBytes=96M
 SizeMaxBytes=96M
 CopyFiles=/boot/systemd-bootx64.efi:/EFI/BOOT/BOOTX64.EFI
-CopyFiles=/boot/patos-x64.efi:/EFI/Linux/patos-linux.efi
+CopyFiles=/boot/patos.efi:/EFI/Linux/patos.efi
 CopyFiles=/boot/loader.conf:/loader/loader.conf
 CopyFiles=/boot/patos.conf:/loader/entries/patos.conf
 EOF
@@ -37,8 +137,8 @@ cat <<EOF > repart.d/10-root.conf
 [Partition]
 Type=root
 Format=erofs
-CopyFiles=/rootfs:/
 Minimize=best
+CopyFiles=/rootfs:/
 SplitName=root
 EOF
 
diff --git a/rootfs/mkinitrd.sh b/rootfs/mkinitrd.sh
index 2fe7770..c634b73 100644
--- a/rootfs/mkinitrd.sh
+++ b/rootfs/mkinitrd.sh
@@ -10,21 +10,12 @@ find . -type d -exec chmod 755 {} \;
 ### create directories
 ln -sf ../usr/lib/systemd/systemd init
 
-# set default target to basic
-mkdir usr/lib/systemd/system/basic.target.wants
-ln -sf basic.target usr/lib/systemd/system/default.target
-
-# enable dbus broker
-ln -sf ../dbus-broker.service usr/lib/systemd/system/basic.target.wants/dbus-broker.service
-ln -sf ../dbus.socket usr/lib/systemd/system/sockets.target.wants/dbus.socket
+mkdir sysroot
 
 ### Create needed files
 echo patos > ./etc/hostname
-cat <<EOF > ./etc/os-release
-NAME="PatOS"
-PRETTY_NAME="PatOS Platform"
-ID=patos
-EOF
+
+ln -sf /etc/os-release ./etc/initrd-release
 
 cat <<EOF > ./etc/passwd
 root::0:0:root:/root:/bin/sh
@@ -36,6 +27,10 @@ http:x:33:33:http:/srv/http:/usr/bin/nologin
 uuidd:x:68:68:uuidd:/:/usr/bin/nologin
 messagebus:x:81:81:messagebus:/:/usr/bin/nologin
 nobody:x:99:99:nobody:/:/usr/bin/nologin
+systemd-coredump:x:151:992::/var/empty:/usr/bin/nologin
+systemd-network:x:152:152::/var/empty:/usr/bin/nologin
+systemd-resolve:x:153:153::/var/empty:/usr/bin/nologin
+systemd-timesync:x:154:154::/var/empty:/usr/bin/nologin
 EOF
 chmod 644 ./etc/passwd
 
@@ -65,6 +60,12 @@ games:x:50:
 lock:x:54:
 uuidd:x:68:
 messagebus:x:81:
+systemd-journal:x:62:
+systemd-network:x:152:
+systemd-resolve:x:153:
+systemd-timesync:x:154:
+systemd-oom:x:991:
+systemd-coredump:x:992:
 network:x:90:
 video:x:91:
 audio:x:92:
@@ -78,31 +79,6 @@ nobody:x:99:
 EOF
 chmod 644 ./etc/group
 
-# FIXME: remove this later (just to get a shell in the initramfs)
-cat <<EOF > usr/lib/systemd/system/demo.service
-[Unit]
-Description=Debug Shell (/bin/sulogin)
-Conflicts=shutdown.target
-Before=shutdown.target
-
-[Service]
-Environment=HOME=/root
-WorkingDirectory=/root
-ExecStart=/bin/sulogin
-Type=idle
-StandardInput=tty-force
-StandardOutput=inherit
-StandardError=inherit
-KillMode=process
-IgnoreSIGPIPE=no
-SendSIGHUP=yes
-Restart=always
-
-[Install]
-WantedBy=basic.target
-EOF
-ln -sf ../demo.service usr/lib/systemd/system/basic.target.wants/demo.service
-
 # gen initrd
 find . -print0 | cpio --null --owner=root:root -o --format=newc | xz -9 --check=crc32 > ../initrd.xz
 
diff --git a/rootfs/mkrootfs.sh b/rootfs/mkrootfs.sh
index b850129..68b6d44 100644
--- a/rootfs/mkrootfs.sh
+++ b/rootfs/mkrootfs.sh
@@ -1,7 +1,7 @@
 set -ex -o pipefail
 
 mkdir -p $out
-mkdir -p $out/etc $out/dev $out/proc $out/sys $out/tmp $out/root
+mkdir -p $out/etc $out/dev $out/proc $out/sys $out/tmp $out/root $out/run $out/boot
 ln -sf ../usr/bin $out/bin
 ln -sf ../usr/bin $out/sbin
 ln -sf ../usr/lib $out/lib
@@ -18,6 +18,15 @@ rm -f $out/usr/lib/systemd/system/sysinit.target.wants/systemd-firstboot.service
 # remove vconsole setup
 rm -f $out/usr/lib/udev/rules.d/90-vconsole.rules
 
+cat <<EOF > $out/etc/os-release
+NAME="PatOS"
+PRETTY_NAME="PatOS 0.0.1 (pre-alpha)"
+ID=patos
+VERSION="0.0.1 (pre-alpha)"
+VERSION_CODENAME=pre-alpha
+VERSION_ID="0.0.1"
+EOF
+
 ### install PatOS glibc
 cp -P $glibcPatos/lib/*.so* $out/usr/lib/
 
@@ -51,4 +60,3 @@ patchelf --remove-rpath $out/usr/lib/ld-linux-x86-64.so.2
 # strip binaries
 find $out -type f -executable -exec strip {} \;
 find $out -type d -exec chmod 755 {} \;
-

From e4ebf7ea7ff4fbe4e0c0bef0d0cec2f661da3d8d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Tue, 25 Feb 2025 13:39:02 +0100
Subject: [PATCH 15/78] feat(image): make /var stateful

---
 image/mkimage.sh   | 19 ++++++++++++++++++-
 rootfs/mkrootfs.sh | 27 ++++++++++++++++++++++++++-
 2 files changed, 44 insertions(+), 2 deletions(-)

diff --git a/image/mkimage.sh b/image/mkimage.sh
index fc80f9d..019aed2 100644
--- a/image/mkimage.sh
+++ b/image/mkimage.sh
@@ -13,11 +13,28 @@ find rootfs/ -type d -exec chmod 755 {} \;
 mkdir rootfs/usr/lib/systemd/system/basic.target.wants
 ln -sf basic.target rootfs/usr/lib/systemd/system/default.target
 
+# mount patos state
+cat <<EOF > rootfs/usr/lib/systemd/system/var.mount
+[Unit]
+Description=Mount for /var
+Before=local-fs.target
+
+[Mount]
+What=/dev/disk/by-label/patos-state
+Where=/var
+Type=ext2
+Options=defaults
+
+[Install]
+WantedBy=basic.target
+EOF
+ln -sf ../var.mount rootfs/usr/lib/systemd/system/basic.target.wants/var.mount
+
 # enable dbus
 ln -sf ../dbus.service rootfs/usr/lib/systemd/system/basic.target.wants/dbus.service
 ln -sf ../dbus.socket rootfs/usr/lib/systemd/system/sockets.target.wants/dbus.socket
 
-# generate machine-id
+# generate a temporary machine id
 $systemd/usr/bin/systemd-machine-id-setup --root=rootfs/
 
 cat <<EOF > rootfs/etc/passwd
diff --git a/rootfs/mkrootfs.sh b/rootfs/mkrootfs.sh
index 68b6d44..3ee0ca3 100644
--- a/rootfs/mkrootfs.sh
+++ b/rootfs/mkrootfs.sh
@@ -1,7 +1,7 @@
 set -ex -o pipefail
 
 mkdir -p $out
-mkdir -p $out/etc $out/dev $out/proc $out/sys $out/tmp $out/root $out/run $out/boot
+mkdir -p $out/etc/repart.d $out/dev $out/proc $out/sys $out/tmp $out/root $out/run $out/boot
 ln -sf ../usr/bin $out/bin
 ln -sf ../usr/bin $out/sbin
 ln -sf ../usr/lib $out/lib
@@ -27,6 +27,31 @@ VERSION_CODENAME=pre-alpha
 VERSION_ID="0.0.1"
 EOF
 
+sed -i 's#After=\(.*\)#After=sysroot.mount \1#' $out/usr/lib/systemd/system/systemd-repart.service
+cat <<EOF > $out/etc/repart.d/10-esp.conf
+[Partition]
+Type=esp
+Format=vfat
+EOF
+
+cat <<EOF > $out/etc/repart.d/22-root.conf
+[Partition]
+Type=root
+EOF
+
+#FIXME: use btrfs instead on ext2(busybox) but need the btrfs tools in rootfs.
+cat <<EOF > $out/etc/repart.d/40-var.conf
+[Partition]
+Type=var
+UUID=4d21b016-b534-45c2-a9fb-5c16e091fd2d
+Format=ext2
+Label=patos-state
+Minimize=off
+FactoryReset=yes
+SizeMinBytes=1G
+SplitName=-
+EOF
+
 ### install PatOS glibc
 cp -P $glibcPatos/lib/*.so* $out/usr/lib/
 

From b3ad9f9962c53fde9303d62c6facb32102b92672 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Tue, 25 Feb 2025 18:01:44 +0100
Subject: [PATCH 16/78] feat(image): fix osrel in uki

---
 image/mkimage.sh   |  5 +----
 rootfs/mkrootfs.sh | 12 +++++++-----
 2 files changed, 8 insertions(+), 9 deletions(-)

diff --git a/image/mkimage.sh b/image/mkimage.sh
index 019aed2..4ad147b 100644
--- a/image/mkimage.sh
+++ b/image/mkimage.sh
@@ -128,15 +128,13 @@ ln -sf ../demo.service rootfs/usr/lib/systemd/system/basic.target.wants/demo.ser
 $systemd/usr/bin/ukify build \
   --linux $kernel/bzImage \
   --initrd $initrd/initrd.xz \
-  --os-release rootfs/etc/os-release \
-  --stub $systemd/usr/lib/systemd/boot/efi/linuxx64.efi.stub \
+  --os-release @rootfs/etc/os-release \
   --cmdline "$kernelCmdLine" \
   -o boot/patos.efi
 
 cp ${systemd}/usr/lib/systemd/boot/efi/systemd-bootx64.efi boot/
 
 echo "timeout 1" > boot/loader.conf
-echo -e "title PatOS Platform\nefi /EFI/Linux/patos.efi" > boot/patos.conf
 
 cat <<EOF > repart.d/10-esp.conf
 [Partition]
@@ -147,7 +145,6 @@ SizeMaxBytes=96M
 CopyFiles=/boot/systemd-bootx64.efi:/EFI/BOOT/BOOTX64.EFI
 CopyFiles=/boot/patos.efi:/EFI/Linux/patos.efi
 CopyFiles=/boot/loader.conf:/loader/loader.conf
-CopyFiles=/boot/patos.conf:/loader/entries/patos.conf
 EOF
 
 cat <<EOF > repart.d/10-root.conf
diff --git a/rootfs/mkrootfs.sh b/rootfs/mkrootfs.sh
index 3ee0ca3..e60e028 100644
--- a/rootfs/mkrootfs.sh
+++ b/rootfs/mkrootfs.sh
@@ -19,12 +19,14 @@ rm -f $out/usr/lib/systemd/system/sysinit.target.wants/systemd-firstboot.service
 rm -f $out/usr/lib/udev/rules.d/90-vconsole.rules
 
 cat <<EOF > $out/etc/os-release
-NAME="PatOS"
-PRETTY_NAME="PatOS 0.0.1 (pre-alpha)"
+NAME=PatOS
+PRETTY_NAME=PatOS 0.0.1 (pre-alpha)
+IMAGE_ID=patos
 ID=patos
-VERSION="0.0.1 (pre-alpha)"
-VERSION_CODENAME=pre-alpha
-VERSION_ID="0.0.1"
+IMAGE_VERSION=0.0.1
+VERSION=0.0.1
+VERSION_ID=0.0.1
+BUILD_ID=0.0.1
 EOF
 
 sed -i 's#After=\(.*\)#After=sysroot.mount \1#' $out/usr/lib/systemd/system/systemd-repart.service

From 3374541b3a14baa03887c2db4b4f669ed77aec58 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Tue, 25 Feb 2025 21:02:35 +0100
Subject: [PATCH 17/78] feat(image): switch to btrfs for patos-state

---
 image/mkimage.sh   | 92 +++++-------------------------------------
 rootfs/default.nix |  1 +
 rootfs/mkinitrd.sh | 65 +-----------------------------
 rootfs/mkrootfs.sh | 99 ++++++++++++++++++++++++++++++++++++++++++----
 4 files changed, 102 insertions(+), 155 deletions(-)

diff --git a/image/mkimage.sh b/image/mkimage.sh
index 4ad147b..721c26e 100644
--- a/image/mkimage.sh
+++ b/image/mkimage.sh
@@ -9,96 +9,22 @@ mkdir rootfs
 cp -prP $rootfs/* rootfs/
 find rootfs/ -type d -exec chmod 755 {} \;
 
-# set default target to basic
-mkdir rootfs/usr/lib/systemd/system/basic.target.wants
-ln -sf basic.target rootfs/usr/lib/systemd/system/default.target
+# set default target to multi-user
+ln -sf multi-user.target rootfs/usr/lib/systemd/system/default.target
 
 # mount patos state
-cat <<EOF > rootfs/usr/lib/systemd/system/var.mount
-[Unit]
-Description=Mount for /var
-Before=local-fs.target
-
-[Mount]
-What=/dev/disk/by-label/patos-state
-Where=/var
-Type=ext2
-Options=defaults
-
-[Install]
-WantedBy=basic.target
-EOF
-ln -sf ../var.mount rootfs/usr/lib/systemd/system/basic.target.wants/var.mount
+ln -sf ../var.mount rootfs/usr/lib/systemd/system/sysinit.target.wants/var.mount
 
 # enable dbus
-ln -sf ../dbus.service rootfs/usr/lib/systemd/system/basic.target.wants/dbus.service
+ln -sf ../dbus.service rootfs/usr/lib/systemd/system/multi-user.target.wants/dbus.service
 ln -sf ../dbus.socket rootfs/usr/lib/systemd/system/sockets.target.wants/dbus.socket
 
+# enable systemd-networkd
+ln -sf ../systemd-networkd.service rootfs/usr/lib/systemd/system/sysinit.target.wants/systemd-networkd.service
+
 # generate a temporary machine id
 $systemd/usr/bin/systemd-machine-id-setup --root=rootfs/
 
-cat <<EOF > rootfs/etc/passwd
-root::0:0:root:/root:/bin/sh
-bin:x:1:1:bin:/bin:/usr/bin/nologin
-daemon:x:2:2:daemon:/:/usr/bin/nologin
-mail:x:8:12:mail:/var/spool/mail:/usr/bin/nologin
-ftp:x:14:11:ftp:/srv/ftp:/usr/bin/nologin
-http:x:33:33:http:/srv/http:/usr/bin/nologin
-uuidd:x:68:68:uuidd:/:/usr/bin/nologin
-messagebus:x:81:81:messagebus:/:/usr/bin/nologin
-nobody:x:99:99:nobody:/:/usr/bin/nologin
-systemd-coredump:x:151:992::/var/empty:/usr/bin/nologin
-systemd-network:x:152:152::/var/empty:/usr/bin/nologin
-systemd-resolve:x:153:153::/var/empty:/usr/bin/nologin
-systemd-timesync:x:154:154::/var/empty:/usr/bin/nologin
-EOF
-chmod 644 rootfs/etc/passwd
-
-cat <<EOF > rootfs/etc/group
-root:x:0:root
-bin:x:1:root,bin,daemon
-daemon:x:2:root,bin,daemon
-sys:x:3:root,bin
-adm:x:4:root,daemon
-tty:x:5:
-disk:x:6:root
-lp:x:7:daemon
-mem:x:8:
-kmem:x:9:
-wheel:x:10:root
-ftp:x:11:
-mail:x:12:
-uucp:x:14:
-log:x:19:root
-utmp:x:20:
-locate:x:21:
-rfkill:x:24:
-smmsp:x:25:
-proc:x:26:
-http:x:33:
-games:x:50:
-lock:x:54:
-uuidd:x:68:
-messagebus:x:81:
-systemd-journal:x:62:
-systemd-network:x:152:
-systemd-resolve:x:153:
-systemd-timesync:x:154:
-systemd-oom:x:991:
-systemd-coredump:x:992:
-network:x:90:
-video:x:91:
-audio:x:92:
-optical:x:93:
-floppy:x:94:
-storage:x:95:
-scanner:x:96:
-input:x:97:
-power:x:98:
-nobody:x:99:
-EOF
-chmod 644 rootfs/etc/group
-
 # FIXME: remove this later (just to get a shell in the initramfs)
 cat <<EOF > rootfs/usr/lib/systemd/system/demo.service
 [Unit]
@@ -120,9 +46,9 @@ SendSIGHUP=yes
 Restart=always
 
 [Install]
-WantedBy=basic.target
+WantedBy=multi-user.target
 EOF
-ln -sf ../demo.service rootfs/usr/lib/systemd/system/basic.target.wants/demo.service
+ln -sf ../demo.service rootfs/usr/lib/systemd/system/multi-user.target.wants/demo.service
 
 
 $systemd/usr/bin/ukify build \
diff --git a/rootfs/default.nix b/rootfs/default.nix
index 755050f..a180f8e 100644
--- a/rootfs/default.nix
+++ b/rootfs/default.nix
@@ -25,6 +25,7 @@ stdenvNoCC.mkDerivation (finalAttrs: {
   kmodLibs = pkgs.kmod.lib;
   kmodBin = pkgs.kmod.out;
   libbpf = pkgs.libbpf.out;
+  btrfs = pkgs.btrfs-progs.out;
 
   builder = ./mkrootfs.sh;
 })
diff --git a/rootfs/mkinitrd.sh b/rootfs/mkinitrd.sh
index c634b73..c735448 100644
--- a/rootfs/mkinitrd.sh
+++ b/rootfs/mkinitrd.sh
@@ -6,79 +6,16 @@ pushd $out/root
 ### copy rootfs
 cp -prP $rootfs/* .
 find . -type d -exec chmod 755 {} \;
+mkdir sysroot
 
 ### create directories
 ln -sf ../usr/lib/systemd/systemd init
 
-mkdir sysroot
-
 ### Create needed files
 echo patos > ./etc/hostname
 
 ln -sf /etc/os-release ./etc/initrd-release
 
-cat <<EOF > ./etc/passwd
-root::0:0:root:/root:/bin/sh
-bin:x:1:1:bin:/bin:/usr/bin/nologin
-daemon:x:2:2:daemon:/:/usr/bin/nologin
-mail:x:8:12:mail:/var/spool/mail:/usr/bin/nologin
-ftp:x:14:11:ftp:/srv/ftp:/usr/bin/nologin
-http:x:33:33:http:/srv/http:/usr/bin/nologin
-uuidd:x:68:68:uuidd:/:/usr/bin/nologin
-messagebus:x:81:81:messagebus:/:/usr/bin/nologin
-nobody:x:99:99:nobody:/:/usr/bin/nologin
-systemd-coredump:x:151:992::/var/empty:/usr/bin/nologin
-systemd-network:x:152:152::/var/empty:/usr/bin/nologin
-systemd-resolve:x:153:153::/var/empty:/usr/bin/nologin
-systemd-timesync:x:154:154::/var/empty:/usr/bin/nologin
-EOF
-chmod 644 ./etc/passwd
-
-cat <<EOF > ./etc/group
-root:x:0:root
-bin:x:1:root,bin,daemon
-daemon:x:2:root,bin,daemon
-sys:x:3:root,bin
-adm:x:4:root,daemon
-tty:x:5:
-disk:x:6:root
-lp:x:7:daemon
-mem:x:8:
-kmem:x:9:
-wheel:x:10:root
-ftp:x:11:
-mail:x:12:
-uucp:x:14:
-log:x:19:root
-utmp:x:20:
-locate:x:21:
-rfkill:x:24:
-smmsp:x:25:
-proc:x:26:
-http:x:33:
-games:x:50:
-lock:x:54:
-uuidd:x:68:
-messagebus:x:81:
-systemd-journal:x:62:
-systemd-network:x:152:
-systemd-resolve:x:153:
-systemd-timesync:x:154:
-systemd-oom:x:991:
-systemd-coredump:x:992:
-network:x:90:
-video:x:91:
-audio:x:92:
-optical:x:93:
-floppy:x:94:
-storage:x:95:
-scanner:x:96:
-input:x:97:
-power:x:98:
-nobody:x:99:
-EOF
-chmod 644 ./etc/group
-
 # gen initrd
 find . -print0 | cpio --null --owner=root:root -o --format=newc | xz -9 --check=crc32 > ../initrd.xz
 
diff --git a/rootfs/mkrootfs.sh b/rootfs/mkrootfs.sh
index e60e028..c7460e6 100644
--- a/rootfs/mkrootfs.sh
+++ b/rootfs/mkrootfs.sh
@@ -1,7 +1,7 @@
 set -ex -o pipefail
 
 mkdir -p $out
-mkdir -p $out/etc/repart.d $out/dev $out/proc $out/sys $out/tmp $out/root $out/run $out/boot
+mkdir -p $out/etc/repart.d $out/dev $out/proc $out/sys $out/tmp $out/root $out/run $out/boot $out/mnt
 ln -sf ../usr/bin $out/bin
 ln -sf ../usr/bin $out/sbin
 ln -sf ../usr/lib $out/lib
@@ -20,13 +20,13 @@ rm -f $out/usr/lib/udev/rules.d/90-vconsole.rules
 
 cat <<EOF > $out/etc/os-release
 NAME=PatOS
-PRETTY_NAME=PatOS 0.0.1 (pre-alpha)
+PRETTY_NAME=PatOS v${version} (Pre-Alpha)
 IMAGE_ID=patos
 ID=patos
-IMAGE_VERSION=0.0.1
-VERSION=0.0.1
-VERSION_ID=0.0.1
-BUILD_ID=0.0.1
+IMAGE_VERSION=${version}
+VERSION=${version}
+VERSION_ID={version}
+BUILD_ID={version}
 EOF
 
 sed -i 's#After=\(.*\)#After=sysroot.mount \1#' $out/usr/lib/systemd/system/systemd-repart.service
@@ -41,12 +41,11 @@ cat <<EOF > $out/etc/repart.d/22-root.conf
 Type=root
 EOF
 
-#FIXME: use btrfs instead on ext2(busybox) but need the btrfs tools in rootfs.
 cat <<EOF > $out/etc/repart.d/40-var.conf
 [Partition]
 Type=var
 UUID=4d21b016-b534-45c2-a9fb-5c16e091fd2d
-Format=ext2
+Format=btrfs
 Label=patos-state
 Minimize=off
 FactoryReset=yes
@@ -54,6 +53,21 @@ SizeMinBytes=1G
 SplitName=-
 EOF
 
+cat <<EOF > $out/usr/lib/systemd/system/var.mount
+[Unit]
+Description=Mount for /var
+Before=local-fs.target
+
+[Mount]
+What=/dev/disk/by-label/patos-state
+Where=/var
+Type=btrfs
+Options=defaults
+
+[Install]
+WantedBy=multi-user.target
+EOF
+
 ### install PatOS glibc
 cp -P $glibcPatos/lib/*.so* $out/usr/lib/
 
@@ -68,6 +82,10 @@ $out/usr/bin/busybox --list | xargs -I {} ln -sf busybox $out/usr/bin/{}
 ### install dbus broker
 cp -r $dbusBroker/* $out/
 
+### install btrfs progs
+cp -Pr ${btrfs}/bin/* $out/usr/bin/
+cp -Pr ${btrfs}/lib/* $out/usr/lib/
+
 ### install lib kmod
 cp -P $kmodLibs/lib/* $out/usr/lib
 cp -P $kmodBin/bin/* $out/usr/bin
@@ -75,6 +93,71 @@ cp -P $kmodBin/bin/* $out/usr/bin
 ### install libbpf
 cp -P $libbpf/lib/libbpf* $out/usr/lib
 
+# remove pkgconfig
+rm -rf $out/usr/lib/pkgconfig
+
+cat <<EOF > $out/etc/passwd
+root::0:0:root:/root:/bin/sh
+bin:x:1:1:bin:/bin:/usr/bin/nologin
+daemon:x:2:2:daemon:/:/usr/bin/nologin
+mail:x:8:12:mail:/var/spool/mail:/usr/bin/nologin
+ftp:x:14:11:ftp:/srv/ftp:/usr/bin/nologin
+http:x:33:33:http:/srv/http:/usr/bin/nologin
+uuidd:x:68:68:uuidd:/:/usr/bin/nologin
+messagebus:x:81:81:messagebus:/:/usr/bin/nologin
+nobody:x:99:99:nobody:/:/usr/bin/nologin
+systemd-coredump:x:151:992::/var/empty:/usr/bin/nologin
+systemd-network:x:152:152::/var/empty:/usr/bin/nologin
+systemd-resolve:x:153:153::/var/empty:/usr/bin/nologin
+systemd-timesync:x:154:154::/var/empty:/usr/bin/nologin
+EOF
+chmod 644 $out/etc/passwd
+
+cat <<EOF > $out/etc/group
+root:x:0:root
+bin:x:1:root,bin,daemon
+daemon:x:2:root,bin,daemon
+sys:x:3:root,bin
+adm:x:4:root,daemon
+tty:x:5:
+disk:x:6:root
+lp:x:7:daemon
+mem:x:8:
+kmem:x:9:
+wheel:x:10:root
+ftp:x:11:
+mail:x:12:
+uucp:x:14:
+log:x:19:root
+utmp:x:20:
+locate:x:21:
+rfkill:x:24:
+smmsp:x:25:
+proc:x:26:
+http:x:33:
+games:x:50:
+lock:x:54:
+uuidd:x:68:
+messagebus:x:81:
+systemd-journal:x:62:
+systemd-network:x:152:
+systemd-resolve:x:153:
+systemd-timesync:x:154:
+systemd-oom:x:991:
+systemd-coredump:x:992:
+network:x:90:
+video:x:91:
+audio:x:92:
+optical:x:93:
+floppy:x:94:
+storage:x:95:
+scanner:x:96:
+input:x:97:
+power:x:98:
+nobody:x:99:
+EOF
+chmod 644 $out/etc/group
+
 ### Find and install all shared libs
 find $out -type f -executable -exec ldd {} \; | awk '{print $3}' | grep -v systemd | grep -v glibc | sort -u | xargs cp -t $out/usr/lib
 find $out -type f -executable -exec chmod 755 {} \;

From 0ed83a6d27d8aae1142a9814d0ae303825b079b9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Tue, 25 Feb 2025 21:54:42 +0100
Subject: [PATCH 18/78] feat(image): add overlay to /etc and use busybox getty
 for login prompt

---
 image/mkimage.sh   | 27 +--------------------------
 rootfs/mkrootfs.sh | 20 +++++++++++++++++++-
 2 files changed, 20 insertions(+), 27 deletions(-)

diff --git a/image/mkimage.sh b/image/mkimage.sh
index 721c26e..7a76dd9 100644
--- a/image/mkimage.sh
+++ b/image/mkimage.sh
@@ -13,6 +13,7 @@ find rootfs/ -type d -exec chmod 755 {} \;
 ln -sf multi-user.target rootfs/usr/lib/systemd/system/default.target
 
 # mount patos state
+ln -sf ../etc.mount rootfs/usr/lib/systemd/system/local-fs.target.wants/etc.mount
 ln -sf ../var.mount rootfs/usr/lib/systemd/system/sysinit.target.wants/var.mount
 
 # enable dbus
@@ -25,32 +26,6 @@ ln -sf ../systemd-networkd.service rootfs/usr/lib/systemd/system/sysinit.target.
 # generate a temporary machine id
 $systemd/usr/bin/systemd-machine-id-setup --root=rootfs/
 
-# FIXME: remove this later (just to get a shell in the initramfs)
-cat <<EOF > rootfs/usr/lib/systemd/system/demo.service
-[Unit]
-Description=Debug Shell (/bin/sulogin)
-Conflicts=shutdown.target
-Before=shutdown.target
-
-[Service]
-Environment=HOME=/root
-WorkingDirectory=/root
-ExecStart=/bin/sulogin
-Type=idle
-StandardInput=tty-force
-StandardOutput=inherit
-StandardError=inherit
-KillMode=process
-IgnoreSIGPIPE=no
-SendSIGHUP=yes
-Restart=always
-
-[Install]
-WantedBy=multi-user.target
-EOF
-ln -sf ../demo.service rootfs/usr/lib/systemd/system/multi-user.target.wants/demo.service
-
-
 $systemd/usr/bin/ukify build \
   --linux $kernel/bzImage \
   --initrd $initrd/initrd.xz \
diff --git a/rootfs/mkrootfs.sh b/rootfs/mkrootfs.sh
index c7460e6..75ba2a6 100644
--- a/rootfs/mkrootfs.sh
+++ b/rootfs/mkrootfs.sh
@@ -1,7 +1,7 @@
 set -ex -o pipefail
 
 mkdir -p $out
-mkdir -p $out/etc/repart.d $out/dev $out/proc $out/sys $out/tmp $out/root $out/run $out/boot $out/mnt
+mkdir -p $out/etc/repart.d $out/dev $out/proc $out/sys $out/tmp $out/root $out/run $out/boot $out/mnt $out/home $out/srv
 ln -sf ../usr/bin $out/bin
 ln -sf ../usr/bin $out/sbin
 ln -sf ../usr/lib $out/lib
@@ -29,6 +29,9 @@ VERSION_ID={version}
 BUILD_ID={version}
 EOF
 
+# replace agetty with busybox getty
+sed -i 's#ExecStart=.*#ExecStart=-/sbin/getty -L %I 115200 vt100#' $out/usr/lib/systemd/system/serial-getty@.service
+
 sed -i 's#After=\(.*\)#After=sysroot.mount \1#' $out/usr/lib/systemd/system/systemd-repart.service
 cat <<EOF > $out/etc/repart.d/10-esp.conf
 [Partition]
@@ -68,6 +71,21 @@ Options=defaults
 WantedBy=multi-user.target
 EOF
 
+cat <<EOF > $out/usr/lib/systemd/system/etc.mount
+[Unit]
+Description=Overlay mount for /etc
+Before=local-fs.target
+
+[Mount]
+What=overlay
+Where=/etc
+Type=overlay
+Options=lowerdir=/etc,upperdir=/run/.rw-etc/upper,workdir=/run/.rw-etc/work
+
+[Install]
+WantedBy=local-fs.target
+EOF
+
 ### install PatOS glibc
 cp -P $glibcPatos/lib/*.so* $out/usr/lib/
 

From a3aab1ea5cb98dfcf0093a2df1f6290e6aa34faa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Tue, 25 Feb 2025 23:08:42 +0100
Subject: [PATCH 19/78] chore: flake nix cleanup

---
 flake.nix           | 22 +++++++++++++++-------
 image/default.nix   |  2 +-
 rootfs/default.nix  |  2 +-
 rootfs/mkinitrd.nix |  2 +-
 4 files changed, 18 insertions(+), 10 deletions(-)

diff --git a/flake.nix b/flake.nix
index 2e4eafa..9e612b4 100644
--- a/flake.nix
+++ b/flake.nix
@@ -17,17 +17,27 @@
       let
         pkgs = import nixpkgs { inherit system; };
         patosPkgs = self.packages.${system};
+        version = "0.0.1";
       in
       {
         packages = {
-          default = self.packages.${system}.image;
-          image = pkgs.callPackage ./image { inherit patosPkgs; };
+          default = patosPkgs.image;
+          image = pkgs.callPackage ./image {
+            inherit patosPkgs;
+            inherit version;
+          };
+          rootfs = pkgs.callPackage ./rootfs {
+            inherit patosPkgs;
+            inherit version;
+          };
+          initrd = pkgs.callPackage ./rootfs/mkinitrd.nix {
+            inherit patosPkgs;
+            inherit version;
+          };
           kernel = pkgs.callPackage ./kernel { };
           glibc = pkgs.callPackage ./glibc { };
           systemd = pkgs.callPackage ./systemd { };
           dbus-broker = pkgs.callPackage ./dbus-broker { };
-          rootfs = pkgs.callPackage ./rootfs { inherit patosPkgs; };
-          initrd = pkgs.callPackage ./rootfs/mkinitrd.nix { inherit patosPkgs; };
 
           qemu-uefi-tpm = pkgs.callPackage ./utils/qemu-uefi-tpm.nix { };
         };
@@ -43,12 +53,10 @@
 
         devShells.default = pkgs.mkShell {
           buildInputs = with pkgs; [
-            erofs-utils
             just
             nixd
             nixfmt-rfc-style
-            squashfs-tools-ng
-            self.packages.${system}.qemu-uefi-tpm
+            patosPkgs.qemu-uefi-tpm
           ];
         };
 
diff --git a/image/default.nix b/image/default.nix
index e116625..553d87f 100644
--- a/image/default.nix
+++ b/image/default.nix
@@ -2,10 +2,10 @@
   pkgs,
   stdenvNoCC,
   patosPkgs,
+  version,
   ...
 }:
 let
-  version = "0.0.1";
   pname = "patos-image";
 in
 stdenvNoCC.mkDerivation (finalAttrs: {
diff --git a/rootfs/default.nix b/rootfs/default.nix
index a180f8e..b206a0c 100644
--- a/rootfs/default.nix
+++ b/rootfs/default.nix
@@ -2,10 +2,10 @@
   pkgs,
   stdenvNoCC,
   patosPkgs,
+  version,
   ...
 }:
 let
-  version = "0.0.1";
   pname = "patos-rootfs";
 in
 stdenvNoCC.mkDerivation (finalAttrs: {
diff --git a/rootfs/mkinitrd.nix b/rootfs/mkinitrd.nix
index f564813..3708483 100644
--- a/rootfs/mkinitrd.nix
+++ b/rootfs/mkinitrd.nix
@@ -2,10 +2,10 @@
   pkgs,
   stdenvNoCC,
   patosPkgs,
+  version,
   ...
 }:
 let
-  version = "0.0.1";
   pname = "patos-ramdisk";
 in
 stdenvNoCC.mkDerivation (finalAttrs: {

From ca54cefe36dae77b60cdc4c49569f573d6eb32f7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 26 Feb 2025 10:21:56 +0100
Subject: [PATCH 20/78] fix: mount race condition of patos-state

---
 image/mkimage.sh    |  8 +++++---
 rootfs/mkrootfs.sh  | 16 +++++++++++-----
 systemd/default.nix |  2 +-
 3 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/image/mkimage.sh b/image/mkimage.sh
index 7a76dd9..0a7ca0b 100644
--- a/image/mkimage.sh
+++ b/image/mkimage.sh
@@ -12,7 +12,7 @@ find rootfs/ -type d -exec chmod 755 {} \;
 # set default target to multi-user
 ln -sf multi-user.target rootfs/usr/lib/systemd/system/default.target
 
-# mount patos state
+# mount /etc overlay and patos state
 ln -sf ../etc.mount rootfs/usr/lib/systemd/system/local-fs.target.wants/etc.mount
 ln -sf ../var.mount rootfs/usr/lib/systemd/system/sysinit.target.wants/var.mount
 
@@ -20,10 +20,12 @@ ln -sf ../var.mount rootfs/usr/lib/systemd/system/sysinit.target.wants/var.mount
 ln -sf ../dbus.service rootfs/usr/lib/systemd/system/multi-user.target.wants/dbus.service
 ln -sf ../dbus.socket rootfs/usr/lib/systemd/system/sockets.target.wants/dbus.socket
 
-# enable systemd-networkd
+# enable network services
 ln -sf ../systemd-networkd.service rootfs/usr/lib/systemd/system/sysinit.target.wants/systemd-networkd.service
+ln -sf ../systemd-resolved.service rootfs/usr/lib/systemd/system/sysinit.target.wants/systemd-resolved.service
+ln -sf ../systemd-timesyncd.service rootfs/usr/lib/systemd/system/multi-user.target.wants/systemd-timesyncd.service
 
-# generate a temporary machine id
+# generate a temporary machine id (replace with overlay later)
 $systemd/usr/bin/systemd-machine-id-setup --root=rootfs/
 
 $systemd/usr/bin/ukify build \
diff --git a/rootfs/mkrootfs.sh b/rootfs/mkrootfs.sh
index 75ba2a6..5fba8c5 100644
--- a/rootfs/mkrootfs.sh
+++ b/rootfs/mkrootfs.sh
@@ -1,11 +1,11 @@
 set -ex -o pipefail
 
 mkdir -p $out
-mkdir -p $out/etc/repart.d $out/dev $out/proc $out/sys $out/tmp $out/root $out/run $out/boot $out/mnt $out/home $out/srv
-ln -sf ../usr/bin $out/bin
-ln -sf ../usr/bin $out/sbin
-ln -sf ../usr/lib $out/lib
-ln -sf ../usr/lib $out/lib64
+mkdir -p $out/etc/repart.d $out/dev $out/proc $out/sys $out/tmp $out/root $out/run $out/boot $out/mnt $out/home $out/srv $out/var/tmp
+ln -sf /usr/bin $out/bin
+ln -sf /usr/bin $out/sbin
+ln -sf /usr/lib $out/lib
+ln -sf /usr/lib $out/lib64
 ln -sf ../proc/self/mounts $out/etc/mtab
 
 ### install systemd
@@ -29,6 +29,11 @@ VERSION_ID={version}
 BUILD_ID={version}
 EOF
 
+cat <<EOF > $out/etc/issue
+<<< Welcome to PatOS v${version} (Pre-Alpha) (\m) - \l >>>
+
+EOF
+
 # replace agetty with busybox getty
 sed -i 's#ExecStart=.*#ExecStart=-/sbin/getty -L %I 115200 vt100#' $out/usr/lib/systemd/system/serial-getty@.service
 
@@ -60,6 +65,7 @@ cat <<EOF > $out/usr/lib/systemd/system/var.mount
 [Unit]
 Description=Mount for /var
 Before=local-fs.target
+After=systemd-repart.service
 
 [Mount]
 What=/dev/disk/by-label/patos-state
diff --git a/systemd/default.nix b/systemd/default.nix
index 4daf9ed..130cf42 100644
--- a/systemd/default.nix
+++ b/systemd/default.nix
@@ -305,7 +305,7 @@ stdenv.mkDerivation (finalAttrs: {
     (lib.mesonBool "utmp" true)
     (lib.mesonBool "log-trace" true)
 
-    (lib.mesonBool "kernel-install" true)
+    (lib.mesonBool "kernel-install" false)
     (lib.mesonBool "quotacheck" false)
     (lib.mesonBool "ldconfig" false)
     (lib.mesonBool "install-sysconfdir" true)

From 0a0e9127e0b60bfe59c39159f20790e7d277cdf5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 26 Feb 2025 10:44:36 +0100
Subject: [PATCH 21/78] fix(systemd): set path to kexec

---
 rootfs/mkrootfs.sh  | 5 +++--
 systemd/default.nix | 1 +
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/rootfs/mkrootfs.sh b/rootfs/mkrootfs.sh
index 5fba8c5..ff19902 100644
--- a/rootfs/mkrootfs.sh
+++ b/rootfs/mkrootfs.sh
@@ -1,6 +1,6 @@
 set -ex -o pipefail
 
-mkdir -p $out
+### create directory structure
 mkdir -p $out/etc/repart.d $out/dev $out/proc $out/sys $out/tmp $out/root $out/run $out/boot $out/mnt $out/home $out/srv $out/var/tmp
 ln -sf /usr/bin $out/bin
 ln -sf /usr/bin $out/sbin
@@ -15,7 +15,8 @@ find $out -type d -exec chmod 755 {} \;
 rm -rf $out/usr/include
 rm -rf $out/usr/sbin
 rm -f $out/usr/lib/systemd/system/sysinit.target.wants/systemd-firstboot.service
-# remove vconsole setup
+rm -f $out/usr/lib/systemd/ukify
+rm -f $out/usr/bin/ukify
 rm -f $out/usr/lib/udev/rules.d/90-vconsole.rules
 
 cat <<EOF > $out/etc/os-release
diff --git a/systemd/default.nix b/systemd/default.nix
index 130cf42..6f5c6c9 100644
--- a/systemd/default.nix
+++ b/systemd/default.nix
@@ -184,6 +184,7 @@ stdenv.mkDerivation (finalAttrs: {
     (lib.mesonOption "tty-gid" "3") # tty in NixOS has gid 3
 
     (lib.mesonOption "kmod-path" "/usr/bin/kmod")
+    (lib.mesonOption "kexec-path" "/usr/bin/kexec")
     (lib.mesonOption "debug-shell" "/usr/bin/sh")
     (lib.mesonOption "pamconfdir" "/etc/pam.d")
     (lib.mesonOption "shellprofiledir" "/etc/profile.d")

From 7365ef8918dacc9c26f9d94bd71078cf62652d27 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 26 Feb 2025 14:35:58 +0100
Subject: [PATCH 22/78] feat(image): install upstream kexec which now have
 support for UKIs

---
 flake.nix                                     | 15 ++---
 {dbus-broker => pkgs/dbus-broker}/default.nix |  0
 {glibc => pkgs/glibc}/default.nix             |  0
 {image => pkgs/image}/default.nix             |  0
 {image => pkgs/image}/mkimage.sh              |  0
 {kernel => pkgs/kernel}/default.nix           |  0
 {kernel => pkgs/kernel}/generic.config        |  0
 pkgs/kexec-tools/default.nix                  | 62 +++++++++++++++++++
 {rootfs => pkgs/rootfs}/default.nix           |  1 +
 {rootfs => pkgs/rootfs}/mkinitrd.nix          |  0
 {rootfs => pkgs/rootfs}/mkinitrd.sh           |  0
 {rootfs => pkgs/rootfs}/mkrootfs.sh           |  3 +
 {systemd => pkgs/systemd}/default.nix         |  0
 13 files changed, 74 insertions(+), 7 deletions(-)
 rename {dbus-broker => pkgs/dbus-broker}/default.nix (100%)
 rename {glibc => pkgs/glibc}/default.nix (100%)
 rename {image => pkgs/image}/default.nix (100%)
 rename {image => pkgs/image}/mkimage.sh (100%)
 rename {kernel => pkgs/kernel}/default.nix (100%)
 rename {kernel => pkgs/kernel}/generic.config (100%)
 create mode 100644 pkgs/kexec-tools/default.nix
 rename {rootfs => pkgs/rootfs}/default.nix (94%)
 rename {rootfs => pkgs/rootfs}/mkinitrd.nix (100%)
 rename {rootfs => pkgs/rootfs}/mkinitrd.sh (100%)
 rename {rootfs => pkgs/rootfs}/mkrootfs.sh (98%)
 rename {systemd => pkgs/systemd}/default.nix (100%)

diff --git a/flake.nix b/flake.nix
index 9e612b4..32097ba 100644
--- a/flake.nix
+++ b/flake.nix
@@ -22,22 +22,23 @@
       {
         packages = {
           default = patosPkgs.image;
-          image = pkgs.callPackage ./image {
+          image = pkgs.callPackage ./pkgs/image {
             inherit patosPkgs;
             inherit version;
           };
-          rootfs = pkgs.callPackage ./rootfs {
+          rootfs = pkgs.callPackage ./pkgs/rootfs {
             inherit patosPkgs;
             inherit version;
           };
-          initrd = pkgs.callPackage ./rootfs/mkinitrd.nix {
+          initrd = pkgs.callPackage ./pkgs/rootfs/mkinitrd.nix {
             inherit patosPkgs;
             inherit version;
           };
-          kernel = pkgs.callPackage ./kernel { };
-          glibc = pkgs.callPackage ./glibc { };
-          systemd = pkgs.callPackage ./systemd { };
-          dbus-broker = pkgs.callPackage ./dbus-broker { };
+          kernel = pkgs.callPackage ./pkgs/kernel { };
+          glibc = pkgs.callPackage ./pkgs/glibc { };
+          kexec = pkgs.callPackage ./pkgs/kexec-tools { };
+          systemd = pkgs.callPackage ./pkgs/systemd { };
+          dbus-broker = pkgs.callPackage ./pkgs/dbus-broker { };
 
           qemu-uefi-tpm = pkgs.callPackage ./utils/qemu-uefi-tpm.nix { };
         };
diff --git a/dbus-broker/default.nix b/pkgs/dbus-broker/default.nix
similarity index 100%
rename from dbus-broker/default.nix
rename to pkgs/dbus-broker/default.nix
diff --git a/glibc/default.nix b/pkgs/glibc/default.nix
similarity index 100%
rename from glibc/default.nix
rename to pkgs/glibc/default.nix
diff --git a/image/default.nix b/pkgs/image/default.nix
similarity index 100%
rename from image/default.nix
rename to pkgs/image/default.nix
diff --git a/image/mkimage.sh b/pkgs/image/mkimage.sh
similarity index 100%
rename from image/mkimage.sh
rename to pkgs/image/mkimage.sh
diff --git a/kernel/default.nix b/pkgs/kernel/default.nix
similarity index 100%
rename from kernel/default.nix
rename to pkgs/kernel/default.nix
diff --git a/kernel/generic.config b/pkgs/kernel/generic.config
similarity index 100%
rename from kernel/generic.config
rename to pkgs/kernel/generic.config
diff --git a/pkgs/kexec-tools/default.nix b/pkgs/kexec-tools/default.nix
new file mode 100644
index 0000000..4ba15ba
--- /dev/null
+++ b/pkgs/kexec-tools/default.nix
@@ -0,0 +1,62 @@
+{
+  lib,
+  stdenv,
+  buildPackages,
+  fetchFromGitHub,
+  autoconf,
+  zlib,
+}:
+
+stdenv.mkDerivation {
+  pname = "kexec-tools";
+  version = "main";
+
+  src = fetchFromGitHub {
+    owner = "horms";
+    repo = "kexec-tools";
+    rev = "a7fcd424c4c80dea5a2fd5ffa274ffeb8129c790";
+    hash = "sha256-QKE+KCkueA21zNunTMidP9OuZaw0IG5tFDF4UJITTTQ=";
+  };
+
+  dontPatchShebangs = true;
+
+  hardeningDisable = [
+    "format"
+    "pic"
+    "relro"
+    "pie"
+  ];
+
+  buildCommand = ''
+    unpackPhase
+    mkdir -p $out
+    cd source
+    ./bootstrap
+    ./configure --prefix=/
+    make DESTDIR=$out install
+  '';
+
+  depsBuildBuild = [ buildPackages.stdenv.cc ];
+
+  buildInputs = [
+    zlib
+    autoconf
+  ];
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    homepage = "http://horms.net/projects/kexec/kexec-tools";
+    description = "Tools related to the kexec Linux feature";
+    platforms = platforms.linux;
+    badPlatforms = [
+      "microblaze-linux"
+      "microblazeel-linux"
+      "riscv64-linux"
+      "riscv32-linux"
+      "sparc-linux"
+      "sparc64-linux"
+    ];
+    license = licenses.gpl2Only;
+  };
+}
diff --git a/rootfs/default.nix b/pkgs/rootfs/default.nix
similarity index 94%
rename from rootfs/default.nix
rename to pkgs/rootfs/default.nix
index b206a0c..c6f6fa1 100644
--- a/rootfs/default.nix
+++ b/pkgs/rootfs/default.nix
@@ -26,6 +26,7 @@ stdenvNoCC.mkDerivation (finalAttrs: {
   kmodBin = pkgs.kmod.out;
   libbpf = pkgs.libbpf.out;
   btrfs = pkgs.btrfs-progs.out;
+  kexec = patosPkgs.kexec.out;
 
   builder = ./mkrootfs.sh;
 })
diff --git a/rootfs/mkinitrd.nix b/pkgs/rootfs/mkinitrd.nix
similarity index 100%
rename from rootfs/mkinitrd.nix
rename to pkgs/rootfs/mkinitrd.nix
diff --git a/rootfs/mkinitrd.sh b/pkgs/rootfs/mkinitrd.sh
similarity index 100%
rename from rootfs/mkinitrd.sh
rename to pkgs/rootfs/mkinitrd.sh
diff --git a/rootfs/mkrootfs.sh b/pkgs/rootfs/mkrootfs.sh
similarity index 98%
rename from rootfs/mkrootfs.sh
rename to pkgs/rootfs/mkrootfs.sh
index ff19902..fb9efe8 100644
--- a/rootfs/mkrootfs.sh
+++ b/pkgs/rootfs/mkrootfs.sh
@@ -107,6 +107,9 @@ $out/usr/bin/busybox --list | xargs -I {} ln -sf busybox $out/usr/bin/{}
 ### install dbus broker
 cp -r $dbusBroker/* $out/
 
+### install kexec
+cp -Pr ${kexec}/sbin/kexec $out/usr/bin/
+
 ### install btrfs progs
 cp -Pr ${btrfs}/bin/* $out/usr/bin/
 cp -Pr ${btrfs}/lib/* $out/usr/lib/
diff --git a/systemd/default.nix b/pkgs/systemd/default.nix
similarity index 100%
rename from systemd/default.nix
rename to pkgs/systemd/default.nix

From 57f83bd4ac0c951e0b432de07e14031bf5c41d03 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Thu, 27 Feb 2025 00:02:22 +0100
Subject: [PATCH 23/78] chore: make erofs with --all-root flag

---
 pkgs/image/default.nix  | 1 +
 pkgs/rootfs/mkrootfs.sh | 4 +++-
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/pkgs/image/default.nix b/pkgs/image/default.nix
index 553d87f..8348db4 100644
--- a/pkgs/image/default.nix
+++ b/pkgs/image/default.nix
@@ -22,6 +22,7 @@ stdenvNoCC.mkDerivation (finalAttrs: {
   env = {
     # vfat options won't efi won't find the fs otherwise.
     SYSTEMD_REPART_MKFS_OPTIONS_VFAT = "-S 512 -c";
+    SYSTEMD_REPART_MKFS_OPTIONS_EROFS = "--all-root";
   };
 
   systemd = patosPkgs.systemd.out;
diff --git a/pkgs/rootfs/mkrootfs.sh b/pkgs/rootfs/mkrootfs.sh
index fb9efe8..078c011 100644
--- a/pkgs/rootfs/mkrootfs.sh
+++ b/pkgs/rootfs/mkrootfs.sh
@@ -1,7 +1,8 @@
 set -ex -o pipefail
 
 ### create directory structure
-mkdir -p $out/etc/repart.d $out/dev $out/proc $out/sys $out/tmp $out/root $out/run $out/boot $out/mnt $out/home $out/srv $out/var/tmp
+mkdir -p $out/etc/repart.d $out/dev $out/proc $out/sys \
+  $out/tmp $out/root $out/run $out/boot $out/mnt $out/home $out/srv $out/var/tmp
 ln -sf /usr/bin $out/bin
 ln -sf /usr/bin $out/sbin
 ln -sf /usr/lib $out/lib
@@ -18,6 +19,7 @@ rm -f $out/usr/lib/systemd/system/sysinit.target.wants/systemd-firstboot.service
 rm -f $out/usr/lib/systemd/ukify
 rm -f $out/usr/bin/ukify
 rm -f $out/usr/lib/udev/rules.d/90-vconsole.rules
+ln -s /run/systemd/resolve/stub-resolv.conf $out/etc/resolv.conf
 
 cat <<EOF > $out/etc/os-release
 NAME=PatOS

From aa4f69d8919d94fa304d6fc20011a07f00c39c1c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Thu, 27 Feb 2025 08:59:01 +0100
Subject: [PATCH 24/78] fix: we need to roll our own versions of tpm2-tools and
 tpm2-tss

---
 flake.nix                     |  2 +
 pkgs/kernel/default.nix       |  4 +-
 pkgs/kernel/generic.config    |  1 +
 pkgs/rootfs/default.nix       |  2 +
 pkgs/rootfs/mkrootfs.sh       |  6 ++-
 pkgs/tpm2-tools/default.nix   | 48 +++++++++++++++++++
 pkgs/tpm2-tss/default.nix     | 86 +++++++++++++++++++++++++++++++++++
 pkgs/tpm2-tss/no-shadow.patch | 16 +++++++
 8 files changed, 162 insertions(+), 3 deletions(-)
 create mode 100644 pkgs/tpm2-tools/default.nix
 create mode 100644 pkgs/tpm2-tss/default.nix
 create mode 100644 pkgs/tpm2-tss/no-shadow.patch

diff --git a/flake.nix b/flake.nix
index 32097ba..071ae56 100644
--- a/flake.nix
+++ b/flake.nix
@@ -37,6 +37,8 @@
           kernel = pkgs.callPackage ./pkgs/kernel { };
           glibc = pkgs.callPackage ./pkgs/glibc { };
           kexec = pkgs.callPackage ./pkgs/kexec-tools { };
+          tpm2-tools = pkgs.callPackage ./pkgs/tpm2-tools { inherit patosPkgs; };
+          tpm2-tss = pkgs.callPackage ./pkgs/tpm2-tss { };
           systemd = pkgs.callPackage ./pkgs/systemd { };
           dbus-broker = pkgs.callPackage ./pkgs/dbus-broker { };
 
diff --git a/pkgs/kernel/default.nix b/pkgs/kernel/default.nix
index e10d25b..73ecd1f 100644
--- a/pkgs/kernel/default.nix
+++ b/pkgs/kernel/default.nix
@@ -1,6 +1,6 @@
 { pkgs, ... }:
 let
-  version = "6.13.2";
+  version = "6.13.4";
 in
 pkgs.linuxPackagesFor (
   pkgs.linuxManualConfig {
@@ -8,7 +8,7 @@ pkgs.linuxPackagesFor (
     modDirVersion = version;
     src = pkgs.fetchurl {
       url = "https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-${version}.tar.xz";
-      hash = "sha256-zfYpgZBru+lwGutzxPn8yAegmEbCiHMWY9YnF+0a5wU=";
+      hash = "sha256-uA4LyO+8MenOWoTRCE3Mz6QOAb6ozCWv0GZIuT1hM54=";
     };
     configfile = ./generic.config;
     allowImportFromDerivation = true;
diff --git a/pkgs/kernel/generic.config b/pkgs/kernel/generic.config
index 7e0325c..c717915 100644
--- a/pkgs/kernel/generic.config
+++ b/pkgs/kernel/generic.config
@@ -2213,6 +2213,7 @@ CONFIG_TCG_CRB=y
 CONFIG_TCG_TIS_CORE=y
 CONFIG_TCG_TIS=y
 CONFIG_TCG_TPM=y
+CONFIG_TCG_TPM2_HMAC=y
 CONFIG_TCP_CONG_ADVANCED=y
 CONFIG_TCP_CONG_BBR=y
 CONFIG_TCP_CONG_CUBIC=y
diff --git a/pkgs/rootfs/default.nix b/pkgs/rootfs/default.nix
index c6f6fa1..4d7768b 100644
--- a/pkgs/rootfs/default.nix
+++ b/pkgs/rootfs/default.nix
@@ -26,6 +26,8 @@ stdenvNoCC.mkDerivation (finalAttrs: {
   kmodBin = pkgs.kmod.out;
   libbpf = pkgs.libbpf.out;
   btrfs = pkgs.btrfs-progs.out;
+  tpm2Libs = patosPkgs.tpm2-tss.out;
+  tpm2Tools = patosPkgs.tpm2-tools.out;
   kexec = patosPkgs.kexec.out;
 
   builder = ./mkrootfs.sh;
diff --git a/pkgs/rootfs/mkrootfs.sh b/pkgs/rootfs/mkrootfs.sh
index 078c011..7d94052 100644
--- a/pkgs/rootfs/mkrootfs.sh
+++ b/pkgs/rootfs/mkrootfs.sh
@@ -116,6 +116,10 @@ cp -Pr ${kexec}/sbin/kexec $out/usr/bin/
 cp -Pr ${btrfs}/bin/* $out/usr/bin/
 cp -Pr ${btrfs}/lib/* $out/usr/lib/
 
+### install tpm2 tools
+cp -P ${tpm2Tools}/bin/* $out/usr/bin/
+cp -P ${tpm2Libs}/lib/*.so* $out/usr/lib/
+
 ### install lib kmod
 cp -P $kmodLibs/lib/* $out/usr/lib
 cp -P $kmodBin/bin/* $out/usr/bin
@@ -189,7 +193,7 @@ EOF
 chmod 644 $out/etc/group
 
 ### Find and install all shared libs
-find $out -type f -executable -exec ldd {} \; | awk '{print $3}' | grep -v systemd | grep -v glibc | sort -u | xargs cp -t $out/usr/lib
+find $out -type f -executable -exec ldd {} \; | awk '{print $3}' | grep -v systemd | grep -v glibc | grep -v tpm2 | sort -u | xargs cp -t $out/usr/lib
 find $out -type f -executable -exec chmod 755 {} \;
 
 # FIXME: ELF patching. Is there a better way?
diff --git a/pkgs/tpm2-tools/default.nix b/pkgs/tpm2-tools/default.nix
new file mode 100644
index 0000000..f447fe6
--- /dev/null
+++ b/pkgs/tpm2-tools/default.nix
@@ -0,0 +1,48 @@
+{
+  stdenv,
+  fetchurl,
+  lib,
+  pandoc,
+  pkg-config,
+  curl,
+  openssl,
+  patosPkgs,
+  libuuid,
+}:
+
+stdenv.mkDerivation rec {
+  pname = "tpm2-tools";
+  version = "5.7";
+
+  src = fetchurl {
+    url = "https://github.com/tpm2-software/${pname}/releases/download/${version}/${pname}-${version}.tar.gz";
+    sha256 = "sha256-OBDTa1B5JW9PL3zlUuIiE9Q7EDHBMVON+KLbw8VwmDo=";
+  };
+
+  nativeBuildInputs = [
+    pandoc
+    pkg-config
+  ];
+  buildInputs = [
+    curl
+    openssl
+    patosPkgs.tpm2-tss
+    libuuid
+  ];
+
+  # Unit tests disabled, as they rely on a dbus session
+  configureFlags = [ "--prefix=/" ];
+  preInstall = ''
+    mkdir -p $out
+    export DESTDIR=$out
+  '';
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Command line tools that provide access to a TPM 2.0 compatible device";
+    homepage = "https://github.com/tpm2-software/tpm2-tools";
+    license = licenses.bsd3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ tomfitzhenry ];
+  };
+}
diff --git a/pkgs/tpm2-tss/default.nix b/pkgs/tpm2-tss/default.nix
new file mode 100644
index 0000000..5e23100
--- /dev/null
+++ b/pkgs/tpm2-tss/default.nix
@@ -0,0 +1,86 @@
+{
+  stdenv,
+  lib,
+  fetchFromGitHub,
+  autoreconfHook,
+  autoconf-archive,
+  pkg-config,
+  doxygen,
+  perl,
+  openssl,
+  json_c,
+  curl,
+  libgcrypt,
+  uthash,
+  git,
+  libuuid,
+  libtpms,
+}:
+
+stdenv.mkDerivation rec {
+  pname = "tpm2-tss";
+  version = "4.1.3";
+
+  src = fetchFromGitHub {
+    owner = "tpm2-software";
+    repo = pname;
+    rev = version;
+    hash = "sha256-BP28utEUI9g1VNv3lCXuiKrDtEImFQxxZfIjLiE3Wr8=";
+  };
+
+  patches = [
+    ./no-shadow.patch
+  ];
+
+  postPatch = ''
+    substituteInPlace ./bootstrap \
+      --replace-fail 'git describe --tags --always --dirty' 'echo "${version}"'
+  '';
+
+  outputs = [
+    "out"
+  ];
+
+  nativeBuildInputs = [
+    autoreconfHook
+    autoconf-archive
+    pkg-config
+    doxygen
+    perl
+    git
+  ];
+
+  buildInputs = [
+    openssl
+    json_c
+    curl
+    libgcrypt
+    uthash
+    libuuid
+    libtpms
+  ];
+
+  strictDeps = true;
+  preAutoreconf = "./bootstrap";
+
+  enableParallelBuilding = true;
+
+  configureFlags = [
+    "--prefix=/"
+  ];
+
+  preInstall = ''
+    mkdir -p $out
+    export DESTDIR=$out
+  '';
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "OSS implementation of the TCG TPM2 Software Stack (TSS2)";
+    homepage = "https://github.com/tpm2-software/tpm2-tss";
+    license = licenses.bsd2;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ baloo ];
+  };
+}
diff --git a/pkgs/tpm2-tss/no-shadow.patch b/pkgs/tpm2-tss/no-shadow.patch
new file mode 100644
index 0000000..a42bf06
--- /dev/null
+++ b/pkgs/tpm2-tss/no-shadow.patch
@@ -0,0 +1,16 @@
+diff --git a/configure.ac b/configure.ac
+index e2d579b8..0eac4ff3 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -672,9 +672,9 @@ AS_IF([test "$HOSTOS" = "Linux" && test "x$systemd_sysusers" != "xyes"],
+       AC_CHECK_PROG(adduser, adduser, yes)
+       AC_CHECK_PROG(addgroup, addgroup, yes)
+       AS_IF([test "x$addgroup" != "xyes" && test "x$groupadd" != "xyes" ],
+-         [AC_MSG_ERROR([addgroup or groupadd are needed.])])
++         [AC_MSG_WARN([addgroup or groupadd are needed.])])
+       AS_IF([test "x$adduser" != "xyes" && test "x$useradd" != "xyes" ],
+-         [AC_MSG_ERROR([adduser or useradd are needed.])])])
++         [AC_MSG_WARN([adduser or useradd are needed.])])])
+ 
+ AC_SUBST([PATH])
+ 

From 0a6fc3af49b1d05134a9bfd5c1941f7de71826b6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Thu, 27 Feb 2025 08:59:01 +0100
Subject: [PATCH 25/78] chore: enable default networking and make root own
 erofs files

---
 pkgs/image/default.nix | 2 +-
 pkgs/image/mkimage.sh  | 2 ++
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/pkgs/image/default.nix b/pkgs/image/default.nix
index 8348db4..c8b7749 100644
--- a/pkgs/image/default.nix
+++ b/pkgs/image/default.nix
@@ -22,7 +22,7 @@ stdenvNoCC.mkDerivation (finalAttrs: {
   env = {
     # vfat options won't efi won't find the fs otherwise.
     SYSTEMD_REPART_MKFS_OPTIONS_VFAT = "-S 512 -c";
-    SYSTEMD_REPART_MKFS_OPTIONS_EROFS = "--all-root";
+    SYSTEMD_REPART_MKFS_OPTIONS_EROFS = "--all-root"; # -zlz4hc,level=12 -Efragments,dedupe,ztailpacking";
   };
 
   systemd = patosPkgs.systemd.out;
diff --git a/pkgs/image/mkimage.sh b/pkgs/image/mkimage.sh
index 0a7ca0b..21dbe5f 100644
--- a/pkgs/image/mkimage.sh
+++ b/pkgs/image/mkimage.sh
@@ -24,6 +24,8 @@ ln -sf ../dbus.socket rootfs/usr/lib/systemd/system/sockets.target.wants/dbus.so
 ln -sf ../systemd-networkd.service rootfs/usr/lib/systemd/system/sysinit.target.wants/systemd-networkd.service
 ln -sf ../systemd-resolved.service rootfs/usr/lib/systemd/system/sysinit.target.wants/systemd-resolved.service
 ln -sf ../systemd-timesyncd.service rootfs/usr/lib/systemd/system/multi-user.target.wants/systemd-timesyncd.service
+# enable default network config
+mv rootfs/usr/lib/systemd/network/89-ethernet.network.example rootfs/usr/lib/systemd/network/89-ethernet.network
 
 # generate a temporary machine id (replace with overlay later)
 $systemd/usr/bin/systemd-machine-id-setup --root=rootfs/

From adb2e90c13b98c6709066ac4ff2aa020a5e9774f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Mon, 3 Mar 2025 13:52:52 +0100
Subject: [PATCH 26/78] fix(image): image need to include devicemapper setup
 tools and udev rules

---
 flake.nix                  |  1 +
 pkgs/kernel/generic.config |  2 +-
 pkgs/lvm2/default.nix      | 66 ++++++++++++++++++++++++++++++++++++++
 pkgs/rootfs/default.nix    |  2 ++
 pkgs/rootfs/mkrootfs.sh    | 52 ++++++++++++++++++++----------
 utils/qemu-uefi-tpm.nix    |  2 +-
 6 files changed, 106 insertions(+), 19 deletions(-)
 create mode 100644 pkgs/lvm2/default.nix

diff --git a/flake.nix b/flake.nix
index 071ae56..5c76b2f 100644
--- a/flake.nix
+++ b/flake.nix
@@ -37,6 +37,7 @@
           kernel = pkgs.callPackage ./pkgs/kernel { };
           glibc = pkgs.callPackage ./pkgs/glibc { };
           kexec = pkgs.callPackage ./pkgs/kexec-tools { };
+          lvm2 = pkgs.callPackage ./pkgs/lvm2 { };
           tpm2-tools = pkgs.callPackage ./pkgs/tpm2-tools { inherit patosPkgs; };
           tpm2-tss = pkgs.callPackage ./pkgs/tpm2-tss { };
           systemd = pkgs.callPackage ./pkgs/systemd { };
diff --git a/pkgs/kernel/generic.config b/pkgs/kernel/generic.config
index c717915..0220e23 100644
--- a/pkgs/kernel/generic.config
+++ b/pkgs/kernel/generic.config
@@ -2213,7 +2213,7 @@ CONFIG_TCG_CRB=y
 CONFIG_TCG_TIS_CORE=y
 CONFIG_TCG_TIS=y
 CONFIG_TCG_TPM=y
-CONFIG_TCG_TPM2_HMAC=y
+CONFIG_TCG_TPM2_HMAC=n
 CONFIG_TCP_CONG_ADVANCED=y
 CONFIG_TCP_CONG_BBR=y
 CONFIG_TCP_CONG_CUBIC=y
diff --git a/pkgs/lvm2/default.nix b/pkgs/lvm2/default.nix
new file mode 100644
index 0000000..f211e26
--- /dev/null
+++ b/pkgs/lvm2/default.nix
@@ -0,0 +1,66 @@
+{
+  stdenv,
+  fetchurl,
+  lib,
+  pkg-config,
+  libaio,
+  udev,
+}:
+
+stdenv.mkDerivation rec {
+  pname = "lvm2";
+  version = "2.03.30";
+
+  src = fetchurl {
+    urls = [
+      "https://mirrors.kernel.org/sourceware/lvm2/LVM2.${version}.tgz"
+      "ftp://sourceware.org/pub/lvm2/LVM2.${version}.tgz"
+    ];
+    hash = "sha256-rXar7LjciHcz4GxEnLmt0Eo1BvnweAwSiBem4aF87AU=";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+  ];
+  buildInputs = [
+      libaio
+      udev
+  ];
+
+  configureFlags = [
+    "--prefix=/"
+    "--sbindir=/usr/bin"
+    "--sysconfdir=/etc"
+    "--localstatedir=/var"
+    "--enable-cmdlib"
+    "--enable-dmeventd"
+    "--enable-lvmpolld"
+    "--enable-pkgconfig"
+    "--enable-udev_rules"
+    "--enable-udev_sync"
+    "--enable-write_install"
+    "--with-cache=internal"
+    "--with-thin=internal"
+  ];
+
+  preInstall = ''
+    mkdir -p $out
+    export DESTDIR=$out
+  '';
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "http://sourceware.org/lvm2/";
+    description = "Tools to support Logical Volume Management (LVM) on Linux";
+    platforms = platforms.linux;
+    license = with licenses; [
+      gpl2Only
+      bsd2
+      lgpl21
+    ];
+    maintainers = with maintainers; [
+      raskin
+      ajs124
+    ];
+  };
+}
diff --git a/pkgs/rootfs/default.nix b/pkgs/rootfs/default.nix
index 4d7768b..20fe642 100644
--- a/pkgs/rootfs/default.nix
+++ b/pkgs/rootfs/default.nix
@@ -29,6 +29,8 @@ stdenvNoCC.mkDerivation (finalAttrs: {
   tpm2Libs = patosPkgs.tpm2-tss.out;
   tpm2Tools = patosPkgs.tpm2-tools.out;
   kexec = patosPkgs.kexec.out;
+  lvm2 = patosPkgs.lvm2.out;
+  cryptsetup = pkgs.cryptsetup.bin;
 
   builder = ./mkrootfs.sh;
 })
diff --git a/pkgs/rootfs/mkrootfs.sh b/pkgs/rootfs/mkrootfs.sh
index 7d94052..538a7c9 100644
--- a/pkgs/rootfs/mkrootfs.sh
+++ b/pkgs/rootfs/mkrootfs.sh
@@ -15,6 +15,7 @@ cp -Pr $systemd/* $out/
 find $out -type d -exec chmod 755 {} \;
 rm -rf $out/usr/include
 rm -rf $out/usr/sbin
+ln -sf /usr/bin $out/usr/sbin
 rm -f $out/usr/lib/systemd/system/sysinit.target.wants/systemd-firstboot.service
 rm -f $out/usr/lib/systemd/ukify
 rm -f $out/usr/bin/ukify
@@ -52,6 +53,13 @@ cat <<EOF > $out/etc/repart.d/22-root.conf
 Type=root
 EOF
 
+mkdir $out/usr/lib/systemd/system/systemd-repart.service.d
+cat <<EOF > $out/usr/lib/systemd/system/systemd-repart.service.d/override.conf
+[Service]
+ExecStart=
+ExecStart=systemd-repart --dry-run=no --generate-crypttab=/etc/crypttab
+EOF
+
 cat <<EOF > $out/etc/repart.d/40-var.conf
 [Partition]
 Type=var
@@ -59,26 +67,28 @@ UUID=4d21b016-b534-45c2-a9fb-5c16e091fd2d
 Format=btrfs
 Label=patos-state
 Minimize=off
+Encrypt=tpm2
+EncryptedVolume=patos-state:none:tpm2-device=auto,luks,discard
 FactoryReset=yes
 SizeMinBytes=1G
 SplitName=-
 EOF
 
-cat <<EOF > $out/usr/lib/systemd/system/var.mount
-[Unit]
-Description=Mount for /var
-Before=local-fs.target
-After=systemd-repart.service
-
-[Mount]
-What=/dev/disk/by-label/patos-state
-Where=/var
-Type=btrfs
-Options=defaults
-
-[Install]
-WantedBy=multi-user.target
-EOF
+# cat <<EOF > $out/usr/lib/systemd/system/var.mount
+# [Unit]
+# Description=Mount for /var
+# Before=local-fs.target
+# After=systemd-repart.service
+#
+# [Mount]
+# What=/dev/mapper/patos-state
+# Where=/var
+# Type=btrfs
+# Options=defaults
+#
+# [Install]
+# WantedBy=multi-user.target
+# EOF
 
 cat <<EOF > $out/usr/lib/systemd/system/etc.mount
 [Unit]
@@ -112,6 +122,11 @@ cp -r $dbusBroker/* $out/
 ### install kexec
 cp -Pr ${kexec}/sbin/kexec $out/usr/bin/
 
+### install dmsetup udev rules
+cp -P ${lvm2}/usr/bin/dmsetup $out/usr/bin/
+cp -P ${lvm2}/lib/libdevmapper.so* $out/usr/lib/
+cp -P ${lvm2}/lib/udev/rules.d/* $out/usr/lib/udev/rules.d/
+
 ### install btrfs progs
 cp -Pr ${btrfs}/bin/* $out/usr/bin/
 cp -Pr ${btrfs}/lib/* $out/usr/lib/
@@ -120,6 +135,9 @@ cp -Pr ${btrfs}/lib/* $out/usr/lib/
 cp -P ${tpm2Tools}/bin/* $out/usr/bin/
 cp -P ${tpm2Libs}/lib/*.so* $out/usr/lib/
 
+### install cryptsetup tools
+cp -P $cryptsetup/bin/* $out/usr/bin/
+
 ### install lib kmod
 cp -P $kmodLibs/lib/* $out/usr/lib
 cp -P $kmodBin/bin/* $out/usr/bin
@@ -193,11 +211,11 @@ EOF
 chmod 644 $out/etc/group
 
 ### Find and install all shared libs
-find $out -type f -executable -exec ldd {} \; | awk '{print $3}' | grep -v systemd | grep -v glibc | grep -v tpm2 | sort -u | xargs cp -t $out/usr/lib
+find $out -type f -executable -exec ldd {} \; | awk '{print $3}' | grep -v systemd | grep -v glibc | grep -v tpm2 | grep -v devmapper | sort -u | xargs -I {} cp {} $out/usr/lib/
 find $out -type f -executable -exec chmod 755 {} \;
 
 # FIXME: ELF patching. Is there a better way?
-find $out -type f -executable -exec patchelf --set-rpath /lib:/usr/lib:/usr/lib/systemd {} \;
+find $out -type f -executable -exec patchelf --set-rpath /lib:/usr/lib:/usr/lib/systemd:/usr/lib/cryptsetup {} \;
 find $out -type f -executable -exec patchelf --set-interpreter /lib/ld-linux-x86-64.so.2 {} \;
 patchelf --remove-rpath $out/usr/lib/ld-linux-x86-64.so.2
 
diff --git a/utils/qemu-uefi-tpm.nix b/utils/qemu-uefi-tpm.nix
index bb151c5..0193a27 100644
--- a/utils/qemu-uefi-tpm.nix
+++ b/utils/qemu-uefi-tpm.nix
@@ -24,7 +24,7 @@ pkgs.writeShellApplication {
       swtpm socket -d --tpmstate dir="$state" \
         --ctrl type=unixio,path="$state/swtpm-sock" \
         --tpm2 \
-        --log level=20
+        --log file="$state/swtpm.log",level=20
 
       qemu-system-x86_64 \
         -enable-kvm \

From 10090a75b0f5d7fd116a6656562c22879448f090 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Tue, 4 Mar 2025 12:09:03 +0100
Subject: [PATCH 27/78] fix(image): finally have working mount of encrypted
 volumes!

---
 pkgs/image/mkimage.sh   |  1 -
 pkgs/rootfs/mkinitrd.sh | 23 +++++++++++++++++++++++
 pkgs/rootfs/mkrootfs.sh | 29 +++++++----------------------
 3 files changed, 30 insertions(+), 23 deletions(-)

diff --git a/pkgs/image/mkimage.sh b/pkgs/image/mkimage.sh
index 21dbe5f..ce33fb7 100644
--- a/pkgs/image/mkimage.sh
+++ b/pkgs/image/mkimage.sh
@@ -14,7 +14,6 @@ ln -sf multi-user.target rootfs/usr/lib/systemd/system/default.target
 
 # mount /etc overlay and patos state
 ln -sf ../etc.mount rootfs/usr/lib/systemd/system/local-fs.target.wants/etc.mount
-ln -sf ../var.mount rootfs/usr/lib/systemd/system/sysinit.target.wants/var.mount
 
 # enable dbus
 ln -sf ../dbus.service rootfs/usr/lib/systemd/system/multi-user.target.wants/dbus.service
diff --git a/pkgs/rootfs/mkinitrd.sh b/pkgs/rootfs/mkinitrd.sh
index c735448..e707f25 100644
--- a/pkgs/rootfs/mkinitrd.sh
+++ b/pkgs/rootfs/mkinitrd.sh
@@ -16,6 +16,29 @@ echo patos > ./etc/hostname
 
 ln -sf /etc/os-release ./etc/initrd-release
 
+# set default target to initrd inside initrd
+ln -sf initrd.target ./usr/lib/systemd/system/default.target
+
+mkdir ./usr/lib/systemd/system/systemd-repart.service.d
+cat <<EOF > ./usr/lib/systemd/system/systemd-repart.service.d/override.conf
+[Service]
+ExecStart=systemd-repart --dry-run=no --generate-crypttab=/run/crypttab --generate-fstab=/run/fstab
+EOF
+
+cat <<EOF > ./usr/lib/systemd/system/sysroot-run.mount
+[Unit]
+Before=initrd-fs.target
+DefaultDependencies=false
+
+[Mount]
+Options=bind
+What=/run
+Where=/sysroot/run
+EOF
+# bind mount /run to /sysroot/run
+mkdir ./usr/lib/systemd/system/initrd-fs.target.requires/
+ln -sf ../sysroot-run.mount ./usr/lib/systemd/system/initrd-fs.target.requires/sysroot-run.mount
+
 # gen initrd
 find . -print0 | cpio --null --owner=root:root -o --format=newc | xz -9 --check=crc32 > ../initrd.xz
 
diff --git a/pkgs/rootfs/mkrootfs.sh b/pkgs/rootfs/mkrootfs.sh
index 538a7c9..8429cf0 100644
--- a/pkgs/rootfs/mkrootfs.sh
+++ b/pkgs/rootfs/mkrootfs.sh
@@ -53,13 +53,6 @@ cat <<EOF > $out/etc/repart.d/22-root.conf
 Type=root
 EOF
 
-mkdir $out/usr/lib/systemd/system/systemd-repart.service.d
-cat <<EOF > $out/usr/lib/systemd/system/systemd-repart.service.d/override.conf
-[Service]
-ExecStart=
-ExecStart=systemd-repart --dry-run=no --generate-crypttab=/etc/crypttab
-EOF
-
 cat <<EOF > $out/etc/repart.d/40-var.conf
 [Partition]
 Type=var
@@ -69,26 +62,18 @@ Label=patos-state
 Minimize=off
 Encrypt=tpm2
 EncryptedVolume=patos-state:none:tpm2-device=auto,luks,discard
+MountPoint=/var
 FactoryReset=yes
 SizeMinBytes=1G
 SplitName=-
 EOF
 
-# cat <<EOF > $out/usr/lib/systemd/system/var.mount
-# [Unit]
-# Description=Mount for /var
-# Before=local-fs.target
-# After=systemd-repart.service
-#
-# [Mount]
-# What=/dev/mapper/patos-state
-# Where=/var
-# Type=btrfs
-# Options=defaults
-#
-# [Install]
-# WantedBy=multi-user.target
-# EOF
+rm -f $out/etc/systemd/system.conf
+cat <<EOF > $out/etc/systemd/system.conf
+[Manager]
+DefaultEnvironment=PATH=/bin:/sbin:/usr/bin
+ManagerEnvironment=PATH=/bin:/sbin:/usr/bin SYSTEMD_CRYPTTAB=/run/crypttab SYSTEMD_SYSROOT_FSTAB=/run/fstab SYSTEMD_FSTAB=/run/fstab
+EOF
 
 cat <<EOF > $out/usr/lib/systemd/system/etc.mount
 [Unit]

From 83bb3599a4e8d3bbb7b443d6d69cab6d38dfb4ee Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Tue, 4 Mar 2025 12:16:49 +0100
Subject: [PATCH 28/78] fix(repart): depend on sysroot-run mount

---
 pkgs/image/mkimage.sh   | 2 +-
 pkgs/rootfs/mkinitrd.sh | 4 ++++
 pkgs/rootfs/mkrootfs.sh | 8 ++++++--
 3 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/pkgs/image/mkimage.sh b/pkgs/image/mkimage.sh
index ce33fb7..0c6fad0 100644
--- a/pkgs/image/mkimage.sh
+++ b/pkgs/image/mkimage.sh
@@ -12,7 +12,7 @@ find rootfs/ -type d -exec chmod 755 {} \;
 # set default target to multi-user
 ln -sf multi-user.target rootfs/usr/lib/systemd/system/default.target
 
-# mount /etc overlay and patos state
+# mount /etc overlay
 ln -sf ../etc.mount rootfs/usr/lib/systemd/system/local-fs.target.wants/etc.mount
 
 # enable dbus
diff --git a/pkgs/rootfs/mkinitrd.sh b/pkgs/rootfs/mkinitrd.sh
index e707f25..c35b516 100644
--- a/pkgs/rootfs/mkinitrd.sh
+++ b/pkgs/rootfs/mkinitrd.sh
@@ -21,6 +21,10 @@ ln -sf initrd.target ./usr/lib/systemd/system/default.target
 
 mkdir ./usr/lib/systemd/system/systemd-repart.service.d
 cat <<EOF > ./usr/lib/systemd/system/systemd-repart.service.d/override.conf
+[Unit]
+After=sysroot-run.mount
+Requires=sysroot-run.mount
+
 [Service]
 ExecStart=systemd-repart --dry-run=no --generate-crypttab=/run/crypttab --generate-fstab=/run/fstab
 EOF
diff --git a/pkgs/rootfs/mkrootfs.sh b/pkgs/rootfs/mkrootfs.sh
index 8429cf0..cdc43d5 100644
--- a/pkgs/rootfs/mkrootfs.sh
+++ b/pkgs/rootfs/mkrootfs.sh
@@ -39,9 +39,13 @@ cat <<EOF > $out/etc/issue
 EOF
 
 # replace agetty with busybox getty
-sed -i 's#ExecStart=.*#ExecStart=-/sbin/getty -L %I 115200 vt100#' $out/usr/lib/systemd/system/serial-getty@.service
+mkdir $out/usr/lib/systemd/system/serial-getty@.service.d
+cat <<EOF > $out/usr/lib/systemd/system/serial-getty@.service.d/override.conf
+[Service]
+ExecStart=
+ExecStart=-/sbin/getty -L %I 115200 vt100
+EOF
 
-sed -i 's#After=\(.*\)#After=sysroot.mount \1#' $out/usr/lib/systemd/system/systemd-repart.service
 cat <<EOF > $out/etc/repart.d/10-esp.conf
 [Partition]
 Type=esp

From 529061df5eb80f1451d9672dacf3d1a7bec480c5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Tue, 4 Mar 2025 14:08:13 +0100
Subject: [PATCH 29/78] chore: clean up comments

---
 pkgs/rootfs/mkinitrd.sh | 3 ++-
 pkgs/rootfs/mkrootfs.sh | 2 ++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/pkgs/rootfs/mkinitrd.sh b/pkgs/rootfs/mkinitrd.sh
index c35b516..7f948f7 100644
--- a/pkgs/rootfs/mkinitrd.sh
+++ b/pkgs/rootfs/mkinitrd.sh
@@ -19,6 +19,7 @@ ln -sf /etc/os-release ./etc/initrd-release
 # set default target to initrd inside initrd
 ln -sf initrd.target ./usr/lib/systemd/system/default.target
 
+# generate crypttab and fstab under /run
 mkdir ./usr/lib/systemd/system/systemd-repart.service.d
 cat <<EOF > ./usr/lib/systemd/system/systemd-repart.service.d/override.conf
 [Unit]
@@ -29,6 +30,7 @@ Requires=sysroot-run.mount
 ExecStart=systemd-repart --dry-run=no --generate-crypttab=/run/crypttab --generate-fstab=/run/fstab
 EOF
 
+# bind mount /run to /sysroot/run
 cat <<EOF > ./usr/lib/systemd/system/sysroot-run.mount
 [Unit]
 Before=initrd-fs.target
@@ -39,7 +41,6 @@ Options=bind
 What=/run
 Where=/sysroot/run
 EOF
-# bind mount /run to /sysroot/run
 mkdir ./usr/lib/systemd/system/initrd-fs.target.requires/
 ln -sf ../sysroot-run.mount ./usr/lib/systemd/system/initrd-fs.target.requires/sysroot-run.mount
 
diff --git a/pkgs/rootfs/mkrootfs.sh b/pkgs/rootfs/mkrootfs.sh
index cdc43d5..aedcf6a 100644
--- a/pkgs/rootfs/mkrootfs.sh
+++ b/pkgs/rootfs/mkrootfs.sh
@@ -72,6 +72,8 @@ SizeMinBytes=1G
 SplitName=-
 EOF
 
+# as rootfs is read-only we need to configure the fstab and cryptsetup generators to look
+# for config under /run (which are generated by systemd-repart)
 rm -f $out/etc/systemd/system.conf
 cat <<EOF > $out/etc/systemd/system.conf
 [Manager]

From e5367bac84f0a5535761d8d581c783aab5b2fdca Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Tue, 4 Mar 2025 14:20:13 +0100
Subject: [PATCH 30/78] chore: more clean up

---
 pkgs/rootfs/mkinitrd.sh | 24 +++++++++++++-----------
 pkgs/rootfs/mkrootfs.sh |  4 +++-
 2 files changed, 16 insertions(+), 12 deletions(-)

diff --git a/pkgs/rootfs/mkinitrd.sh b/pkgs/rootfs/mkinitrd.sh
index 7f948f7..43708d0 100644
--- a/pkgs/rootfs/mkinitrd.sh
+++ b/pkgs/rootfs/mkinitrd.sh
@@ -19,17 +19,6 @@ ln -sf /etc/os-release ./etc/initrd-release
 # set default target to initrd inside initrd
 ln -sf initrd.target ./usr/lib/systemd/system/default.target
 
-# generate crypttab and fstab under /run
-mkdir ./usr/lib/systemd/system/systemd-repart.service.d
-cat <<EOF > ./usr/lib/systemd/system/systemd-repart.service.d/override.conf
-[Unit]
-After=sysroot-run.mount
-Requires=sysroot-run.mount
-
-[Service]
-ExecStart=systemd-repart --dry-run=no --generate-crypttab=/run/crypttab --generate-fstab=/run/fstab
-EOF
-
 # bind mount /run to /sysroot/run
 cat <<EOF > ./usr/lib/systemd/system/sysroot-run.mount
 [Unit]
@@ -44,6 +33,19 @@ EOF
 mkdir ./usr/lib/systemd/system/initrd-fs.target.requires/
 ln -sf ../sysroot-run.mount ./usr/lib/systemd/system/initrd-fs.target.requires/sysroot-run.mount
 
+# repart: generate crypttab and fstab under /run
+mkdir ./usr/lib/systemd/system/systemd-repart.service.d
+cat <<EOF > ./usr/lib/systemd/system/systemd-repart.service.d/override.conf
+[Unit]
+After=sysroot-run.mount
+Requires=sysroot-run.mount
+
+[Service]
+Environment=SYSTEMD_REPART_MKFS_OPTIONS_BTRFS=--nodiscard
+ExecStart=
+ExecStart=systemd-repart --dry-run=no --generate-crypttab=/run/crypttab --generate-fstab=/run/fstab
+EOF
+
 # gen initrd
 find . -print0 | cpio --null --owner=root:root -o --format=newc | xz -9 --check=crc32 > ../initrd.xz
 
diff --git a/pkgs/rootfs/mkrootfs.sh b/pkgs/rootfs/mkrootfs.sh
index aedcf6a..8fdda39 100644
--- a/pkgs/rootfs/mkrootfs.sh
+++ b/pkgs/rootfs/mkrootfs.sh
@@ -46,6 +46,7 @@ ExecStart=
 ExecStart=-/sbin/getty -L %I 115200 vt100
 EOF
 
+# Configure systemd-repart
 cat <<EOF > $out/etc/repart.d/10-esp.conf
 [Partition]
 Type=esp
@@ -73,7 +74,7 @@ SplitName=-
 EOF
 
 # as rootfs is read-only we need to configure the fstab and cryptsetup generators to look
-# for config under /run (which are generated by systemd-repart)
+# for config under /run (which are generated by systemd-repart in initrd)
 rm -f $out/etc/systemd/system.conf
 cat <<EOF > $out/etc/systemd/system.conf
 [Manager]
@@ -81,6 +82,7 @@ DefaultEnvironment=PATH=/bin:/sbin:/usr/bin
 ManagerEnvironment=PATH=/bin:/sbin:/usr/bin SYSTEMD_CRYPTTAB=/run/crypttab SYSTEMD_SYSROOT_FSTAB=/run/fstab SYSTEMD_FSTAB=/run/fstab
 EOF
 
+# Overlay mount for /etc which makes it read-write in runtime
 cat <<EOF > $out/usr/lib/systemd/system/etc.mount
 [Unit]
 Description=Overlay mount for /etc

From 8e61f85f725985a7f5ef278a51fc9d6c0989f340 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Tue, 4 Mar 2025 15:31:03 +0100
Subject: [PATCH 31/78] chore: clean up var-repart config

---
 pkgs/rootfs/mkrootfs.sh | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/pkgs/rootfs/mkrootfs.sh b/pkgs/rootfs/mkrootfs.sh
index 8fdda39..31fc347 100644
--- a/pkgs/rootfs/mkrootfs.sh
+++ b/pkgs/rootfs/mkrootfs.sh
@@ -61,16 +61,14 @@ EOF
 cat <<EOF > $out/etc/repart.d/40-var.conf
 [Partition]
 Type=var
-UUID=4d21b016-b534-45c2-a9fb-5c16e091fd2d
 Format=btrfs
+MountPoint=/var
 Label=patos-state
-Minimize=off
 Encrypt=tpm2
 EncryptedVolume=patos-state:none:tpm2-device=auto,luks,discard
-MountPoint=/var
-FactoryReset=yes
 SizeMinBytes=1G
-SplitName=-
+Minimize=off
+FactoryReset=yes
 EOF
 
 # as rootfs is read-only we need to configure the fstab and cryptsetup generators to look

From 12bacf271db414e1f94de8e9dcda8b497df3f9dc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Tue, 4 Mar 2025 21:47:19 +0100
Subject: [PATCH 32/78] feat: generate passwd/group with systemd-sysusers

---
 flake.nix                      |   1 +
 pkgs/busybox/clang-cross.patch |  37 ++++++
 pkgs/busybox/default.nix       | 219 +++++++++++++++++++++++++++++++++
 pkgs/rootfs/default.nix        |   2 +-
 pkgs/rootfs/mkrootfs.sh        |  65 +---------
 5 files changed, 262 insertions(+), 62 deletions(-)
 create mode 100644 pkgs/busybox/clang-cross.patch
 create mode 100644 pkgs/busybox/default.nix

diff --git a/flake.nix b/flake.nix
index 5c76b2f..97a1f97 100644
--- a/flake.nix
+++ b/flake.nix
@@ -36,6 +36,7 @@
           };
           kernel = pkgs.callPackage ./pkgs/kernel { };
           glibc = pkgs.callPackage ./pkgs/glibc { };
+          busybox = pkgs.callPackage ./pkgs/busybox { };
           kexec = pkgs.callPackage ./pkgs/kexec-tools { };
           lvm2 = pkgs.callPackage ./pkgs/lvm2 { };
           tpm2-tools = pkgs.callPackage ./pkgs/tpm2-tools { inherit patosPkgs; };
diff --git a/pkgs/busybox/clang-cross.patch b/pkgs/busybox/clang-cross.patch
new file mode 100644
index 0000000..b2d696b
--- /dev/null
+++ b/pkgs/busybox/clang-cross.patch
@@ -0,0 +1,37 @@
+diff --git a/Makefile b/Makefile
+index 6fedcffba..3385836c4 100644
+--- a/Makefile
++++ b/Makefile
+@@ -271,8 +271,8 @@ export quiet Q KBUILD_VERBOSE
+ # Look for make include files relative to root of kernel src
+ MAKEFLAGS += --include-dir=$(srctree)
+ 
+-HOSTCC  	= gcc
+-HOSTCXX  	= g++
++HOSTCC		= cc
++HOSTCXX	= c++
+ HOSTCFLAGS	:=
+ HOSTCXXFLAGS	:=
+ # We need some generic definitions
+@@ -289,7 +289,7 @@ MAKEFLAGS += -rR
+ # Make variables (CC, etc...)
+ 
+ AS		= $(CROSS_COMPILE)as
+-CC		= $(CROSS_COMPILE)gcc
++CC		= $(CROSS_COMPILE)cc
+ LD		= $(CC) -nostdlib
+ CPP		= $(CC) -E
+ AR		= $(CROSS_COMPILE)ar
+diff --git a/scripts/Makefile.IMA b/scripts/Makefile.IMA
+index f155108d7..185257064 100644
+--- a/scripts/Makefile.IMA
++++ b/scripts/Makefile.IMA
+@@ -39,7 +39,7 @@ ifndef HOSTCC
+ HOSTCC = cc
+ endif
+ AS              = $(CROSS_COMPILE)as
+-CC              = $(CROSS_COMPILE)gcc
++CC              = $(CROSS_COMPILE)cc
+ LD              = $(CC) -nostdlib
+ CPP             = $(CC) -E
+ AR              = $(CROSS_COMPILE)ar
diff --git a/pkgs/busybox/default.nix b/pkgs/busybox/default.nix
new file mode 100644
index 0000000..571d0cf
--- /dev/null
+++ b/pkgs/busybox/default.nix
@@ -0,0 +1,219 @@
+{
+  stdenv,
+  lib,
+  buildPackages,
+  fetchurl,
+  fetchpatch,
+  fetchFromGitLab,
+  enableStatic ? stdenv.hostPlatform.isStatic,
+  enableMinimal ? false,
+  enableAppletSymlinks ? true,
+  # Allow forcing musl without switching stdenv itself, e.g. for our bootstrapping:
+  # nix build -f pkgs/top-level/release.nix stdenvBootstrapTools.x86_64-linux.dist
+  useMusl ? stdenv.hostPlatform.libc == "musl",
+  musl,
+  extraConfig ? "",
+}:
+
+assert stdenv.hostPlatform.libc == "musl" -> useMusl;
+
+let
+  configParser = ''
+    function parseconfig {
+        while read LINE; do
+            NAME=`echo "$LINE" | cut -d \  -f 1`
+            OPTION=`echo "$LINE" | cut -d \  -f 2`
+
+            if ! [[ "$NAME" =~ ^CONFIG_ ]]; then continue; fi
+
+            echo "parseconfig: removing $NAME"
+            sed -i /$NAME'\(=\| \)'/d .config
+
+            echo "parseconfig: setting $NAME=$OPTION"
+            echo "$NAME=$OPTION" >> .config
+        done
+    }
+  '';
+
+  libcConfig = lib.optionalString useMusl ''
+    CONFIG_FEATURE_UTMP n
+    CONFIG_FEATURE_WTMP n
+  '';
+
+  # The debian version lags behind the upstream version and also contains
+  # a debian-specific suffix. We only fetch the debian repository to get the
+  # default.script
+  debianVersion = "1.30.1-6";
+  debianSource = fetchFromGitLab {
+    domain = "salsa.debian.org";
+    owner = "installer-team";
+    repo = "busybox";
+    rev = "debian/1%${debianVersion}";
+    sha256 = "sha256-6r0RXtmqGXtJbvLSD1Ma1xpqR8oXL2bBKaUE/cSENL8=";
+  };
+  debianDispatcherScript = "${debianSource}/debian/tree/udhcpc/etc/udhcpc/default.script";
+  outDispatchPath = "$out/default.script";
+in
+
+stdenv.mkDerivation rec {
+  pname = "busybox";
+  version = "1.36.1";
+
+  # Note to whoever is updating busybox: please verify that:
+  # nix-build pkgs/stdenv/linux/make-bootstrap-tools.nix -A test
+  # still builds after the update.
+  src = fetchurl {
+    url = "https://busybox.net/downloads/${pname}-${version}.tar.bz2";
+    sha256 = "sha256-uMwkyVdNgJ5yecO+NJeVxdXOtv3xnKcJ+AzeUOR94xQ=";
+  };
+
+  hardeningDisable = [
+    "format"
+    "pie"
+  ] ++ lib.optionals enableStatic [ "fortify" ];
+
+  patches = [
+    (fetchurl {
+      name = "CVE-2022-28391.patch";
+      url = "https://git.alpinelinux.org/aports/plain/main/busybox/0001-libbb-sockaddr2str-ensure-only-printable-characters-.patch?id=ed92963eb55bbc8d938097b9ccb3e221a94653f4";
+      sha256 = "sha256-yviw1GV+t9tbHbY7YNxEqPi7xEreiXVqbeRyf8c6Awo=";
+    })
+    (fetchurl {
+      name = "CVE-2022-28391.patch";
+      url = "https://git.alpinelinux.org/aports/plain/main/busybox/0002-nslookup-sanitize-all-printed-strings-with-printable.patch?id=ed92963eb55bbc8d938097b9ccb3e221a94653f4";
+      sha256 = "sha256-vl1wPbsHtXY9naajjnTicQ7Uj3N+EQ8pRNnrdsiow+w=";
+    })
+    (fetchpatch {
+      name = "CVE-2022-48174.patch"; # https://bugs.busybox.net/show_bug.cgi?id=15216
+      url = "https://git.busybox.net/busybox/patch/?id=d417193cf37ca1005830d7e16f5fa7e1d8a44209";
+      hash = "sha256-mpDEwYncpU6X6tmtj9xM2KCrB/v2ys5bYxmPPrhm6es=";
+    })
+    (fetchpatch {
+      name = "CVE-2023-42366.patch"; # https://bugs.busybox.net/show_bug.cgi?id=15874
+      # This patch is also used by Alpine, see https://git.alpinelinux.org/aports/tree/main/busybox/0037-awk.c-fix-CVE-2023-42366-bug-15874.patch
+      url = "https://bugs.busybox.net/attachment.cgi?id=9697";
+      hash = "sha256-2eYfLZLjStea9apKXogff6sCAdG9yHx0ZsgUBaGfQIA=";
+    })
+    (fetchpatch {
+      name = "CVE-2023-42363.patch"; # https://bugs.busybox.net/show_bug.cgi?id=15865
+      url = "https://git.launchpad.net/ubuntu/+source/busybox/plain/debian/patches/CVE-2023-42363.patch?id=c9d8a323b337d58e302717d41796aa0242963d5a";
+      hash = "sha256-1W9Q8+yFkYQKzNTrvndie8QuaEbyAFL1ZASG2fPF+Z4=";
+    })
+    (fetchpatch {
+      name = "CVE-2023-42364_CVE-2023-42365.patch"; # https://bugs.busybox.net/show_bug.cgi?id=15871 https://bugs.busybox.net/show_bug.cgi?id=15868
+      url = "https://git.alpinelinux.org/aports/plain/main/busybox/CVE-2023-42364-CVE-2023-42365.patch?id=8a4bf5971168bf48201c05afda7bee0fbb188e13";
+      hash = "sha256-nQPgT9eA1asCo38Z9X7LR9My0+Vz5YBPba3ARV3fWcc=";
+    })
+  ] ++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) ./clang-cross.patch;
+
+  separateDebugInfo = true;
+
+  # postPatch = "patchShebangs .";
+
+  configurePhase = ''
+    export KCONFIG_NOTIMESTAMP=1
+    make ${if enableMinimal then "allnoconfig" else "defconfig"}
+
+    ${configParser}
+
+    cat << EOF | parseconfig
+
+    CONFIG_PREFIX "$out"
+    CONFIG_INSTALL_NO_USR y
+
+    CONFIG_LFS y
+
+    # More features for modprobe.
+    ${lib.optionalString (!enableMinimal) ''
+      CONFIG_FEATURE_MODPROBE_BLACKLIST y
+      CONFIG_FEATURE_MODUTILS_ALIAS y
+      CONFIG_FEATURE_MODUTILS_SYMBOLS y
+      CONFIG_MODPROBE_SMALL n
+    ''}
+
+    ${lib.optionalString enableStatic ''
+      CONFIG_STATIC y
+    ''}
+
+    ${lib.optionalString (!enableAppletSymlinks) ''
+      CONFIG_INSTALL_APPLET_DONT y
+      CONFIG_INSTALL_APPLET_SYMLINKS n
+    ''}
+
+    # Use the external mount.cifs program.
+    CONFIG_FEATURE_MOUNT_CIFS n
+    CONFIG_FEATURE_MOUNT_HELPERS y
+
+    # BB_SHADOW
+    FEATURE_SHADOWPASSWDS y
+    CONFIG_USE_BB_PWD_GRP y
+    CONFIG_USE_BB_SHADOW y
+    CONFIG_USE_BB_CRYPT y
+    USE_BB_CRYPT_SHA y
+    CONFIG_FEATURE_DEFAULT_PASSWD_ALGO "sha512"
+
+    # Set paths for console fonts.
+    CONFIG_DEFAULT_SETFONT_DIR "/etc/kbd"
+
+    # Bump from 4KB, much faster I/O
+    CONFIG_FEATURE_COPYBUF_KB 64
+
+    # Doesn't build with current kernel headers.
+    # https://bugs.busybox.net/show_bug.cgi?id=15934
+    CONFIG_TC n
+
+    # Set the path for the udhcpc script
+    CONFIG_UDHCPC_DEFAULT_SCRIPT "${outDispatchPath}"
+
+    ${extraConfig}
+    CONFIG_CROSS_COMPILER_PREFIX "${stdenv.cc.targetPrefix}"
+    ${libcConfig}
+    EOF
+
+    make oldconfig
+
+    runHook postConfigure
+  '';
+
+  postConfigure = lib.optionalString (useMusl && stdenv.hostPlatform.libc != "musl") ''
+    makeFlagsArray+=("CC=${stdenv.cc.targetPrefix}cc -isystem ${musl.dev}/include -B${musl}/lib -L${musl}/lib")
+  '';
+
+  makeFlags = [ "SKIP_STRIP=y" ];
+
+  postInstall = ''
+    sed -e '
+    1 a busybox() { '$out'/bin/busybox "$@"; }\
+    logger() { '$out'/bin/logger "$@"; }\
+    ' ${debianDispatcherScript} > ${outDispatchPath}
+    chmod 555 ${outDispatchPath}
+    HOST_PATH=$out/bin patchShebangs --host ${outDispatchPath}
+  '';
+
+  strictDeps = true;
+
+  depsBuildBuild = [ buildPackages.stdenv.cc ];
+
+  buildInputs = lib.optionals (enableStatic && !useMusl && stdenv.cc.libc ? static) [
+    stdenv.cc.libc
+    stdenv.cc.libc.static
+  ];
+
+  enableParallelBuilding = true;
+
+  doCheck = false; # tries to access the net
+
+  passthru.shellPath = "/bin/ash";
+
+  meta = with lib; {
+    description = "Tiny versions of common UNIX utilities in a single small executable";
+    homepage = "https://busybox.net/";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [
+      TethysSvensson
+      qyliss
+    ];
+    platforms = platforms.linux;
+    priority = 15; # below systemd (halt, init, poweroff, reboot) and coreutils
+  };
+}
diff --git a/pkgs/rootfs/default.nix b/pkgs/rootfs/default.nix
index 20fe642..dd0e2a7 100644
--- a/pkgs/rootfs/default.nix
+++ b/pkgs/rootfs/default.nix
@@ -21,7 +21,7 @@ stdenvNoCC.mkDerivation (finalAttrs: {
   systemd = patosPkgs.systemd.out;
   dbusBroker = patosPkgs.dbus-broker.out;
   kernel = patosPkgs.kernel.kernel;
-  busybox = pkgs.busybox.out;
+  busybox = patosPkgs.busybox.out;
   kmodLibs = pkgs.kmod.lib;
   kmodBin = pkgs.kmod.out;
   libbpf = pkgs.libbpf.out;
diff --git a/pkgs/rootfs/mkrootfs.sh b/pkgs/rootfs/mkrootfs.sh
index 31fc347..d86ae78 100644
--- a/pkgs/rootfs/mkrootfs.sh
+++ b/pkgs/rootfs/mkrootfs.sh
@@ -139,67 +139,10 @@ cp -P $libbpf/lib/libbpf* $out/usr/lib
 # remove pkgconfig
 rm -rf $out/usr/lib/pkgconfig
 
-cat <<EOF > $out/etc/passwd
-root::0:0:root:/root:/bin/sh
-bin:x:1:1:bin:/bin:/usr/bin/nologin
-daemon:x:2:2:daemon:/:/usr/bin/nologin
-mail:x:8:12:mail:/var/spool/mail:/usr/bin/nologin
-ftp:x:14:11:ftp:/srv/ftp:/usr/bin/nologin
-http:x:33:33:http:/srv/http:/usr/bin/nologin
-uuidd:x:68:68:uuidd:/:/usr/bin/nologin
-messagebus:x:81:81:messagebus:/:/usr/bin/nologin
-nobody:x:99:99:nobody:/:/usr/bin/nologin
-systemd-coredump:x:151:992::/var/empty:/usr/bin/nologin
-systemd-network:x:152:152::/var/empty:/usr/bin/nologin
-systemd-resolve:x:153:153::/var/empty:/usr/bin/nologin
-systemd-timesync:x:154:154::/var/empty:/usr/bin/nologin
-EOF
-chmod 644 $out/etc/passwd
-
-cat <<EOF > $out/etc/group
-root:x:0:root
-bin:x:1:root,bin,daemon
-daemon:x:2:root,bin,daemon
-sys:x:3:root,bin
-adm:x:4:root,daemon
-tty:x:5:
-disk:x:6:root
-lp:x:7:daemon
-mem:x:8:
-kmem:x:9:
-wheel:x:10:root
-ftp:x:11:
-mail:x:12:
-uucp:x:14:
-log:x:19:root
-utmp:x:20:
-locate:x:21:
-rfkill:x:24:
-smmsp:x:25:
-proc:x:26:
-http:x:33:
-games:x:50:
-lock:x:54:
-uuidd:x:68:
-messagebus:x:81:
-systemd-journal:x:62:
-systemd-network:x:152:
-systemd-resolve:x:153:
-systemd-timesync:x:154:
-systemd-oom:x:991:
-systemd-coredump:x:992:
-network:x:90:
-video:x:91:
-audio:x:92:
-optical:x:93:
-floppy:x:94:
-storage:x:95:
-scanner:x:96:
-input:x:97:
-power:x:98:
-nobody:x:99:
-EOF
-chmod 644 $out/etc/group
+### install sys users (default password is patos)
+mkdir creds
+echo -n patos > creds/passwd.plaintext-password.root
+CREDENTIALS_DIRECTORY=$PWD/creds SYSTEMD_CRYPT_PREFIX='$6$' $systemd/usr/bin/systemd-sysusers --root=$out $out/usr/lib/sysusers.d/*.conf
 
 ### Find and install all shared libs
 find $out -type f -executable -exec ldd {} \; | awk '{print $3}' | grep -v systemd | grep -v glibc | grep -v tpm2 | grep -v devmapper | sort -u | xargs -I {} cp {} $out/usr/lib/

From 879f74befab0a2517b0d9586636967cf84b3cab6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 5 Mar 2025 08:24:54 +0100
Subject: [PATCH 33/78] chore: remove unused logind and sysuser for dbus svc

---
 pkgs/dbus-broker/default.nix | 3 +++
 pkgs/image/mkimage.sh        | 7 +++++++
 pkgs/rootfs/mkrootfs.sh      | 5 -----
 pkgs/systemd/default.nix     | 2 +-
 4 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/pkgs/dbus-broker/default.nix b/pkgs/dbus-broker/default.nix
index 156c490..809f3ce 100644
--- a/pkgs/dbus-broker/default.nix
+++ b/pkgs/dbus-broker/default.nix
@@ -154,6 +154,9 @@ stdenv.mkDerivation (finalAttrs: {
     find $out/usr/share/ -type d -exec chmod 755 {} \;
     sed -i 's#/nix/store.*/share#/usr/share#' $out/usr/share/xml/dbus-1/catalog.xml
     sed -i 's#/nix/store.*/libexec#/usr/bin#' $out/usr/share/dbus-1/system.conf
+
+    mkdir -p $out/usr/lib/sysusers.d/
+    echo 'u! messagebus - "DBus broker"' > $out/usr/lib/sysusers.d/dbus-broker.conf
   '';
 
   doCheck = false;
diff --git a/pkgs/image/mkimage.sh b/pkgs/image/mkimage.sh
index 0c6fad0..b104525 100644
--- a/pkgs/image/mkimage.sh
+++ b/pkgs/image/mkimage.sh
@@ -26,6 +26,13 @@ ln -sf ../systemd-timesyncd.service rootfs/usr/lib/systemd/system/multi-user.tar
 # enable default network config
 mv rootfs/usr/lib/systemd/network/89-ethernet.network.example rootfs/usr/lib/systemd/network/89-ethernet.network
 
+### install sys users (default password is patos)
+mkdir creds
+echo -n patos > creds/passwd.plaintext-password.root
+CREDENTIALS_DIRECTORY=$PWD/creds SYSTEMD_CRYPT_PREFIX='$6$' $systemd/usr/bin/systemd-sysusers --root=rootfs rootfs/usr/lib/sysusers.d/*.conf
+chmod 600 rootfs/etc/shadow
+cat rootfs/etc/shadow
+
 # generate a temporary machine id (replace with overlay later)
 $systemd/usr/bin/systemd-machine-id-setup --root=rootfs/
 
diff --git a/pkgs/rootfs/mkrootfs.sh b/pkgs/rootfs/mkrootfs.sh
index d86ae78..62bfe56 100644
--- a/pkgs/rootfs/mkrootfs.sh
+++ b/pkgs/rootfs/mkrootfs.sh
@@ -139,11 +139,6 @@ cp -P $libbpf/lib/libbpf* $out/usr/lib
 # remove pkgconfig
 rm -rf $out/usr/lib/pkgconfig
 
-### install sys users (default password is patos)
-mkdir creds
-echo -n patos > creds/passwd.plaintext-password.root
-CREDENTIALS_DIRECTORY=$PWD/creds SYSTEMD_CRYPT_PREFIX='$6$' $systemd/usr/bin/systemd-sysusers --root=$out $out/usr/lib/sysusers.d/*.conf
-
 ### Find and install all shared libs
 find $out -type f -executable -exec ldd {} \; | awk '{print $3}' | grep -v systemd | grep -v glibc | grep -v tpm2 | grep -v devmapper | sort -u | xargs -I {} cp {} $out/usr/lib/
 find $out -type f -executable -exec chmod 755 {} \;
diff --git a/pkgs/systemd/default.nix b/pkgs/systemd/default.nix
index 6f5c6c9..db53c60 100644
--- a/pkgs/systemd/default.nix
+++ b/pkgs/systemd/default.nix
@@ -287,7 +287,7 @@ stdenv.mkDerivation (finalAttrs: {
     (lib.mesonEnable "man" false)
 
     (lib.mesonBool "analyze" true)
-    (lib.mesonBool "logind" true)
+    (lib.mesonBool "logind" false)
     (lib.mesonBool "localed" false)
     (lib.mesonBool "hostnamed" true)
     (lib.mesonBool "machined" true)

From 0a129b548927958925fe7f4aec962874c2ec573f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 5 Mar 2025 08:45:34 +0100
Subject: [PATCH 34/78] chore: clean up

---
 pkgs/image/default.nix  |  2 ++
 pkgs/image/mkimage.sh   | 20 +++++++++++++++++---
 pkgs/rootfs/mkrootfs.sh | 23 +++--------------------
 3 files changed, 22 insertions(+), 23 deletions(-)

diff --git a/pkgs/image/default.nix b/pkgs/image/default.nix
index c8b7749..ba783f7 100644
--- a/pkgs/image/default.nix
+++ b/pkgs/image/default.nix
@@ -7,10 +7,12 @@
 }:
 let
   pname = "patos-image";
+  defaultPassword = "patos";
 in
 stdenvNoCC.mkDerivation (finalAttrs: {
   inherit version;
   inherit pname;
+  inherit defaultPassword;
 
   buildInputs = with pkgs; [
     erofs-utils
diff --git a/pkgs/image/mkimage.sh b/pkgs/image/mkimage.sh
index b104525..d4975ab 100644
--- a/pkgs/image/mkimage.sh
+++ b/pkgs/image/mkimage.sh
@@ -12,7 +12,21 @@ find rootfs/ -type d -exec chmod 755 {} \;
 # set default target to multi-user
 ln -sf multi-user.target rootfs/usr/lib/systemd/system/default.target
 
-# mount /etc overlay
+# Overlay mount for /etc which makes it read-write in runtime
+cat <<EOF > rootfs/usr/lib/systemd/system/etc.mount
+[Unit]
+Description=Overlay mount for /etc
+Before=local-fs.target
+
+[Mount]
+What=overlay
+Where=/etc
+Type=overlay
+Options=lowerdir=/etc,upperdir=/run/.rw-etc/upper,workdir=/run/.rw-etc/work
+
+[Install]
+WantedBy=local-fs.target
+EOF
 ln -sf ../etc.mount rootfs/usr/lib/systemd/system/local-fs.target.wants/etc.mount
 
 # enable dbus
@@ -26,9 +40,9 @@ ln -sf ../systemd-timesyncd.service rootfs/usr/lib/systemd/system/multi-user.tar
 # enable default network config
 mv rootfs/usr/lib/systemd/network/89-ethernet.network.example rootfs/usr/lib/systemd/network/89-ethernet.network
 
-### install sys users (default password is patos)
+# install sys users
 mkdir creds
-echo -n patos > creds/passwd.plaintext-password.root
+echo -n $defaultPassword > creds/passwd.plaintext-password.root
 CREDENTIALS_DIRECTORY=$PWD/creds SYSTEMD_CRYPT_PREFIX='$6$' $systemd/usr/bin/systemd-sysusers --root=rootfs rootfs/usr/lib/sysusers.d/*.conf
 chmod 600 rootfs/etc/shadow
 cat rootfs/etc/shadow
diff --git a/pkgs/rootfs/mkrootfs.sh b/pkgs/rootfs/mkrootfs.sh
index 62bfe56..110b1e4 100644
--- a/pkgs/rootfs/mkrootfs.sh
+++ b/pkgs/rootfs/mkrootfs.sh
@@ -80,22 +80,6 @@ DefaultEnvironment=PATH=/bin:/sbin:/usr/bin
 ManagerEnvironment=PATH=/bin:/sbin:/usr/bin SYSTEMD_CRYPTTAB=/run/crypttab SYSTEMD_SYSROOT_FSTAB=/run/fstab SYSTEMD_FSTAB=/run/fstab
 EOF
 
-# Overlay mount for /etc which makes it read-write in runtime
-cat <<EOF > $out/usr/lib/systemd/system/etc.mount
-[Unit]
-Description=Overlay mount for /etc
-Before=local-fs.target
-
-[Mount]
-What=overlay
-Where=/etc
-Type=overlay
-Options=lowerdir=/etc,upperdir=/run/.rw-etc/upper,workdir=/run/.rw-etc/work
-
-[Install]
-WantedBy=local-fs.target
-EOF
-
 ### install PatOS glibc
 cp -P $glibcPatos/lib/*.so* $out/usr/lib/
 
@@ -123,12 +107,11 @@ cp -Pr ${btrfs}/bin/* $out/usr/bin/
 cp -Pr ${btrfs}/lib/* $out/usr/lib/
 
 ### install tpm2 tools
-cp -P ${tpm2Tools}/bin/* $out/usr/bin/
+# For TPM debugging
+# cp -P ${tpm2Tools}/bin/* $out/usr/bin/
+# cp -P $cryptsetup/bin/* $out/usr/bin/
 cp -P ${tpm2Libs}/lib/*.so* $out/usr/lib/
 
-### install cryptsetup tools
-cp -P $cryptsetup/bin/* $out/usr/bin/
-
 ### install lib kmod
 cp -P $kmodLibs/lib/* $out/usr/lib
 cp -P $kmodBin/bin/* $out/usr/bin

From be4efca9a55ce89447c9e75bb134be5b37899637 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 5 Mar 2025 09:46:28 +0100
Subject: [PATCH 35/78] chore: temporary generate machine-id on boot until we
 have a confext

---
 pkgs/image/mkimage.sh | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/pkgs/image/mkimage.sh b/pkgs/image/mkimage.sh
index d4975ab..52a3b60 100644
--- a/pkgs/image/mkimage.sh
+++ b/pkgs/image/mkimage.sh
@@ -40,15 +40,23 @@ ln -sf ../systemd-timesyncd.service rootfs/usr/lib/systemd/system/multi-user.tar
 # enable default network config
 mv rootfs/usr/lib/systemd/network/89-ethernet.network.example rootfs/usr/lib/systemd/network/89-ethernet.network
 
+# FIXME: remove this! machine id should be setup by a confext instead?
+mkdir rootfs/usr/lib/systemd/system/systemd-machine-id-commit.service.d
+cat <<EOF > rootfs/usr/lib/systemd/system/systemd-machine-id-commit.service.d/override.conf
+[Unit]
+After=local-fs.target sysroot-etc.mount
+ConditionPathIsMountPoint=
+[Service]
+ExecStart=
+ExecStart=systemd-machine-id-setup
+EOF
+
 # install sys users
 mkdir creds
 echo -n $defaultPassword > creds/passwd.plaintext-password.root
 CREDENTIALS_DIRECTORY=$PWD/creds SYSTEMD_CRYPT_PREFIX='$6$' $systemd/usr/bin/systemd-sysusers --root=rootfs rootfs/usr/lib/sysusers.d/*.conf
 chmod 600 rootfs/etc/shadow
-cat rootfs/etc/shadow
-
-# generate a temporary machine id (replace with overlay later)
-$systemd/usr/bin/systemd-machine-id-setup --root=rootfs/
+rm -rf creds
 
 $systemd/usr/bin/ukify build \
   --linux $kernel/bzImage \

From 18c8e76850d44c5218f24427b1a0c18ceb56079b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 5 Mar 2025 10:08:12 +0100
Subject: [PATCH 36/78] revert to static machine id for now

---
 pkgs/image/mkimage.sh | 12 ++----------
 1 file changed, 2 insertions(+), 10 deletions(-)

diff --git a/pkgs/image/mkimage.sh b/pkgs/image/mkimage.sh
index 52a3b60..ad7d57d 100644
--- a/pkgs/image/mkimage.sh
+++ b/pkgs/image/mkimage.sh
@@ -40,16 +40,8 @@ ln -sf ../systemd-timesyncd.service rootfs/usr/lib/systemd/system/multi-user.tar
 # enable default network config
 mv rootfs/usr/lib/systemd/network/89-ethernet.network.example rootfs/usr/lib/systemd/network/89-ethernet.network
 
-# FIXME: remove this! machine id should be setup by a confext instead?
-mkdir rootfs/usr/lib/systemd/system/systemd-machine-id-commit.service.d
-cat <<EOF > rootfs/usr/lib/systemd/system/systemd-machine-id-commit.service.d/override.conf
-[Unit]
-After=local-fs.target sysroot-etc.mount
-ConditionPathIsMountPoint=
-[Service]
-ExecStart=
-ExecStart=systemd-machine-id-setup
-EOF
+#FIXME: generate a temporary machine id (replace with overlay/confext later?)
+$systemd/usr/bin/systemd-machine-id-setup --root=rootfs/
 
 # install sys users
 mkdir creds

From 62dd1ca5bfcee730f0e8738513cdf89bb8790ab6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 5 Mar 2025 16:24:34 +0100
Subject: [PATCH 37/78] feat: enable conf/sys ext services and make /etc
 read-only without overlay

---
 pkgs/image/mkimage.sh      | 22 +++-------------------
 pkgs/kernel/generic.config |  3 ++-
 pkgs/rootfs/default.nix    |  4 +++-
 pkgs/rootfs/mkrootfs.sh    | 21 ++++++++++++++++++---
 4 files changed, 26 insertions(+), 24 deletions(-)

diff --git a/pkgs/image/mkimage.sh b/pkgs/image/mkimage.sh
index ad7d57d..c08f0d8 100644
--- a/pkgs/image/mkimage.sh
+++ b/pkgs/image/mkimage.sh
@@ -12,23 +12,6 @@ find rootfs/ -type d -exec chmod 755 {} \;
 # set default target to multi-user
 ln -sf multi-user.target rootfs/usr/lib/systemd/system/default.target
 
-# Overlay mount for /etc which makes it read-write in runtime
-cat <<EOF > rootfs/usr/lib/systemd/system/etc.mount
-[Unit]
-Description=Overlay mount for /etc
-Before=local-fs.target
-
-[Mount]
-What=overlay
-Where=/etc
-Type=overlay
-Options=lowerdir=/etc,upperdir=/run/.rw-etc/upper,workdir=/run/.rw-etc/work
-
-[Install]
-WantedBy=local-fs.target
-EOF
-ln -sf ../etc.mount rootfs/usr/lib/systemd/system/local-fs.target.wants/etc.mount
-
 # enable dbus
 ln -sf ../dbus.service rootfs/usr/lib/systemd/system/multi-user.target.wants/dbus.service
 ln -sf ../dbus.socket rootfs/usr/lib/systemd/system/sockets.target.wants/dbus.socket
@@ -40,8 +23,9 @@ ln -sf ../systemd-timesyncd.service rootfs/usr/lib/systemd/system/multi-user.tar
 # enable default network config
 mv rootfs/usr/lib/systemd/network/89-ethernet.network.example rootfs/usr/lib/systemd/network/89-ethernet.network
 
-#FIXME: generate a temporary machine id (replace with overlay/confext later?)
-$systemd/usr/bin/systemd-machine-id-setup --root=rootfs/
+# enable confext/sysext services
+ln -sf ../systemd-confext.service rootfs/usr/lib/systemd/system/sysinit.target.wants/systemd-confext.service
+ln -sf ../systemd-sysext.service rootfs/usr/lib/systemd/system/sysinit.target.wants/systemd-sysext.service
 
 # install sys users
 mkdir creds
diff --git a/pkgs/kernel/generic.config b/pkgs/kernel/generic.config
index 0220e23..209e026 100644
--- a/pkgs/kernel/generic.config
+++ b/pkgs/kernel/generic.config
@@ -591,7 +591,8 @@ CONFIG_DM_SWITCH=m
 CONFIG_DM_THIN_PROVISIONING=m
 CONFIG_DM_UNSTRIPED=m
 CONFIG_DM_VDO=m
-CONFIG_DM_VERITY=m
+CONFIG_DM_VERITY=y
+CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG=y
 CONFIG_DM_WRITECACHE=m
 CONFIG_DM_ZERO=y
 CONFIG_DM_ZONED=m
diff --git a/pkgs/rootfs/default.nix b/pkgs/rootfs/default.nix
index dd0e2a7..5ac9c6a 100644
--- a/pkgs/rootfs/default.nix
+++ b/pkgs/rootfs/default.nix
@@ -27,10 +27,12 @@ stdenvNoCC.mkDerivation (finalAttrs: {
   libbpf = pkgs.libbpf.out;
   btrfs = pkgs.btrfs-progs.out;
   tpm2Libs = patosPkgs.tpm2-tss.out;
-  tpm2Tools = patosPkgs.tpm2-tools.out;
   kexec = patosPkgs.kexec.out;
   lvm2 = patosPkgs.lvm2.out;
+  # FIXME: remove later:
+  tpm2Tools = patosPkgs.tpm2-tools.out;
   cryptsetup = pkgs.cryptsetup.bin;
+  erofsUtils = pkgs.erofs-utils.out;
 
   builder = ./mkrootfs.sh;
 })
diff --git a/pkgs/rootfs/mkrootfs.sh b/pkgs/rootfs/mkrootfs.sh
index 110b1e4..78d14d3 100644
--- a/pkgs/rootfs/mkrootfs.sh
+++ b/pkgs/rootfs/mkrootfs.sh
@@ -29,8 +29,8 @@ IMAGE_ID=patos
 ID=patos
 IMAGE_VERSION=${version}
 VERSION=${version}
-VERSION_ID={version}
-BUILD_ID={version}
+VERSION_ID=patos
+BUILD_ID=somehash
 EOF
 
 cat <<EOF > $out/etc/issue
@@ -106,6 +106,9 @@ cp -P ${lvm2}/lib/udev/rules.d/* $out/usr/lib/udev/rules.d/
 cp -Pr ${btrfs}/bin/* $out/usr/bin/
 cp -Pr ${btrfs}/lib/* $out/usr/lib/
 
+##FIXME(remove later): install mkfs.erofs bin
+cp -P ${erofsUtils}/bin/mkfs.erofs $out/usr/bin/
+
 ### install tpm2 tools
 # For TPM debugging
 # cp -P ${tpm2Tools}/bin/* $out/usr/bin/
@@ -119,11 +122,23 @@ cp -P $kmodBin/bin/* $out/usr/bin
 ### install libbpf
 cp -P $libbpf/lib/libbpf* $out/usr/lib
 
+# setup default files
+$systemd/usr/bin/systemd-hwdb --root=$out --usr update
+$systemd/usr/bin/systemd-tmpfiles --root=$out $out/usr/lib/tmpfiles.d/etc.conf --create
+cp $out/usr/share/factory/etc/nsswitch.conf $out/etc/
+cp $out/usr/share/factory/etc/locale.conf $out/etc/
+cp $out/usr/share/factory/etc/vconsole.conf $out/etc/
+#Ephemeral machine-id until registration
+ln -sf /run/machine-id $out/etc/machine-id
+
+
 # remove pkgconfig
 rm -rf $out/usr/lib/pkgconfig
 
 ### Find and install all shared libs
-find $out -type f -executable -exec ldd {} \; | awk '{print $3}' | grep -v systemd | grep -v glibc | grep -v tpm2 | grep -v devmapper | sort -u | xargs -I {} cp {} $out/usr/lib/
+find $out -type f -executable -exec ldd {} \; | awk '{print $3}' | \
+  grep -v util-linux-2 | grep -v systemd | grep -v glibc | grep -v tpm2 | grep -v devmapper | \
+  sort -u | xargs -I {} cp {} $out/usr/lib/
 find $out -type f -executable -exec chmod 755 {} \;
 
 # FIXME: ELF patching. Is there a better way?

From 658b5af153d4d64369a3fcb4877598380cb8f4d0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Thu, 6 Mar 2025 16:15:29 +0100
Subject: [PATCH 38/78] chore: even better erofs compression

---
 pkgs/image/default.nix | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pkgs/image/default.nix b/pkgs/image/default.nix
index ba783f7..4da5187 100644
--- a/pkgs/image/default.nix
+++ b/pkgs/image/default.nix
@@ -24,7 +24,7 @@ stdenvNoCC.mkDerivation (finalAttrs: {
   env = {
     # vfat options won't efi won't find the fs otherwise.
     SYSTEMD_REPART_MKFS_OPTIONS_VFAT = "-S 512 -c";
-    SYSTEMD_REPART_MKFS_OPTIONS_EROFS = "--all-root"; # -zlz4hc,level=12 -Efragments,dedupe,ztailpacking";
+    SYSTEMD_REPART_MKFS_OPTIONS_EROFS = "--all-root"; # -zlz4hc,12 -C1048576 -Efragments,dedupe,ztailpacking";
   };
 
   systemd = patosPkgs.systemd.out;

From d1e25bdddf5ea012ffa94e5fbc84151583cb9edd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Thu, 6 Mar 2025 16:26:13 +0100
Subject: [PATCH 39/78] chore: upgrade systemd to latest stable

---
 pkgs/systemd/default.nix | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pkgs/systemd/default.nix b/pkgs/systemd/default.nix
index db53c60..b22d243 100644
--- a/pkgs/systemd/default.nix
+++ b/pkgs/systemd/default.nix
@@ -7,7 +7,7 @@
   ...
 }:
 let
-  version = "257.3";
+  version = "257.4";
 
   # Use the command below to update `releaseTimestamp` on every (major) version
   # change. More details in the commentary at mesonFlags.
@@ -27,7 +27,7 @@ stdenv.mkDerivation (finalAttrs: {
     owner = "systemd";
     repo = "systemd";
     rev = "v${version}";
-    hash = "sha256-GvRn55grHWR6M+tA86RMzqinuXNpPZzRB4ApuGN/ZvU=";
+    hash = "sha256-6rxJUYRq785U6aik5VhQRqG+Ss67lBB6T3eQF+tkyhk=";
   };
 
   dontCheckForBrokenSymlinks = true;

From 3f443a9e9bd1c801d31d896b59dcd718e11a0ed1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Thu, 6 Mar 2025 17:17:53 +0100
Subject: [PATCH 40/78] chore: autologin as root for now

---
 pkgs/rootfs/mkrootfs.sh | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/pkgs/rootfs/mkrootfs.sh b/pkgs/rootfs/mkrootfs.sh
index 78d14d3..a9f16d9 100644
--- a/pkgs/rootfs/mkrootfs.sh
+++ b/pkgs/rootfs/mkrootfs.sh
@@ -38,13 +38,14 @@ cat <<EOF > $out/etc/issue
 
 EOF
 
-# replace agetty with busybox getty
+# replace agetty with busybox getty (optionally autologin)
 mkdir $out/usr/lib/systemd/system/serial-getty@.service.d
 cat <<EOF > $out/usr/lib/systemd/system/serial-getty@.service.d/override.conf
 [Service]
 ExecStart=
-ExecStart=-/sbin/getty -L %I 115200 vt100
+ExecStart=-/bin/login -f root
 EOF
+# ExecStart=-/sbin/getty -L %I 115200 vt100
 
 # Configure systemd-repart
 cat <<EOF > $out/etc/repart.d/10-esp.conf

From e907d0d3d35c08b4ba4353f1f3a788feddd2ad99 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Fri, 7 Mar 2025 15:18:51 +0100
Subject: [PATCH 41/78] fix: rootfs now with verity and A/B prep

---
 pkgs/image/default.nix  |  4 +-
 pkgs/image/mkimage.sh   | 84 ++++++++++++++++++++++++++++++++++-------
 pkgs/rootfs/mkrootfs.sh | 29 +++++++++++++-
 3 files changed, 100 insertions(+), 17 deletions(-)

diff --git a/pkgs/image/default.nix b/pkgs/image/default.nix
index 4da5187..0fcaf3f 100644
--- a/pkgs/image/default.nix
+++ b/pkgs/image/default.nix
@@ -19,6 +19,7 @@ stdenvNoCC.mkDerivation (finalAttrs: {
     dosfstools
     mtools
     e2fsprogs
+    jq
   ];
 
   env = {
@@ -32,8 +33,7 @@ stdenvNoCC.mkDerivation (finalAttrs: {
   initrd = patosPkgs.initrd.out;
   rootfs = patosPkgs.rootfs.out;
 
-  #FIXME: use roothash instead of device.
-  kernelCmdLine = "root=/dev/sda2 console=ttyS0";
+  kernelCmdLine = "console=ttyS0";
 
   builder = ./mkimage.sh;
 })
diff --git a/pkgs/image/mkimage.sh b/pkgs/image/mkimage.sh
index c08f0d8..78e55f8 100644
--- a/pkgs/image/mkimage.sh
+++ b/pkgs/image/mkimage.sh
@@ -1,6 +1,6 @@
 set -ex -o pipefail
 
-mkdir -p $out/repart.d $out/boot
+mkdir -p $out/init.repart.d $out/final.repart.d $out/boot
 pushd $out
 
 # Don't seem to work just to create a symlink to rootfs derivation?
@@ -34,46 +34,102 @@ CREDENTIALS_DIRECTORY=$PWD/creds SYSTEMD_CRYPT_PREFIX='$6$' $systemd/usr/bin/sys
 chmod 600 rootfs/etc/shadow
 rm -rf creds
 
+# Initial partitioning
+cat <<EOF > init.repart.d/10-root.conf
+[Partition]
+Type=root
+Format=erofs
+Minimize=best
+CopyFiles=/rootfs:/
+Verity=data
+VerityMatchKey=root
+SplitName=root
+EOF
+
+cat <<EOF > init.repart.d/20-root-verity.conf
+[Partition]
+Type=root-verity
+Verity=hash
+VerityMatchKey=root
+Minimize=best
+SplitName=verity
+EOF
+
+#TODO: Add verity signature partition
+
+$systemd/usr/bin/systemd-repart \
+  --no-pager \
+  --empty=create \
+  --size=auto \
+  --definitions=./init.repart.d \
+  --split=true \
+  --json=pretty \
+  --root=$out \
+  patos-$version.raw > init-repart-output.json
+rm -f patos-$version.raw
+
+roothash=$(jq -r '.[0].roothash' init-repart-output.json)
+rootPart=$(jq -r '.[0].split_path' init-repart-output.json)
+rootUuid=$(jq -r '.[0].uuid' init-repart-output.json)
+
+verityPart=$(jq -r '.[1].split_path' init-repart-output.json)
+verityUuid=$(jq -r '.[1].uuid' init-repart-output.json)
+
 $systemd/usr/bin/ukify build \
   --linux $kernel/bzImage \
   --initrd $initrd/initrd.xz \
   --os-release @rootfs/etc/os-release \
-  --cmdline "$kernelCmdLine" \
-  -o boot/patos.efi
+  --cmdline "$kernelCmdLine roothash=$roothash" \
+  -o patos_${version}.efi
+rm -rf rootfs
 
+cp patos_${version}.efi boot/
 cp ${systemd}/usr/lib/systemd/boot/efi/systemd-bootx64.efi boot/
-
 echo "timeout 1" > boot/loader.conf
 
-cat <<EOF > repart.d/10-esp.conf
+# Final partitioning
+cat <<EOF > final.repart.d/10-esp.conf
 [Partition]
 Type=esp
 Format=vfat
 SizeMinBytes=96M
 SizeMaxBytes=96M
 CopyFiles=/boot/systemd-bootx64.efi:/EFI/BOOT/BOOTX64.EFI
-CopyFiles=/boot/patos.efi:/EFI/Linux/patos.efi
+CopyFiles=/boot/patos_${version}.efi:/EFI/Linux/patos_${version}.efi
 CopyFiles=/boot/loader.conf:/loader/loader.conf
 EOF
 
-cat <<EOF > repart.d/10-root.conf
+cat <<EOF > final.repart.d/20-root.conf
 [Partition]
 Type=root
-Format=erofs
-Minimize=best
-CopyFiles=/rootfs:/
-SplitName=root
+Label=root-${version}
+CopyBlocks=/${rootPart}
+UUID=${rootUuid}
+SizeMinBytes=256M
+SizeMaxBytes=256M
+ReadOnly=1
 EOF
 
+cat <<EOF > final.repart.d/22-root-verity.conf
+[Partition]
+Type=root-verity
+Label=verity-${version}
+CopyBlocks=/${verityPart}
+UUID=${verityUuid}
+SizeMinBytes=10M
+SizeMaxBytes=10M
+ReadOnly=1
+EOF
+
+# finalize image ready for boot
 $systemd/usr/bin/systemd-repart \
   --no-pager \
   --empty=create \
   --size=auto \
-  --definitions=./repart.d \
+  --definitions=./final.repart.d \
   --root=$out \
-  patos-$version.raw
+  patos-$version.raw > final-repart-output.json
 
-rm -rf rootfs
 rm -rf boot
 
 popd
diff --git a/pkgs/rootfs/mkrootfs.sh b/pkgs/rootfs/mkrootfs.sh
index a9f16d9..05a613b 100644
--- a/pkgs/rootfs/mkrootfs.sh
+++ b/pkgs/rootfs/mkrootfs.sh
@@ -52,11 +52,38 @@ cat <<EOF > $out/etc/repart.d/10-esp.conf
 [Partition]
 Type=esp
 Format=vfat
+SizeMaxBytes=96M
+SizeMinBytes=96M
 EOF
 
-cat <<EOF > $out/etc/repart.d/22-root.conf
+cat <<EOF > $out/etc/repart.d/20-root-a.conf
 [Partition]
 Type=root
+SizeMaxBytes=256M
+SizeMinBytes=256M
+EOF
+cat <<EOF > $out/etc/repart.d/22-root-verify-a.conf
+[Partition]
+Type=root-verity
+SizeMaxBytes=10M
+SizeMinBytes=10M
+EOF
+
+cat <<EOF > $out/etc/repart.d/30-root-b.conf
+[Partition]
+Type=root
+Label=_empty
+SizeMaxBytes=256M
+SizeMinBytes=256M
+ReadOnly=1
+EOF
+cat <<EOF > $out/etc/repart.d/32-root-verity-b.conf
+[Partition]
+Type=root-verity
+Label=_empty
+SizeMaxBytes=10M
+SizeMinBytes=10M
+ReadOnly=1
 EOF
 
 cat <<EOF > $out/etc/repart.d/40-var.conf

From 55ac59e2b3a9aa89ed497dd6eae6626d58a0582c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Sun, 9 Mar 2025 14:42:28 +0100
Subject: [PATCH 42/78] chore: add subvolumes state partition

---
 pkgs/rootfs/mkrootfs.sh | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/pkgs/rootfs/mkrootfs.sh b/pkgs/rootfs/mkrootfs.sh
index 05a613b..9d1e621 100644
--- a/pkgs/rootfs/mkrootfs.sh
+++ b/pkgs/rootfs/mkrootfs.sh
@@ -90,10 +90,14 @@ cat <<EOF > $out/etc/repart.d/40-var.conf
 [Partition]
 Type=var
 Format=btrfs
+MakeDirectories=/var/lib/confexts /var/.snapshots
 MountPoint=/var
 Label=patos-state
 Encrypt=tpm2
 EncryptedVolume=patos-state:none:tpm2-device=auto,luks,discard
+Subvolumes=/var/lib/confexts /var/.snapshots
+MountPoint=/var/lib/confexts:subvol=/var/lib/confexts
+MountPoint=/var/.snapshots:subvol=/var/.snapshots
 SizeMinBytes=1G
 Minimize=off
 FactoryReset=yes
@@ -134,9 +138,6 @@ cp -P ${lvm2}/lib/udev/rules.d/* $out/usr/lib/udev/rules.d/
 cp -Pr ${btrfs}/bin/* $out/usr/bin/
 cp -Pr ${btrfs}/lib/* $out/usr/lib/
 
-##FIXME(remove later): install mkfs.erofs bin
-cp -P ${erofsUtils}/bin/mkfs.erofs $out/usr/bin/
-
 ### install tpm2 tools
 # For TPM debugging
 # cp -P ${tpm2Tools}/bin/* $out/usr/bin/
@@ -159,13 +160,12 @@ cp $out/usr/share/factory/etc/vconsole.conf $out/etc/
 #Ephemeral machine-id until registration
 ln -sf /run/machine-id $out/etc/machine-id
 
-
 # remove pkgconfig
 rm -rf $out/usr/lib/pkgconfig
 
 ### Find and install all shared libs
 find $out -type f -executable -exec ldd {} \; | awk '{print $3}' | \
-  grep -v util-linux-2 | grep -v systemd | grep -v glibc | grep -v tpm2 | grep -v devmapper | \
+  grep -v systemd | grep -v glibc | grep -v tpm2 | grep -v devmapper | \
   sort -u | xargs -I {} cp {} $out/usr/lib/
 find $out -type f -executable -exec chmod 755 {} \;
 

From e49c2b22b54bd8c7c25ae9635944c4139ca70494 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Sun, 9 Mar 2025 21:10:05 +0100
Subject: [PATCH 43/78] chore: install ca cert bundle

---
 pkgs/busybox/default.nix | 11 +----------
 pkgs/rootfs/default.nix  |  5 +----
 pkgs/rootfs/mkrootfs.sh  | 14 ++++++++------
 3 files changed, 10 insertions(+), 20 deletions(-)

diff --git a/pkgs/busybox/default.nix b/pkgs/busybox/default.nix
index 571d0cf..e318d8a 100644
--- a/pkgs/busybox/default.nix
+++ b/pkgs/busybox/default.nix
@@ -163,7 +163,7 @@ stdenv.mkDerivation rec {
     CONFIG_TC n
 
     # Set the path for the udhcpc script
-    CONFIG_UDHCPC_DEFAULT_SCRIPT "${outDispatchPath}"
+    CONFIG_UDHCPC_DEFAULT_SCRIPT "/usr/share/busybox/"
 
     ${extraConfig}
     CONFIG_CROSS_COMPILER_PREFIX "${stdenv.cc.targetPrefix}"
@@ -181,15 +181,6 @@ stdenv.mkDerivation rec {
 
   makeFlags = [ "SKIP_STRIP=y" ];
 
-  postInstall = ''
-    sed -e '
-    1 a busybox() { '$out'/bin/busybox "$@"; }\
-    logger() { '$out'/bin/logger "$@"; }\
-    ' ${debianDispatcherScript} > ${outDispatchPath}
-    chmod 555 ${outDispatchPath}
-    HOST_PATH=$out/bin patchShebangs --host ${outDispatchPath}
-  '';
-
   strictDeps = true;
 
   depsBuildBuild = [ buildPackages.stdenv.cc ];
diff --git a/pkgs/rootfs/default.nix b/pkgs/rootfs/default.nix
index 5ac9c6a..4e64ddd 100644
--- a/pkgs/rootfs/default.nix
+++ b/pkgs/rootfs/default.nix
@@ -24,15 +24,12 @@ stdenvNoCC.mkDerivation (finalAttrs: {
   busybox = patosPkgs.busybox.out;
   kmodLibs = pkgs.kmod.lib;
   kmodBin = pkgs.kmod.out;
+  cacert = pkgs.cacert.out;
   libbpf = pkgs.libbpf.out;
   btrfs = pkgs.btrfs-progs.out;
   tpm2Libs = patosPkgs.tpm2-tss.out;
   kexec = patosPkgs.kexec.out;
   lvm2 = patosPkgs.lvm2.out;
-  # FIXME: remove later:
-  tpm2Tools = patosPkgs.tpm2-tools.out;
-  cryptsetup = pkgs.cryptsetup.bin;
-  erofsUtils = pkgs.erofs-utils.out;
 
   builder = ./mkrootfs.sh;
 })
diff --git a/pkgs/rootfs/mkrootfs.sh b/pkgs/rootfs/mkrootfs.sh
index 9d1e621..ad227ad 100644
--- a/pkgs/rootfs/mkrootfs.sh
+++ b/pkgs/rootfs/mkrootfs.sh
@@ -138,26 +138,27 @@ cp -P ${lvm2}/lib/udev/rules.d/* $out/usr/lib/udev/rules.d/
 cp -Pr ${btrfs}/bin/* $out/usr/bin/
 cp -Pr ${btrfs}/lib/* $out/usr/lib/
 
-### install tpm2 tools
-# For TPM debugging
-# cp -P ${tpm2Tools}/bin/* $out/usr/bin/
-# cp -P $cryptsetup/bin/* $out/usr/bin/
+### install tpm2 libs
 cp -P ${tpm2Libs}/lib/*.so* $out/usr/lib/
 
 ### install lib kmod
-cp -P $kmodLibs/lib/* $out/usr/lib
+cp -P $kmodLibs/lib/*.so* $out/usr/lib/
 cp -P $kmodBin/bin/* $out/usr/bin
 
 ### install libbpf
 cp -P $libbpf/lib/libbpf* $out/usr/lib
 
+### install ca cert bundle
+cp -Pr $cacert/etc/ssl $out/etc/
+
 # setup default files
 $systemd/usr/bin/systemd-hwdb --root=$out --usr update
 $systemd/usr/bin/systemd-tmpfiles --root=$out $out/usr/lib/tmpfiles.d/etc.conf --create
 cp $out/usr/share/factory/etc/nsswitch.conf $out/etc/
 cp $out/usr/share/factory/etc/locale.conf $out/etc/
 cp $out/usr/share/factory/etc/vconsole.conf $out/etc/
-#Ephemeral machine-id until registration
+
+# Ephemeral machine-id until registration
 ln -sf /run/machine-id $out/etc/machine-id
 
 # remove pkgconfig
@@ -167,6 +168,7 @@ rm -rf $out/usr/lib/pkgconfig
 find $out -type f -executable -exec ldd {} \; | awk '{print $3}' | \
   grep -v systemd | grep -v glibc | grep -v tpm2 | grep -v devmapper | \
   sort -u | xargs -I {} cp {} $out/usr/lib/
+
 find $out -type f -executable -exec chmod 755 {} \;
 
 # FIXME: ELF patching. Is there a better way?

From 4ecf8ead2addd9568154ca979d8c465439125113 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 12 Mar 2025 10:39:39 +0100
Subject: [PATCH 44/78] chore: add lib for making systemd sysexts

---
 flake.nix           | 15 ++++++++
 lib/make-sysext.nix | 87 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 102 insertions(+)
 create mode 100644 lib/make-sysext.nix

diff --git a/flake.nix b/flake.nix
index 97a1f97..ed6a3e5 100644
--- a/flake.nix
+++ b/flake.nix
@@ -45,6 +45,21 @@
           dbus-broker = pkgs.callPackage ./pkgs/dbus-broker { };
 
           qemu-uefi-tpm = pkgs.callPackage ./utils/qemu-uefi-tpm.nix { };
+
+          debug-tools-sysext = pkgs.callPackage ./lib/make-sysext.nix {
+            name = "debug-tools";
+            version = "0.0.1";
+            packages = [
+                { drv = pkgs.curl; path = "bin/curl"; }
+                { drv = patosPkgs.tpm2-tools; path = "bin/tpm2"; }
+                { drv = pkgs.cryptsetup; path = "bin/cryptsetup"; }
+                { drv = pkgs.cryptsetup; path = "bin/veritysetup"; }
+                # shared lib required for cryptsetup
+                { drv = pkgs.popt; path = "lib/libpopt.so.0.0.2"; }
+                { drv = pkgs.popt; path = "lib/libpopt.so.0"; }
+                { drv = pkgs.popt; path = "lib/libpopt.so"; }
+            ];
+          };
         };
 
         checks = {
diff --git a/lib/make-sysext.nix b/lib/make-sysext.nix
new file mode 100644
index 0000000..fb1a8f0
--- /dev/null
+++ b/lib/make-sysext.nix
@@ -0,0 +1,87 @@
+{
+  lib,
+  runCommand,
+  pkgs,
+
+  name,
+  packages,
+  osId ? "patos",
+  version ? null,
+}:
+
+
+let
+  metadata = {
+    ID = osId;
+    VERSION_ID = osId;
+    IMAGE_ID = name;
+    IMAGE_VERSION = version;
+  };
+
+  metadataFile = lib.concatStringsSep "\n" (
+    lib.mapAttrsToList (k: v: "${k}=${v}") (lib.filterAttrs (_: v: v != null) metadata)
+  );
+
+  doCopy =
+    {
+      drv,
+      prefix ? "usr",
+      path,
+      destpath ? null,
+    }:
+    "do_copy ${prefix} ${drv} ${path}" + lib.optionalString (destpath != null) " ${destpath}";
+
+in
+
+runCommand name
+  {
+    passthru.name = name;
+    inherit metadataFile;
+    passAsFile = [ "metadataFile" ];
+
+    buildInputs = [
+      pkgs.erofs-utils
+      pkgs.cryptsetup
+    ];
+
+  }
+  ''
+    do_copy () {
+      local prefix="$1"
+      local drv="$2"
+      local path="$3"
+      local destpath="''${4:-$path}"
+
+      local srcfile
+      local destdir
+      local destfile
+      srcfile="$drv/$path"
+      destfile="$out/tree/$prefix/$destpath"
+      destdir="$(dirname -- "$destfile")"
+
+      mkdir -pv "$destdir"
+      cp -Pv "$srcfile" "$destfile"
+
+      chmod 755 "$destfile"
+      patchelf --set-rpath /lib:/usr/lib:/ $destfile
+      patchelf --set-interpreter /lib/ld-linux-x86-64.so.2 $destfile || true
+    }
+
+    mkdir -p $out/tree
+
+    ${lib.concatStringsSep "\n" (map doCopy packages)}
+
+    # bake metadata into the structure
+    if ! [ -f $out/tree/usr/lib/extension-release.d/extension-release."${name}" ]; then
+      mkdir -p $out/tree/usr/lib/extension-release.d
+      cat "$metadataFilePath" > $out/tree/usr/lib/extension-release.d/extension-release."${name}"
+    fi
+
+    pushd $out
+    find tree -type d -exec chmod 0755 {} \;
+    mkfs.erofs --all-root $name.raw tree/
+    veritysetup format --root-hash-file $name.roothash $name.raw $name.verity
+    #TODO: pcks7 signature?
+    rm -rf tree
+    popd
+  ''

From 5ecfd546f66d4a68bd68537cc7efa9f174a24470 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 12 Mar 2025 12:47:56 +0100
Subject: [PATCH 45/78] fix: we have to build our own openssl to use standard
 paths

---
 flake.nix                |   1 +
 lib/make-sysext.nix      |   2 +-
 pkgs/openssl/default.nix | 166 +++++++++++++++++++++++++++++++++++++++
 pkgs/rootfs/default.nix  |   1 +
 pkgs/rootfs/mkrootfs.sh  |   9 ++-
 5 files changed, 176 insertions(+), 3 deletions(-)
 create mode 100644 pkgs/openssl/default.nix

diff --git a/flake.nix b/flake.nix
index ed6a3e5..fc453e8 100644
--- a/flake.nix
+++ b/flake.nix
@@ -37,6 +37,7 @@
           kernel = pkgs.callPackage ./pkgs/kernel { };
           glibc = pkgs.callPackage ./pkgs/glibc { };
           busybox = pkgs.callPackage ./pkgs/busybox { };
+          openssl = pkgs.callPackage ./pkgs/openssl { };
           kexec = pkgs.callPackage ./pkgs/kexec-tools { };
           lvm2 = pkgs.callPackage ./pkgs/lvm2 { };
           tpm2-tools = pkgs.callPackage ./pkgs/tpm2-tools { inherit patosPkgs; };
diff --git a/lib/make-sysext.nix b/lib/make-sysext.nix
index fb1a8f0..2541e3d 100644
--- a/lib/make-sysext.nix
+++ b/lib/make-sysext.nix
@@ -63,7 +63,7 @@ runCommand name
       cp -Pv "$srcfile" "$destfile"
 
       chmod 755 "$destfile"
-      patchelf --set-rpath /lib:/usr/lib:/ $destfile
+      patchelf --set-rpath /usr/lib $destfile
       patchelf --set-interpreter /lib/ld-linux-x86-64.so.2 $destfile || true
     }
 
diff --git a/pkgs/openssl/default.nix b/pkgs/openssl/default.nix
new file mode 100644
index 0000000..137176d
--- /dev/null
+++ b/pkgs/openssl/default.nix
@@ -0,0 +1,166 @@
+{
+  lib,
+  stdenv,
+  fetchurl,
+  perl,
+  makeBinaryWrapper,
+  withCryptodev ? false,
+  cryptodev,
+  withZlib ? false,
+  zlib,
+  enableSSL2 ? false,
+  enableSSL3 ? false,
+  enableMD2 ? false,
+  enableKTLS ? stdenv.hostPlatform.isLinux,
+  static ? stdenv.hostPlatform.isStatic,
+  removeReferencesTo,
+}:
+
+stdenv.mkDerivation rec {
+    pname = "openssl";
+    version = "3.4.1";
+    hash = "sha256-ACotazC1i/S+pGxDvdljZar42qbEKHgqpP7uBtoZffM=";
+
+    src = fetchurl {
+      url = "https://github.com/openssl/openssl/releases/download/openssl-${version}/openssl-${version}.tar.gz";
+      hash = hash;
+    };
+
+    outputs = [ "out" ];
+
+    nativeBuildInputs =
+      lib.optional (!stdenv.hostPlatform.isWindows) makeBinaryWrapper
+      ++ [ perl ]
+      ++ lib.optionals static [ removeReferencesTo ];
+    buildInputs = lib.optional withCryptodev cryptodev ++ lib.optional withZlib zlib;
+
+    # TODO(@Ericson2314): Improve with mass rebuild
+    configurePlatforms = [ ];
+    configureScript =
+      {
+        armv5tel-linux = "./Configure linux-armv4 -march=armv5te";
+        armv6l-linux = "./Configure linux-armv4 -march=armv6";
+        armv7l-linux = "./Configure linux-armv4 -march=armv7-a";
+        x86_64-darwin = "./Configure darwin64-x86_64-cc";
+        aarch64-darwin = "./Configure darwin64-arm64-cc";
+        x86_64-linux = "./Configure linux-x86_64";
+        x86_64-solaris = "./Configure solaris64-x86_64-gcc";
+        powerpc64-linux = "./Configure linux-ppc64";
+        riscv32-linux = "./Configure ${
+          if lib.versionAtLeast version "3.2" then "linux32-riscv32" else "linux-latomic"
+        }";
+        riscv64-linux = "./Configure linux64-riscv64";
+      }
+      .${stdenv.hostPlatform.system} or (
+        if stdenv.hostPlatform == stdenv.buildPlatform then
+          "./config"
+        else if stdenv.hostPlatform.isBSD then
+          if stdenv.hostPlatform.isx86_64 then
+            "./Configure BSD-x86_64"
+          else if stdenv.hostPlatform.isx86_32 then
+            "./Configure BSD-x86" + lib.optionalString stdenv.hostPlatform.isElf "-elf"
+          else
+            "./Configure BSD-generic${toString stdenv.hostPlatform.parsed.cpu.bits}"
+        else if stdenv.hostPlatform.isMinGW then
+          "./Configure mingw${
+            lib.optionalString (stdenv.hostPlatform.parsed.cpu.bits != 32) (
+              toString stdenv.hostPlatform.parsed.cpu.bits
+            )
+          }"
+        else if stdenv.hostPlatform.isLinux then
+          if stdenv.hostPlatform.isx86_64 then
+            "./Configure linux-x86_64"
+          else if stdenv.hostPlatform.isMicroBlaze then
+            "./Configure linux-latomic"
+          else if stdenv.hostPlatform.isMips32 then
+            "./Configure linux-mips32"
+          else if stdenv.hostPlatform.isMips64n32 then
+            "./Configure linux-mips64"
+          else if stdenv.hostPlatform.isMips64n64 then
+            "./Configure linux64-mips64"
+          else
+            "./Configure linux-generic${toString stdenv.hostPlatform.parsed.cpu.bits}"
+        else if stdenv.hostPlatform.isiOS then
+          "./Configure ios${toString stdenv.hostPlatform.parsed.cpu.bits}-cross"
+        else
+          throw "Not sure what configuration to use for ${stdenv.hostPlatform.config}"
+      );
+
+    # OpenSSL doesn't like the `--enable-static` / `--disable-shared` flags.
+    dontAddStaticConfigureFlags = true;
+
+    configureFlags =
+      [
+        "shared" # "shared" builds both shared and static libraries
+        "--prefix=/usr"
+        "--libdir=lib"
+        "--openssldir=/etc/ssl"
+      ]
+      ++ lib.optionals withCryptodev [
+        "-DHAVE_CRYPTODEV"
+        "-DUSE_CRYPTODEV_DIGESTS"
+      ]
+      ++ lib.optional enableMD2 "enable-md2"
+      ++ lib.optional enableSSL2 "enable-ssl2"
+      ++ lib.optional enableSSL3 "enable-ssl3"
+      # We select KTLS here instead of the configure-time detection (which we patch out).
+      # KTLS should work on FreeBSD 13+ as well, so we could enable it if someone tests it.
+      ++ lib.optional (lib.versionAtLeast version "3.0.0" && enableKTLS) "enable-ktls"
+      ++ lib.optional (lib.versionAtLeast version "1.1.1" && stdenv.hostPlatform.isAarch64) "no-afalgeng"
+      # OpenSSL needs a specific `no-shared` configure flag.
+      # See https://wiki.openssl.org/index.php/Compilation_and_Installation#Configure_Options
+      # for a comprehensive list of configuration options.
+      ++ lib.optional (lib.versionAtLeast version "1.1.1" && static) "no-shared"
+      ++ lib.optional (lib.versionAtLeast version "3.0.0" && static) "no-module"
+      # This introduces a reference to the CTLOG_FILE which is undesired when
+      # trying to build binaries statically.
+      ++ lib.optional static "no-ct"
+      ++ lib.optional withZlib "zlib"
+      # /dev/crypto support has been dropped in OpenBSD 5.7.
+      #
+      # OpenBSD's ports does this too,
+      # https://github.com/openbsd/ports/blob/a1147500c76970fea22947648fb92a093a529d7c/security/openssl/3.3/Makefile#L25.
+      #
+      # https://github.com/openssl/openssl/pull/10565 indicated the
+      # intent was that this would be configured properly automatically,
+      # but that doesn't appear to be the case.
+      ++ lib.optional stdenv.hostPlatform.isOpenBSD "no-devcryptoeng"
+      ++ lib.optionals (stdenv.hostPlatform.isMips && stdenv.hostPlatform ? gcc.arch) [
+        # This is necessary in order to avoid openssl adding -march
+        # flags which ultimately conflict with those added by
+        # cc-wrapper.  Openssl assumes that it can scan CFLAGS to
+        # detect any -march flags, using this perl code:
+        #
+        #   && !grep { $_ =~ /-m(ips|arch=)/ } (@{$config{CFLAGS}})
+        #
+        # The following bogus CFLAGS environment variable triggers the
+        # the code above, inhibiting `./Configure` from adding the
+        # conflicting flags.
+        "CFLAGS=-march=${stdenv.hostPlatform.gcc.arch}"
+      ];
+
+    postPatch = ''
+      patchShebangs Configure
+    '';
+
+    installPhase = ''
+      make DESTDIR=$out install
+    '';
+
+    enableParallelBuilding = true;
+
+    meta = {
+      homepage = "https://www.openssl.org/";
+      changelog = "https://github.com/openssl/openssl/blob/openssl-${version}/CHANGES.md";
+      description = "Cryptographic library that implements the SSL and TLS protocols";
+      license = lib.licenses.openssl;
+      mainProgram = "openssl";
+      maintainers = with lib.maintainers; [ thillux ] ++ lib.teams.stridtech.members;
+      pkgConfigModules = [
+        "libcrypto"
+        "libssl"
+        "openssl"
+      ];
+      platforms = lib.platforms.all;
+    };
+}
diff --git a/pkgs/rootfs/default.nix b/pkgs/rootfs/default.nix
index 4e64ddd..c7f0dba 100644
--- a/pkgs/rootfs/default.nix
+++ b/pkgs/rootfs/default.nix
@@ -30,6 +30,7 @@ stdenvNoCC.mkDerivation (finalAttrs: {
   tpm2Libs = patosPkgs.tpm2-tss.out;
   kexec = patosPkgs.kexec.out;
   lvm2 = patosPkgs.lvm2.out;
+  openssl = patosPkgs.openssl.out;
 
   builder = ./mkrootfs.sh;
 })
diff --git a/pkgs/rootfs/mkrootfs.sh b/pkgs/rootfs/mkrootfs.sh
index ad227ad..14f4dac 100644
--- a/pkgs/rootfs/mkrootfs.sh
+++ b/pkgs/rootfs/mkrootfs.sh
@@ -115,6 +115,10 @@ EOF
 ### install PatOS glibc
 cp -P $glibcPatos/lib/*.so* $out/usr/lib/
 
+### install openssl
+cp -P $openssl/usr/lib/*.so* $out/usr/lib/
+cp -Pr $openssl/etc/ssl $out/etc/
+
 ### install kernel modules
 cp -r $kernel/lib/modules $out/usr/lib/
 find $out/usr/lib/modules -type d -exec chmod 755 {} \;
@@ -149,7 +153,8 @@ cp -P $kmodBin/bin/* $out/usr/bin
 cp -P $libbpf/lib/libbpf* $out/usr/lib
 
 ### install ca cert bundle
-cp -Pr $cacert/etc/ssl $out/etc/
+chmod 755 $out/etc/ssl
+cp -P $cacert/etc/ssl/certs/ca-bundle.crt $out/etc/ssl/cert.pem
 
 # setup default files
 $systemd/usr/bin/systemd-hwdb --root=$out --usr update
@@ -166,7 +171,7 @@ rm -rf $out/usr/lib/pkgconfig
 
 ### Find and install all shared libs
 find $out -type f -executable -exec ldd {} \; | awk '{print $3}' | \
-  grep -v systemd | grep -v glibc | grep -v tpm2 | grep -v devmapper | \
+  grep -v systemd | grep -v glibc | grep -v openssl | grep -v tpm2 | grep -v devmapper | grep -v not | \
   sort -u | xargs -I {} cp {} $out/usr/lib/
 
 find $out -type f -executable -exec chmod 755 {} \;

From 4c0ae9086ba93aec9985c85df9d689c2350270b0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 12 Mar 2025 13:37:59 +0100
Subject: [PATCH 46/78] chore(openssl): remove dist files from ssldir

---
 lib/make-sysext.nix      | 6 +++++-
 pkgs/openssl/default.nix | 1 +
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/lib/make-sysext.nix b/lib/make-sysext.nix
index 2541e3d..c94227b 100644
--- a/lib/make-sysext.nix
+++ b/lib/make-sysext.nix
@@ -81,7 +81,11 @@ runCommand name
     find tree -type d -exec chmod 0755 {} \;
     mkfs.erofs --all-root $name.raw tree/
     veritysetup format --root-hash-file $name.roothash $name.raw $name.verity
-    #TODO: pcks7 signature?
+    # TODO: pcks7 signature
+    # openssl smime -sign -nocerts -noattr -binary -in ${name}.roothash \
+    #   -inkey key.pem -signer cert.pem -outform der -out ${name}.roothash.p7s
     rm -rf tree
+    sha256sum * > SHA256SUMS
+    # TODO: add gpg signature
     popd
   ''
diff --git a/pkgs/openssl/default.nix b/pkgs/openssl/default.nix
index 137176d..0e1f742 100644
--- a/pkgs/openssl/default.nix
+++ b/pkgs/openssl/default.nix
@@ -145,6 +145,7 @@ stdenv.mkDerivation rec {
 
     installPhase = ''
       make DESTDIR=$out install
+      rm -rf $out/etc/ssl/*.dist $out/etc/ssl/misc
     '';
 
     enableParallelBuilding = true;

From 865d73abab7b0c8d6ad44f890351ff1ff158dc13 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 12 Mar 2025 14:12:38 +0100
Subject: [PATCH 47/78] chore(debug-tools): add a couple of useful tools

---
 flake.nix           | 4 ++++
 lib/make-sysext.nix | 2 +-
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/flake.nix b/flake.nix
index fc453e8..1276c0c 100644
--- a/flake.nix
+++ b/flake.nix
@@ -52,6 +52,10 @@
             version = "0.0.1";
             packages = [
                 { drv = pkgs.curl; path = "bin/curl"; }
+                { drv = pkgs.bash; path = "bin/bash"; }
+                { drv = patosPkgs.glibc; path = "bin/ldd"; }
+                { drv = pkgs.keyutils; path = "bin/keyctl"; }
+                { drv = pkgs.gnutar; path = "bin/tar"; }
                 { drv = patosPkgs.tpm2-tools; path = "bin/tpm2"; }
                 { drv = pkgs.cryptsetup; path = "bin/cryptsetup"; }
                 { drv = pkgs.cryptsetup; path = "bin/veritysetup"; }
diff --git a/lib/make-sysext.nix b/lib/make-sysext.nix
index c94227b..6de1e63 100644
--- a/lib/make-sysext.nix
+++ b/lib/make-sysext.nix
@@ -63,7 +63,7 @@ runCommand name
       cp -Pv "$srcfile" "$destfile"
 
       chmod 755 "$destfile"
-      patchelf --set-rpath /usr/lib $destfile
+      patchelf --set-rpath /usr/lib $destfile || true
       patchelf --set-interpreter /lib/ld-linux-x86-64.so.2 $destfile || true
     }
 

From 723c7efa327dbaeece28a7e001034f76bc50d5f7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 12 Mar 2025 14:38:01 +0100
Subject: [PATCH 48/78] chore(debug-tools): more tools for the people :rocket:

---
 flake.nix | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/flake.nix b/flake.nix
index 1276c0c..ed21385 100644
--- a/flake.nix
+++ b/flake.nix
@@ -57,12 +57,18 @@
                 { drv = pkgs.keyutils; path = "bin/keyctl"; }
                 { drv = pkgs.gnutar; path = "bin/tar"; }
                 { drv = patosPkgs.tpm2-tools; path = "bin/tpm2"; }
+                { drv = patosPkgs.openssl; path = "usr/bin/openssl"; destpath = "bin/openssl"; }
                 { drv = pkgs.cryptsetup; path = "bin/cryptsetup"; }
                 { drv = pkgs.cryptsetup; path = "bin/veritysetup"; }
+                { drv = pkgs.erofs-utils; path = "bin/mkfs.erofs"; }
                 # shared lib required for cryptsetup
                 { drv = pkgs.popt; path = "lib/libpopt.so.0.0.2"; }
                 { drv = pkgs.popt; path = "lib/libpopt.so.0"; }
                 { drv = pkgs.popt; path = "lib/libpopt.so"; }
+                # shared lib required for mkfs.erofs
+                { drv = pkgs.lz4.lib; path = "lib/liblz4.so.1.10.0"; }
+                { drv = pkgs.lz4.lib; path = "lib/liblz4.so.1"; }
+                { drv = pkgs.lz4.lib; path = "lib/liblz4.so"; }
             ];
           };
         };

From 1fcccfcd7c3837bdb2aa4cd846e58e295b803b73 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 12 Mar 2025 15:38:40 +0100
Subject: [PATCH 49/78] chore(debug-tools): add strace and binutils

---
 flake.nix | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/flake.nix b/flake.nix
index ed21385..f1005dc 100644
--- a/flake.nix
+++ b/flake.nix
@@ -56,6 +56,8 @@
                 { drv = patosPkgs.glibc; path = "bin/ldd"; }
                 { drv = pkgs.keyutils; path = "bin/keyctl"; }
                 { drv = pkgs.gnutar; path = "bin/tar"; }
+                { drv = pkgs.binutils-unwrapped; path = "bin/strings"; }
+                { drv = pkgs.strace; path = "bin/strace"; }
                 { drv = patosPkgs.tpm2-tools; path = "bin/tpm2"; }
                 { drv = patosPkgs.openssl; path = "usr/bin/openssl"; destpath = "bin/openssl"; }
                 { drv = pkgs.cryptsetup; path = "bin/cryptsetup"; }
@@ -69,6 +71,18 @@
                 { drv = pkgs.lz4.lib; path = "lib/liblz4.so.1.10.0"; }
                 { drv = pkgs.lz4.lib; path = "lib/liblz4.so.1"; }
                 { drv = pkgs.lz4.lib; path = "lib/liblz4.so"; }
+                # shared lib required for binutils
+                { drv = pkgs.binutils-unwrapped.lib; path = "lib/libsframe.so.1.0.0"; }
+                { drv = pkgs.binutils-unwrapped.lib; path = "lib/libsframe.so.1"; }
+                { drv = pkgs.binutils-unwrapped.lib; path = "lib/libbfd-2.43.1.so"; }
+                { drv = pkgs.binutils-unwrapped.lib; path = "lib/libbfd.so"; }
+                # shared lib required for strace
+                { drv = pkgs.elfutils.out; path = "lib/libdw-0.192.so"; }
+                { drv = pkgs.elfutils.out; path = "lib/libdw.so.1"; }
+                { drv = pkgs.elfutils.out; path = "lib/libdw.so"; }
+                { drv = pkgs.elfutils.out; path = "lib/libelf-0.192.so"; }
+                { drv = pkgs.elfutils.out; path = "lib/libelf.so.1"; }
+                { drv = pkgs.elfutils.out; path = "lib/libelf.so"; }
             ];
           };
         };

From 3dec49b2e4205eddd53475cf4047ba74393aa3c8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Thu, 13 Mar 2025 09:36:42 +0100
Subject: [PATCH 50/78] chore(qemu): enable secure boot

---
 utils/qemu-uefi-tpm.nix | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/utils/qemu-uefi-tpm.nix b/utils/qemu-uefi-tpm.nix
index 0193a27..4fcadfd 100644
--- a/utils/qemu-uefi-tpm.nix
+++ b/utils/qemu-uefi-tpm.nix
@@ -12,7 +12,7 @@ pkgs.writeShellApplication {
 
   text =
     let
-      tpmOVMF = pkgs.OVMF.override { tpmSupport = true; };
+      tpmOVMF = pkgs.OVMF.override { tpmSupport = true; secureBoot = true; };
     in
     ''
       set -ex
@@ -26,6 +26,9 @@ pkgs.writeShellApplication {
         --tpm2 \
         --log file="$state/swtpm.log",level=20
 
+      cp ${tpmOVMF.variables} "$state"
+      chmod 700 "$state/OVMF_VARS.fd"
+
       qemu-system-x86_64 \
         -enable-kvm \
         -machine q35,accel=kvm \
@@ -37,7 +40,7 @@ pkgs.writeShellApplication {
         -serial chardev:char0 \
         -mon chardev=char0 \
         -drive "if=pflash,format=raw,unit=0,readonly=on,file=${tpmOVMF.firmware}" \
-        -drive "if=pflash,format=raw,unit=1,readonly=on,file=${tpmOVMF.variables}" \
+        -drive "if=pflash,format=raw,unit=1,file=$state/OVMF_VARS.fd" \
         -chardev socket,id=chrtpm,path="$state/swtpm-sock" \
         -tpmdev emulator,id=tpm0,chardev=chrtpm \
         -device tpm-tis,tpmdev=tpm0 \

From 2c2d212e250eceed41f3fbd5b7b14898d4a89540 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Thu, 13 Mar 2025 09:36:42 +0100
Subject: [PATCH 51/78] fix: our own derivation for the kernel in order to be
 able to sign modules

---
 flake.nix                     |   2 +-
 pkgs/image/default.nix        |   4 +-
 pkgs/image/mkimage.sh         |   7 -
 pkgs/kernel/default.nix       |   7 +-
 pkgs/kernel/generic.config    |  14 +-
 pkgs/kernel/manual-config.nix | 465 ++++++++++++++++++++++++++++++++++
 pkgs/kernel/result            |   1 +
 pkgs/openssl/default.nix      |   2 +-
 pkgs/rootfs/default.nix       |   4 +-
 pkgs/rootfs/mkrootfs.sh       |  34 ++-
 10 files changed, 508 insertions(+), 32 deletions(-)
 create mode 100644 pkgs/kernel/manual-config.nix
 create mode 120000 pkgs/kernel/result

diff --git a/flake.nix b/flake.nix
index f1005dc..5b1774f 100644
--- a/flake.nix
+++ b/flake.nix
@@ -59,7 +59,7 @@
                 { drv = pkgs.binutils-unwrapped; path = "bin/strings"; }
                 { drv = pkgs.strace; path = "bin/strace"; }
                 { drv = patosPkgs.tpm2-tools; path = "bin/tpm2"; }
-                { drv = patosPkgs.openssl; path = "usr/bin/openssl"; destpath = "bin/openssl"; }
+                { drv = patosPkgs.openssl; path = "bin/openssl"; }
                 { drv = pkgs.cryptsetup; path = "bin/cryptsetup"; }
                 { drv = pkgs.cryptsetup; path = "bin/veritysetup"; }
                 { drv = pkgs.erofs-utils; path = "bin/mkfs.erofs"; }
diff --git a/pkgs/image/default.nix b/pkgs/image/default.nix
index 0fcaf3f..74e0931 100644
--- a/pkgs/image/default.nix
+++ b/pkgs/image/default.nix
@@ -7,12 +7,10 @@
 }:
 let
   pname = "patos-image";
-  defaultPassword = "patos";
 in
 stdenvNoCC.mkDerivation (finalAttrs: {
   inherit version;
   inherit pname;
-  inherit defaultPassword;
 
   buildInputs = with pkgs; [
     erofs-utils
@@ -29,7 +27,7 @@ stdenvNoCC.mkDerivation (finalAttrs: {
   };
 
   systemd = patosPkgs.systemd.out;
-  kernel = patosPkgs.kernel.kernel;
+  kernel = patosPkgs.kernel;
   initrd = patosPkgs.initrd.out;
   rootfs = patosPkgs.rootfs.out;
 
diff --git a/pkgs/image/mkimage.sh b/pkgs/image/mkimage.sh
index 78e55f8..df56849 100644
--- a/pkgs/image/mkimage.sh
+++ b/pkgs/image/mkimage.sh
@@ -27,13 +27,6 @@ mv rootfs/usr/lib/systemd/network/89-ethernet.network.example rootfs/usr/lib/sys
 ln -sf ../systemd-confext.service rootfs/usr/lib/systemd/system/sysinit.target.wants/systemd-confext.service
 ln -sf ../systemd-sysext.service rootfs/usr/lib/systemd/system/sysinit.target.wants/systemd-sysext.service
 
-# install sys users
-mkdir creds
-echo -n $defaultPassword > creds/passwd.plaintext-password.root
-CREDENTIALS_DIRECTORY=$PWD/creds SYSTEMD_CRYPT_PREFIX='$6$' $systemd/usr/bin/systemd-sysusers --root=rootfs rootfs/usr/lib/sysusers.d/*.conf
-chmod 600 rootfs/etc/shadow
-rm -rf creds
-
 # Initial partitioning
 cat <<EOF > init.repart.d/10-root.conf
 [Partition]
diff --git a/pkgs/kernel/default.nix b/pkgs/kernel/default.nix
index 73ecd1f..c5dabce 100644
--- a/pkgs/kernel/default.nix
+++ b/pkgs/kernel/default.nix
@@ -1,9 +1,9 @@
-{ pkgs, ... }:
+{ pkgs, lib, stdenv, ... }:
 let
   version = "6.13.4";
 in
-pkgs.linuxPackagesFor (
-  pkgs.linuxManualConfig {
+  (pkgs.callPackage ./manual-config.nix { })  {
+    inherit lib stdenv;
     version = "${version}-patos1";
     modDirVersion = version;
     src = pkgs.fetchurl {
@@ -13,4 +13,3 @@ pkgs.linuxPackagesFor (
     configfile = ./generic.config;
     allowImportFromDerivation = true;
   }
-)
diff --git a/pkgs/kernel/generic.config b/pkgs/kernel/generic.config
index 209e026..647bf91 100644
--- a/pkgs/kernel/generic.config
+++ b/pkgs/kernel/generic.config
@@ -522,11 +522,11 @@ CONFIG_DEBUG_BUGVERBOSE=y
 CONFIG_DEBUG_ENTRY=y
 CONFIG_DEBUG_FS_ALLOW_ALL=y
 CONFIG_DEBUG_FS=y
-CONFIG_DEBUG_INFO_BTF_MODULES=y
-CONFIG_DEBUG_INFO_BTF=y
-CONFIG_DEBUG_INFO_COMPRESSED_NONE=y
-CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y
-CONFIG_DEBUG_INFO=y
+#CONFIG_DEBUG_INFO_BTF_MODULES=y
+#CONFIG_DEBUG_INFO_BTF=y
+#CONFIG_DEBUG_INFO_COMPRESSED_NONE=y
+#CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y
+CONFIG_DEBUG_INFO=n
 CONFIG_DEBUG_KERNEL=y
 CONFIG_DEBUG_LIST=y
 CONFIG_DEBUG_MISC=y
@@ -1400,6 +1400,10 @@ CONFIG_MODULE_COMPRESS_ZSTD=y
 CONFIG_MODULE_FORCE_UNLOAD=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_SIG=y
+CONFIG_MODULE_SIG_FORCE=n
+CONFIG_MODULE_SIG_ALL=y
+CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"
 CONFIG_MODULES_TREE_LOOKUP=y
 CONFIG_MODULES_USE_ELF_RELA=y
 CONFIG_MODULES=y
diff --git a/pkgs/kernel/manual-config.nix b/pkgs/kernel/manual-config.nix
new file mode 100644
index 0000000..ffcf758
--- /dev/null
+++ b/pkgs/kernel/manual-config.nix
@@ -0,0 +1,465 @@
+{ lib, stdenv, buildPackages, runCommand, nettools, bc, bison, flex, perl, rsync, gmp, libmpc, mpfr, openssl
+, cpio, elfutils, hexdump, zstd, python3Minimal, zlib, pahole, kmod, ubootTools
+, fetchpatch
+, rustc, rust-bindgen, rustPlatform
+}:
+
+let
+  lib_ = lib;
+  stdenv_ = stdenv;
+
+  readConfig = configfile: import (runCommand "config.nix" {} ''
+    echo "{" > "$out"
+    while IFS='=' read key val; do
+      [ "x''${key#CONFIG_}" != "x$key" ] || continue
+      no_firstquote="''${val#\"}";
+      echo '  "'"$key"'" = "'"''${no_firstquote%\"}"'";' >> "$out"
+    done < "${configfile}"
+    echo "}" >> $out
+  '').outPath;
+in lib.makeOverridable ({
+  # The kernel version
+  version,
+  # The kernel pname (should be set for variants)
+  pname ? "linux",
+  # Position of the Linux build expression
+  pos ? null,
+  # Additional kernel make flags
+  extraMakeFlags ? [],
+  # The name of the kernel module directory
+  # Needs to be X.Y.Z[-extra], so pad with zeros if needed.
+  modDirVersion ? null /* derive from version */,
+  # The kernel source (tarball, git checkout, etc.)
+  src,
+  # a list of { name=..., patch=..., extraConfig=...} patches
+  kernelPatches ? [],
+  # The kernel .config file
+  configfile,
+  # Manually specified nixexpr representing the config
+  # If unspecified, this will be autodetected from the .config
+  config ? lib.optionalAttrs allowImportFromDerivation (readConfig configfile),
+  # Custom seed used for CONFIG_GCC_PLUGIN_RANDSTRUCT if enabled. This is
+  # automatically extended with extra per-version and per-config values.
+  randstructSeed ? "",
+  # Extra meta attributes
+  extraMeta ? {},
+
+  # for module compatibility
+  isZen      ? false,
+  isLibre    ? false,
+  isHardened ? false,
+
+  # Whether to utilize the controversial import-from-derivation feature to parse the config
+  allowImportFromDerivation ? false,
+  # ignored
+  features ? null, lib ? lib_, stdenv ? stdenv_,
+}:
+
+let
+  # Provide defaults. Note that we support `null` so that callers don't need to use optionalAttrs,
+  # which can lead to unnecessary strictness and infinite recursions.
+  modDirVersion_ = if modDirVersion == null then lib.versions.pad 3 version else modDirVersion;
+in
+let
+  # Shadow the un-defaulted parameter; don't want null.
+  modDirVersion = modDirVersion_;
+  inherit (lib)
+    hasAttr getAttr optional optionals optionalString optionalAttrs maintainers platforms;
+
+  drvAttrs = config_: kernelConf: kernelPatches: configfile:
+    let
+      # Folding in `ubootTools` in the default nativeBuildInputs is problematic, as
+      # it makes updating U-Boot cumbersome, since it will go above the current
+      # threshold of rebuilds
+      #
+      # To prevent these needless rounds of staging for U-Boot builds, we can
+      # limit the inclusion of ubootTools to target platforms where uImage *may*
+      # be produced.
+      #
+      # This command lists those (kernel-named) platforms:
+      #     .../linux $ grep -l uImage ./arch/*/Makefile | cut -d'/' -f3 | sort
+      #
+      # This is still a guesstimation, but since none of our cached platforms
+      # coincide in that list, this gives us "perfect" decoupling here.
+      linuxPlatformsUsingUImage = [
+        "arc"
+        "arm"
+        "csky"
+        "mips"
+        "powerpc"
+        "sh"
+        "sparc"
+        "xtensa"
+      ];
+      needsUbootTools =
+        lib.elem stdenv.hostPlatform.linuxArch linuxPlatformsUsingUImage
+      ;
+
+      config = let attrName = attr: "CONFIG_" + attr; in {
+        isSet = attr: hasAttr (attrName attr) config;
+
+        getValue = attr: if config.isSet attr then getAttr (attrName attr) config else null;
+
+        isYes = attr: (config.getValue attr) == "y";
+
+        isNo = attr: (config.getValue attr) == "n";
+
+        isModule = attr: (config.getValue attr) == "m";
+
+        isEnabled = attr: (config.isModule attr) || (config.isYes attr);
+
+        isDisabled = attr: (!(config.isSet attr)) || (config.isNo attr);
+      } // config_;
+
+      isModular = config.isYes "MODULES";
+      withRust = config.isYes "RUST";
+
+      buildDTBs = kernelConf.DTB or false;
+
+      # Dependencies that are required to build kernel modules
+      moduleBuildDependencies = [
+        pahole
+        perl
+        elfutils
+        # module makefiles often run uname commands to find out the kernel version
+        (buildPackages.deterministic-uname.override { inherit modDirVersion; })
+      ]
+      ++ optional (lib.versionAtLeast version "5.13") zstd
+      ++ optionals withRust [ rustc rust-bindgen ]
+      ;
+
+    in (optionalAttrs isModular { outputs = [ "out" "dev" ]; }) // {
+      passthru = rec {
+        inherit version modDirVersion config kernelPatches configfile
+          moduleBuildDependencies stdenv;
+        inherit isZen isHardened isLibre withRust;
+        isXen = lib.warn "The isXen attribute is deprecated. All Nixpkgs kernels that support it now have Xen enabled." true;
+        baseVersion = lib.head (lib.splitString "-rc" version);
+        kernelOlder = lib.versionOlder baseVersion;
+        kernelAtLeast = lib.versionAtLeast baseVersion;
+      };
+
+      inherit src;
+
+      depsBuildBuild = [ buildPackages.stdenv.cc ];
+      nativeBuildInputs = [
+        bison
+        flex
+        perl
+        bc
+        nettools
+        openssl
+        rsync
+        gmp
+        libmpc
+        mpfr
+        elfutils
+        zstd
+        python3Minimal
+        kmod
+        hexdump
+      ] ++ optional  needsUbootTools ubootTools
+        ++ optionals (lib.versionAtLeast version "5.2")  [ cpio pahole zlib ]
+        ++ optionals withRust [ rustc rust-bindgen ];
+
+      RUST_LIB_SRC = lib.optionalString withRust rustPlatform.rustLibSrc;
+
+      # avoid leaking Rust source file names into the final binary, which adds
+      # a false dependency on rust-lib-src on targets with uncompressed kernels
+      KRUSTFLAGS = lib.optionalString withRust "--remap-path-prefix ${rustPlatform.rustLibSrc}=/";
+
+      # patches =
+      #   map (p: p.patch) kernelPatches
+      #   # Required for deterministic builds along with some postPatch magic.
+      #   ++ optional (lib.versionOlder version "5.19") ./randstruct-provide-seed.patch
+      #   ++ optional (lib.versionAtLeast version "5.19") ./randstruct-provide-seed-5.19.patch
+      #   # Linux 5.12 marked certain PowerPC-only symbols as GPL, which breaks
+      #   # OpenZFS; this was fixed in Linux 5.19 so we backport the fix
+      #   # https://github.com/openzfs/zfs/pull/13367
+      #   ++ optional (lib.versionAtLeast version "5.12" &&
+      #                lib.versionOlder version "5.19" &&
+      #                stdenv.hostPlatform.isPower)
+      #     (fetchpatch {
+      #       url = "https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git/patch/?id=d9e5c3e9e75162f845880535957b7fd0b4637d23";
+      #       hash = "sha256-bBOyJcP6jUvozFJU0SPTOf3cmnTQ6ZZ4PlHjiniHXLU=";
+      #     });
+
+      postPatch = ''
+        # Ensure that depmod gets resolved through PATH
+        sed -i Makefile -e 's|= /sbin/depmod|= depmod|'
+
+        # Some linux-hardened patches now remove certain files in the scripts directory, so the file may not exist.
+        [[ -f scripts/ld-version.sh ]] && patchShebangs scripts/ld-version.sh
+
+        # Set randstruct seed to a deterministic but diversified value. Note:
+        # we could have instead patched gen-random-seed.sh to take input from
+        # the buildFlags, but that would require also patching the kernel's
+        # toplevel Makefile to add a variable export. This would be likely to
+        # cause future patch conflicts.
+        for file in scripts/gen-randstruct-seed.sh scripts/gcc-plugins/gen-random-seed.sh; do
+          if [ -f "$file" ]; then
+            substituteInPlace "$file" \
+              --replace NIXOS_RANDSTRUCT_SEED \
+              $(echo ${randstructSeed}${src} ${placeholder "configfile"} | sha256sum | cut -d ' ' -f 1 | tr -d '\n')
+            break
+          fi
+        done
+
+        patchShebangs scripts
+
+        # also patch arch-specific install scripts
+        for i in $(find arch -name install.sh); do
+            patchShebangs "$i"
+        done
+
+        # unset $src because the build system tries to use it and spams a bunch of warnings
+        # see: https://github.com/torvalds/linux/commit/b1992c3772e69a6fd0e3fc81cd4d2820c8b6eca0
+        unset src
+      '';
+
+      configurePhase = ''
+        runHook preConfigure
+
+        mkdir build
+        export buildRoot="$(pwd)/build"
+
+        echo "manual-config configurePhase buildRoot=$buildRoot pwd=$PWD"
+
+        if [ -f "$buildRoot/.config" ]; then
+          echo "Could not link $buildRoot/.config : file exists"
+          exit 1
+        fi
+        ln -sv ${configfile} $buildRoot/.config
+
+        # reads the existing .config file and prompts the user for options in
+        # the current kernel source that are not found in the file.
+        make $makeFlags "''${makeFlagsArray[@]}" oldconfig
+        runHook postConfigure
+
+        make $makeFlags "''${makeFlagsArray[@]}" prepare
+        actualModDirVersion="$(cat $buildRoot/include/config/kernel.release)"
+        if [ "$actualModDirVersion" != "${modDirVersion}" ]; then
+          echo "Error: modDirVersion ${modDirVersion} specified in the Nix expression is wrong, it should be: $actualModDirVersion"
+          exit 1
+        fi
+
+        buildFlagsArray+=("KBUILD_BUILD_TIMESTAMP=$(date -u -d @$SOURCE_DATE_EPOCH)")
+
+        cd $buildRoot
+      '';
+
+      buildFlags = [
+        "KBUILD_BUILD_VERSION=1-PatOS"
+        kernelConf.target
+        "vmlinux"  # for "perf" and things like that
+      ] ++ optional isModular "modules"
+        ++ optionals buildDTBs ["dtbs" "DTC_FLAGS=-@"]
+      ++ extraMakeFlags;
+
+      installFlags = [
+        "INSTALL_PATH=$(out)"
+      ] ++ (optional isModular "INSTALL_MOD_PATH=$(out)")
+      ++ optionals buildDTBs ["dtbs_install" "INSTALL_DTBS_PATH=$(out)/dtbs"];
+
+      dontStrip = true;
+
+      preInstall = let
+        # All we really need to do here is copy the final image and System.map to $out,
+        # and use the kernel's modules_install, firmware_install, dtbs_install, etc. targets
+        # for the rest. Easy, right?
+        #
+        # Unfortunately for us, the obvious way of getting the built image path,
+        # make -s image_name, does not work correctly, because some architectures
+        # (*cough* aarch64 *cough*) change KBUILD_IMAGE on the fly in their install targets,
+        # so we end up attempting to install the thing we didn't actually build.
+        #
+        # Thankfully, there's a way out that doesn't involve just hardcoding everything.
+        #
+        # The kernel has an install target, which runs a pretty simple shell script
+        # (located at scripts/install.sh or arch/$arch/boot/install.sh, depending on
+        # which kernel version you're looking at) that tries to do something sensible.
+        #
+        # (it would be great to hijack this script immediately, as it has all the
+        #   information we need passed to it and we don't need it to try and be smart,
+        #   but unfortunately, the exact location of the scripts differs between kernel
+        #   versions, and they're seemingly not considered to be public API at all)
+        #
+        # One of the ways it tries to discover what "something sensible" actually is
+        # is by delegating to what's supposed to be a user-provided install script
+        # located at ~/bin/installkernel.
+        #
+        # (the other options are:
+        #   - a distribution-specific script at /sbin/installkernel,
+        #        which we can't really create in the sandbox easily
+        #   - an architecture-specific script at arch/$arch/boot/install.sh,
+        #        which attempts to guess _something_ and usually guesses very wrong)
+        #
+        # More specifically, the install script exec's into ~/bin/installkernel, if one
+        # exists, with the following arguments:
+        #
+        # $1: $KERNELRELEASE - full kernel version string
+        # $2: $KBUILD_IMAGE - the final image path
+        # $3: System.map - path to System.map file, seemingly hardcoded everywhere
+        # $4: $INSTALL_PATH - path to the destination directory as specified in installFlags
+        #
+        # $2 is exactly what we want, so hijack the script and use the knowledge given to it
+        # by the makefile overlords for our own nefarious ends.
+        #
+        # Note that the makefiles specifically look in ~/bin/installkernel, and
+        # writeShellScriptBin writes the script to <store path>/bin/installkernel,
+        # so HOME needs to be set to just the store path.
+        #
+        # FIXME: figure out a less roundabout way of doing this.
+        installkernel = buildPackages.writeShellScriptBin "installkernel" ''
+          cp -av $2 $4
+          cp -av $3 $4
+        '';
+      in ''
+        installFlagsArray+=("-j$NIX_BUILD_CORES")
+        export HOME=${installkernel}
+      '';
+
+      # Some image types need special install targets (e.g. uImage is installed with make uinstall on arm)
+      installTargets = [
+        (kernelConf.installTarget or (
+          /**/ if kernelConf.target == "uImage" && stdenv.hostPlatform.linuxArch == "arm" then "uinstall"
+          else if kernelConf.target == "zImage" || kernelConf.target == "Image.gz" || kernelConf.target == "vmlinuz.efi" then "zinstall"
+          else "install"))
+      ];
+
+      # We remove a bunch of stuff that is symlinked from other places to save space,
+      # which trips the broken symlink check. So, just skip it. We'll know if it explodes.
+      dontCheckForBrokenSymlinks = true;
+
+      postInstall = optionalString isModular ''
+        mkdir -p $dev
+        cp vmlinux $dev/
+        if [ -z "''${dontStrip-}" ]; then
+          installFlagsArray+=("INSTALL_MOD_STRIP=1")
+        fi
+        make modules_install $makeFlags "''${makeFlagsArray[@]}" \
+          $installFlags "''${installFlagsArray[@]}"
+        unlink $out/lib/modules/${modDirVersion}/build
+        rm -f $out/lib/modules/${modDirVersion}/source
+
+        mkdir -p $dev/lib/modules/${modDirVersion}/{build,source}
+
+        # To save space, exclude a bunch of unneeded stuff when copying.
+        (cd .. && rsync --archive --prune-empty-dirs \
+            --exclude='/build/' \
+            * $dev/lib/modules/${modDirVersion}/source/)
+
+        cd $dev/lib/modules/${modDirVersion}/source
+
+        cp $buildRoot/{.config,Module.symvers} $dev/lib/modules/${modDirVersion}/build
+        make modules_prepare $makeFlags "''${makeFlagsArray[@]}" O=$dev/lib/modules/${modDirVersion}/build
+
+        # For reproducibility, removes accidental leftovers from a `cc1` call
+        # from a `try-run` call from the Makefile
+        rm -f $dev/lib/modules/${modDirVersion}/build/.[0-9]*.d
+
+        # Keep some extra files on some arches (powerpc, aarch64)
+        for f in arch/powerpc/lib/crtsavres.o arch/arm64/kernel/ftrace-mod.o; do
+          if [ -f "$buildRoot/$f" ]; then
+            cp $buildRoot/$f $dev/lib/modules/${modDirVersion}/build/$f
+          fi
+        done
+
+        # !!! No documentation on how much of the source tree must be kept
+        # If/when kernel builds fail due to missing files, you can add
+        # them here. Note that we may see packages requiring headers
+        # from drivers/ in the future; it adds 50M to keep all of its
+        # headers on 3.10 though.
+
+        chmod u+w -R ..
+        arch=$(cd $dev/lib/modules/${modDirVersion}/build/arch; ls)
+
+        # Remove unused arches
+        for d in $(cd arch/; ls); do
+          if [ "$d" = "$arch" ]; then continue; fi
+          if [ "$arch" = arm64 ] && [ "$d" = arm ]; then continue; fi
+          rm -rf arch/$d
+        done
+
+        # Remove all driver-specific code (50M of which is headers)
+        rm -fR drivers
+
+        # Keep all headers
+        find .  -type f -name '*.h' -print0 | xargs -0 -r chmod u-w
+
+        # Keep linker scripts (they are required for out-of-tree modules on aarch64)
+        find .  -type f -name '*.lds' -print0 | xargs -0 -r chmod u-w
+
+        # Keep root and arch-specific Makefiles
+        chmod u-w Makefile arch/"$arch"/Makefile*
+
+        # Keep whole scripts dir
+        chmod u-w -R scripts
+
+        # Delete everything not kept
+        find . -type f -perm -u=w -print0 | xargs -0 -r rm
+
+        # Delete empty directories
+        find -empty -type d -delete
+      '';
+
+      requiredSystemFeatures = [ "big-parallel" ];
+
+      meta = {
+        # https://github.com/NixOS/nixpkgs/pull/345534#issuecomment-2391238381
+        broken = withRust && lib.versionOlder version "6.12";
+
+        description =
+          "The Linux kernel" +
+          (if kernelPatches == [] then "" else
+            " (with patches: "
+            + lib.concatStringsSep ", " (map (x: x.name) kernelPatches)
+            + ")");
+        license = lib.licenses.gpl2Only;
+        homepage = "https://www.kernel.org/";
+        maintainers = lib.teams.linux-kernel.members ++ [
+          maintainers.thoughtpolice
+        ];
+        platforms = platforms.linux;
+        badPlatforms =
+          lib.optionals (lib.versionOlder version "4.15") [ "riscv32-linux" "riscv64-linux" ] ++
+          lib.optional (lib.versionOlder version "5.19") "loongarch64-linux";
+        timeout = 14400; # 4 hours
+      } // extraMeta;
+    };
+
+  # Absolute paths for compilers avoid any PATH-clobbering issues.
+  commonMakeFlags = [
+    "ARCH=${stdenv.hostPlatform.linuxArch}"
+    "CROSS_COMPILE=${stdenv.cc.targetPrefix}"
+  ] ++ lib.optionals (stdenv.isx86_64 && stdenv.cc.bintools.isLLVM) [
+    # The wrapper for ld.lld breaks linking the kernel. We use the
+    # unwrapped linker as workaround. See:
+    #
+    # https://github.com/NixOS/nixpkgs/issues/321667
+    "LD=${stdenv.cc.bintools.bintools}/bin/${stdenv.cc.targetPrefix}ld"
+  ] ++ (stdenv.hostPlatform.linux-kernel.makeFlags or [])
+    ++ extraMakeFlags;
+in
+
+stdenv.mkDerivation (
+  builtins.foldl' lib.recursiveUpdate {} [
+    (drvAttrs config stdenv.hostPlatform.linux-kernel kernelPatches configfile)
+    {
+      inherit pname version;
+
+      enableParallelBuilding = true;
+
+      hardeningDisable = [ "bindnow" "format" "fortify" "stackprotector" "pic" "pie" ];
+
+      makeFlags = [
+        "O=$(buildRoot)"
+      ] ++ commonMakeFlags;
+
+      passthru = { inherit commonMakeFlags; };
+
+      karch = stdenv.hostPlatform.linuxArch;
+    }
+    (optionalAttrs (pos != null) { inherit pos; })
+  ]
+))
diff --git a/pkgs/kernel/result b/pkgs/kernel/result
new file mode 120000
index 0000000..adacbb4
--- /dev/null
+++ b/pkgs/kernel/result
@@ -0,0 +1 @@
+/nix/store/kwigngi2rkbhd5qmhjaxla2wh3adm4ph-linux-6.13.4-patos1
\ No newline at end of file
diff --git a/pkgs/openssl/default.nix b/pkgs/openssl/default.nix
index 0e1f742..bc833cc 100644
--- a/pkgs/openssl/default.nix
+++ b/pkgs/openssl/default.nix
@@ -92,7 +92,7 @@ stdenv.mkDerivation rec {
     configureFlags =
       [
         "shared" # "shared" builds both shared and static libraries
-        "--prefix=/usr"
+        "--prefix=/"
         "--libdir=lib"
         "--openssldir=/etc/ssl"
       ]
diff --git a/pkgs/rootfs/default.nix b/pkgs/rootfs/default.nix
index c7f0dba..d3c39c3 100644
--- a/pkgs/rootfs/default.nix
+++ b/pkgs/rootfs/default.nix
@@ -7,10 +7,12 @@
 }:
 let
   pname = "patos-rootfs";
+  defaultPassword = "patos";
 in
 stdenvNoCC.mkDerivation (finalAttrs: {
   inherit version;
   inherit pname;
+  inherit defaultPassword;
 
   buildInputs = with pkgs; [
     glibc
@@ -20,7 +22,7 @@ stdenvNoCC.mkDerivation (finalAttrs: {
   glibcPatos = patosPkgs.glibc.out;
   systemd = patosPkgs.systemd.out;
   dbusBroker = patosPkgs.dbus-broker.out;
-  kernel = patosPkgs.kernel.kernel;
+  kernel = patosPkgs.kernel;
   busybox = patosPkgs.busybox.out;
   kmodLibs = pkgs.kmod.lib;
   kmodBin = pkgs.kmod.out;
diff --git a/pkgs/rootfs/mkrootfs.sh b/pkgs/rootfs/mkrootfs.sh
index 14f4dac..7e8df9e 100644
--- a/pkgs/rootfs/mkrootfs.sh
+++ b/pkgs/rootfs/mkrootfs.sh
@@ -62,6 +62,7 @@ Type=root
 SizeMaxBytes=256M
 SizeMinBytes=256M
 EOF
+
 cat <<EOF > $out/etc/repart.d/22-root-verify-a.conf
 [Partition]
 Type=root-verity
@@ -77,6 +78,7 @@ SizeMaxBytes=256M
 SizeMinBytes=256M
 ReadOnly=1
 EOF
+
 cat <<EOF > $out/etc/repart.d/32-root-verity-b.conf
 [Partition]
 Type=root-verity
@@ -90,13 +92,15 @@ cat <<EOF > $out/etc/repart.d/40-var.conf
 [Partition]
 Type=var
 Format=btrfs
-MakeDirectories=/var/lib/confexts /var/.snapshots
+MakeDirectories=/var/lib/confexts /var/lib/extensions /var/lib/portables /var/.snapshots
 MountPoint=/var
 Label=patos-state
 Encrypt=tpm2
 EncryptedVolume=patos-state:none:tpm2-device=auto,luks,discard
-Subvolumes=/var/lib/confexts /var/.snapshots
+Subvolumes=/var/lib/confexts /var/lib/extensions /var/lib/portables /var/.snapshots
 MountPoint=/var/lib/confexts:subvol=/var/lib/confexts
+MountPoint=/var/lib/extensions:subvol=/var/lib/extensions
+MountPoint=/var/lib/portables:subvol=/var/lib/portables
 MountPoint=/var/.snapshots:subvol=/var/.snapshots
 SizeMinBytes=1G
 Minimize=off
@@ -116,13 +120,9 @@ EOF
 cp -P $glibcPatos/lib/*.so* $out/usr/lib/
 
 ### install openssl
-cp -P $openssl/usr/lib/*.so* $out/usr/lib/
+cp -P $openssl/lib/*.so* $out/usr/lib/
 cp -Pr $openssl/etc/ssl $out/etc/
 
-### install kernel modules
-cp -r $kernel/lib/modules $out/usr/lib/
-find $out/usr/lib/modules -type d -exec chmod 755 {} \;
-
 ### install busybox
 cp $busybox/bin/busybox $out/usr/bin/
 $out/usr/bin/busybox --list | xargs -I {} ln -sf busybox $out/usr/bin/{}
@@ -150,11 +150,13 @@ cp -P $kmodLibs/lib/*.so* $out/usr/lib/
 cp -P $kmodBin/bin/* $out/usr/bin
 
 ### install libbpf
-cp -P $libbpf/lib/libbpf* $out/usr/lib
+cp -P $libbpf/lib/libbpf*.so* $out/usr/lib
 
 ### install ca cert bundle
-chmod 755 $out/etc/ssl
+chmod 755 $out/etc/ssl $out/etc/ssl/certs
 cp -P $cacert/etc/ssl/certs/ca-bundle.crt $out/etc/ssl/cert.pem
+ln -sf ../cert.pem $out/etc/ssl/certs/ca-certificates.crt
+ln -sf ../cert.pem $out/etc/ssl/certs/ca-bundle.crt
 
 # setup default files
 $systemd/usr/bin/systemd-hwdb --root=$out --usr update
@@ -162,6 +164,13 @@ $systemd/usr/bin/systemd-tmpfiles --root=$out $out/usr/lib/tmpfiles.d/etc.conf -
 cp $out/usr/share/factory/etc/nsswitch.conf $out/etc/
 cp $out/usr/share/factory/etc/locale.conf $out/etc/
 cp $out/usr/share/factory/etc/vconsole.conf $out/etc/
+# install sys users
+mkdir creds
+echo -n $defaultPassword > creds/passwd.plaintext-password.root
+CREDENTIALS_DIRECTORY=$PWD/creds SYSTEMD_CRYPT_PREFIX='$6$' $systemd/usr/bin/systemd-sysusers --root=$out rootfs/usr/lib/sysusers.d/*.conf
+chmod 600 $out/etc/shadow
+rm -rf creds
+
 
 # Ephemeral machine-id until registration
 ln -sf /run/machine-id $out/etc/machine-id
@@ -171,7 +180,7 @@ rm -rf $out/usr/lib/pkgconfig
 
 ### Find and install all shared libs
 find $out -type f -executable -exec ldd {} \; | awk '{print $3}' | \
-  grep -v systemd | grep -v glibc | grep -v openssl | grep -v tpm2 | grep -v devmapper | grep -v not | \
+  grep -vE "(systemd|glibc|openssl|tpm2|devmapper)" | \
   sort -u | xargs -I {} cp {} $out/usr/lib/
 
 find $out -type f -executable -exec chmod 755 {} \;
@@ -184,3 +193,8 @@ patchelf --remove-rpath $out/usr/lib/ld-linux-x86-64.so.2
 # strip binaries
 find $out -type f -executable -exec strip {} \;
 find $out -type d -exec chmod 755 {} \;
+
+### install kernel modules
+cp -r $kernel/lib/modules $out/usr/lib/
+find $out/usr/lib/modules -type d -exec chmod 755 {} \;
+

From 1fcc45dd321e75e130a6048f1cacaad33d94890c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Fri, 14 Mar 2025 07:52:35 +0100
Subject: [PATCH 52/78] feat: add factory reset UKI

---
 pkgs/image/mkimage.sh   | 25 ++++++++++++++++++++++---
 pkgs/rootfs/mkrootfs.sh |  4 ++--
 2 files changed, 24 insertions(+), 5 deletions(-)

diff --git a/pkgs/image/mkimage.sh b/pkgs/image/mkimage.sh
index df56849..8c94348 100644
--- a/pkgs/image/mkimage.sh
+++ b/pkgs/image/mkimage.sh
@@ -74,21 +74,40 @@ $systemd/usr/bin/ukify build \
   --os-release @rootfs/etc/os-release \
   --cmdline "$kernelCmdLine roothash=$roothash" \
   -o patos_${version}.efi
+
+cat <<EOF > reset-os-release
+NAME=PatOS
+PRETTY_NAME=PatOS Factory Reset
+IMAGE_ID=patos
+ID=patos
+IMAGE_VERSION=${version}
+VERSION=${version}
+VERSION_ID=patos
+EOF
+
+$systemd/usr/bin/ukify build \
+  --linux $kernel/bzImage \
+  --initrd $initrd/initrd.xz \
+  --os-release @./reset-os-release \
+  --cmdline "$kernelCmdLine roothash=$roothash systemd.factory_reset=yes" \
+  -o patos_factory_reset.efi
 rm -rf rootfs
 
 cp patos_${version}.efi boot/
+cp patos_factory_reset.efi boot/
 cp ${systemd}/usr/lib/systemd/boot/efi/systemd-bootx64.efi boot/
-echo "timeout 1" > boot/loader.conf
+echo "timeout 2" > boot/loader.conf
 
 # Final partitioning
 cat <<EOF > final.repart.d/10-esp.conf
 [Partition]
 Type=esp
 Format=vfat
-SizeMinBytes=96M
-SizeMaxBytes=96M
+SizeMinBytes=160M
+SizeMaxBytes=160M
 CopyFiles=/boot/systemd-bootx64.efi:/EFI/BOOT/BOOTX64.EFI
 CopyFiles=/boot/patos_${version}.efi:/EFI/Linux/patos_${version}.efi
+CopyFiles=/boot/patos_factory_reset.efi:/EFI/Linux/patos_factory_reset.efi
 CopyFiles=/boot/loader.conf:/loader/loader.conf
 EOF
 
diff --git a/pkgs/rootfs/mkrootfs.sh b/pkgs/rootfs/mkrootfs.sh
index 7e8df9e..3ccc93c 100644
--- a/pkgs/rootfs/mkrootfs.sh
+++ b/pkgs/rootfs/mkrootfs.sh
@@ -52,8 +52,8 @@ cat <<EOF > $out/etc/repart.d/10-esp.conf
 [Partition]
 Type=esp
 Format=vfat
-SizeMaxBytes=96M
-SizeMinBytes=96M
+SizeMaxBytes=160M
+SizeMinBytes=160M
 EOF
 
 cat <<EOF > $out/etc/repart.d/20-root-a.conf

From 1f1c93b775b3ef6d2b25fad3f475cb28b5be0783 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Fri, 14 Mar 2025 10:45:39 +0100
Subject: [PATCH 53/78] feat: enable secure boot

---
 pkgs/image/default.nix             |  1 +
 pkgs/image/mkimage.sh              | 37 ++++++++++++++++++++----------
 pkgs/systemd/default.nix           |  2 ++
 pkgs/systemd/skip-verify-esp.patch | 24 +++++++++++++++++++
 4 files changed, 52 insertions(+), 12 deletions(-)
 create mode 100644 pkgs/systemd/skip-verify-esp.patch

diff --git a/pkgs/image/default.nix b/pkgs/image/default.nix
index 74e0931..5612185 100644
--- a/pkgs/image/default.nix
+++ b/pkgs/image/default.nix
@@ -18,6 +18,7 @@ stdenvNoCC.mkDerivation (finalAttrs: {
     mtools
     e2fsprogs
     jq
+    openssl
   ];
 
   env = {
diff --git a/pkgs/image/mkimage.sh b/pkgs/image/mkimage.sh
index 8c94348..3e6ed9e 100644
--- a/pkgs/image/mkimage.sh
+++ b/pkgs/image/mkimage.sh
@@ -58,8 +58,7 @@ $systemd/usr/bin/systemd-repart \
   --split=true \
   --json=pretty \
   --root=$out \
-  patos-$version.raw > init-repart-output.json
-rm -f patos-$version.raw
+  patos-$version.raw > init-repart-output.json && rm -f patos-$version.raw
 
 roothash=$(jq -r '.[0].roothash' init-repart-output.json)
 rootPart=$(jq -r '.[0].split_path' init-repart-output.json)
@@ -91,12 +90,29 @@ $systemd/usr/bin/ukify build \
   --os-release @./reset-os-release \
   --cmdline "$kernelCmdLine roothash=$roothash systemd.factory_reset=yes" \
   -o patos_factory_reset.efi
-rm -rf rootfs
 
-cp patos_${version}.efi boot/
-cp patos_factory_reset.efi boot/
-cp ${systemd}/usr/lib/systemd/boot/efi/systemd-bootx64.efi boot/
-echo "timeout 2" > boot/loader.conf
+# Secure boot
+openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout key.pem -subj "/CN=patagia-signing"
+
+SYSTEMD_RELAX_ESP_CHECKS=1 $systemd/usr/bin/bootctl install --root ./rootfs --esp-path /boot \
+  --secure-boot-auto-enroll=true --certificate=./cert.pem --private-key=./key.pem
+
+# install UKIs
+cp patos_${version}.efi rootfs/boot/EFI/Linux
+cp patos_factory_reset.efi rootfs/boot/EFI/Linux
+
+# sign EFIs
+$systemd/usr/lib/systemd/systemd-sbsign sign --certificate=./cert.pem --private-key=./key.pem \
+  rootfs/boot/EFI/BOOT/BOOTX64.EFI  --output=rootfs/boot/EFI/BOOT/BOOTX64.EFI
+
+$systemd/usr/lib/systemd/systemd-sbsign sign --certificate=./cert.pem --private-key=./key.pem \
+  rootfs/boot/EFI/Linux/patos_0.0.1.efi --output=rootfs/boot/EFI/Linux/patos_0.0.1.efi
+
+$systemd/usr/lib/systemd/systemd-sbsign sign --certificate=./cert.pem --private-key=./key.pem \
+  rootfs/boot/EFI/Linux/patos_factory_reset.efi --output=rootfs/boot/EFI/Linux/patos_factory_reset.efi
+
+echo "timeout 2" > rootfs/boot/loader/loader.conf
+echo "secure-boot-enroll force" >> rootfs/boot/loader/loader.conf
 
 # Final partitioning
 cat <<EOF > final.repart.d/10-esp.conf
@@ -105,10 +121,7 @@ Type=esp
 Format=vfat
 SizeMinBytes=160M
 SizeMaxBytes=160M
-CopyFiles=/boot/systemd-bootx64.efi:/EFI/BOOT/BOOTX64.EFI
-CopyFiles=/boot/patos_${version}.efi:/EFI/Linux/patos_${version}.efi
-CopyFiles=/boot/patos_factory_reset.efi:/EFI/Linux/patos_factory_reset.efi
-CopyFiles=/boot/loader.conf:/loader/loader.conf
+CopyFiles=/rootfs/boot:/
 EOF
 
 cat <<EOF > final.repart.d/20-root.conf
@@ -142,6 +155,6 @@ $systemd/usr/bin/systemd-repart \
   --root=$out \
   patos-$version.raw > final-repart-output.json
 
-rm -rf boot
+rm -rf rootfs
 
 popd
diff --git a/pkgs/systemd/default.nix b/pkgs/systemd/default.nix
index b22d243..a1cb314 100644
--- a/pkgs/systemd/default.nix
+++ b/pkgs/systemd/default.nix
@@ -30,6 +30,8 @@ stdenv.mkDerivation (finalAttrs: {
     hash = "sha256-6rxJUYRq785U6aik5VhQRqG+Ss67lBB6T3eQF+tkyhk=";
   };
 
+  patches = [ ./skip-verify-esp.patch ];
+
   dontCheckForBrokenSymlinks = true;
 
   nativeBuildInputs = with pkgs; [
diff --git a/pkgs/systemd/skip-verify-esp.patch b/pkgs/systemd/skip-verify-esp.patch
new file mode 100644
index 0000000..2cb9505
--- /dev/null
+++ b/pkgs/systemd/skip-verify-esp.patch
@@ -0,0 +1,24 @@
+diff --git a/src/shared/find-esp.c b/src/shared/find-esp.c
+index f830d6dfe3..7ad2a8cd1d 100644
+--- a/src/shared/find-esp.c
++++ b/src/shared/find-esp.c
+@@ -403,15 +403,15 @@ static int verify_esp(
+                                               "File system \"%s\" is not a FAT EFI System Partition (ESP) file system.", p);
+         }
+ 
+-        r = verify_fsroot_dir(pfd, p, flags, FLAGS_SET(flags, VERIFY_ESP_SKIP_DEVICE_CHECK) ? NULL : &devid);
+-        if (r < 0)
+-                return r;
+-
+         /* In a container we don't have access to block devices, skip this part of the verification, we trust
+          * the container manager set everything up correctly on its own. */
+         if (FLAGS_SET(flags, VERIFY_ESP_SKIP_DEVICE_CHECK))
+                 goto finish;
+ 
++        r = verify_fsroot_dir(pfd, p, flags, FLAGS_SET(flags, VERIFY_ESP_SKIP_DEVICE_CHECK) ? NULL : &devid);
++        if (r < 0)
++                return r;
++
+         if (devnum_is_zero(devid))
+                 return log_full_errno(searching ? LOG_DEBUG : LOG_ERR,
+                                       SYNTHETIC_ERRNO(searching ? EADDRNOTAVAIL : ENODEV),

From 7376743266d48b3c3db49c9c6fdb711a25b660c5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Fri, 14 Mar 2025 15:13:31 +0100
Subject: [PATCH 54/78] chore: clean up

---
 pkgs/image/mkimage.sh | 30 +++++-------------------------
 1 file changed, 5 insertions(+), 25 deletions(-)

diff --git a/pkgs/image/mkimage.sh b/pkgs/image/mkimage.sh
index 3e6ed9e..1d14349 100644
--- a/pkgs/image/mkimage.sh
+++ b/pkgs/image/mkimage.sh
@@ -74,44 +74,24 @@ $systemd/usr/bin/ukify build \
   --cmdline "$kernelCmdLine roothash=$roothash" \
   -o patos_${version}.efi
 
-cat <<EOF > reset-os-release
-NAME=PatOS
-PRETTY_NAME=PatOS Factory Reset
-IMAGE_ID=patos
-ID=patos
-IMAGE_VERSION=${version}
-VERSION=${version}
-VERSION_ID=patos
-EOF
-
-$systemd/usr/bin/ukify build \
-  --linux $kernel/bzImage \
-  --initrd $initrd/initrd.xz \
-  --os-release @./reset-os-release \
-  --cmdline "$kernelCmdLine roothash=$roothash systemd.factory_reset=yes" \
-  -o patos_factory_reset.efi
-
 # Secure boot
 openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout key.pem -subj "/CN=patagia-signing"
 
+# install ESP
 SYSTEMD_RELAX_ESP_CHECKS=1 $systemd/usr/bin/bootctl install --root ./rootfs --esp-path /boot \
   --secure-boot-auto-enroll=true --certificate=./cert.pem --private-key=./key.pem
-
-# install UKIs
-cp patos_${version}.efi rootfs/boot/EFI/Linux
-cp patos_factory_reset.efi rootfs/boot/EFI/Linux
+echo "timeout 2" > rootfs/boot/loader/loader.conf
 
 # sign EFIs
 $systemd/usr/lib/systemd/systemd-sbsign sign --certificate=./cert.pem --private-key=./key.pem \
   rootfs/boot/EFI/BOOT/BOOTX64.EFI  --output=rootfs/boot/EFI/BOOT/BOOTX64.EFI
 
 $systemd/usr/lib/systemd/systemd-sbsign sign --certificate=./cert.pem --private-key=./key.pem \
-  rootfs/boot/EFI/Linux/patos_0.0.1.efi --output=rootfs/boot/EFI/Linux/patos_0.0.1.efi
+  patos_${version}.efi --output=patos_${version}.efi
 
-$systemd/usr/lib/systemd/systemd-sbsign sign --certificate=./cert.pem --private-key=./key.pem \
-  rootfs/boot/EFI/Linux/patos_factory_reset.efi --output=rootfs/boot/EFI/Linux/patos_factory_reset.efi
+# install UKI
+cp patos_${version}.efi rootfs/boot/EFI/Linux
 
-echo "timeout 2" > rootfs/boot/loader/loader.conf
 echo "secure-boot-enroll force" >> rootfs/boot/loader/loader.conf
 
 # Final partitioning

From b619c6f01d9d91e86e32fe5415bfd2ffe7094c4a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Sat, 15 Mar 2025 18:26:28 +0100
Subject: [PATCH 55/78] chore: remove result symlink

---
 pkgs/kernel/result | 1 -
 1 file changed, 1 deletion(-)
 delete mode 120000 pkgs/kernel/result

diff --git a/pkgs/kernel/result b/pkgs/kernel/result
deleted file mode 120000
index adacbb4..0000000
--- a/pkgs/kernel/result
+++ /dev/null
@@ -1 +0,0 @@
-/nix/store/kwigngi2rkbhd5qmhjaxla2wh3adm4ph-linux-6.13.4-patos1
\ No newline at end of file

From 1725120a49ac03c29562c085984c880441843a9b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Sat, 15 Mar 2025 18:49:38 +0100
Subject: [PATCH 56/78] chore: upgrade kernel

---
 pkgs/kernel/default.nix | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/pkgs/kernel/default.nix b/pkgs/kernel/default.nix
index c5dabce..edbfb65 100644
--- a/pkgs/kernel/default.nix
+++ b/pkgs/kernel/default.nix
@@ -1,14 +1,14 @@
-{ pkgs, lib, stdenv, ... }:
+{ pkgs }:
 let
-  version = "6.13.4";
+  version = "6.13.7";
+  hash = "sha256-Ojm2IDi3rC9D0mofhLQoPhl4BOHoF61jfpo9h0xHgB0=";
 in
-  (pkgs.callPackage ./manual-config.nix { })  {
-    inherit lib stdenv;
+  (pkgs.callPackage ./manual-config.nix {}) {
     version = "${version}-patos1";
     modDirVersion = version;
     src = pkgs.fetchurl {
       url = "https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-${version}.tar.xz";
-      hash = "sha256-uA4LyO+8MenOWoTRCE3Mz6QOAb6ozCWv0GZIuT1hM54=";
+      hash = hash;
     };
     configfile = ./generic.config;
     allowImportFromDerivation = true;

From a3e2a970f896821f75c9f57962953d77c4c5a39a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Mon, 17 Mar 2025 10:18:30 +0100
Subject: [PATCH 57/78] chore: clean up

---
 flake.nix                                 |  80 +-
 pkgs/cert/default.nix                     |  17 +
 pkgs/image/default.nix                    | 149 +++-
 pkgs/image/mkimage.sh                     | 140 ---
 pkgs/kernel/default.nix                   |  20 +-
 pkgs/kernel/generic.config                |   7 +-
 pkgs/kernel/manual-config.nix             | 981 ++++++++++++----------
 pkgs/rootfs/default.nix                   |  38 -
 pkgs/rootfs/mkinitrd.nix                  |  67 +-
 pkgs/rootfs/mkinitrd.sh                   |  53 --
 pkgs/rootfs/{mkrootfs.sh => mkrootfs.nix} |  65 +-
 11 files changed, 845 insertions(+), 772 deletions(-)
 create mode 100644 pkgs/cert/default.nix
 delete mode 100644 pkgs/image/mkimage.sh
 delete mode 100644 pkgs/rootfs/default.nix
 delete mode 100644 pkgs/rootfs/mkinitrd.sh
 rename pkgs/rootfs/{mkrootfs.sh => mkrootfs.nix} (75%)

diff --git a/flake.nix b/flake.nix
index 5b1774f..2358ab1 100644
--- a/flake.nix
+++ b/flake.nix
@@ -22,22 +22,14 @@
       {
         packages = {
           default = patosPkgs.image;
-          image = pkgs.callPackage ./pkgs/image {
-            inherit patosPkgs;
-            inherit version;
-          };
-          rootfs = pkgs.callPackage ./pkgs/rootfs {
-            inherit patosPkgs;
-            inherit version;
-          };
-          initrd = pkgs.callPackage ./pkgs/rootfs/mkinitrd.nix {
-            inherit patosPkgs;
-            inherit version;
-          };
+          image = pkgs.callPackage ./pkgs/image { inherit patosPkgs version; };
+          rootfs = pkgs.callPackage ./pkgs/rootfs/mkrootfs.nix { inherit patosPkgs version; };
+          initrd = pkgs.callPackage ./pkgs/rootfs/mkinitrd.nix { inherit patosPkgs version; };
           kernel = pkgs.callPackage ./pkgs/kernel { };
           glibc = pkgs.callPackage ./pkgs/glibc { };
           busybox = pkgs.callPackage ./pkgs/busybox { };
           openssl = pkgs.callPackage ./pkgs/openssl { };
+          cert = pkgs.callPackage ./pkgs/cert { };
           kexec = pkgs.callPackage ./pkgs/kexec-tools { };
           lvm2 = pkgs.callPackage ./pkgs/lvm2 { };
           tpm2-tools = pkgs.callPackage ./pkgs/tpm2-tools { inherit patosPkgs; };
@@ -51,38 +43,38 @@
             name = "debug-tools";
             version = "0.0.1";
             packages = [
-                { drv = pkgs.curl; path = "bin/curl"; }
-                { drv = pkgs.bash; path = "bin/bash"; }
-                { drv = patosPkgs.glibc; path = "bin/ldd"; }
-                { drv = pkgs.keyutils; path = "bin/keyctl"; }
-                { drv = pkgs.gnutar; path = "bin/tar"; }
-                { drv = pkgs.binutils-unwrapped; path = "bin/strings"; }
-                { drv = pkgs.strace; path = "bin/strace"; }
-                { drv = patosPkgs.tpm2-tools; path = "bin/tpm2"; }
-                { drv = patosPkgs.openssl; path = "bin/openssl"; }
-                { drv = pkgs.cryptsetup; path = "bin/cryptsetup"; }
-                { drv = pkgs.cryptsetup; path = "bin/veritysetup"; }
-                { drv = pkgs.erofs-utils; path = "bin/mkfs.erofs"; }
-                # shared lib required for cryptsetup
-                { drv = pkgs.popt; path = "lib/libpopt.so.0.0.2"; }
-                { drv = pkgs.popt; path = "lib/libpopt.so.0"; }
-                { drv = pkgs.popt; path = "lib/libpopt.so"; }
-                # shared lib required for mkfs.erofs
-                { drv = pkgs.lz4.lib; path = "lib/liblz4.so.1.10.0"; }
-                { drv = pkgs.lz4.lib; path = "lib/liblz4.so.1"; }
-                { drv = pkgs.lz4.lib; path = "lib/liblz4.so"; }
-                # shared lib required for binutils
-                { drv = pkgs.binutils-unwrapped.lib; path = "lib/libsframe.so.1.0.0"; }
-                { drv = pkgs.binutils-unwrapped.lib; path = "lib/libsframe.so.1"; }
-                { drv = pkgs.binutils-unwrapped.lib; path = "lib/libbfd-2.43.1.so"; }
-                { drv = pkgs.binutils-unwrapped.lib; path = "lib/libbfd.so"; }
-                # shared lib required for strace
-                { drv = pkgs.elfutils.out; path = "lib/libdw-0.192.so"; }
-                { drv = pkgs.elfutils.out; path = "lib/libdw.so.1"; }
-                { drv = pkgs.elfutils.out; path = "lib/libdw.so"; }
-                { drv = pkgs.elfutils.out; path = "lib/libelf-0.192.so"; }
-                { drv = pkgs.elfutils.out; path = "lib/libelf.so.1"; }
-                { drv = pkgs.elfutils.out; path = "lib/libelf.so"; }
+              { drv = pkgs.curl; path = "bin/curl"; }
+              { drv = pkgs.bash; path = "bin/bash"; }
+              { drv = patosPkgs.glibc; path = "bin/ldd"; }
+              { drv = pkgs.keyutils; path = "bin/keyctl"; }
+              { drv = pkgs.gnutar; path = "bin/tar"; }
+              { drv = pkgs.binutils-unwrapped; path = "bin/strings"; }
+              { drv = pkgs.strace; path = "bin/strace"; }
+              { drv = patosPkgs.tpm2-tools; path = "bin/tpm2"; }
+              { drv = patosPkgs.openssl; path = "bin/openssl"; }
+              { drv = pkgs.cryptsetup; path = "bin/cryptsetup"; }
+              { drv = pkgs.cryptsetup; path = "bin/veritysetup"; }
+              { drv = pkgs.erofs-utils; path = "bin/mkfs.erofs"; }
+              # shared lib required for cryptsetup
+              { drv = pkgs.popt; path = "lib/libpopt.so.0.0.2"; }
+              { drv = pkgs.popt; path = "lib/libpopt.so.0"; }
+              { drv = pkgs.popt; path = "lib/libpopt.so"; }
+              # shared lib required for mkfs.erofs
+              { drv = pkgs.lz4.lib; path = "lib/liblz4.so.1.10.0"; }
+              { drv = pkgs.lz4.lib; path = "lib/liblz4.so.1"; }
+              { drv = pkgs.lz4.lib; path = "lib/liblz4.so"; }
+              # shared lib required for binutils
+              { drv = pkgs.binutils-unwrapped.lib; path = "lib/libsframe.so.1.0.0"; }
+              { drv = pkgs.binutils-unwrapped.lib; path = "lib/libsframe.so.1"; }
+              { drv = pkgs.binutils-unwrapped.lib; path = "lib/libbfd-2.43.1.so"; }
+              { drv = pkgs.binutils-unwrapped.lib; path = "lib/libbfd.so"; }
+              # shared lib required for strace
+              { drv = pkgs.elfutils.out; path = "lib/libdw-0.192.so"; }
+              { drv = pkgs.elfutils.out; path = "lib/libdw.so.1"; }
+              { drv = pkgs.elfutils.out; path = "lib/libdw.so"; }
+              { drv = pkgs.elfutils.out; path = "lib/libelf-0.192.so"; }
+              { drv = pkgs.elfutils.out; path = "lib/libelf.so.1"; }
+              { drv = pkgs.elfutils.out; path = "lib/libelf.so"; }
             ];
           };
         };
diff --git a/pkgs/cert/default.nix b/pkgs/cert/default.nix
new file mode 100644
index 0000000..f3237e9
--- /dev/null
+++ b/pkgs/cert/default.nix
@@ -0,0 +1,17 @@
+{
+  runCommand,
+  pkgs,
+
+}:
+
+runCommand "patagia-certs"
+  {
+    buildInputs = with pkgs; [
+      openssl
+    ];
+
+  }
+  ''
+    mkdir -pv $out
+    openssl req -new -x509 -days 365 -nodes -out $out/cert.pem -keyout $out/key.pem -subj "/CN=patagia-signing"
+  ''
diff --git a/pkgs/image/default.nix b/pkgs/image/default.nix
index 5612185..7d5f565 100644
--- a/pkgs/image/default.nix
+++ b/pkgs/image/default.nix
@@ -1,16 +1,15 @@
 {
   pkgs,
-  stdenvNoCC,
   patosPkgs,
   version,
+  runCommand,
   ...
 }:
 let
   pname = "patos-image";
 in
-stdenvNoCC.mkDerivation (finalAttrs: {
+runCommand pname {
   inherit version;
-  inherit pname;
 
   buildInputs = with pkgs; [
     erofs-utils
@@ -27,12 +26,142 @@ stdenvNoCC.mkDerivation (finalAttrs: {
     SYSTEMD_REPART_MKFS_OPTIONS_EROFS = "--all-root"; # -zlz4hc,12 -C1048576 -Efragments,dedupe,ztailpacking";
   };
 
-  systemd = patosPkgs.systemd.out;
-  kernel = patosPkgs.kernel;
-  initrd = patosPkgs.initrd.out;
-  rootfs = patosPkgs.rootfs.out;
-
   kernelCmdLine = "console=ttyS0";
+}
+''
+mkdir -p $out/init.repart.d $out/final.repart.d $out/boot
+pushd $out
 
-  builder = ./mkimage.sh;
-})
+# Don't seem to work just to create a symlink to rootfs derivation?
+# ln -sf $rootfs rootfs
+mkdir rootfs
+cp -prP ${patosPkgs.rootfs}/* rootfs/
+find rootfs/ -type d -exec chmod 755 {} \;
+
+# set default target to multi-user
+ln -sf multi-user.target rootfs/usr/lib/systemd/system/default.target
+
+# enable dbus
+ln -sf ../dbus.service rootfs/usr/lib/systemd/system/multi-user.target.wants/dbus.service
+ln -sf ../dbus.socket rootfs/usr/lib/systemd/system/sockets.target.wants/dbus.socket
+
+# enable network services
+ln -sf ../systemd-networkd.service rootfs/usr/lib/systemd/system/sysinit.target.wants/systemd-networkd.service
+ln -sf ../systemd-resolved.service rootfs/usr/lib/systemd/system/sysinit.target.wants/systemd-resolved.service
+ln -sf ../systemd-timesyncd.service rootfs/usr/lib/systemd/system/multi-user.target.wants/systemd-timesyncd.service
+# enable default network config
+mv rootfs/usr/lib/systemd/network/89-ethernet.network.example rootfs/usr/lib/systemd/network/89-ethernet.network
+
+# enable confext/sysext services
+ln -sf ../systemd-confext.service rootfs/usr/lib/systemd/system/sysinit.target.wants/systemd-confext.service
+ln -sf ../systemd-sysext.service rootfs/usr/lib/systemd/system/sysinit.target.wants/systemd-sysext.service
+
+# Initial partitioning
+cat <<EOF > init.repart.d/10-root.conf
+[Partition]
+Type=root
+Format=erofs
+Minimize=best
+CopyFiles=/rootfs:/
+Verity=data
+VerityMatchKey=root
+SplitName=root
+EOF
+
+cat <<EOF > init.repart.d/20-root-verity.conf
+[Partition]
+Type=root-verity
+Verity=hash
+VerityMatchKey=root
+Minimize=best
+SplitName=verity
+EOF
+
+#TODO: Add verity signature partition
+
+${patosPkgs.systemd}/usr/bin/systemd-repart \
+  --no-pager \
+  --empty=create \
+  --size=auto \
+  --definitions=./init.repart.d \
+  --split=true \
+  --json=pretty \
+  --root=$out \
+  patos-$version.raw > init-repart-output.json && rm -f patos-$version.raw
+
+roothash=$(jq -r '.[0].roothash' init-repart-output.json)
+rootPart=$(jq -r '.[0].split_path' init-repart-output.json)
+rootUuid=$(jq -r '.[0].uuid' init-repart-output.json)
+
+verityPart=$(jq -r '.[1].split_path' init-repart-output.json)
+verityUuid=$(jq -r '.[1].uuid' init-repart-output.json)
+
+${patosPkgs.systemd}/usr/bin/ukify build \
+  --linux ${patosPkgs.kernel}/bzImage \
+  --initrd ${patosPkgs.initrd}/initrd.xz \
+  --os-release @rootfs/etc/os-release \
+  --cmdline "$kernelCmdLine roothash=$roothash" \
+  -o patos_${version}.efi
+
+# install ESP
+SYSTEMD_RELAX_ESP_CHECKS=1 ${patosPkgs.systemd}/usr/bin/bootctl install --root ./rootfs --esp-path /boot \
+  --secure-boot-auto-enroll=true --certificate=${patosPkgs.cert}/cert.pem --private-key=${patosPkgs.cert}/key.pem
+echo "timeout 2" > rootfs/boot/loader/loader.conf
+
+# sign EFIs
+${patosPkgs.systemd}/usr/lib/systemd/systemd-sbsign sign --certificate=${patosPkgs.cert}/cert.pem --private-key=${patosPkgs.cert}/key.pem \
+  rootfs/boot/EFI/BOOT/BOOTX64.EFI  --output=rootfs/boot/EFI/BOOT/BOOTX64.EFI
+
+${patosPkgs.systemd}/usr/lib/systemd/systemd-sbsign sign --certificate=${patosPkgs.cert}/cert.pem --private-key=${patosPkgs.cert}/key.pem \
+  patos_${version}.efi --output=patos_${version}.efi
+
+# install UKI
+cp patos_${version}.efi rootfs/boot/EFI/Linux
+
+echo "secure-boot-enroll force" >> rootfs/boot/loader/loader.conf
+
+# Final partitioning
+cat <<EOF > final.repart.d/10-esp.conf
+[Partition]
+Type=esp
+Format=vfat
+SizeMinBytes=160M
+SizeMaxBytes=160M
+CopyFiles=/rootfs/boot:/
+EOF
+
+cat <<EOF > final.repart.d/20-root.conf
+[Partition]
+Type=root
+Label=root-${version}
+CopyBlocks=/$rootPart
+UUID=$rootUuid
+SizeMinBytes=256M
+SizeMaxBytes=256M
+ReadOnly=1
+EOF
+
+cat <<EOF > final.repart.d/22-root-verity.conf
+[Partition]
+Type=root-verity
+Label=verity-${version}
+CopyBlocks=/$verityPart
+UUID=$verityUuid
+SizeMinBytes=10M
+SizeMaxBytes=10M
+ReadOnly=1
+EOF
+
+# finalize image ready for boot
+${patosPkgs.systemd}/usr/bin/systemd-repart \
+  --no-pager \
+  --empty=create \
+  --size=auto \
+  --definitions=./final.repart.d \
+  --root=$out \
+  patos-$version.raw > final-repart-output.json
+
+rm -rf rootfs
+
+popd
+''
diff --git a/pkgs/image/mkimage.sh b/pkgs/image/mkimage.sh
deleted file mode 100644
index 1d14349..0000000
--- a/pkgs/image/mkimage.sh
+++ /dev/null
@@ -1,140 +0,0 @@
-set -ex -o pipefail
-
-mkdir -p $out/init.repart.d $out/final.repart.d $out/boot
-pushd $out
-
-# Don't seem to work just to create a symlink to rootfs derivation?
-# ln -sf $rootfs rootfs
-mkdir rootfs
-cp -prP $rootfs/* rootfs/
-find rootfs/ -type d -exec chmod 755 {} \;
-
-# set default target to multi-user
-ln -sf multi-user.target rootfs/usr/lib/systemd/system/default.target
-
-# enable dbus
-ln -sf ../dbus.service rootfs/usr/lib/systemd/system/multi-user.target.wants/dbus.service
-ln -sf ../dbus.socket rootfs/usr/lib/systemd/system/sockets.target.wants/dbus.socket
-
-# enable network services
-ln -sf ../systemd-networkd.service rootfs/usr/lib/systemd/system/sysinit.target.wants/systemd-networkd.service
-ln -sf ../systemd-resolved.service rootfs/usr/lib/systemd/system/sysinit.target.wants/systemd-resolved.service
-ln -sf ../systemd-timesyncd.service rootfs/usr/lib/systemd/system/multi-user.target.wants/systemd-timesyncd.service
-# enable default network config
-mv rootfs/usr/lib/systemd/network/89-ethernet.network.example rootfs/usr/lib/systemd/network/89-ethernet.network
-
-# enable confext/sysext services
-ln -sf ../systemd-confext.service rootfs/usr/lib/systemd/system/sysinit.target.wants/systemd-confext.service
-ln -sf ../systemd-sysext.service rootfs/usr/lib/systemd/system/sysinit.target.wants/systemd-sysext.service
-
-# Initial partitioning
-cat <<EOF > init.repart.d/10-root.conf
-[Partition]
-Type=root
-Format=erofs
-Minimize=best
-CopyFiles=/rootfs:/
-Verity=data
-VerityMatchKey=root
-SplitName=root
-EOF
-
-cat <<EOF > init.repart.d/20-root-verity.conf
-[Partition]
-Type=root-verity
-Verity=hash
-VerityMatchKey=root
-Minimize=best
-SplitName=verity
-EOF
-
-#TODO: Add verity signature partition
-
-$systemd/usr/bin/systemd-repart \
-  --no-pager \
-  --empty=create \
-  --size=auto \
-  --definitions=./init.repart.d \
-  --split=true \
-  --json=pretty \
-  --root=$out \
-  patos-$version.raw > init-repart-output.json && rm -f patos-$version.raw
-
-roothash=$(jq -r '.[0].roothash' init-repart-output.json)
-rootPart=$(jq -r '.[0].split_path' init-repart-output.json)
-rootUuid=$(jq -r '.[0].uuid' init-repart-output.json)
-
-verityPart=$(jq -r '.[1].split_path' init-repart-output.json)
-verityUuid=$(jq -r '.[1].uuid' init-repart-output.json)
-
-$systemd/usr/bin/ukify build \
-  --linux $kernel/bzImage \
-  --initrd $initrd/initrd.xz \
-  --os-release @rootfs/etc/os-release \
-  --cmdline "$kernelCmdLine roothash=$roothash" \
-  -o patos_${version}.efi
-
-# Secure boot
-openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout key.pem -subj "/CN=patagia-signing"
-
-# install ESP
-SYSTEMD_RELAX_ESP_CHECKS=1 $systemd/usr/bin/bootctl install --root ./rootfs --esp-path /boot \
-  --secure-boot-auto-enroll=true --certificate=./cert.pem --private-key=./key.pem
-echo "timeout 2" > rootfs/boot/loader/loader.conf
-
-# sign EFIs
-$systemd/usr/lib/systemd/systemd-sbsign sign --certificate=./cert.pem --private-key=./key.pem \
-  rootfs/boot/EFI/BOOT/BOOTX64.EFI  --output=rootfs/boot/EFI/BOOT/BOOTX64.EFI
-
-$systemd/usr/lib/systemd/systemd-sbsign sign --certificate=./cert.pem --private-key=./key.pem \
-  patos_${version}.efi --output=patos_${version}.efi
-
-# install UKI
-cp patos_${version}.efi rootfs/boot/EFI/Linux
-
-echo "secure-boot-enroll force" >> rootfs/boot/loader/loader.conf
-
-# Final partitioning
-cat <<EOF > final.repart.d/10-esp.conf
-[Partition]
-Type=esp
-Format=vfat
-SizeMinBytes=160M
-SizeMaxBytes=160M
-CopyFiles=/rootfs/boot:/
-EOF
-
-cat <<EOF > final.repart.d/20-root.conf
-[Partition]
-Type=root
-Label=root-${version}
-CopyBlocks=/${rootPart}
-UUID=${rootUuid}
-SizeMinBytes=256M
-SizeMaxBytes=256M
-ReadOnly=1
-EOF
-
-cat <<EOF > final.repart.d/22-root-verity.conf
-[Partition]
-Type=root-verity
-Label=verity-${version}
-CopyBlocks=/${verityPart}
-UUID=${verityUuid}
-SizeMinBytes=10M
-SizeMaxBytes=10M
-ReadOnly=1
-EOF
-
-# finalize image ready for boot
-$systemd/usr/bin/systemd-repart \
-  --no-pager \
-  --empty=create \
-  --size=auto \
-  --definitions=./final.repart.d \
-  --root=$out \
-  patos-$version.raw > final-repart-output.json
-
-rm -rf rootfs
-
-popd
diff --git a/pkgs/kernel/default.nix b/pkgs/kernel/default.nix
index edbfb65..a5f24db 100644
--- a/pkgs/kernel/default.nix
+++ b/pkgs/kernel/default.nix
@@ -3,13 +3,13 @@ let
   version = "6.13.7";
   hash = "sha256-Ojm2IDi3rC9D0mofhLQoPhl4BOHoF61jfpo9h0xHgB0=";
 in
-  (pkgs.callPackage ./manual-config.nix {}) {
-    version = "${version}-patos1";
-    modDirVersion = version;
-    src = pkgs.fetchurl {
-      url = "https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-${version}.tar.xz";
-      hash = hash;
-    };
-    configfile = ./generic.config;
-    allowImportFromDerivation = true;
-  }
+(pkgs.callPackage ./manual-config.nix { }) {
+  version = "${version}-patos1";
+  modDirVersion = version;
+  src = pkgs.fetchurl {
+    url = "https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-${version}.tar.xz";
+    hash = hash;
+  };
+  configfile = ./generic.config;
+  allowImportFromDerivation = true;
+}
diff --git a/pkgs/kernel/generic.config b/pkgs/kernel/generic.config
index 647bf91..048421b 100644
--- a/pkgs/kernel/generic.config
+++ b/pkgs/kernel/generic.config
@@ -522,10 +522,6 @@ CONFIG_DEBUG_BUGVERBOSE=y
 CONFIG_DEBUG_ENTRY=y
 CONFIG_DEBUG_FS_ALLOW_ALL=y
 CONFIG_DEBUG_FS=y
-#CONFIG_DEBUG_INFO_BTF_MODULES=y
-#CONFIG_DEBUG_INFO_BTF=y
-#CONFIG_DEBUG_INFO_COMPRESSED_NONE=y
-#CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y
 CONFIG_DEBUG_INFO=n
 CONFIG_DEBUG_KERNEL=y
 CONFIG_DEBUG_LIST=y
@@ -1401,9 +1397,8 @@ CONFIG_MODULE_FORCE_UNLOAD=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_MODULE_UNLOAD=y
 CONFIG_MODULE_SIG=y
-CONFIG_MODULE_SIG_FORCE=n
+CONFIG_MODULE_SIG_FORCE=y
 CONFIG_MODULE_SIG_ALL=y
-CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"
 CONFIG_MODULES_TREE_LOOKUP=y
 CONFIG_MODULES_USE_ELF_RELA=y
 CONFIG_MODULES=y
diff --git a/pkgs/kernel/manual-config.nix b/pkgs/kernel/manual-config.nix
index ffcf758..9f1ba99 100644
--- a/pkgs/kernel/manual-config.nix
+++ b/pkgs/kernel/manual-config.nix
@@ -1,465 +1,576 @@
-{ lib, stdenv, buildPackages, runCommand, nettools, bc, bison, flex, perl, rsync, gmp, libmpc, mpfr, openssl
-, cpio, elfutils, hexdump, zstd, python3Minimal, zlib, pahole, kmod, ubootTools
-, fetchpatch
-, rustc, rust-bindgen, rustPlatform
+{
+  lib,
+  stdenv,
+  buildPackages,
+  runCommand,
+  nettools,
+  bc,
+  bison,
+  flex,
+  perl,
+  rsync,
+  gmp,
+  libmpc,
+  mpfr,
+  openssl,
+  cpio,
+  elfutils,
+  hexdump,
+  zstd,
+  python3Minimal,
+  zlib,
+  pahole,
+  kmod,
+  ubootTools,
+  fetchpatch,
+  rustc,
+  rust-bindgen,
+  rustPlatform,
 }:
 
 let
   lib_ = lib;
   stdenv_ = stdenv;
 
-  readConfig = configfile: import (runCommand "config.nix" {} ''
-    echo "{" > "$out"
-    while IFS='=' read key val; do
-      [ "x''${key#CONFIG_}" != "x$key" ] || continue
-      no_firstquote="''${val#\"}";
-      echo '  "'"$key"'" = "'"''${no_firstquote%\"}"'";' >> "$out"
-    done < "${configfile}"
-    echo "}" >> $out
-  '').outPath;
-in lib.makeOverridable ({
-  # The kernel version
-  version,
-  # The kernel pname (should be set for variants)
-  pname ? "linux",
-  # Position of the Linux build expression
-  pos ? null,
-  # Additional kernel make flags
-  extraMakeFlags ? [],
-  # The name of the kernel module directory
-  # Needs to be X.Y.Z[-extra], so pad with zeros if needed.
-  modDirVersion ? null /* derive from version */,
-  # The kernel source (tarball, git checkout, etc.)
-  src,
-  # a list of { name=..., patch=..., extraConfig=...} patches
-  kernelPatches ? [],
-  # The kernel .config file
-  configfile,
-  # Manually specified nixexpr representing the config
-  # If unspecified, this will be autodetected from the .config
-  config ? lib.optionalAttrs allowImportFromDerivation (readConfig configfile),
-  # Custom seed used for CONFIG_GCC_PLUGIN_RANDSTRUCT if enabled. This is
-  # automatically extended with extra per-version and per-config values.
-  randstructSeed ? "",
-  # Extra meta attributes
-  extraMeta ? {},
-
-  # for module compatibility
-  isZen      ? false,
-  isLibre    ? false,
-  isHardened ? false,
-
-  # Whether to utilize the controversial import-from-derivation feature to parse the config
-  allowImportFromDerivation ? false,
-  # ignored
-  features ? null, lib ? lib_, stdenv ? stdenv_,
-}:
-
-let
-  # Provide defaults. Note that we support `null` so that callers don't need to use optionalAttrs,
-  # which can lead to unnecessary strictness and infinite recursions.
-  modDirVersion_ = if modDirVersion == null then lib.versions.pad 3 version else modDirVersion;
+  readConfig =
+    configfile:
+    import
+      (runCommand "config.nix" { } ''
+        echo "{" > "$out"
+        while IFS='=' read key val; do
+          [ "x''${key#CONFIG_}" != "x$key" ] || continue
+          no_firstquote="''${val#\"}";
+          echo '  "'"$key"'" = "'"''${no_firstquote%\"}"'";' >> "$out"
+        done < "${configfile}"
+        echo "}" >> $out
+      '').outPath;
 in
-let
-  # Shadow the un-defaulted parameter; don't want null.
-  modDirVersion = modDirVersion_;
-  inherit (lib)
-    hasAttr getAttr optional optionals optionalString optionalAttrs maintainers platforms;
+lib.makeOverridable (
+  {
+    # The kernel version
+    version,
+    # The kernel pname (should be set for variants)
+    pname ? "linux",
+    # Position of the Linux build expression
+    pos ? null,
+    # Additional kernel make flags
+    extraMakeFlags ? [ ],
+    # The name of the kernel module directory
+    # Needs to be X.Y.Z[-extra], so pad with zeros if needed.
+    modDirVersion ? null, # derive from version
+    # The kernel source (tarball, git checkout, etc.)
+    src,
+    # a list of { name=..., patch=..., extraConfig=...} patches
+    kernelPatches ? [ ],
+    # The kernel .config file
+    configfile,
+    # Manually specified nixexpr representing the config
+    # If unspecified, this will be autodetected from the .config
+    config ? lib.optionalAttrs allowImportFromDerivation (readConfig configfile),
+    # Custom seed used for CONFIG_GCC_PLUGIN_RANDSTRUCT if enabled. This is
+    # automatically extended with extra per-version and per-config values.
+    randstructSeed ? "",
+    # Extra meta attributes
+    extraMeta ? { },
 
-  drvAttrs = config_: kernelConf: kernelPatches: configfile:
-    let
-      # Folding in `ubootTools` in the default nativeBuildInputs is problematic, as
-      # it makes updating U-Boot cumbersome, since it will go above the current
-      # threshold of rebuilds
-      #
-      # To prevent these needless rounds of staging for U-Boot builds, we can
-      # limit the inclusion of ubootTools to target platforms where uImage *may*
-      # be produced.
-      #
-      # This command lists those (kernel-named) platforms:
-      #     .../linux $ grep -l uImage ./arch/*/Makefile | cut -d'/' -f3 | sort
-      #
-      # This is still a guesstimation, but since none of our cached platforms
-      # coincide in that list, this gives us "perfect" decoupling here.
-      linuxPlatformsUsingUImage = [
-        "arc"
-        "arm"
-        "csky"
-        "mips"
-        "powerpc"
-        "sh"
-        "sparc"
-        "xtensa"
-      ];
-      needsUbootTools =
-        lib.elem stdenv.hostPlatform.linuxArch linuxPlatformsUsingUImage
+    # for module compatibility
+    isZen ? false,
+    isLibre ? false,
+    isHardened ? false,
+
+    # Whether to utilize the controversial import-from-derivation feature to parse the config
+    allowImportFromDerivation ? false,
+    # ignored
+    features ? null,
+    lib ? lib_,
+    stdenv ? stdenv_,
+  }:
+
+  let
+    # Provide defaults. Note that we support `null` so that callers don't need to use optionalAttrs,
+    # which can lead to unnecessary strictness and infinite recursions.
+    modDirVersion_ = if modDirVersion == null then lib.versions.pad 3 version else modDirVersion;
+  in
+  let
+    # Shadow the un-defaulted parameter; don't want null.
+    modDirVersion = modDirVersion_;
+    inherit (lib)
+      hasAttr
+      getAttr
+      optional
+      optionals
+      optionalString
+      optionalAttrs
+      maintainers
+      platforms
       ;
 
-      config = let attrName = attr: "CONFIG_" + attr; in {
-        isSet = attr: hasAttr (attrName attr) config;
+    drvAttrs =
+      config_: kernelConf: kernelPatches: configfile:
+      let
+        # Folding in `ubootTools` in the default nativeBuildInputs is problematic, as
+        # it makes updating U-Boot cumbersome, since it will go above the current
+        # threshold of rebuilds
+        #
+        # To prevent these needless rounds of staging for U-Boot builds, we can
+        # limit the inclusion of ubootTools to target platforms where uImage *may*
+        # be produced.
+        #
+        # This command lists those (kernel-named) platforms:
+        #     .../linux $ grep -l uImage ./arch/*/Makefile | cut -d'/' -f3 | sort
+        #
+        # This is still a guesstimation, but since none of our cached platforms
+        # coincide in that list, this gives us "perfect" decoupling here.
+        linuxPlatformsUsingUImage = [
+          "arc"
+          "arm"
+          "csky"
+          "mips"
+          "powerpc"
+          "sh"
+          "sparc"
+          "xtensa"
+        ];
+        needsUbootTools = lib.elem stdenv.hostPlatform.linuxArch linuxPlatformsUsingUImage;
 
-        getValue = attr: if config.isSet attr then getAttr (attrName attr) config else null;
+        config =
+          let
+            attrName = attr: "CONFIG_" + attr;
+          in
+          {
+            isSet = attr: hasAttr (attrName attr) config;
 
-        isYes = attr: (config.getValue attr) == "y";
+            getValue = attr: if config.isSet attr then getAttr (attrName attr) config else null;
 
-        isNo = attr: (config.getValue attr) == "n";
+            isYes = attr: (config.getValue attr) == "y";
 
-        isModule = attr: (config.getValue attr) == "m";
+            isNo = attr: (config.getValue attr) == "n";
 
-        isEnabled = attr: (config.isModule attr) || (config.isYes attr);
+            isModule = attr: (config.getValue attr) == "m";
 
-        isDisabled = attr: (!(config.isSet attr)) || (config.isNo attr);
-      } // config_;
+            isEnabled = attr: (config.isModule attr) || (config.isYes attr);
 
-      isModular = config.isYes "MODULES";
-      withRust = config.isYes "RUST";
+            isDisabled = attr: (!(config.isSet attr)) || (config.isNo attr);
+          }
+          // config_;
 
-      buildDTBs = kernelConf.DTB or false;
+        isModular = config.isYes "MODULES";
+        withRust = config.isYes "RUST";
 
-      # Dependencies that are required to build kernel modules
-      moduleBuildDependencies = [
-        pahole
-        perl
-        elfutils
-        # module makefiles often run uname commands to find out the kernel version
-        (buildPackages.deterministic-uname.override { inherit modDirVersion; })
-      ]
-      ++ optional (lib.versionAtLeast version "5.13") zstd
-      ++ optionals withRust [ rustc rust-bindgen ]
-      ;
+        buildDTBs = kernelConf.DTB or false;
 
-    in (optionalAttrs isModular { outputs = [ "out" "dev" ]; }) // {
-      passthru = rec {
-        inherit version modDirVersion config kernelPatches configfile
-          moduleBuildDependencies stdenv;
-        inherit isZen isHardened isLibre withRust;
-        isXen = lib.warn "The isXen attribute is deprecated. All Nixpkgs kernels that support it now have Xen enabled." true;
-        baseVersion = lib.head (lib.splitString "-rc" version);
-        kernelOlder = lib.versionOlder baseVersion;
-        kernelAtLeast = lib.versionAtLeast baseVersion;
+        # Dependencies that are required to build kernel modules
+        moduleBuildDependencies =
+          [
+            pahole
+            perl
+            elfutils
+            # module makefiles often run uname commands to find out the kernel version
+            (buildPackages.deterministic-uname.override { inherit modDirVersion; })
+          ]
+          ++ optional (lib.versionAtLeast version "5.13") zstd
+          ++ optionals withRust [
+            rustc
+            rust-bindgen
+          ];
+
+      in
+      (optionalAttrs isModular {
+        outputs = [
+          "out"
+          "dev"
+        ];
+      })
+      // {
+        passthru = rec {
+          inherit
+            version
+            modDirVersion
+            config
+            kernelPatches
+            configfile
+            moduleBuildDependencies
+            stdenv
+            ;
+          inherit
+            isZen
+            isHardened
+            isLibre
+            withRust
+            ;
+          isXen = lib.warn "The isXen attribute is deprecated. All Nixpkgs kernels that support it now have Xen enabled." true;
+          baseVersion = lib.head (lib.splitString "-rc" version);
+          kernelOlder = lib.versionOlder baseVersion;
+          kernelAtLeast = lib.versionAtLeast baseVersion;
+        };
+
+        inherit src;
+
+        depsBuildBuild = [ buildPackages.stdenv.cc ];
+        nativeBuildInputs =
+          [
+            bison
+            flex
+            perl
+            bc
+            nettools
+            openssl
+            rsync
+            gmp
+            libmpc
+            mpfr
+            elfutils
+            zstd
+            python3Minimal
+            kmod
+            hexdump
+          ]
+          ++ optional needsUbootTools ubootTools
+          ++ optionals (lib.versionAtLeast version "5.2") [
+            cpio
+            pahole
+            zlib
+          ]
+          ++ optionals withRust [
+            rustc
+            rust-bindgen
+          ];
+
+        RUST_LIB_SRC = lib.optionalString withRust rustPlatform.rustLibSrc;
+
+        # avoid leaking Rust source file names into the final binary, which adds
+        # a false dependency on rust-lib-src on targets with uncompressed kernels
+        KRUSTFLAGS = lib.optionalString withRust "--remap-path-prefix ${rustPlatform.rustLibSrc}=/";
+
+        # patches =
+        #   map (p: p.patch) kernelPatches
+        #   # Required for deterministic builds along with some postPatch magic.
+        #   ++ optional (lib.versionOlder version "5.19") ./randstruct-provide-seed.patch
+        #   ++ optional (lib.versionAtLeast version "5.19") ./randstruct-provide-seed-5.19.patch
+        #   # Linux 5.12 marked certain PowerPC-only symbols as GPL, which breaks
+        #   # OpenZFS; this was fixed in Linux 5.19 so we backport the fix
+        #   # https://github.com/openzfs/zfs/pull/13367
+        #   ++ optional (lib.versionAtLeast version "5.12" &&
+        #                lib.versionOlder version "5.19" &&
+        #                stdenv.hostPlatform.isPower)
+        #     (fetchpatch {
+        #       url = "https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git/patch/?id=d9e5c3e9e75162f845880535957b7fd0b4637d23";
+        #       hash = "sha256-bBOyJcP6jUvozFJU0SPTOf3cmnTQ6ZZ4PlHjiniHXLU=";
+        #     });
+
+        postPatch = ''
+          # Ensure that depmod gets resolved through PATH
+          sed -i Makefile -e 's|= /sbin/depmod|= depmod|'
+
+          # Some linux-hardened patches now remove certain files in the scripts directory, so the file may not exist.
+          [[ -f scripts/ld-version.sh ]] && patchShebangs scripts/ld-version.sh
+
+          # Set randstruct seed to a deterministic but diversified value. Note:
+          # we could have instead patched gen-random-seed.sh to take input from
+          # the buildFlags, but that would require also patching the kernel's
+          # toplevel Makefile to add a variable export. This would be likely to
+          # cause future patch conflicts.
+          # for file in scripts/gen-randstruct-seed.sh scripts/gcc-plugins/gen-random-seed.sh; do
+          #   if [ -f "$file" ]; then
+          #     substituteInPlace "$file" \
+          #       --replace NIXOS_RANDSTRUCT_SEED \
+          #       $(echo ${randstructSeed}${src} ${placeholder "configfile"} | sha256sum | cut -d ' ' -f 1 | tr -d '\n')
+          #     break
+          #   fi
+          # done
+
+          patchShebangs scripts
+
+          # also patch arch-specific install scripts
+          for i in $(find arch -name install.sh); do
+              patchShebangs "$i"
+          done
+
+          # unset $src because the build system tries to use it and spams a bunch of warnings
+          # see: https://github.com/torvalds/linux/commit/b1992c3772e69a6fd0e3fc81cd4d2820c8b6eca0
+          unset src
+        '';
+
+        configurePhase = ''
+          runHook preConfigure
+
+          mkdir build
+          export buildRoot="$(pwd)/build"
+
+          echo "manual-config configurePhase buildRoot=$buildRoot pwd=$PWD"
+
+          if [ -f "$buildRoot/.config" ]; then
+            echo "Could not link $buildRoot/.config : file exists"
+            exit 1
+          fi
+          ln -sv ${configfile} $buildRoot/.config
+
+          # reads the existing .config file and prompts the user for options in
+          # the current kernel source that are not found in the file.
+          make $makeFlags "''${makeFlagsArray[@]}" oldconfig
+          runHook postConfigure
+
+          make $makeFlags "''${makeFlagsArray[@]}" prepare
+          actualModDirVersion="$(cat $buildRoot/include/config/kernel.release)"
+          if [ "$actualModDirVersion" != "${modDirVersion}" ]; then
+            echo "Error: modDirVersion ${modDirVersion} specified in the Nix expression is wrong, it should be: $actualModDirVersion"
+            exit 1
+          fi
+
+          buildFlagsArray+=("KBUILD_BUILD_TIMESTAMP=$(date -u -d @$SOURCE_DATE_EPOCH)")
+
+          cd $buildRoot
+        '';
+
+        buildFlags =
+          [
+            "KBUILD_BUILD_VERSION=1-PatOS"
+            kernelConf.target
+            "vmlinux" # for "perf" and things like that
+          ]
+          ++ optional isModular "modules"
+          ++ optionals buildDTBs [
+            "dtbs"
+            "DTC_FLAGS=-@"
+          ]
+          ++ extraMakeFlags;
+
+        installFlags =
+          [
+            "INSTALL_PATH=$(out)"
+          ]
+          ++ (optional isModular "INSTALL_MOD_PATH=$(out)")
+          ++ optionals buildDTBs [
+            "dtbs_install"
+            "INSTALL_DTBS_PATH=$(out)/dtbs"
+          ];
+
+        dontStrip = true;
+
+        preInstall =
+          let
+            # All we really need to do here is copy the final image and System.map to $out,
+            # and use the kernel's modules_install, firmware_install, dtbs_install, etc. targets
+            # for the rest. Easy, right?
+            #
+            # Unfortunately for us, the obvious way of getting the built image path,
+            # make -s image_name, does not work correctly, because some architectures
+            # (*cough* aarch64 *cough*) change KBUILD_IMAGE on the fly in their install targets,
+            # so we end up attempting to install the thing we didn't actually build.
+            #
+            # Thankfully, there's a way out that doesn't involve just hardcoding everything.
+            #
+            # The kernel has an install target, which runs a pretty simple shell script
+            # (located at scripts/install.sh or arch/$arch/boot/install.sh, depending on
+            # which kernel version you're looking at) that tries to do something sensible.
+            #
+            # (it would be great to hijack this script immediately, as it has all the
+            #   information we need passed to it and we don't need it to try and be smart,
+            #   but unfortunately, the exact location of the scripts differs between kernel
+            #   versions, and they're seemingly not considered to be public API at all)
+            #
+            # One of the ways it tries to discover what "something sensible" actually is
+            # is by delegating to what's supposed to be a user-provided install script
+            # located at ~/bin/installkernel.
+            #
+            # (the other options are:
+            #   - a distribution-specific script at /sbin/installkernel,
+            #        which we can't really create in the sandbox easily
+            #   - an architecture-specific script at arch/$arch/boot/install.sh,
+            #        which attempts to guess _something_ and usually guesses very wrong)
+            #
+            # More specifically, the install script exec's into ~/bin/installkernel, if one
+            # exists, with the following arguments:
+            #
+            # $1: $KERNELRELEASE - full kernel version string
+            # $2: $KBUILD_IMAGE - the final image path
+            # $3: System.map - path to System.map file, seemingly hardcoded everywhere
+            # $4: $INSTALL_PATH - path to the destination directory as specified in installFlags
+            #
+            # $2 is exactly what we want, so hijack the script and use the knowledge given to it
+            # by the makefile overlords for our own nefarious ends.
+            #
+            # Note that the makefiles specifically look in ~/bin/installkernel, and
+            # writeShellScriptBin writes the script to <store path>/bin/installkernel,
+            # so HOME needs to be set to just the store path.
+            #
+            # FIXME: figure out a less roundabout way of doing this.
+            installkernel = buildPackages.writeShellScriptBin "installkernel" ''
+              cp -av $2 $4
+              cp -av $3 $4
+            '';
+          in
+          ''
+            installFlagsArray+=("-j$NIX_BUILD_CORES")
+            export HOME=${installkernel}
+          '';
+
+        # Some image types need special install targets (e.g. uImage is installed with make uinstall on arm)
+        installTargets = [
+          (kernelConf.installTarget or (
+            if kernelConf.target == "uImage" && stdenv.hostPlatform.linuxArch == "arm" then
+              "uinstall"
+            else if
+              kernelConf.target == "zImage"
+              || kernelConf.target == "Image.gz"
+              || kernelConf.target == "vmlinuz.efi"
+            then
+              "zinstall"
+            else
+              "install"
+          )
+          )
+        ];
+
+        # We remove a bunch of stuff that is symlinked from other places to save space,
+        # which trips the broken symlink check. So, just skip it. We'll know if it explodes.
+        dontCheckForBrokenSymlinks = true;
+
+        postInstall = optionalString isModular ''
+          mkdir -p $dev
+          cp vmlinux $dev/
+          # if [ -z "''${dontStrip-}" ]; then
+          #   installFlagsArray+=("INSTALL_MOD_STRIP=1")
+          # fi
+          make modules_install $makeFlags "''${makeFlagsArray[@]}" \
+            $installFlags "''${installFlagsArray[@]}"
+          unlink $out/lib/modules/${modDirVersion}/build
+          rm -f $out/lib/modules/${modDirVersion}/source
+
+          mkdir -p $dev/lib/modules/${modDirVersion}/{build,source}
+
+          # To save space, exclude a bunch of unneeded stuff when copying.
+          (cd .. && rsync --archive --prune-empty-dirs \
+              --exclude='/build/' \
+              * $dev/lib/modules/${modDirVersion}/source/)
+
+          cd $dev/lib/modules/${modDirVersion}/source
+
+          cp $buildRoot/{.config,Module.symvers} $dev/lib/modules/${modDirVersion}/build
+          make modules_prepare $makeFlags "''${makeFlagsArray[@]}" O=$dev/lib/modules/${modDirVersion}/build
+
+          # For reproducibility, removes accidental leftovers from a `cc1` call
+          # from a `try-run` call from the Makefile
+          rm -f $dev/lib/modules/${modDirVersion}/build/.[0-9]*.d
+
+          # Keep some extra files on some arches (powerpc, aarch64)
+          for f in arch/powerpc/lib/crtsavres.o arch/arm64/kernel/ftrace-mod.o; do
+            if [ -f "$buildRoot/$f" ]; then
+              cp $buildRoot/$f $dev/lib/modules/${modDirVersion}/build/$f
+            fi
+          done
+
+          # !!! No documentation on how much of the source tree must be kept
+          # If/when kernel builds fail due to missing files, you can add
+          # them here. Note that we may see packages requiring headers
+          # from drivers/ in the future; it adds 50M to keep all of its
+          # headers on 3.10 though.
+
+          chmod u+w -R ..
+          arch=$(cd $dev/lib/modules/${modDirVersion}/build/arch; ls)
+
+          # Remove unused arches
+          for d in $(cd arch/; ls); do
+            if [ "$d" = "$arch" ]; then continue; fi
+            if [ "$arch" = arm64 ] && [ "$d" = arm ]; then continue; fi
+            rm -rf arch/$d
+          done
+
+          # Remove all driver-specific code (50M of which is headers)
+          rm -fR drivers
+
+          # Keep all headers
+          find .  -type f -name '*.h' -print0 | xargs -0 -r chmod u-w
+
+          # Keep linker scripts (they are required for out-of-tree modules on aarch64)
+          find .  -type f -name '*.lds' -print0 | xargs -0 -r chmod u-w
+
+          # Keep root and arch-specific Makefiles
+          chmod u-w Makefile arch/"$arch"/Makefile*
+
+          # Keep whole scripts dir
+          chmod u-w -R scripts
+
+          # Delete everything not kept
+          find . -type f -perm -u=w -print0 | xargs -0 -r rm
+
+          # Delete empty directories
+          find -empty -type d -delete
+        '';
+
+        requiredSystemFeatures = [ "big-parallel" ];
+
+        meta = {
+          # https://github.com/NixOS/nixpkgs/pull/345534#issuecomment-2391238381
+          broken = withRust && lib.versionOlder version "6.12";
+
+          description =
+            "The Linux kernel"
+            + (
+              if kernelPatches == [ ] then
+                ""
+              else
+                " (with patches: " + lib.concatStringsSep ", " (map (x: x.name) kernelPatches) + ")"
+            );
+          license = lib.licenses.gpl2Only;
+          homepage = "https://www.kernel.org/";
+          maintainers = lib.teams.linux-kernel.members ++ [
+            maintainers.thoughtpolice
+          ];
+          platforms = platforms.linux;
+          badPlatforms =
+            lib.optionals (lib.versionOlder version "4.15") [
+              "riscv32-linux"
+              "riscv64-linux"
+            ]
+            ++ lib.optional (lib.versionOlder version "5.19") "loongarch64-linux";
+          timeout = 14400; # 4 hours
+        } // extraMeta;
       };
 
-      inherit src;
-
-      depsBuildBuild = [ buildPackages.stdenv.cc ];
-      nativeBuildInputs = [
-        bison
-        flex
-        perl
-        bc
-        nettools
-        openssl
-        rsync
-        gmp
-        libmpc
-        mpfr
-        elfutils
-        zstd
-        python3Minimal
-        kmod
-        hexdump
-      ] ++ optional  needsUbootTools ubootTools
-        ++ optionals (lib.versionAtLeast version "5.2")  [ cpio pahole zlib ]
-        ++ optionals withRust [ rustc rust-bindgen ];
-
-      RUST_LIB_SRC = lib.optionalString withRust rustPlatform.rustLibSrc;
-
-      # avoid leaking Rust source file names into the final binary, which adds
-      # a false dependency on rust-lib-src on targets with uncompressed kernels
-      KRUSTFLAGS = lib.optionalString withRust "--remap-path-prefix ${rustPlatform.rustLibSrc}=/";
-
-      # patches =
-      #   map (p: p.patch) kernelPatches
-      #   # Required for deterministic builds along with some postPatch magic.
-      #   ++ optional (lib.versionOlder version "5.19") ./randstruct-provide-seed.patch
-      #   ++ optional (lib.versionAtLeast version "5.19") ./randstruct-provide-seed-5.19.patch
-      #   # Linux 5.12 marked certain PowerPC-only symbols as GPL, which breaks
-      #   # OpenZFS; this was fixed in Linux 5.19 so we backport the fix
-      #   # https://github.com/openzfs/zfs/pull/13367
-      #   ++ optional (lib.versionAtLeast version "5.12" &&
-      #                lib.versionOlder version "5.19" &&
-      #                stdenv.hostPlatform.isPower)
-      #     (fetchpatch {
-      #       url = "https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git/patch/?id=d9e5c3e9e75162f845880535957b7fd0b4637d23";
-      #       hash = "sha256-bBOyJcP6jUvozFJU0SPTOf3cmnTQ6ZZ4PlHjiniHXLU=";
-      #     });
-
-      postPatch = ''
-        # Ensure that depmod gets resolved through PATH
-        sed -i Makefile -e 's|= /sbin/depmod|= depmod|'
-
-        # Some linux-hardened patches now remove certain files in the scripts directory, so the file may not exist.
-        [[ -f scripts/ld-version.sh ]] && patchShebangs scripts/ld-version.sh
-
-        # Set randstruct seed to a deterministic but diversified value. Note:
-        # we could have instead patched gen-random-seed.sh to take input from
-        # the buildFlags, but that would require also patching the kernel's
-        # toplevel Makefile to add a variable export. This would be likely to
-        # cause future patch conflicts.
-        for file in scripts/gen-randstruct-seed.sh scripts/gcc-plugins/gen-random-seed.sh; do
-          if [ -f "$file" ]; then
-            substituteInPlace "$file" \
-              --replace NIXOS_RANDSTRUCT_SEED \
-              $(echo ${randstructSeed}${src} ${placeholder "configfile"} | sha256sum | cut -d ' ' -f 1 | tr -d '\n')
-            break
-          fi
-        done
-
-        patchShebangs scripts
-
-        # also patch arch-specific install scripts
-        for i in $(find arch -name install.sh); do
-            patchShebangs "$i"
-        done
-
-        # unset $src because the build system tries to use it and spams a bunch of warnings
-        # see: https://github.com/torvalds/linux/commit/b1992c3772e69a6fd0e3fc81cd4d2820c8b6eca0
-        unset src
-      '';
-
-      configurePhase = ''
-        runHook preConfigure
-
-        mkdir build
-        export buildRoot="$(pwd)/build"
-
-        echo "manual-config configurePhase buildRoot=$buildRoot pwd=$PWD"
-
-        if [ -f "$buildRoot/.config" ]; then
-          echo "Could not link $buildRoot/.config : file exists"
-          exit 1
-        fi
-        ln -sv ${configfile} $buildRoot/.config
-
-        # reads the existing .config file and prompts the user for options in
-        # the current kernel source that are not found in the file.
-        make $makeFlags "''${makeFlagsArray[@]}" oldconfig
-        runHook postConfigure
-
-        make $makeFlags "''${makeFlagsArray[@]}" prepare
-        actualModDirVersion="$(cat $buildRoot/include/config/kernel.release)"
-        if [ "$actualModDirVersion" != "${modDirVersion}" ]; then
-          echo "Error: modDirVersion ${modDirVersion} specified in the Nix expression is wrong, it should be: $actualModDirVersion"
-          exit 1
-        fi
-
-        buildFlagsArray+=("KBUILD_BUILD_TIMESTAMP=$(date -u -d @$SOURCE_DATE_EPOCH)")
-
-        cd $buildRoot
-      '';
-
-      buildFlags = [
-        "KBUILD_BUILD_VERSION=1-PatOS"
-        kernelConf.target
-        "vmlinux"  # for "perf" and things like that
-      ] ++ optional isModular "modules"
-        ++ optionals buildDTBs ["dtbs" "DTC_FLAGS=-@"]
+    # Absolute paths for compilers avoid any PATH-clobbering issues.
+    commonMakeFlags =
+      [
+        "ARCH=${stdenv.hostPlatform.linuxArch}"
+        "CROSS_COMPILE=${stdenv.cc.targetPrefix}"
+      ]
+      ++ lib.optionals (stdenv.isx86_64 && stdenv.cc.bintools.isLLVM) [
+        # The wrapper for ld.lld breaks linking the kernel. We use the
+        # unwrapped linker as workaround. See:
+        #
+        # https://github.com/NixOS/nixpkgs/issues/321667
+        "LD=${stdenv.cc.bintools.bintools}/bin/${stdenv.cc.targetPrefix}ld"
+      ]
+      ++ (stdenv.hostPlatform.linux-kernel.makeFlags or [ ])
       ++ extraMakeFlags;
+  in
 
-      installFlags = [
-        "INSTALL_PATH=$(out)"
-      ] ++ (optional isModular "INSTALL_MOD_PATH=$(out)")
-      ++ optionals buildDTBs ["dtbs_install" "INSTALL_DTBS_PATH=$(out)/dtbs"];
+  stdenv.mkDerivation (
+    builtins.foldl' lib.recursiveUpdate { } [
+      (drvAttrs config stdenv.hostPlatform.linux-kernel kernelPatches configfile)
+      {
+        inherit pname version;
 
-      dontStrip = true;
+        enableParallelBuilding = true;
 
-      preInstall = let
-        # All we really need to do here is copy the final image and System.map to $out,
-        # and use the kernel's modules_install, firmware_install, dtbs_install, etc. targets
-        # for the rest. Easy, right?
-        #
-        # Unfortunately for us, the obvious way of getting the built image path,
-        # make -s image_name, does not work correctly, because some architectures
-        # (*cough* aarch64 *cough*) change KBUILD_IMAGE on the fly in their install targets,
-        # so we end up attempting to install the thing we didn't actually build.
-        #
-        # Thankfully, there's a way out that doesn't involve just hardcoding everything.
-        #
-        # The kernel has an install target, which runs a pretty simple shell script
-        # (located at scripts/install.sh or arch/$arch/boot/install.sh, depending on
-        # which kernel version you're looking at) that tries to do something sensible.
-        #
-        # (it would be great to hijack this script immediately, as it has all the
-        #   information we need passed to it and we don't need it to try and be smart,
-        #   but unfortunately, the exact location of the scripts differs between kernel
-        #   versions, and they're seemingly not considered to be public API at all)
-        #
-        # One of the ways it tries to discover what "something sensible" actually is
-        # is by delegating to what's supposed to be a user-provided install script
-        # located at ~/bin/installkernel.
-        #
-        # (the other options are:
-        #   - a distribution-specific script at /sbin/installkernel,
-        #        which we can't really create in the sandbox easily
-        #   - an architecture-specific script at arch/$arch/boot/install.sh,
-        #        which attempts to guess _something_ and usually guesses very wrong)
-        #
-        # More specifically, the install script exec's into ~/bin/installkernel, if one
-        # exists, with the following arguments:
-        #
-        # $1: $KERNELRELEASE - full kernel version string
-        # $2: $KBUILD_IMAGE - the final image path
-        # $3: System.map - path to System.map file, seemingly hardcoded everywhere
-        # $4: $INSTALL_PATH - path to the destination directory as specified in installFlags
-        #
-        # $2 is exactly what we want, so hijack the script and use the knowledge given to it
-        # by the makefile overlords for our own nefarious ends.
-        #
-        # Note that the makefiles specifically look in ~/bin/installkernel, and
-        # writeShellScriptBin writes the script to <store path>/bin/installkernel,
-        # so HOME needs to be set to just the store path.
-        #
-        # FIXME: figure out a less roundabout way of doing this.
-        installkernel = buildPackages.writeShellScriptBin "installkernel" ''
-          cp -av $2 $4
-          cp -av $3 $4
-        '';
-      in ''
-        installFlagsArray+=("-j$NIX_BUILD_CORES")
-        export HOME=${installkernel}
-      '';
-
-      # Some image types need special install targets (e.g. uImage is installed with make uinstall on arm)
-      installTargets = [
-        (kernelConf.installTarget or (
-          /**/ if kernelConf.target == "uImage" && stdenv.hostPlatform.linuxArch == "arm" then "uinstall"
-          else if kernelConf.target == "zImage" || kernelConf.target == "Image.gz" || kernelConf.target == "vmlinuz.efi" then "zinstall"
-          else "install"))
-      ];
-
-      # We remove a bunch of stuff that is symlinked from other places to save space,
-      # which trips the broken symlink check. So, just skip it. We'll know if it explodes.
-      dontCheckForBrokenSymlinks = true;
-
-      postInstall = optionalString isModular ''
-        mkdir -p $dev
-        cp vmlinux $dev/
-        if [ -z "''${dontStrip-}" ]; then
-          installFlagsArray+=("INSTALL_MOD_STRIP=1")
-        fi
-        make modules_install $makeFlags "''${makeFlagsArray[@]}" \
-          $installFlags "''${installFlagsArray[@]}"
-        unlink $out/lib/modules/${modDirVersion}/build
-        rm -f $out/lib/modules/${modDirVersion}/source
-
-        mkdir -p $dev/lib/modules/${modDirVersion}/{build,source}
-
-        # To save space, exclude a bunch of unneeded stuff when copying.
-        (cd .. && rsync --archive --prune-empty-dirs \
-            --exclude='/build/' \
-            * $dev/lib/modules/${modDirVersion}/source/)
-
-        cd $dev/lib/modules/${modDirVersion}/source
-
-        cp $buildRoot/{.config,Module.symvers} $dev/lib/modules/${modDirVersion}/build
-        make modules_prepare $makeFlags "''${makeFlagsArray[@]}" O=$dev/lib/modules/${modDirVersion}/build
-
-        # For reproducibility, removes accidental leftovers from a `cc1` call
-        # from a `try-run` call from the Makefile
-        rm -f $dev/lib/modules/${modDirVersion}/build/.[0-9]*.d
-
-        # Keep some extra files on some arches (powerpc, aarch64)
-        for f in arch/powerpc/lib/crtsavres.o arch/arm64/kernel/ftrace-mod.o; do
-          if [ -f "$buildRoot/$f" ]; then
-            cp $buildRoot/$f $dev/lib/modules/${modDirVersion}/build/$f
-          fi
-        done
-
-        # !!! No documentation on how much of the source tree must be kept
-        # If/when kernel builds fail due to missing files, you can add
-        # them here. Note that we may see packages requiring headers
-        # from drivers/ in the future; it adds 50M to keep all of its
-        # headers on 3.10 though.
-
-        chmod u+w -R ..
-        arch=$(cd $dev/lib/modules/${modDirVersion}/build/arch; ls)
-
-        # Remove unused arches
-        for d in $(cd arch/; ls); do
-          if [ "$d" = "$arch" ]; then continue; fi
-          if [ "$arch" = arm64 ] && [ "$d" = arm ]; then continue; fi
-          rm -rf arch/$d
-        done
-
-        # Remove all driver-specific code (50M of which is headers)
-        rm -fR drivers
-
-        # Keep all headers
-        find .  -type f -name '*.h' -print0 | xargs -0 -r chmod u-w
-
-        # Keep linker scripts (they are required for out-of-tree modules on aarch64)
-        find .  -type f -name '*.lds' -print0 | xargs -0 -r chmod u-w
-
-        # Keep root and arch-specific Makefiles
-        chmod u-w Makefile arch/"$arch"/Makefile*
-
-        # Keep whole scripts dir
-        chmod u-w -R scripts
-
-        # Delete everything not kept
-        find . -type f -perm -u=w -print0 | xargs -0 -r rm
-
-        # Delete empty directories
-        find -empty -type d -delete
-      '';
-
-      requiredSystemFeatures = [ "big-parallel" ];
-
-      meta = {
-        # https://github.com/NixOS/nixpkgs/pull/345534#issuecomment-2391238381
-        broken = withRust && lib.versionOlder version "6.12";
-
-        description =
-          "The Linux kernel" +
-          (if kernelPatches == [] then "" else
-            " (with patches: "
-            + lib.concatStringsSep ", " (map (x: x.name) kernelPatches)
-            + ")");
-        license = lib.licenses.gpl2Only;
-        homepage = "https://www.kernel.org/";
-        maintainers = lib.teams.linux-kernel.members ++ [
-          maintainers.thoughtpolice
+        hardeningDisable = [
+          "bindnow"
+          "format"
+          "fortify"
+          "stackprotector"
+          "pic"
+          "pie"
         ];
-        platforms = platforms.linux;
-        badPlatforms =
-          lib.optionals (lib.versionOlder version "4.15") [ "riscv32-linux" "riscv64-linux" ] ++
-          lib.optional (lib.versionOlder version "5.19") "loongarch64-linux";
-        timeout = 14400; # 4 hours
-      } // extraMeta;
-    };
 
-  # Absolute paths for compilers avoid any PATH-clobbering issues.
-  commonMakeFlags = [
-    "ARCH=${stdenv.hostPlatform.linuxArch}"
-    "CROSS_COMPILE=${stdenv.cc.targetPrefix}"
-  ] ++ lib.optionals (stdenv.isx86_64 && stdenv.cc.bintools.isLLVM) [
-    # The wrapper for ld.lld breaks linking the kernel. We use the
-    # unwrapped linker as workaround. See:
-    #
-    # https://github.com/NixOS/nixpkgs/issues/321667
-    "LD=${stdenv.cc.bintools.bintools}/bin/${stdenv.cc.targetPrefix}ld"
-  ] ++ (stdenv.hostPlatform.linux-kernel.makeFlags or [])
-    ++ extraMakeFlags;
-in
+        makeFlags = [
+          "O=$(buildRoot)"
+        ] ++ commonMakeFlags;
 
-stdenv.mkDerivation (
-  builtins.foldl' lib.recursiveUpdate {} [
-    (drvAttrs config stdenv.hostPlatform.linux-kernel kernelPatches configfile)
-    {
-      inherit pname version;
+        passthru = { inherit commonMakeFlags; };
 
-      enableParallelBuilding = true;
-
-      hardeningDisable = [ "bindnow" "format" "fortify" "stackprotector" "pic" "pie" ];
-
-      makeFlags = [
-        "O=$(buildRoot)"
-      ] ++ commonMakeFlags;
-
-      passthru = { inherit commonMakeFlags; };
-
-      karch = stdenv.hostPlatform.linuxArch;
-    }
-    (optionalAttrs (pos != null) { inherit pos; })
-  ]
-))
+        karch = stdenv.hostPlatform.linuxArch;
+      }
+      (optionalAttrs (pos != null) { inherit pos; })
+    ]
+  )
+)
diff --git a/pkgs/rootfs/default.nix b/pkgs/rootfs/default.nix
deleted file mode 100644
index d3c39c3..0000000
--- a/pkgs/rootfs/default.nix
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  pkgs,
-  stdenvNoCC,
-  patosPkgs,
-  version,
-  ...
-}:
-let
-  pname = "patos-rootfs";
-  defaultPassword = "patos";
-in
-stdenvNoCC.mkDerivation (finalAttrs: {
-  inherit version;
-  inherit pname;
-  inherit defaultPassword;
-
-  buildInputs = with pkgs; [
-    glibc
-    binutils
-  ];
-
-  glibcPatos = patosPkgs.glibc.out;
-  systemd = patosPkgs.systemd.out;
-  dbusBroker = patosPkgs.dbus-broker.out;
-  kernel = patosPkgs.kernel;
-  busybox = patosPkgs.busybox.out;
-  kmodLibs = pkgs.kmod.lib;
-  kmodBin = pkgs.kmod.out;
-  cacert = pkgs.cacert.out;
-  libbpf = pkgs.libbpf.out;
-  btrfs = pkgs.btrfs-progs.out;
-  tpm2Libs = patosPkgs.tpm2-tss.out;
-  kexec = patosPkgs.kexec.out;
-  lvm2 = patosPkgs.lvm2.out;
-  openssl = patosPkgs.openssl.out;
-
-  builder = ./mkrootfs.sh;
-})
diff --git a/pkgs/rootfs/mkinitrd.nix b/pkgs/rootfs/mkinitrd.nix
index 3708483..8eb721e 100644
--- a/pkgs/rootfs/mkinitrd.nix
+++ b/pkgs/rootfs/mkinitrd.nix
@@ -1,23 +1,66 @@
 {
   pkgs,
-  stdenvNoCC,
   patosPkgs,
-  version,
+  runCommand,
   ...
 }:
-let
-  pname = "patos-ramdisk";
-in
-stdenvNoCC.mkDerivation (finalAttrs: {
-  inherit version;
-  inherit pname;
-
+runCommand "patos-initrd" {
   buildInputs = with pkgs; [
     cpio
     xz
   ];
+}
+''
+echo "Building initram disk"
+mkdir -p $out/root
+pushd $out/root
 
-  rootfs = patosPkgs.rootfs.out;
+### copy rootfs
+cp -prP ${patosPkgs.rootfs}/* .
+find . -type d -exec chmod 755 {} \;
+mkdir sysroot
 
-  builder = ./mkinitrd.sh;
-})
+### create directories
+ln -sf ../usr/lib/systemd/systemd init
+
+### Create needed files
+echo patos > ./etc/hostname
+
+ln -sf /etc/os-release ./etc/initrd-release
+
+# set default target to initrd inside initrd
+ln -sf initrd.target ./usr/lib/systemd/system/default.target
+
+# bind mount /run to /sysroot/run
+cat <<EOF > ./usr/lib/systemd/system/sysroot-run.mount
+[Unit]
+Before=initrd-fs.target
+DefaultDependencies=false
+
+[Mount]
+Options=bind
+What=/run
+Where=/sysroot/run
+EOF
+mkdir ./usr/lib/systemd/system/initrd-fs.target.requires/
+ln -sf ../sysroot-run.mount ./usr/lib/systemd/system/initrd-fs.target.requires/sysroot-run.mount
+
+# repart: generate crypttab and fstab under /run
+mkdir ./usr/lib/systemd/system/systemd-repart.service.d
+cat <<EOF > ./usr/lib/systemd/system/systemd-repart.service.d/override.conf
+[Unit]
+After=sysroot-run.mount
+Requires=sysroot-run.mount
+
+[Service]
+Environment=SYSTEMD_REPART_MKFS_OPTIONS_BTRFS=--nodiscard
+ExecStart=
+ExecStart=systemd-repart --dry-run=no --generate-crypttab=/run/crypttab --generate-fstab=/run/fstab
+EOF
+
+# gen initrd
+find . -print0 | cpio --null --owner=root:root -o --format=newc | xz -9 --check=crc32 > ../initrd.xz
+
+popd
+rm -rf $out/root
+''
diff --git a/pkgs/rootfs/mkinitrd.sh b/pkgs/rootfs/mkinitrd.sh
deleted file mode 100644
index 43708d0..0000000
--- a/pkgs/rootfs/mkinitrd.sh
+++ /dev/null
@@ -1,53 +0,0 @@
-set -ex -p pipefail
-echo "Building initram disk"
-mkdir -p $out/root
-pushd $out/root
-
-### copy rootfs
-cp -prP $rootfs/* .
-find . -type d -exec chmod 755 {} \;
-mkdir sysroot
-
-### create directories
-ln -sf ../usr/lib/systemd/systemd init
-
-### Create needed files
-echo patos > ./etc/hostname
-
-ln -sf /etc/os-release ./etc/initrd-release
-
-# set default target to initrd inside initrd
-ln -sf initrd.target ./usr/lib/systemd/system/default.target
-
-# bind mount /run to /sysroot/run
-cat <<EOF > ./usr/lib/systemd/system/sysroot-run.mount
-[Unit]
-Before=initrd-fs.target
-DefaultDependencies=false
-
-[Mount]
-Options=bind
-What=/run
-Where=/sysroot/run
-EOF
-mkdir ./usr/lib/systemd/system/initrd-fs.target.requires/
-ln -sf ../sysroot-run.mount ./usr/lib/systemd/system/initrd-fs.target.requires/sysroot-run.mount
-
-# repart: generate crypttab and fstab under /run
-mkdir ./usr/lib/systemd/system/systemd-repart.service.d
-cat <<EOF > ./usr/lib/systemd/system/systemd-repart.service.d/override.conf
-[Unit]
-After=sysroot-run.mount
-Requires=sysroot-run.mount
-
-[Service]
-Environment=SYSTEMD_REPART_MKFS_OPTIONS_BTRFS=--nodiscard
-ExecStart=
-ExecStart=systemd-repart --dry-run=no --generate-crypttab=/run/crypttab --generate-fstab=/run/fstab
-EOF
-
-# gen initrd
-find . -print0 | cpio --null --owner=root:root -o --format=newc | xz -9 --check=crc32 > ../initrd.xz
-
-popd
-rm -rf $out/root
diff --git a/pkgs/rootfs/mkrootfs.sh b/pkgs/rootfs/mkrootfs.nix
similarity index 75%
rename from pkgs/rootfs/mkrootfs.sh
rename to pkgs/rootfs/mkrootfs.nix
index 3ccc93c..fb25c4d 100644
--- a/pkgs/rootfs/mkrootfs.sh
+++ b/pkgs/rootfs/mkrootfs.nix
@@ -1,5 +1,22 @@
-set -ex -o pipefail
+{
+  pkgs,
+  patosPkgs,
+  version,
+  runCommand,
+  ...
+}:
+let
+  defaultPassword = "patos";
+in
 
+runCommand "patos-rootfs"
+{
+  buildInputs = [
+    pkgs.glibc
+    pkgs.binutils
+  ];
+}
+''
 ### create directory structure
 mkdir -p $out/etc/repart.d $out/dev $out/proc $out/sys \
   $out/tmp $out/root $out/run $out/boot $out/mnt $out/home $out/srv $out/var/tmp
@@ -11,7 +28,7 @@ ln -sf ../proc/self/mounts $out/etc/mtab
 
 ### install systemd
 echo "Installing systemd"
-cp -Pr $systemd/* $out/
+cp -Pr ${patosPkgs.systemd}/* $out/
 find $out -type d -exec chmod 755 {} \;
 rm -rf $out/usr/include
 rm -rf $out/usr/sbin
@@ -117,57 +134,57 @@ ManagerEnvironment=PATH=/bin:/sbin:/usr/bin SYSTEMD_CRYPTTAB=/run/crypttab SYSTE
 EOF
 
 ### install PatOS glibc
-cp -P $glibcPatos/lib/*.so* $out/usr/lib/
+cp -P ${patosPkgs.glibc}/lib/*.so* $out/usr/lib/
 
 ### install openssl
-cp -P $openssl/lib/*.so* $out/usr/lib/
-cp -Pr $openssl/etc/ssl $out/etc/
+cp -P ${patosPkgs.openssl}/lib/*.so* $out/usr/lib/
+cp -Pr ${patosPkgs.openssl}/etc/ssl $out/etc/
 
 ### install busybox
-cp $busybox/bin/busybox $out/usr/bin/
+cp ${patosPkgs.busybox}/bin/busybox $out/usr/bin/
 $out/usr/bin/busybox --list | xargs -I {} ln -sf busybox $out/usr/bin/{}
 
 ### install dbus broker
-cp -r $dbusBroker/* $out/
+cp -r ${patosPkgs.dbus-broker}/* $out/
 
 ### install kexec
-cp -Pr ${kexec}/sbin/kexec $out/usr/bin/
+cp -Pr ${patosPkgs.kexec}/sbin/kexec $out/usr/bin/
 
 ### install dmsetup udev rules
-cp -P ${lvm2}/usr/bin/dmsetup $out/usr/bin/
-cp -P ${lvm2}/lib/libdevmapper.so* $out/usr/lib/
-cp -P ${lvm2}/lib/udev/rules.d/* $out/usr/lib/udev/rules.d/
+cp -P ${patosPkgs.lvm2}/usr/bin/dmsetup $out/usr/bin/
+cp -P ${patosPkgs.lvm2}/lib/libdevmapper.so* $out/usr/lib/
+cp -P ${patosPkgs.lvm2}/lib/udev/rules.d/* $out/usr/lib/udev/rules.d/
 
 ### install btrfs progs
-cp -Pr ${btrfs}/bin/* $out/usr/bin/
-cp -Pr ${btrfs}/lib/* $out/usr/lib/
+cp -Pr ${pkgs.btrfs-progs}/bin/* $out/usr/bin/
+cp -Pr ${pkgs.btrfs-progs}/lib/* $out/usr/lib/
 
 ### install tpm2 libs
-cp -P ${tpm2Libs}/lib/*.so* $out/usr/lib/
+cp -P ${patosPkgs.tpm2-tss}/lib/*.so* $out/usr/lib/
 
 ### install lib kmod
-cp -P $kmodLibs/lib/*.so* $out/usr/lib/
-cp -P $kmodBin/bin/* $out/usr/bin
+cp -P ${pkgs.kmod.lib}/lib/*.so* $out/usr/lib/
+cp -P ${pkgs.kmod}/bin/* $out/usr/bin
 
 ### install libbpf
-cp -P $libbpf/lib/libbpf*.so* $out/usr/lib
+cp -P ${pkgs.libbpf}/lib/libbpf*.so* $out/usr/lib
 
 ### install ca cert bundle
 chmod 755 $out/etc/ssl $out/etc/ssl/certs
-cp -P $cacert/etc/ssl/certs/ca-bundle.crt $out/etc/ssl/cert.pem
+cp -P ${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt $out/etc/ssl/cert.pem
 ln -sf ../cert.pem $out/etc/ssl/certs/ca-certificates.crt
 ln -sf ../cert.pem $out/etc/ssl/certs/ca-bundle.crt
 
 # setup default files
-$systemd/usr/bin/systemd-hwdb --root=$out --usr update
-$systemd/usr/bin/systemd-tmpfiles --root=$out $out/usr/lib/tmpfiles.d/etc.conf --create
+${patosPkgs.systemd}/usr/bin/systemd-hwdb --root=$out --usr update
+${patosPkgs.systemd}/usr/bin/systemd-tmpfiles --root=$out $out/usr/lib/tmpfiles.d/etc.conf --create
 cp $out/usr/share/factory/etc/nsswitch.conf $out/etc/
 cp $out/usr/share/factory/etc/locale.conf $out/etc/
 cp $out/usr/share/factory/etc/vconsole.conf $out/etc/
 # install sys users
 mkdir creds
-echo -n $defaultPassword > creds/passwd.plaintext-password.root
-CREDENTIALS_DIRECTORY=$PWD/creds SYSTEMD_CRYPT_PREFIX='$6$' $systemd/usr/bin/systemd-sysusers --root=$out rootfs/usr/lib/sysusers.d/*.conf
+echo -n ${defaultPassword} > creds/passwd.plaintext-password.root
+CREDENTIALS_DIRECTORY=$PWD/creds SYSTEMD_CRYPT_PREFIX='$6$' ${patosPkgs.systemd}/usr/bin/systemd-sysusers --root=$out rootfs/usr/lib/sysusers.d/*.conf
 chmod 600 $out/etc/shadow
 rm -rf creds
 
@@ -195,6 +212,6 @@ find $out -type f -executable -exec strip {} \;
 find $out -type d -exec chmod 755 {} \;
 
 ### install kernel modules
-cp -r $kernel/lib/modules $out/usr/lib/
+cp -r ${patosPkgs.kernel}/lib/modules $out/usr/lib/
 find $out/usr/lib/modules -type d -exec chmod 755 {} \;
-
+''

From df3a42da4be1a24bf96fee185483e3b49b75bb53 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Mon, 17 Mar 2025 17:03:52 +0100
Subject: [PATCH 58/78] chore: more clean up

---
 pkgs/image/default.nix   |  4 +---
 pkgs/rootfs/mkrootfs.nix | 13 +++++++------
 2 files changed, 8 insertions(+), 9 deletions(-)

diff --git a/pkgs/image/default.nix b/pkgs/image/default.nix
index 7d5f565..e82b49a 100644
--- a/pkgs/image/default.nix
+++ b/pkgs/image/default.nix
@@ -15,9 +15,7 @@ runCommand pname {
     erofs-utils
     dosfstools
     mtools
-    e2fsprogs
     jq
-    openssl
   ];
 
   env = {
@@ -159,7 +157,7 @@ ${patosPkgs.systemd}/usr/bin/systemd-repart \
   --size=auto \
   --definitions=./final.repart.d \
   --root=$out \
-  patos-$version.raw > final-repart-output.json
+  patos-${version}.raw > final-repart-output.json
 
 rm -rf rootfs
 
diff --git a/pkgs/rootfs/mkrootfs.nix b/pkgs/rootfs/mkrootfs.nix
index fb25c4d..a40e17b 100644
--- a/pkgs/rootfs/mkrootfs.nix
+++ b/pkgs/rootfs/mkrootfs.nix
@@ -11,6 +11,8 @@ in
 
 runCommand "patos-rootfs"
 {
+  inherit version;
+
   buildInputs = [
     pkgs.glibc
     pkgs.binutils
@@ -175,6 +177,9 @@ cp -P ${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt $out/etc/ssl/cert.pem
 ln -sf ../cert.pem $out/etc/ssl/certs/ca-certificates.crt
 ln -sf ../cert.pem $out/etc/ssl/certs/ca-bundle.crt
 
+# no need for pkgconfig, removing..
+rm -rf $out/usr/lib/pkgconfig
+
 # setup default files
 ${patosPkgs.systemd}/usr/bin/systemd-hwdb --root=$out --usr update
 ${patosPkgs.systemd}/usr/bin/systemd-tmpfiles --root=$out $out/usr/lib/tmpfiles.d/etc.conf --create
@@ -188,13 +193,9 @@ CREDENTIALS_DIRECTORY=$PWD/creds SYSTEMD_CRYPT_PREFIX='$6$' ${patosPkgs.systemd}
 chmod 600 $out/etc/shadow
 rm -rf creds
 
-
 # Ephemeral machine-id until registration
 ln -sf /run/machine-id $out/etc/machine-id
 
-# remove pkgconfig
-rm -rf $out/usr/lib/pkgconfig
-
 ### Find and install all shared libs
 find $out -type f -executable -exec ldd {} \; | awk '{print $3}' | \
   grep -vE "(systemd|glibc|openssl|tpm2|devmapper)" | \
@@ -202,7 +203,7 @@ find $out -type f -executable -exec ldd {} \; | awk '{print $3}' | \
 
 find $out -type f -executable -exec chmod 755 {} \;
 
-# FIXME: ELF patching. Is there a better way?
+# patch ELFs
 find $out -type f -executable -exec patchelf --set-rpath /lib:/usr/lib:/usr/lib/systemd:/usr/lib/cryptsetup {} \;
 find $out -type f -executable -exec patchelf --set-interpreter /lib/ld-linux-x86-64.so.2 {} \;
 patchelf --remove-rpath $out/usr/lib/ld-linux-x86-64.so.2
@@ -211,7 +212,7 @@ patchelf --remove-rpath $out/usr/lib/ld-linux-x86-64.so.2
 find $out -type f -executable -exec strip {} \;
 find $out -type d -exec chmod 755 {} \;
 
-### install kernel modules
+# install kernel modules
 cp -r ${patosPkgs.kernel}/lib/modules $out/usr/lib/
 find $out/usr/lib/modules -type d -exec chmod 755 {} \;
 ''

From dc8ed2a7741810ab6806fb078eded015ef147e6e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Mon, 17 Mar 2025 22:22:35 +0100
Subject: [PATCH 59/78] feat: enable factory reset

---
 pkgs/image/default.nix   | 27 +++++++++++++++++++++++----
 pkgs/rootfs/mkinitrd.nix |  1 +
 pkgs/rootfs/mkrootfs.nix | 17 ++++++++++-------
 3 files changed, 34 insertions(+), 11 deletions(-)

diff --git a/pkgs/image/default.nix b/pkgs/image/default.nix
index e82b49a..e82bc3d 100644
--- a/pkgs/image/default.nix
+++ b/pkgs/image/default.nix
@@ -27,7 +27,7 @@ runCommand pname {
   kernelCmdLine = "console=ttyS0";
 }
 ''
-mkdir -p $out/init.repart.d $out/final.repart.d $out/boot
+mkdir -p $out/init.repart.d $out/final.repart.d
 pushd $out
 
 # Don't seem to work just to create a symlink to rootfs derivation?
@@ -106,9 +106,28 @@ SYSTEMD_RELAX_ESP_CHECKS=1 ${patosPkgs.systemd}/usr/bin/bootctl install --root .
   --secure-boot-auto-enroll=true --certificate=${patosPkgs.cert}/cert.pem --private-key=${patosPkgs.cert}/key.pem
 echo "timeout 2" > rootfs/boot/loader/loader.conf
 
+# setup factory reset
+mkdir -p rootfs/boot/EFI/tools
+cp ${pkgs.edk2-uefi-shell}/shell.efi rootfs/boot/EFI/tools/
+
+cat <<EOF > rootfs/boot/EFI/tools/factoryreset.nsh
+setvar FactoryReset -guid 8cf2644b-4b0b-428f-9387-6d876050dc67 -nv -rt =%1
+reset
+EOF
+
+cat <<EOF > rootfs/boot/loader/entries/factoryreset.conf
+title Enable Factory Reset
+options -nostartup -nomap
+options \EFI\tools\factoryreset.nsh L"t"
+efi EFI/tools/shell.efi
+EOF
+
 # sign EFIs
 ${patosPkgs.systemd}/usr/lib/systemd/systemd-sbsign sign --certificate=${patosPkgs.cert}/cert.pem --private-key=${patosPkgs.cert}/key.pem \
-  rootfs/boot/EFI/BOOT/BOOTX64.EFI  --output=rootfs/boot/EFI/BOOT/BOOTX64.EFI
+  rootfs/boot/EFI/tools/shell.efi --output=rootfs/boot/EFI/tools/shell.efi
+
+${patosPkgs.systemd}/usr/lib/systemd/systemd-sbsign sign --certificate=${patosPkgs.cert}/cert.pem --private-key=${patosPkgs.cert}/key.pem \
+  rootfs/boot/EFI/BOOT/BOOTX64.EFI --output=rootfs/boot/EFI/BOOT/BOOTX64.EFI
 
 ${patosPkgs.systemd}/usr/lib/systemd/systemd-sbsign sign --certificate=${patosPkgs.cert}/cert.pem --private-key=${patosPkgs.cert}/key.pem \
   patos_${version}.efi --output=patos_${version}.efi
@@ -123,8 +142,8 @@ cat <<EOF > final.repart.d/10-esp.conf
 [Partition]
 Type=esp
 Format=vfat
-SizeMinBytes=160M
-SizeMaxBytes=160M
+SizeMinBytes=96M
+SizeMaxBytes=96M
 CopyFiles=/rootfs/boot:/
 EOF
 
diff --git a/pkgs/rootfs/mkinitrd.nix b/pkgs/rootfs/mkinitrd.nix
index 8eb721e..2187514 100644
--- a/pkgs/rootfs/mkinitrd.nix
+++ b/pkgs/rootfs/mkinitrd.nix
@@ -57,6 +57,7 @@ Environment=SYSTEMD_REPART_MKFS_OPTIONS_BTRFS=--nodiscard
 ExecStart=
 ExecStart=systemd-repart --dry-run=no --generate-crypttab=/run/crypttab --generate-fstab=/run/fstab
 EOF
+ln -sf ../systemd-repart.service ./usr/lib/systemd/system/initrd-root-fs.target.wants/systemd-repart.service
 
 # gen initrd
 find . -print0 | cpio --null --owner=root:root -o --format=newc | xz -9 --check=crc32 > ../initrd.xz
diff --git a/pkgs/rootfs/mkrootfs.nix b/pkgs/rootfs/mkrootfs.nix
index a40e17b..ca449b3 100644
--- a/pkgs/rootfs/mkrootfs.nix
+++ b/pkgs/rootfs/mkrootfs.nix
@@ -3,7 +3,6 @@
   patosPkgs,
   version,
   runCommand,
-  ...
 }:
 let
   defaultPassword = "patos";
@@ -13,10 +12,11 @@ runCommand "patos-rootfs"
 {
   inherit version;
 
-  buildInputs = [
-    pkgs.glibc
-    pkgs.binutils
+  buildInputs = with pkgs;[
+    glibc
+    binutils
   ];
+
 }
 ''
 ### create directory structure
@@ -29,13 +29,16 @@ ln -sf /usr/lib $out/lib64
 ln -sf ../proc/self/mounts $out/etc/mtab
 
 ### install systemd
-echo "Installing systemd"
 cp -Pr ${patosPkgs.systemd}/* $out/
 find $out -type d -exec chmod 755 {} \;
 rm -rf $out/usr/include
 rm -rf $out/usr/sbin
 ln -sf /usr/bin $out/usr/sbin
 rm -f $out/usr/lib/systemd/system/sysinit.target.wants/systemd-firstboot.service
+# enable in ramdisk instead
+rm -f $out/usr/lib/systemd/system/sysinit.target.wants/systemd-repart.service
+rm -f $out/usr/lib/systemd/system/initrd-root-fs.target.wants/systemd-repart.service
+
 rm -f $out/usr/lib/systemd/ukify
 rm -f $out/usr/bin/ukify
 rm -f $out/usr/lib/udev/rules.d/90-vconsole.rules
@@ -71,8 +74,8 @@ cat <<EOF > $out/etc/repart.d/10-esp.conf
 [Partition]
 Type=esp
 Format=vfat
-SizeMaxBytes=160M
-SizeMinBytes=160M
+SizeMaxBytes=96M
+SizeMinBytes=96M
 EOF
 
 cat <<EOF > $out/etc/repart.d/20-root-a.conf

From 8fb3174c7868f39470a0070462344f7e64a5d6b7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Mon, 17 Mar 2025 22:22:35 +0100
Subject: [PATCH 60/78] feat: enroll secure boot at first boot

---
 pkgs/image/default.nix   | 32 +++++++++++++++++-------------
 pkgs/rootfs/mkinitrd.nix | 43 ++++++++++++++++++++++++++++++++++++++++
 pkgs/rootfs/mkrootfs.nix |  8 +++++++-
 3 files changed, 68 insertions(+), 15 deletions(-)

diff --git a/pkgs/image/default.nix b/pkgs/image/default.nix
index e82bc3d..2084901 100644
--- a/pkgs/image/default.nix
+++ b/pkgs/image/default.nix
@@ -54,6 +54,22 @@ mv rootfs/usr/lib/systemd/network/89-ethernet.network.example rootfs/usr/lib/sys
 ln -sf ../systemd-confext.service rootfs/usr/lib/systemd/system/sysinit.target.wants/systemd-confext.service
 ln -sf ../systemd-sysext.service rootfs/usr/lib/systemd/system/sysinit.target.wants/systemd-sysext.service
 
+cat <<EOF > rootfs/usr/lib/systemd/system/secure-boot-import-keys.service
+[Unit]
+Description=Import Secure Boot keys
+DefaultDependencies=no
+RequiresMountsFor=/var/lib/sbctl /boot
+ConditionPathExists=/boot/sbctl/keys
+After=local-fs.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=sbctl import-keys -d /boot/sbctl/keys
+ExecStartPost=rm -rf /boot/sbctl
+EOF
+ln -sf ../secure-boot-import-keys.service rootfs/usr/lib/systemd/system/sysinit.target.wants/secure-boot-import-keys.service
+
 # Initial partitioning
 cat <<EOF > init.repart.d/10-root.conf
 [Partition]
@@ -102,9 +118,7 @@ ${patosPkgs.systemd}/usr/bin/ukify build \
   -o patos_${version}.efi
 
 # install ESP
-SYSTEMD_RELAX_ESP_CHECKS=1 ${patosPkgs.systemd}/usr/bin/bootctl install --root ./rootfs --esp-path /boot \
-  --secure-boot-auto-enroll=true --certificate=${patosPkgs.cert}/cert.pem --private-key=${patosPkgs.cert}/key.pem
-echo "timeout 2" > rootfs/boot/loader/loader.conf
+SYSTEMD_RELAX_ESP_CHECKS=1 ${patosPkgs.systemd}/usr/bin/bootctl install --root ./rootfs --esp-path /boot
 
 # setup factory reset
 mkdir -p rootfs/boot/EFI/tools
@@ -122,21 +136,11 @@ options \EFI\tools\factoryreset.nsh L"t"
 efi EFI/tools/shell.efi
 EOF
 
-# sign EFIs
-${patosPkgs.systemd}/usr/lib/systemd/systemd-sbsign sign --certificate=${patosPkgs.cert}/cert.pem --private-key=${patosPkgs.cert}/key.pem \
-  rootfs/boot/EFI/tools/shell.efi --output=rootfs/boot/EFI/tools/shell.efi
-
-${patosPkgs.systemd}/usr/lib/systemd/systemd-sbsign sign --certificate=${patosPkgs.cert}/cert.pem --private-key=${patosPkgs.cert}/key.pem \
-  rootfs/boot/EFI/BOOT/BOOTX64.EFI --output=rootfs/boot/EFI/BOOT/BOOTX64.EFI
-
-${patosPkgs.systemd}/usr/lib/systemd/systemd-sbsign sign --certificate=${patosPkgs.cert}/cert.pem --private-key=${patosPkgs.cert}/key.pem \
-  patos_${version}.efi --output=patos_${version}.efi
+echo "timeout 2" > rootfs/boot/loader/loader.conf
 
 # install UKI
 cp patos_${version}.efi rootfs/boot/EFI/Linux
 
-echo "secure-boot-enroll force" >> rootfs/boot/loader/loader.conf
-
 # Final partitioning
 cat <<EOF > final.repart.d/10-esp.conf
 [Partition]
diff --git a/pkgs/rootfs/mkinitrd.nix b/pkgs/rootfs/mkinitrd.nix
index 2187514..5cc6411 100644
--- a/pkgs/rootfs/mkinitrd.nix
+++ b/pkgs/rootfs/mkinitrd.nix
@@ -31,6 +31,49 @@ ln -sf /etc/os-release ./etc/initrd-release
 # set default target to initrd inside initrd
 ln -sf initrd.target ./usr/lib/systemd/system/default.target
 
+# setup secure boot
+cat <<EOF > ./usr/bin/secure-boot-enroll
+#!/bin/sh
+set -ex -o pipefail
+
+SETUP_MODE=\$(sbctl status --json | xq -r '.setup_mode')
+
+[ "\$SETUP_MODE" = "false" ] && exit 0
+
+cat <<EOL> /run/sbctl.yml
+---
+keydir: /sysroot/boot/sbctl/keys
+guid: /sysroot/boot/sbctl/GUID
+EOL
+
+ESP=\$(blkid --label ESP)
+
+mount \$ESP /sysroot/boot && \
+  sbctl --config /run/sbctl.yml create-keys && \
+  sbctl --config /run/sbctl.yml enroll-keys --yolo && \
+  # Sign EFIs
+  find /sysroot/boot -type f \( -iname "*.efi" -o -iname "*.EFI" \) -print0 | xargs -I {} sbctl --config /run/sbctl.yml sign {}
+
+umount /sysroot/boot && \
+  systemctl reboot -f
+EOF
+chmod +x ./usr/bin/secure-boot-enroll
+
+cat <<EOF > ./usr/lib/systemd/system/secure-boot-enroll.service
+[Unit]
+Description=Enroll Secure Boot
+DefaultDependencies=false
+After=sysroot-run.mount
+Requires=sysroot-run.mount
+Before=systemd-repart.service initrd.target shutdown.target sysinit.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/secure-boot-enroll
+RemainAfterExit=yes
+EOF
+ln -sf ../secure-boot-enroll.service ./usr/lib/systemd/system/initrd-root-fs.target.wants/secure-boot-enroll.service
+
 # bind mount /run to /sysroot/run
 cat <<EOF > ./usr/lib/systemd/system/sysroot-run.mount
 [Unit]
diff --git a/pkgs/rootfs/mkrootfs.nix b/pkgs/rootfs/mkrootfs.nix
index ca449b3..f98a219 100644
--- a/pkgs/rootfs/mkrootfs.nix
+++ b/pkgs/rootfs/mkrootfs.nix
@@ -172,7 +172,13 @@ cp -P ${pkgs.kmod.lib}/lib/*.so* $out/usr/lib/
 cp -P ${pkgs.kmod}/bin/* $out/usr/bin
 
 ### install libbpf
-cp -P ${pkgs.libbpf}/lib/libbpf*.so* $out/usr/lib
+cp -P ${pkgs.libbpf}/lib/libbpf*.so* $out/usr/lib/
+
+### install secure boot tools
+cp -P ${pkgs.sbctl}/bin/sbctl $out/usr/bin/
+rm -f $out/usr/bin/blkid
+cp -P ${pkgs.util-linuxMinimal}/bin/blkid $out/usr/bin/
+cp -P ${pkgs.xq}/bin/xq $out/usr/bin/
 
 ### install ca cert bundle
 chmod 755 $out/etc/ssl $out/etc/ssl/certs

From a7b86fd03e26caf9429a12ac84dadaf9969aff5e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Mon, 17 Mar 2025 22:22:35 +0100
Subject: [PATCH 61/78] feat: add sysupdate definitions

---
 flake.nix                         |  3 +-
 pkgs/image/default.nix            | 66 +++++++++++++++++++++++++++++--
 pkgs/rootfs/mkinitrd.nix          | 31 +++------------
 pkgs/rootfs/mkrootfs.nix          |  9 ++++-
 pkgs/rootfs/secure-boot-enroll.sh | 37 +++++++++++++++++
 5 files changed, 114 insertions(+), 32 deletions(-)
 create mode 100644 pkgs/rootfs/secure-boot-enroll.sh

diff --git a/flake.nix b/flake.nix
index 2358ab1..7c17fff 100644
--- a/flake.nix
+++ b/flake.nix
@@ -18,11 +18,12 @@
         pkgs = import nixpkgs { inherit system; };
         patosPkgs = self.packages.${system};
         version = "0.0.1";
+        updateUrl = "http://10.0.2.2:8000";
       in
       {
         packages = {
           default = patosPkgs.image;
-          image = pkgs.callPackage ./pkgs/image { inherit patosPkgs version; };
+          image = pkgs.callPackage ./pkgs/image { inherit patosPkgs version updateUrl; };
           rootfs = pkgs.callPackage ./pkgs/rootfs/mkrootfs.nix { inherit patosPkgs version; };
           initrd = pkgs.callPackage ./pkgs/rootfs/mkinitrd.nix { inherit patosPkgs version; };
           kernel = pkgs.callPackage ./pkgs/kernel { };
diff --git a/pkgs/image/default.nix b/pkgs/image/default.nix
index 2084901..8f3acbf 100644
--- a/pkgs/image/default.nix
+++ b/pkgs/image/default.nix
@@ -3,13 +3,14 @@
   patosPkgs,
   version,
   runCommand,
-  ...
+  updateUrl
 }:
 let
   pname = "patos-image";
 in
 runCommand pname {
   inherit version;
+  inherit updateUrl;
 
   buildInputs = with pkgs; [
     erofs-utils
@@ -24,7 +25,7 @@ runCommand pname {
     SYSTEMD_REPART_MKFS_OPTIONS_EROFS = "--all-root"; # -zlz4hc,12 -C1048576 -Efragments,dedupe,ztailpacking";
   };
 
-  kernelCmdLine = "console=ttyS0";
+  kernelCmdLine = "console=ttyS0 patos.secureboot=true";
 }
 ''
 mkdir -p $out/init.repart.d $out/final.repart.d
@@ -70,6 +71,63 @@ ExecStartPost=rm -rf /boot/sbctl
 EOF
 ln -sf ../secure-boot-import-keys.service rootfs/usr/lib/systemd/system/sysinit.target.wants/secure-boot-import-keys.service
 
+# sysupdate
+mkdir -p rootfs/etc/sysupdate.d
+cat <<EOF > rootfs/etc/sysupdate.d/10-uki.transfer
+[Source]
+Path=${updateUrl}
+MatchPattern=patos_@v.efi
+Type=url-file
+
+[Target]
+InstancesMax=2
+MatchPattern=patos_@v+@l-@d.efi patos_@v+@l.efi patos_@v.efi
+Mode=0444
+Path=/EFI/Linux
+PathRelativeTo=esp
+TriesDone=0
+TriesLeft=3
+Type=regular-file
+
+[Transfer]
+Verify=no
+EOF
+
+cat <<EOF > rootfs/etc/sysupdate.d/20-root.transfer
+[Source]
+Type=url-file
+Path=${updateUrl}
+MatchPattern=patos_@v_@u.verity
+
+[Target]
+Type=partition
+Path=auto
+MatchPattern=verity-@v
+MatchPartitionType=root-verity
+ReadOnly=1
+
+[Transfer]
+Verify=no
+EOF
+
+cat <<EOF > rootfs/etc/sysupdate.d/22-root.transfer
+[Source]
+Type=url-file
+Path=${updateUrl}
+MatchPattern=patos_@v_@u.root
+
+[Target]
+Type=partition
+Path=auto
+MatchPattern=root-@v
+MatchPartitionType=root
+ReadOnly=1
+
+[Transfer]
+Verify=no
+EOF
+
+
 # Initial partitioning
 cat <<EOF > init.repart.d/10-root.conf
 [Partition]
@@ -146,8 +204,8 @@ cat <<EOF > final.repart.d/10-esp.conf
 [Partition]
 Type=esp
 Format=vfat
-SizeMinBytes=96M
-SizeMaxBytes=96M
+SizeMinBytes=128M
+SizeMaxBytes=128M
 CopyFiles=/rootfs/boot:/
 EOF
 
diff --git a/pkgs/rootfs/mkinitrd.nix b/pkgs/rootfs/mkinitrd.nix
index 5cc6411..10399a6 100644
--- a/pkgs/rootfs/mkinitrd.nix
+++ b/pkgs/rootfs/mkinitrd.nix
@@ -4,7 +4,12 @@
   runCommand,
   ...
 }:
+let
+  secureBootEnroll = ./secure-boot-enroll.sh;
+in
 runCommand "patos-initrd" {
+  inherit secureBootEnroll;
+
   buildInputs = with pkgs; [
     cpio
     xz
@@ -32,31 +37,7 @@ ln -sf /etc/os-release ./etc/initrd-release
 ln -sf initrd.target ./usr/lib/systemd/system/default.target
 
 # setup secure boot
-cat <<EOF > ./usr/bin/secure-boot-enroll
-#!/bin/sh
-set -ex -o pipefail
-
-SETUP_MODE=\$(sbctl status --json | xq -r '.setup_mode')
-
-[ "\$SETUP_MODE" = "false" ] && exit 0
-
-cat <<EOL> /run/sbctl.yml
----
-keydir: /sysroot/boot/sbctl/keys
-guid: /sysroot/boot/sbctl/GUID
-EOL
-
-ESP=\$(blkid --label ESP)
-
-mount \$ESP /sysroot/boot && \
-  sbctl --config /run/sbctl.yml create-keys && \
-  sbctl --config /run/sbctl.yml enroll-keys --yolo && \
-  # Sign EFIs
-  find /sysroot/boot -type f \( -iname "*.efi" -o -iname "*.EFI" \) -print0 | xargs -I {} sbctl --config /run/sbctl.yml sign {}
-
-umount /sysroot/boot && \
-  systemctl reboot -f
-EOF
+cat $secureBootEnroll > ./usr/bin/secure-boot-enroll
 chmod +x ./usr/bin/secure-boot-enroll
 
 cat <<EOF > ./usr/lib/systemd/system/secure-boot-enroll.service
diff --git a/pkgs/rootfs/mkrootfs.nix b/pkgs/rootfs/mkrootfs.nix
index f98a219..61e99d1 100644
--- a/pkgs/rootfs/mkrootfs.nix
+++ b/pkgs/rootfs/mkrootfs.nix
@@ -74,8 +74,8 @@ cat <<EOF > $out/etc/repart.d/10-esp.conf
 [Partition]
 Type=esp
 Format=vfat
-SizeMaxBytes=96M
-SizeMinBytes=96M
+SizeMaxBytes=128M
+SizeMinBytes=128M
 EOF
 
 cat <<EOF > $out/etc/repart.d/20-root-a.conf
@@ -178,7 +178,12 @@ cp -P ${pkgs.libbpf}/lib/libbpf*.so* $out/usr/lib/
 cp -P ${pkgs.sbctl}/bin/sbctl $out/usr/bin/
 rm -f $out/usr/bin/blkid
 cp -P ${pkgs.util-linuxMinimal}/bin/blkid $out/usr/bin/
+cp -P ${pkgs.util-linuxMinimal}/bin/lsblk $out/usr/bin/
+cp -P ${pkgs.bash}/bin/bash $out/usr/bin/
+
+### install xq (jq clone)
 cp -P ${pkgs.xq}/bin/xq $out/usr/bin/
+ln -sf /usr/bin/xq $out/usr/bin/jq
 
 ### install ca cert bundle
 chmod 755 $out/etc/ssl $out/etc/ssl/certs
diff --git a/pkgs/rootfs/secure-boot-enroll.sh b/pkgs/rootfs/secure-boot-enroll.sh
new file mode 100644
index 0000000..9546027
--- /dev/null
+++ b/pkgs/rootfs/secure-boot-enroll.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+set -ex -uo pipefail
+
+enroll=
+for o in $(< /proc/cmdline); do
+    case $o in
+        patos.secureboot=*)
+            enroll=${o#*=}
+            ;;
+    esac
+done
+
+if [ -z "$enroll" ]; then
+  echo 'No patos.secureboot= parameter on the kernel command line' >&2
+  exit 0
+fi
+
+SETUP_MODE=$(sbctl status --json | jq -r '.setup_mode')
+
+[ "$SETUP_MODE" = "false" -o "$enroll" != "true" ] && exit 0
+
+cat <<EOL> /run/sbctl.yml
+---
+keydir: /sysroot/boot/sbctl/keys
+guid: /sysroot/boot/sbctl/GUID
+EOL
+
+ESP=$(blkid --label ESP)
+
+mount $ESP /sysroot/boot && \
+  sbctl --config /run/sbctl.yml create-keys && \
+  sbctl --config /run/sbctl.yml enroll-keys --yolo && \
+  # Sign EFIs
+  find /sysroot/boot -type f \( -iname "*.efi" -o -iname "*.EFI" \) -print0 | xargs -I {} sbctl --config /run/sbctl.yml sign {}
+
+umount /sysroot/boot && \
+  systemctl reboot -f

From 91a5646555d4c9c2337d42d504c2a118a7591090 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 19 Mar 2025 13:21:52 +0100
Subject: [PATCH 62/78] fix: include uuid in sysupdate images

---
 flake.nix              |  2 +-
 pkgs/image/default.nix | 10 +++++++---
 2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/flake.nix b/flake.nix
index 7c17fff..9e92cc8 100644
--- a/flake.nix
+++ b/flake.nix
@@ -18,7 +18,7 @@
         pkgs = import nixpkgs { inherit system; };
         patosPkgs = self.packages.${system};
         version = "0.0.1";
-        updateUrl = "http://10.0.2.2:8000";
+        updateUrl = "http://10.0.2.2:8000/";
       in
       {
         packages = {
diff --git a/pkgs/image/default.nix b/pkgs/image/default.nix
index 8f3acbf..e0a4a24 100644
--- a/pkgs/image/default.nix
+++ b/pkgs/image/default.nix
@@ -93,7 +93,7 @@ Type=regular-file
 Verify=no
 EOF
 
-cat <<EOF > rootfs/etc/sysupdate.d/20-root.transfer
+cat <<EOF > rootfs/etc/sysupdate.d/20-root-verity.transfer
 [Source]
 Type=url-file
 Path=${updateUrl}
@@ -159,7 +159,7 @@ ${patosPkgs.systemd}/usr/bin/systemd-repart \
   --split=true \
   --json=pretty \
   --root=$out \
-  patos-$version.raw > init-repart-output.json && rm -f patos-$version.raw
+  patos_$version.raw > init-repart-output.json && rm -f patos_$version.raw
 
 roothash=$(jq -r '.[0].roothash' init-repart-output.json)
 rootPart=$(jq -r '.[0].split_path' init-repart-output.json)
@@ -168,6 +168,9 @@ rootUuid=$(jq -r '.[0].uuid' init-repart-output.json)
 verityPart=$(jq -r '.[1].split_path' init-repart-output.json)
 verityUuid=$(jq -r '.[1].uuid' init-repart-output.json)
 
+ln -sf patos_$version.verity.raw patos_${version}_$verityUuid.verity
+ln -sf patos_$version.root.raw patos_${version}_$rootUuid.root
+
 ${patosPkgs.systemd}/usr/bin/ukify build \
   --linux ${patosPkgs.kernel}/bzImage \
   --initrd ${patosPkgs.initrd}/initrd.xz \
@@ -238,9 +241,10 @@ ${patosPkgs.systemd}/usr/bin/systemd-repart \
   --size=auto \
   --definitions=./final.repart.d \
   --root=$out \
-  patos-${version}.raw > final-repart-output.json
+  patos_${version}.img > final-repart-output.json
 
 rm -rf rootfs
+sha256sum *.root *.verity *.efi > SHA256SUMS
 
 popd
 ''

From 6819565d790d5a6228161e9dd2b57f447566d5cc Mon Sep 17 00:00:00 2001
From: Daniel Lundin <dln@arity.se>
Date: Wed, 19 Mar 2025 19:50:39 +0100
Subject: [PATCH 63/78] qemu: remove unused ssh port forward

---
 utils/qemu-uefi-tpm.nix | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/utils/qemu-uefi-tpm.nix b/utils/qemu-uefi-tpm.nix
index 4fcadfd..9087ada 100644
--- a/utils/qemu-uefi-tpm.nix
+++ b/utils/qemu-uefi-tpm.nix
@@ -12,7 +12,10 @@ pkgs.writeShellApplication {
 
   text =
     let
-      tpmOVMF = pkgs.OVMF.override { tpmSupport = true; secureBoot = true; };
+      tpmOVMF = pkgs.OVMF.override {
+        tpmSupport = true;
+        secureBoot = true;
+      };
     in
     ''
       set -ex
@@ -44,7 +47,6 @@ pkgs.writeShellApplication {
         -chardev socket,id=chrtpm,path="$state/swtpm-sock" \
         -tpmdev emulator,id=tpm0,chardev=chrtpm \
         -device tpm-tis,tpmdev=tpm0 \
-        -netdev id=net00,type=user,hostfwd=tcp::2222-:22 \
         -device virtio-net-pci,netdev=net00 \
         -drive "format=qcow2,file=$state/disk.qcow2"
     '';

From c748e172796965769cc28c63ae574f1da4f62a4e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 19 Mar 2025 15:03:15 +0100
Subject: [PATCH 64/78] chore(sb): use systemd kernel cmdline condition

---
 pkgs/image/default.nix            |  8 +++-----
 pkgs/rootfs/mkinitrd.nix          |  2 ++
 pkgs/rootfs/mkrootfs.nix          | 13 ++++---------
 pkgs/rootfs/secure-boot-enroll.sh | 18 ++----------------
 4 files changed, 11 insertions(+), 30 deletions(-)

diff --git a/pkgs/image/default.nix b/pkgs/image/default.nix
index e0a4a24..94748a3 100644
--- a/pkgs/image/default.nix
+++ b/pkgs/image/default.nix
@@ -22,7 +22,7 @@ runCommand pname {
   env = {
     # vfat options won't efi won't find the fs otherwise.
     SYSTEMD_REPART_MKFS_OPTIONS_VFAT = "-S 512 -c";
-    SYSTEMD_REPART_MKFS_OPTIONS_EROFS = "--all-root"; # -zlz4hc,12 -C1048576 -Efragments,dedupe,ztailpacking";
+    SYSTEMD_REPART_MKFS_OPTIONS_EROFS = "--all-root -zlz4hc,12 -C1048576 -Efragments,dedupe,ztailpacking";
   };
 
   kernelCmdLine = "console=ttyS0 patos.secureboot=true";
@@ -218,8 +218,8 @@ Type=root
 Label=root-${version}
 CopyBlocks=/$rootPart
 UUID=$rootUuid
-SizeMinBytes=256M
-SizeMaxBytes=256M
+SizeMinBytes=64M
+SizeMaxBytes=64M
 ReadOnly=1
 EOF
 
@@ -229,8 +229,6 @@ Type=root-verity
 Label=verity-${version}
 CopyBlocks=/$verityPart
 UUID=$verityUuid
-SizeMinBytes=10M
-SizeMaxBytes=10M
 ReadOnly=1
 EOF
 
diff --git a/pkgs/rootfs/mkinitrd.nix b/pkgs/rootfs/mkinitrd.nix
index 10399a6..c46ed9d 100644
--- a/pkgs/rootfs/mkinitrd.nix
+++ b/pkgs/rootfs/mkinitrd.nix
@@ -47,6 +47,8 @@ DefaultDependencies=false
 After=sysroot-run.mount
 Requires=sysroot-run.mount
 Before=systemd-repart.service initrd.target shutdown.target sysinit.target
+ConditionKernelCommandLine=patos.secureboot=true
+ConditionPathExists=|!/sys/firmware/efi/efivars/PK-8be4df61-93ca-11d2-aa0d-00e098032b8c
 
 [Service]
 Type=oneshot
diff --git a/pkgs/rootfs/mkrootfs.nix b/pkgs/rootfs/mkrootfs.nix
index 61e99d1..257ffb6 100644
--- a/pkgs/rootfs/mkrootfs.nix
+++ b/pkgs/rootfs/mkrootfs.nix
@@ -81,23 +81,21 @@ EOF
 cat <<EOF > $out/etc/repart.d/20-root-a.conf
 [Partition]
 Type=root
-SizeMaxBytes=256M
-SizeMinBytes=256M
+SizeMaxBytes=64M
+SizeMinBytes=64M
 EOF
 
 cat <<EOF > $out/etc/repart.d/22-root-verify-a.conf
 [Partition]
 Type=root-verity
-SizeMaxBytes=10M
-SizeMinBytes=10M
 EOF
 
 cat <<EOF > $out/etc/repart.d/30-root-b.conf
 [Partition]
 Type=root
 Label=_empty
-SizeMaxBytes=256M
-SizeMinBytes=256M
+SizeMaxBytes=64M
+SizeMinBytes=64M
 ReadOnly=1
 EOF
 
@@ -105,8 +103,6 @@ cat <<EOF > $out/etc/repart.d/32-root-verity-b.conf
 [Partition]
 Type=root-verity
 Label=_empty
-SizeMaxBytes=10M
-SizeMinBytes=10M
 ReadOnly=1
 EOF
 
@@ -179,7 +175,6 @@ cp -P ${pkgs.sbctl}/bin/sbctl $out/usr/bin/
 rm -f $out/usr/bin/blkid
 cp -P ${pkgs.util-linuxMinimal}/bin/blkid $out/usr/bin/
 cp -P ${pkgs.util-linuxMinimal}/bin/lsblk $out/usr/bin/
-cp -P ${pkgs.bash}/bin/bash $out/usr/bin/
 
 ### install xq (jq clone)
 cp -P ${pkgs.xq}/bin/xq $out/usr/bin/
diff --git a/pkgs/rootfs/secure-boot-enroll.sh b/pkgs/rootfs/secure-boot-enroll.sh
index 9546027..2588baf 100644
--- a/pkgs/rootfs/secure-boot-enroll.sh
+++ b/pkgs/rootfs/secure-boot-enroll.sh
@@ -1,23 +1,9 @@
-#!/bin/bash
+#!/bin/sh
 set -ex -uo pipefail
 
-enroll=
-for o in $(< /proc/cmdline); do
-    case $o in
-        patos.secureboot=*)
-            enroll=${o#*=}
-            ;;
-    esac
-done
-
-if [ -z "$enroll" ]; then
-  echo 'No patos.secureboot= parameter on the kernel command line' >&2
-  exit 0
-fi
-
 SETUP_MODE=$(sbctl status --json | jq -r '.setup_mode')
 
-[ "$SETUP_MODE" = "false" -o "$enroll" != "true" ] && exit 0
+[ "$SETUP_MODE" = "false" ] && exit 0
 
 cat <<EOL> /run/sbctl.yml
 ---

From 4166b4c1fb0ba384d7f8de43b9517a9bfc0205be Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 19 Mar 2025 15:03:15 +0100
Subject: [PATCH 65/78] feat: kernel modules as system extensions

---
 flake.nix                  |  2 +-
 pkgs/image/default.nix     | 36 +++++++++++++++++++++++++++++++-----
 pkgs/kernel/generic.config | 10 +++++-----
 pkgs/rootfs/mkrootfs.nix   |  2 ++
 utils/qemu-uefi-tpm.nix    |  1 +
 5 files changed, 40 insertions(+), 11 deletions(-)

diff --git a/flake.nix b/flake.nix
index 9e92cc8..b4a7411 100644
--- a/flake.nix
+++ b/flake.nix
@@ -17,7 +17,7 @@
       let
         pkgs = import nixpkgs { inherit system; };
         patosPkgs = self.packages.${system};
-        version = "0.0.1";
+        version = "0.0.3";
         updateUrl = "http://10.0.2.2:8000/";
       in
       {
diff --git a/pkgs/image/default.nix b/pkgs/image/default.nix
index 94748a3..452bf1f 100644
--- a/pkgs/image/default.nix
+++ b/pkgs/image/default.nix
@@ -25,18 +25,28 @@ runCommand pname {
     SYSTEMD_REPART_MKFS_OPTIONS_EROFS = "--all-root -zlz4hc,12 -C1048576 -Efragments,dedupe,ztailpacking";
   };
 
-  kernelCmdLine = "console=ttyS0 patos.secureboot=true";
+  kernelCmdLine = "console=ttyS0 patos.secureboot=false";
 }
 ''
 mkdir -p $out/init.repart.d $out/final.repart.d
 pushd $out
 
-# Don't seem to work just to create a symlink to rootfs derivation?
-# ln -sf $rootfs rootfs
 mkdir rootfs
 cp -prP ${patosPkgs.rootfs}/* rootfs/
 find rootfs/ -type d -exec chmod 755 {} \;
 
+# package kernel modules as sysext
+pkgName="patos-kernel-modules-${version}"
+mkdir -p ./tree/usr/lib/extension-release.d
+cat << EOF > ./tree/usr/lib/extension-release.d/extension-release.patos-kernel-modules
+ID=patos
+IMAGE_ID=patos-kernel-modules
+IMAGE_VERSION=${version}
+VERSION_ID=patos
+EOF
+cp -Prp rootfs/usr/lib/modules ./tree/usr/lib/modules && rm -rf rootfs/usr/lib/modules
+tar -cJf $pkgName.tar.xz -C ./tree . --owner=root:0 --group=root:0 && rm -rf tree
+
 # set default target to multi-user
 ln -sf multi-user.target rootfs/usr/lib/systemd/system/default.target
 
@@ -127,6 +137,22 @@ ReadOnly=1
 Verify=no
 EOF
 
+cat <<EOF > rootfs/etc/sysupdate.d/30-kernel-modules.transfer
+[Source]
+Type=url-tar
+Path=${updateUrl}
+MatchPattern=patos-kernel-modules-@v.tar.xz
+
+[Target]
+Type=subvolume
+Path=/var/lib/extensions
+MatchPattern=patos-kernel-modules-@v
+CurrentSymlink=patos-kernel-modules
+
+[Transfer]
+Verify=no
+EOF
+
 
 # Initial partitioning
 cat <<EOF > init.repart.d/10-root.conf
@@ -241,8 +267,8 @@ ${patosPkgs.systemd}/usr/bin/systemd-repart \
   --root=$out \
   patos_${version}.img > final-repart-output.json
 
-rm -rf rootfs
-sha256sum *.root *.verity *.efi > SHA256SUMS
+rm -rf rootfs init.repart.d final.repart.d *.json
+sha256sum *.root *.verity *.efi *.tar.xz > SHA256SUMS
 
 popd
 ''
diff --git a/pkgs/kernel/generic.config b/pkgs/kernel/generic.config
index 048421b..4c67b0a 100644
--- a/pkgs/kernel/generic.config
+++ b/pkgs/kernel/generic.config
@@ -276,7 +276,7 @@ CONFIG_BRIDGE_VLAN_FILTERING=y
 CONFIG_BRIDGE=y
 CONFIG_BSD_DISKLABEL=y
 CONFIG_BSD_PROCESS_ACCT=y
-CONFIG_BTRFS_FS=m
+CONFIG_BTRFS_FS=y
 CONFIG_BTRFS_FS_POSIX_ACL=y
 CONFIG_BUFFER_HEAD=y
 CONFIG_BUG_ON_DATA_CORRUPTION=y
@@ -426,7 +426,7 @@ CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y
 CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519=y
 CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y
 CONFIG_CRYPTO_AUTHENC=y
-CONFIG_CRYPTO_BLAKE2B=m
+CONFIG_CRYPTO_BLAKE2B=y
 CONFIG_CRYPTO_BLAKE2S_X86=y
 CONFIG_CRYPTO_CBC=y
 CONFIG_CRYPTO_CCM=y
@@ -643,7 +643,7 @@ CONFIG_ELF_CORE=y
 CONFIG_ELFCORE=y
 CONFIG_ENA_ETHERNET=y
 CONFIG_ENCLOSURE_SERVICES=y
-CONFIG_ENCRYPTED_KEYS=m
+CONFIG_ENCRYPTED_KEYS=y
 CONFIG_ENIC=m
 CONFIG_EPOLL=y
 CONFIG_EROFS_FS_POSIX_ACL=y
@@ -1953,7 +1953,7 @@ CONFIG_QUOTA_TREE=y
 CONFIG_QUOTA=y
 CONFIG_R8169=m
 CONFIG_RAID6_PQ_BENCHMARK=y
-CONFIG_RAID6_PQ=m
+CONFIG_RAID6_PQ=y
 CONFIG_RAID_ATTRS=y
 CONFIG_RANDOMIZE_BASE=y
 CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT=y
@@ -2487,7 +2487,7 @@ CONFIG_XFS_QUOTA=y
 CONFIG_XFS_RT=y
 CONFIG_XFS_SUPPORT_ASCII_CI=y
 CONFIG_XFS_SUPPORT_V4=y
-CONFIG_XOR_BLOCKS=m
+CONFIG_XOR_BLOCKS=y
 CONFIG_XPS=y
 CONFIG_XXHASH=y
 CONFIG_XZ_DEC_ARMTHUMB=y
diff --git a/pkgs/rootfs/mkrootfs.nix b/pkgs/rootfs/mkrootfs.nix
index 257ffb6..235a70a 100644
--- a/pkgs/rootfs/mkrootfs.nix
+++ b/pkgs/rootfs/mkrootfs.nix
@@ -172,7 +172,9 @@ cp -P ${pkgs.libbpf}/lib/libbpf*.so* $out/usr/lib/
 
 ### install secure boot tools
 cp -P ${pkgs.sbctl}/bin/sbctl $out/usr/bin/
+rm -f $out/usr/bin/tar
 rm -f $out/usr/bin/blkid
+cp -P ${pkgs.gnutar}/bin/tar $out/usr/bin/
 cp -P ${pkgs.util-linuxMinimal}/bin/blkid $out/usr/bin/
 cp -P ${pkgs.util-linuxMinimal}/bin/lsblk $out/usr/bin/
 
diff --git a/utils/qemu-uefi-tpm.nix b/utils/qemu-uefi-tpm.nix
index 9087ada..7d51868 100644
--- a/utils/qemu-uefi-tpm.nix
+++ b/utils/qemu-uefi-tpm.nix
@@ -47,6 +47,7 @@ pkgs.writeShellApplication {
         -chardev socket,id=chrtpm,path="$state/swtpm-sock" \
         -tpmdev emulator,id=tpm0,chardev=chrtpm \
         -device tpm-tis,tpmdev=tpm0 \
+        -netdev id=net00,type=user \
         -device virtio-net-pci,netdev=net00 \
         -drive "format=qcow2,file=$state/disk.qcow2"
     '';

From 91191a29474d3b1a2aec4314c3ee8545b1339f03 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Thu, 20 Mar 2025 14:01:50 +0100
Subject: [PATCH 66/78] revert version

---
 flake.nix | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/flake.nix b/flake.nix
index b4a7411..9e92cc8 100644
--- a/flake.nix
+++ b/flake.nix
@@ -17,7 +17,7 @@
       let
         pkgs = import nixpkgs { inherit system; };
         patosPkgs = self.packages.${system};
-        version = "0.0.3";
+        version = "0.0.1";
         updateUrl = "http://10.0.2.2:8000/";
       in
       {

From a7de3101a8184a8a885a2973756fffb2f50e3bcf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Thu, 20 Mar 2025 16:06:31 +0100
Subject: [PATCH 67/78] chore: include kernel modules in rootfs as sysext

---
 pkgs/image/default.nix        | 32 ++++----------------------------
 pkgs/kernel/manual-config.nix | 18 ++++++++++++++++++
 2 files changed, 22 insertions(+), 28 deletions(-)

diff --git a/pkgs/image/default.nix b/pkgs/image/default.nix
index 452bf1f..a248a09 100644
--- a/pkgs/image/default.nix
+++ b/pkgs/image/default.nix
@@ -35,17 +35,10 @@ mkdir rootfs
 cp -prP ${patosPkgs.rootfs}/* rootfs/
 find rootfs/ -type d -exec chmod 755 {} \;
 
-# package kernel modules as sysext
-pkgName="patos-kernel-modules-${version}"
-mkdir -p ./tree/usr/lib/extension-release.d
-cat << EOF > ./tree/usr/lib/extension-release.d/extension-release.patos-kernel-modules
-ID=patos
-IMAGE_ID=patos-kernel-modules
-IMAGE_VERSION=${version}
-VERSION_ID=patos
-EOF
-cp -Prp rootfs/usr/lib/modules ./tree/usr/lib/modules && rm -rf rootfs/usr/lib/modules
-tar -cJf $pkgName.tar.xz -C ./tree . --owner=root:0 --group=root:0 && rm -rf tree
+# package kernel modules as sysext (will reduce the image size a little bit (~3MB))
+mkdir rootfs/etc/extensions
+rm -rf rootfs/usr/lib/modules
+cp ${patosPkgs.kernel}/patos-kernel-modules* rootfs/etc/extensions/
 
 # set default target to multi-user
 ln -sf multi-user.target rootfs/usr/lib/systemd/system/default.target
@@ -137,23 +130,6 @@ ReadOnly=1
 Verify=no
 EOF
 
-cat <<EOF > rootfs/etc/sysupdate.d/30-kernel-modules.transfer
-[Source]
-Type=url-tar
-Path=${updateUrl}
-MatchPattern=patos-kernel-modules-@v.tar.xz
-
-[Target]
-Type=subvolume
-Path=/var/lib/extensions
-MatchPattern=patos-kernel-modules-@v
-CurrentSymlink=patos-kernel-modules
-
-[Transfer]
-Verify=no
-EOF
-
-
 # Initial partitioning
 cat <<EOF > init.repart.d/10-root.conf
 [Partition]
diff --git a/pkgs/kernel/manual-config.nix b/pkgs/kernel/manual-config.nix
index 9f1ba99..98b09f8 100644
--- a/pkgs/kernel/manual-config.nix
+++ b/pkgs/kernel/manual-config.nix
@@ -22,6 +22,8 @@
   pahole,
   kmod,
   ubootTools,
+  erofs-utils,
+  cryptsetup,
   fetchpatch,
   rustc,
   rust-bindgen,
@@ -224,6 +226,8 @@ lib.makeOverridable (
             python3Minimal
             kmod
             hexdump
+            erofs-utils
+            cryptsetup
           ]
           ++ optional needsUbootTools ubootTools
           ++ optionals (lib.versionAtLeast version "5.2") [
@@ -496,6 +500,20 @@ lib.makeOverridable (
 
           # Delete empty directories
           find -empty -type d -delete
+
+          pkgName="patos-kernel-modules"
+          mkdir -p $out/tree/usr/lib/extension-release.d
+          cat << EOF > $out/tree/usr/lib/extension-release.d/extension-release.$pkgName
+          ID=patos
+          IMAGE_ID=$pkgName
+          IMAGE_VERSION=${version}
+          VERSION_ID=patos
+          EOF
+          cp -Prp $out/lib/modules $out/tree/usr/lib/modules
+          find $out/tree -type d -exec chmod 0755 {} \;
+          mkfs.erofs --all-root -zlz4hc,12 -C1048576 -Efragments,dedupe,ztailpacking $out/$pkgName.raw $out/tree/
+          veritysetup format --root-hash-file $out/$pkgName.roothash $out/$pkgName.raw $out/$pkgName.verity
+          chmod -R 755 $out/tree && rm -rf $out/tree
         '';
 
         requiredSystemFeatures = [ "big-parallel" ];

From 2841610f418660be880ccfde482255b0de71394d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 26 Mar 2025 10:30:23 +0100
Subject: [PATCH 68/78] chore: bump kernel version

---
 pkgs/kernel/default.nix | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pkgs/kernel/default.nix b/pkgs/kernel/default.nix
index a5f24db..51a05bf 100644
--- a/pkgs/kernel/default.nix
+++ b/pkgs/kernel/default.nix
@@ -1,7 +1,7 @@
 { pkgs }:
 let
-  version = "6.13.7";
-  hash = "sha256-Ojm2IDi3rC9D0mofhLQoPhl4BOHoF61jfpo9h0xHgB0=";
+  version = "6.13.8";
+  hash = "sha256-JZr6Wdc9Z2vsKuib6s2UngjVTT9wp/iwp0IxUJV1Grs=";
 in
 (pkgs.callPackage ./manual-config.nix { }) {
   version = "${version}-patos1";

From bb708e3e61102caef9337c45f29b033dfd2b4ebe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 26 Mar 2025 10:37:38 +0100
Subject: [PATCH 69/78] feat(image): parameter to include microcode and
 secureboot

---
 flake.nix              |  4 +++-
 pkgs/image/default.nix | 14 ++++++++++----
 2 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/flake.nix b/flake.nix
index 9e92cc8..99fce5b 100644
--- a/flake.nix
+++ b/flake.nix
@@ -18,12 +18,14 @@
         pkgs = import nixpkgs { inherit system; };
         patosPkgs = self.packages.${system};
         version = "0.0.1";
+        secureBoot = "false";
+        cpuArch = "intel";
         updateUrl = "http://10.0.2.2:8000/";
       in
       {
         packages = {
           default = patosPkgs.image;
-          image = pkgs.callPackage ./pkgs/image { inherit patosPkgs version updateUrl; };
+          image = pkgs.callPackage ./pkgs/image { inherit patosPkgs version updateUrl cpuArch secureBoot; };
           rootfs = pkgs.callPackage ./pkgs/rootfs/mkrootfs.nix { inherit patosPkgs version; };
           initrd = pkgs.callPackage ./pkgs/rootfs/mkinitrd.nix { inherit patosPkgs version; };
           kernel = pkgs.callPackage ./pkgs/kernel { };
diff --git a/pkgs/image/default.nix b/pkgs/image/default.nix
index a248a09..05d9c72 100644
--- a/pkgs/image/default.nix
+++ b/pkgs/image/default.nix
@@ -1,16 +1,21 @@
 {
+  lib,
   pkgs,
   patosPkgs,
   version,
   runCommand,
-  updateUrl
+  updateUrl,
+  cpuArch ? "",
+  secureBoot ? "false"
 }:
 let
   pname = "patos-image";
 in
 runCommand pname {
-  inherit version;
-  inherit updateUrl;
+  inherit version cpuArch updateUrl secureBoot;
+
+  microcode = lib.optionalString (cpuArch == "amd") "--microcode ${pkgs.microcode-amd}/amd-ucode.img"
+      + lib.optionalString (cpuArch == "intel") "--microcode ${pkgs.microcode-intel}/intel-ucode.img";
 
   buildInputs = with pkgs; [
     erofs-utils
@@ -25,7 +30,7 @@ runCommand pname {
     SYSTEMD_REPART_MKFS_OPTIONS_EROFS = "--all-root -zlz4hc,12 -C1048576 -Efragments,dedupe,ztailpacking";
   };
 
-  kernelCmdLine = "console=ttyS0 patos.secureboot=false";
+  kernelCmdLine = "console=ttyS0 patos.secureboot=${secureBoot}";
 }
 ''
 mkdir -p $out/init.repart.d $out/final.repart.d
@@ -176,6 +181,7 @@ ln -sf patos_$version.root.raw patos_${version}_$rootUuid.root
 ${patosPkgs.systemd}/usr/bin/ukify build \
   --linux ${patosPkgs.kernel}/bzImage \
   --initrd ${patosPkgs.initrd}/initrd.xz \
+  $microcode \
   --os-release @rootfs/etc/os-release \
   --cmdline "$kernelCmdLine roothash=$roothash" \
   -o patos_${version}.efi

From 242294eb8dba13d301acb2a5b463cf3648eb7df8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 26 Mar 2025 11:13:16 +0100
Subject: [PATCH 70/78] chore: nix flake update

---
 flake.lock               | 6 +++---
 pkgs/busybox/default.nix | 8 +++-----
 pkgs/openssl/default.nix | 9 +++------
 3 files changed, 9 insertions(+), 14 deletions(-)

diff --git a/flake.lock b/flake.lock
index 85be38f..2272d3d 100644
--- a/flake.lock
+++ b/flake.lock
@@ -20,11 +20,11 @@
     },
     "nixpkgs": {
       "locked": {
-        "lastModified": 1739020877,
-        "narHash": "sha256-mIvECo/NNdJJ/bXjNqIh8yeoSjVLAuDuTUzAo7dzs8Y=",
+        "lastModified": 1742669843,
+        "narHash": "sha256-G5n+FOXLXcRx+3hCJ6Rt6ZQyF1zqQ0DL0sWAMn2Nk0w=",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "a79cfe0ebd24952b580b1cf08cd906354996d547",
+        "rev": "1e5b653dff12029333a6546c11e108ede13052eb",
         "type": "github"
       },
       "original": {
diff --git a/pkgs/busybox/default.nix b/pkgs/busybox/default.nix
index e318d8a..6f22641 100644
--- a/pkgs/busybox/default.nix
+++ b/pkgs/busybox/default.nix
@@ -1,6 +1,7 @@
 {
   stdenv,
   lib,
+  pkgs,
   buildPackages,
   fetchurl,
   fetchpatch,
@@ -57,15 +58,12 @@ in
 
 stdenv.mkDerivation rec {
   pname = "busybox";
-  version = "1.36.1";
+  version = pkgs.busybox.version;
 
   # Note to whoever is updating busybox: please verify that:
   # nix-build pkgs/stdenv/linux/make-bootstrap-tools.nix -A test
   # still builds after the update.
-  src = fetchurl {
-    url = "https://busybox.net/downloads/${pname}-${version}.tar.bz2";
-    sha256 = "sha256-uMwkyVdNgJ5yecO+NJeVxdXOtv3xnKcJ+AzeUOR94xQ=";
-  };
+  src = pkgs.busybox.src;
 
   hardeningDisable = [
     "format"
diff --git a/pkgs/openssl/default.nix b/pkgs/openssl/default.nix
index bc833cc..08c1309 100644
--- a/pkgs/openssl/default.nix
+++ b/pkgs/openssl/default.nix
@@ -1,5 +1,6 @@
 {
   lib,
+  pkgs,
   stdenv,
   fetchurl,
   perl,
@@ -18,13 +19,9 @@
 
 stdenv.mkDerivation rec {
     pname = "openssl";
-    version = "3.4.1";
-    hash = "sha256-ACotazC1i/S+pGxDvdljZar42qbEKHgqpP7uBtoZffM=";
+    version = pkgs.openssl.version;
 
-    src = fetchurl {
-      url = "https://github.com/openssl/openssl/releases/download/openssl-${version}/openssl-${version}.tar.gz";
-      hash = hash;
-    };
+    src = pkgs.openssl.src;
 
     outputs = [ "out" ];
 

From c470bf6d595176023198e1164db01f00aa177c50 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 26 Mar 2025 11:49:37 +0100
Subject: [PATCH 71/78] chore: track upstream nixpkgs for our forks

---
 pkgs/dbus-broker/default.nix |  9 ++-------
 pkgs/lvm2/default.nix        | 13 ++++---------
 pkgs/result                  |  1 +
 pkgs/tpm2-tools/default.nix  | 11 +++++------
 pkgs/tpm2-tss/default.nix    | 10 +++-------
 5 files changed, 15 insertions(+), 29 deletions(-)
 create mode 120000 pkgs/result

diff --git a/pkgs/dbus-broker/default.nix b/pkgs/dbus-broker/default.nix
index 809f3ce..0002d9c 100644
--- a/pkgs/dbus-broker/default.nix
+++ b/pkgs/dbus-broker/default.nix
@@ -100,14 +100,9 @@ in
 
 stdenv.mkDerivation (finalAttrs: {
   pname = "dbus-broker";
-  version = "36";
+  version = pkgs.dbus-broker.version;
 
-  src = fetchFromGitHub {
-    owner = "bus1";
-    repo = "dbus-broker";
-    rev = "v${finalAttrs.version}";
-    hash = "sha256-5dAMKjybqrHG57vArbtWEPR/svSj2ION75JrjvnnpVM=";
-  };
+  src = pkgs.dbus-broker.src;
 
   nativeBuildInputs = with pkgs; [
     docutils
diff --git a/pkgs/lvm2/default.nix b/pkgs/lvm2/default.nix
index f211e26..8d18663 100644
--- a/pkgs/lvm2/default.nix
+++ b/pkgs/lvm2/default.nix
@@ -1,5 +1,6 @@
 {
   stdenv,
+  pkgs,
   fetchurl,
   lib,
   pkg-config,
@@ -7,17 +8,11 @@
   udev,
 }:
 
-stdenv.mkDerivation rec {
+stdenv.mkDerivation {
   pname = "lvm2";
-  version = "2.03.30";
+  version = pkgs.lvm2.version;
 
-  src = fetchurl {
-    urls = [
-      "https://mirrors.kernel.org/sourceware/lvm2/LVM2.${version}.tgz"
-      "ftp://sourceware.org/pub/lvm2/LVM2.${version}.tgz"
-    ];
-    hash = "sha256-rXar7LjciHcz4GxEnLmt0Eo1BvnweAwSiBem4aF87AU=";
-  };
+  src = pkgs.lvm2.src;
 
   nativeBuildInputs = [
     pkg-config
diff --git a/pkgs/result b/pkgs/result
new file mode 120000
index 0000000..301e3b1
--- /dev/null
+++ b/pkgs/result
@@ -0,0 +1 @@
+/nix/store/9m1cdv4fiky0mihfx3ck8vcknclcagn2-patos-image
\ No newline at end of file
diff --git a/pkgs/tpm2-tools/default.nix b/pkgs/tpm2-tools/default.nix
index f447fe6..4bb14c1 100644
--- a/pkgs/tpm2-tools/default.nix
+++ b/pkgs/tpm2-tools/default.nix
@@ -1,5 +1,6 @@
 {
   stdenv,
+  pkgs,
   fetchurl,
   lib,
   pandoc,
@@ -10,19 +11,17 @@
   libuuid,
 }:
 
-stdenv.mkDerivation rec {
+stdenv.mkDerivation {
   pname = "tpm2-tools";
-  version = "5.7";
+  version = pkgs.tpm2-tools.version;
 
-  src = fetchurl {
-    url = "https://github.com/tpm2-software/${pname}/releases/download/${version}/${pname}-${version}.tar.gz";
-    sha256 = "sha256-OBDTa1B5JW9PL3zlUuIiE9Q7EDHBMVON+KLbw8VwmDo=";
-  };
+  src = pkgs.tpm2-tools.src;
 
   nativeBuildInputs = [
     pandoc
     pkg-config
   ];
+
   buildInputs = [
     curl
     openssl
diff --git a/pkgs/tpm2-tss/default.nix b/pkgs/tpm2-tss/default.nix
index 5e23100..5a6477a 100644
--- a/pkgs/tpm2-tss/default.nix
+++ b/pkgs/tpm2-tss/default.nix
@@ -1,5 +1,6 @@
 {
   stdenv,
+  pkgs,
   lib,
   fetchFromGitHub,
   autoreconfHook,
@@ -19,14 +20,9 @@
 
 stdenv.mkDerivation rec {
   pname = "tpm2-tss";
-  version = "4.1.3";
+  version = pkgs.tpm2-tss.version;
 
-  src = fetchFromGitHub {
-    owner = "tpm2-software";
-    repo = pname;
-    rev = version;
-    hash = "sha256-BP28utEUI9g1VNv3lCXuiKrDtEImFQxxZfIjLiE3Wr8=";
-  };
+  src = pkgs.tpm2-tss.src;
 
   patches = [
     ./no-shadow.patch

From d10bd7bb04c494ef37096467d34135b4b447ca61 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 26 Mar 2025 11:57:03 +0100
Subject: [PATCH 72/78] fix(rootfs): symlink /var/tmp to /tmp if no state
 partition available this enable systemd networkd and resolved to work

---
 pkgs/result              | 1 -
 pkgs/rootfs/mkrootfs.nix | 3 ++-
 2 files changed, 2 insertions(+), 2 deletions(-)
 delete mode 120000 pkgs/result

diff --git a/pkgs/result b/pkgs/result
deleted file mode 120000
index 301e3b1..0000000
--- a/pkgs/result
+++ /dev/null
@@ -1 +0,0 @@
-/nix/store/9m1cdv4fiky0mihfx3ck8vcknclcagn2-patos-image
\ No newline at end of file
diff --git a/pkgs/rootfs/mkrootfs.nix b/pkgs/rootfs/mkrootfs.nix
index 235a70a..bda4c7d 100644
--- a/pkgs/rootfs/mkrootfs.nix
+++ b/pkgs/rootfs/mkrootfs.nix
@@ -21,11 +21,12 @@ runCommand "patos-rootfs"
 ''
 ### create directory structure
 mkdir -p $out/etc/repart.d $out/dev $out/proc $out/sys \
-  $out/tmp $out/root $out/run $out/boot $out/mnt $out/home $out/srv $out/var/tmp
+  $out/tmp $out/root $out/run $out/boot $out/mnt $out/home $out/srv $out/var
 ln -sf /usr/bin $out/bin
 ln -sf /usr/bin $out/sbin
 ln -sf /usr/lib $out/lib
 ln -sf /usr/lib $out/lib64
+ln -sf /tmp $out/var/tmp
 ln -sf ../proc/self/mounts $out/etc/mtab
 
 ### install systemd

From 58861e6de6c80d6b93609185048f2a98e515b444 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Thu, 17 Apr 2025 19:06:37 +0200
Subject: [PATCH 73/78] chore: upgrade systemd

---
 pkgs/systemd/default.nix | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pkgs/systemd/default.nix b/pkgs/systemd/default.nix
index a1cb314..a93fd76 100644
--- a/pkgs/systemd/default.nix
+++ b/pkgs/systemd/default.nix
@@ -7,7 +7,7 @@
   ...
 }:
 let
-  version = "257.4";
+  version = "257.5";
 
   # Use the command below to update `releaseTimestamp` on every (major) version
   # change. More details in the commentary at mesonFlags.

From 92c204231b7cfaa9f3b880e8d3b27af2ad6474d5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Sat, 19 Apr 2025 22:56:00 +0200
Subject: [PATCH 74/78] chore: nix flake update

---
 flake.lock | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/flake.lock b/flake.lock
index 2272d3d..3725da4 100644
--- a/flake.lock
+++ b/flake.lock
@@ -20,11 +20,11 @@
     },
     "nixpkgs": {
       "locked": {
-        "lastModified": 1742669843,
-        "narHash": "sha256-G5n+FOXLXcRx+3hCJ6Rt6ZQyF1zqQ0DL0sWAMn2Nk0w=",
+        "lastModified": 1744932701,
+        "narHash": "sha256-fusHbZCyv126cyArUwwKrLdCkgVAIaa/fQJYFlCEqiU=",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "1e5b653dff12029333a6546c11e108ede13052eb",
+        "rev": "b024ced1aac25639f8ca8fdfc2f8c4fbd66c48ef",
         "type": "github"
       },
       "original": {

From 15227256ecf0e8aea67d3ebb21e2122a7b6a0f46 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Sat, 19 Apr 2025 23:06:44 +0200
Subject: [PATCH 75/78] chore: kernel upgrade

---
 pkgs/kernel/default.nix | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pkgs/kernel/default.nix b/pkgs/kernel/default.nix
index 51a05bf..1297825 100644
--- a/pkgs/kernel/default.nix
+++ b/pkgs/kernel/default.nix
@@ -1,7 +1,7 @@
 { pkgs }:
 let
-  version = "6.13.8";
-  hash = "sha256-JZr6Wdc9Z2vsKuib6s2UngjVTT9wp/iwp0IxUJV1Grs=";
+  version = "6.14.2";
+  hash = "sha256-xcaCo1TqMZATk1elfTSnnlw3IhrOgjqTjhARa1d6Lhs=";
 in
 (pkgs.callPackage ./manual-config.nix { }) {
   version = "${version}-patos1";

From b7e526454b66c1aca7875fcab107cc3fbb780099 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Tue, 6 May 2025 18:12:03 +0200
Subject: [PATCH 76/78] chore: nix update

---
 flake.lock               | 6 +++---
 pkgs/kernel/default.nix  | 4 ++--
 pkgs/systemd/default.nix | 2 +-
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/flake.lock b/flake.lock
index 3725da4..bb33fd6 100644
--- a/flake.lock
+++ b/flake.lock
@@ -20,11 +20,11 @@
     },
     "nixpkgs": {
       "locked": {
-        "lastModified": 1744932701,
-        "narHash": "sha256-fusHbZCyv126cyArUwwKrLdCkgVAIaa/fQJYFlCEqiU=",
+        "lastModified": 1746328495,
+        "narHash": "sha256-uKCfuDs7ZM3QpCE/jnfubTg459CnKnJG/LwqEVEdEiw=",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "b024ced1aac25639f8ca8fdfc2f8c4fbd66c48ef",
+        "rev": "979daf34c8cacebcd917d540070b52a3c2b9b16e",
         "type": "github"
       },
       "original": {
diff --git a/pkgs/kernel/default.nix b/pkgs/kernel/default.nix
index 1297825..dcd382d 100644
--- a/pkgs/kernel/default.nix
+++ b/pkgs/kernel/default.nix
@@ -1,7 +1,7 @@
 { pkgs }:
 let
-  version = "6.14.2";
-  hash = "sha256-xcaCo1TqMZATk1elfTSnnlw3IhrOgjqTjhARa1d6Lhs=";
+  version = "6.14.4";
+  hash = "sha256-lFLyjXoAUfukiGcSOVtITEx/z5+FlEpi/T2X3JI/Uzk=";
 in
 (pkgs.callPackage ./manual-config.nix { }) {
   version = "${version}-patos1";
diff --git a/pkgs/systemd/default.nix b/pkgs/systemd/default.nix
index a93fd76..db0b64c 100644
--- a/pkgs/systemd/default.nix
+++ b/pkgs/systemd/default.nix
@@ -27,7 +27,7 @@ stdenv.mkDerivation (finalAttrs: {
     owner = "systemd";
     repo = "systemd";
     rev = "v${version}";
-    hash = "sha256-6rxJUYRq785U6aik5VhQRqG+Ss67lBB6T3eQF+tkyhk=";
+    hash = "sha256-mn/JB/nrOz2TOobu2d+XBH2dVH3vn/HPvWN4Zz6s+SM=";
   };
 
   patches = [ ./skip-verify-esp.patch ];

From af2a063ff2dfed7b8270f72e1d4c6f856b8be7ba Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 7 May 2025 06:26:16 +0200
Subject: [PATCH 77/78] chore: kernel upgrade

---
 pkgs/kernel/default.nix | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pkgs/kernel/default.nix b/pkgs/kernel/default.nix
index dcd382d..703b612 100644
--- a/pkgs/kernel/default.nix
+++ b/pkgs/kernel/default.nix
@@ -1,7 +1,7 @@
 { pkgs }:
 let
-  version = "6.14.4";
-  hash = "sha256-lFLyjXoAUfukiGcSOVtITEx/z5+FlEpi/T2X3JI/Uzk=";
+  version = "6.14.5";
+  hash = "sha256-KCB+xSu+qjUHAQrv+UT0QvfZ8isoa3nK9F7G3xsk9Ak=";
 in
 (pkgs.callPackage ./manual-config.nix { }) {
   version = "${version}-patos1";

From 8ee40679fc722db4cce24f7f0eb4a1bb159c2a0f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Mon, 12 May 2025 19:40:51 +0200
Subject: [PATCH 78/78] chore: os update

---
 flake.lock              | 6 +++---
 pkgs/kernel/default.nix | 4 ++--
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/flake.lock b/flake.lock
index bb33fd6..affeabc 100644
--- a/flake.lock
+++ b/flake.lock
@@ -20,11 +20,11 @@
     },
     "nixpkgs": {
       "locked": {
-        "lastModified": 1746328495,
-        "narHash": "sha256-uKCfuDs7ZM3QpCE/jnfubTg459CnKnJG/LwqEVEdEiw=",
+        "lastModified": 1746904237,
+        "narHash": "sha256-3e+AVBczosP5dCLQmMoMEogM57gmZ2qrVSrmq9aResQ=",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "979daf34c8cacebcd917d540070b52a3c2b9b16e",
+        "rev": "d89fc19e405cb2d55ce7cc114356846a0ee5e956",
         "type": "github"
       },
       "original": {
diff --git a/pkgs/kernel/default.nix b/pkgs/kernel/default.nix
index 703b612..6b8bb21 100644
--- a/pkgs/kernel/default.nix
+++ b/pkgs/kernel/default.nix
@@ -1,7 +1,7 @@
 { pkgs }:
 let
-  version = "6.14.5";
-  hash = "sha256-KCB+xSu+qjUHAQrv+UT0QvfZ8isoa3nK9F7G3xsk9Ak=";
+  version = "6.14.6";
+  hash = "sha256-IYF/GZjiIw+B9+T2Bfpv3LBA4U+ifZnCfdsWznSXl6k=";
 in
 (pkgs.callPackage ./manual-config.nix { }) {
   version = "${version}-patos1";