summaryrefslogtreecommitdiff
path: root/epistemia
diff options
context:
space:
mode:
authorVineet Kumar <git@vineetk.net>2026-05-19 12:37:56 -0400
committerVineet Kumar <git@vineetk.net>2026-05-19 14:03:02 -0400
commit195a46b6b803150210cbe39fde33ee7593b49769 (patch)
tree77573a9d88955450b2fa252d8fbad235f5c8bfa9 /epistemia
parentc1fb52d755c21289452f5b691829f7bf50942778 (diff)
move base-system and linux-initrd to guix-epistemia
Diffstat (limited to 'epistemia')
-rw-r--r--epistemia/systems/base-system.scm33
-rw-r--r--epistemia/systems/linux-initrd.scm268
2 files changed, 0 insertions, 301 deletions
diff --git a/epistemia/systems/base-system.scm b/epistemia/systems/base-system.scm
deleted file mode 100644
index 86abafd..0000000
--- a/epistemia/systems/base-system.scm
+++ /dev/null
@@ -1,33 +0,0 @@
1(define-module (epistemia systems base-system)
2 #:use-module (gnu)
3 #:use-module (gnu packages bash)
4 #:use-module (gnu packages ssh)
5 #:use-module (guix)
6 #:export (base-system))
7
8(define base-system
9 (operating-system
10 (host-name "base")
11 (timezone "Canada/Eastern")
12 (locale "en_US.utf8")
13
14 ;; should be set per-system
15 (kernel '())
16 (firmware '())
17
18 ;; will be overrided per-system
19 (bootloader (bootloader-configuration
20 (bootloader grub-efi-bootloader)
21 (targets '("/boot/efi"))))
22
23 (file-systems %base-file-systems)
24
25 (packages %base-packages)
26
27 (services (modify-services %base-services
28 (guix-service-type config =>
29 (guix-configuration
30 (inherit config)
31 (authorized-keys
32 (append (list (local-file "../../demiurge.pub"))
33 %default-authorized-guix-keys))))))))
diff --git a/epistemia/systems/linux-initrd.scm b/epistemia/systems/linux-initrd.scm
deleted file mode 100644
index c727428..0000000
--- a/epistemia/systems/linux-initrd.scm
+++ /dev/null
@@ -1,268 +0,0 @@
1;;; SPDX-License-Identifier: GPL-3.0-or-later
2;; AI disclosure: LLM slop, but it works. This was made before I got more familiar with Guile Scheme and took many retries to get working.
3;; TODO: rewrite this later by deleting this and rewriting by reading the main initrd and my previous pre-guix initrd script. could maybe be deduplicated a lot via inherits.
4(define-module (epistemia systems linux-initrd)
5 #:use-module (guix gexp)
6 #:use-module (guix utils)
7 #:use-module ((guix store) #:select (%store-prefix))
8 #:use-module ((guix derivations) #:select (derivation->output-path))
9 #:use-module (guix modules)
10 #:use-module (gnu packages compression)
11 #:use-module (gnu packages disk)
12 #:use-module (gnu packages guile)
13 #:use-module (gnu packages linux)
14 #:use-module (gnu packages file-systems)
15 #:use-module (gnu system file-systems)
16 #:use-module (gnu system mapped-devices)
17 #:use-module (gnu system keyboard)
18 #:use-module (gnu system linux-initrd)
19 #:use-module (ice-9 match)
20 #:use-module (ice-9 regex)
21 #:use-module (ice-9 vlist)
22 #:use-module (srfi srfi-1)
23 #:use-module (srfi srfi-26)
24 #:export (epistemia-zfs-initrd))
25
26(define (flat-linux-module-directory* linux extra-packages modules)
27 "Return a flat directory containing the Linux kernel modules listed in
28MODULES."
29 (define imported-modules
30 (source-module-closure '((gnu build linux-modules)
31 (guix build utils))))
32
33 (define build-exp
34 (with-imported-modules imported-modules
35 (with-extensions (list guile-zlib guile-zstd)
36 #~(begin
37 (use-modules (gnu build linux-modules)
38 (guix build utils)
39 (rnrs io ports)
40 (srfi srfi-1)
41 (srfi srfi-26)
42 (ice-9 match))
43
44 (define module-dirs
45 (map (lambda (pkg) (string-append pkg "/lib/modules"))
46 (cons #$linux '#$extra-packages)))
47
48 (define builtin-modules
49 (match (find-files (string-append #$linux "/lib/modules")
50 (lambda (file stat)
51 (string=? (basename file) "modules.builtin")))
52 ((file . _)
53 (call-with-input-file file
54 (lambda (port)
55 (map file-name->module-name
56 (string-tokenize (get-string-all port))))))
57 (_ '())))
58
59 (define modules-to-lookup
60 (lset-difference string=? '#$modules builtin-modules))
61
62 (define (lookup-in-dirs name)
63 (let loop ((dirs module-dirs))
64 (match dirs
65 ((dir . rest)
66 (let ((candidates
67 (find-files dir
68 (lambda (file stat)
69 (let ((base (basename file)))
70 (or (string=? base (string-append name ".ko"))
71 (string=? base (string-append name ".ko.gz"))
72 (string=? base (string-append name ".ko.zst"))))))))
73 (match candidates
74 ((first . _) first)
75 (() (loop rest)))))
76 (() #f))))
77
78 (define modules
79 (let ((found-modules (map lookup-in-dirs modules-to-lookup)))
80 (append (filter identity found-modules)
81 (recursive-module-dependencies
82 (filter identity found-modules)
83 #:lookup-module lookup-in-dirs))))
84
85 (define (maybe-uncompress file)
86 (cond
87 ((string-contains file ".ko.gz")
88 (invoke #+(file-append gzip "/bin/gunzip") file))
89 ((string-contains file ".ko.zst")
90 (invoke #+(file-append zstd "/bin/zstd") "-d" file))))
91
92 (mkdir #$output)
93 (for-each (lambda (module)
94 (when module
95 (let ((out-module
96 (string-append #$output "/"
97 (basename module))))
98 (format #t "copying '~a'...~%" module)
99 (copy-file module out-module)
100 (maybe-uncompress out-module))))
101 (delete-duplicates modules))
102
103 (write-module-name-database #$output)))))
104
105 (computed-file "linux-modules-combined" build-exp))
106
107(define* (zfs-raw-initrd file-systems
108 #:key
109 (linux linux-libre)
110 (zfs-package zfs)
111 (linux-modules '())
112 (pre-mount #t)
113 (mapped-devices '())
114 (keyboard-layout #f)
115 (helper-packages '())
116 qemu-networking?
117 volatile-root?
118 (on-error 'debug)
119 (monkey-patch? #t)
120 #:allow-other-keys)
121
122 (define device-mapping-commands
123 (map (lambda (md)
124 (let* ((source (mapped-device-source md))
125 (targets (mapped-device-targets md))
126 (type (mapped-device-type md))
127 (open (mapped-device-kind-open type)))
128 (apply open source targets
129 (mapped-device-arguments md))))
130 mapped-devices))
131
132 (define file-system-scan-commands
133 (let ((file-system-types (map file-system-type file-systems)))
134 (if (member "btrfs" file-system-types)
135 #~((system* (string-append #$btrfs-progs/static "/bin/btrfs")
136 "device" "scan"))
137 #~())))
138
139 (define zfs-import-commands
140 #~(begin
141 (format #t "Epistemia: Importing ZFS pools...~%")
142 (false-if-exception
143 (system* (string-append #$zfs-package "/sbin/zpool")
144 "import" "-a" "-N" "-f" "-d" "/dev"))
145 (format #t "Epistemia: Imported ZFS pools:~%")
146 (false-if-exception
147 (system* (string-append #$zfs-package "/sbin/zpool")
148 "status"))
149 (sleep 2)
150 #t))
151
152 (define kodir
153 (flat-linux-module-directory* linux
154 (list (gexp-input zfs-package "module"))
155 linux-modules))
156
157 (expression->initrd
158 (with-imported-modules (source-module-closure
159 '((gnu build linux-boot)
160 (guix build utils)
161 (guix build bournish)
162 (gnu system file-systems)
163 (gnu build file-systems)))
164 #~(begin
165 (use-modules (gnu build linux-boot)
166 (gnu system file-systems)
167 ((guix build utils) #:hide (delete))
168 (guix build bournish)
169 (srfi srfi-1)
170 (srfi srfi-13)
171 (srfi srfi-26))
172
173 ;; We must patch BOTH modules because linux-boot likely already
174 ;; imported the function.
175 #$(if monkey-patch?
176 #~(let* ((fs-mod (resolve-module '(gnu build file-systems)))
177 (boot-mod (resolve-module '(gnu build linux-boot)))
178 (orig-canon (module-ref fs-mod 'canonicalize-device-spec))
179 (new-canon
180 (lambda (spec)
181 ;; ZFS datasets in Guix config are either strings or file-system-labels.
182 ;; If it's a label record, the first field is the label string.
183 (let ((device (cond
184 ((string? spec) spec)
185 ((and (struct? spec)
186 (string? (struct-ref spec 0)))
187 (struct-ref spec 0))
188 (else #f))))
189 (if (and device
190 (or (string-contains device "zroot/")
191 (string-contains device "zfs")))
192 (begin
193 (format #t "Epistemia: ZFS bypass for ~s~%" device)
194 device)
195 (orig-canon spec))))))
196
197 ;; 1. Overwrite the definition source
198 (module-set! fs-mod 'canonicalize-device-spec new-canon)
199
200 ;; 2. Overwrite the consumer's binding (Crucial for boot-system)
201 (module-set! boot-mod 'canonicalize-device-spec new-canon)
202
203 (format #t "Epistemia: ZFS Monkey Patch Applied.~%"))
204 #~#t)
205
206 (with-output-to-port (%make-void-port "w")
207 (lambda ()
208 (set-path-environment-variable "PATH" '("bin" "sbin")
209 '#$helper-packages)))
210
211 (parameterize ((current-warning-port (%make-void-port "w")))
212 (boot-system #:mounts
213 (map spec->file-system
214 '#$(map file-system->spec file-systems))
215 #:pre-mount (lambda ()
216 (and #$pre-mount
217 #$@device-mapping-commands
218 #$@file-system-scan-commands
219 #$zfs-import-commands))
220 #:linux-modules '#$linux-modules
221 #:linux-module-directory '#$kodir
222 #:keymap-file #+(and=> keyboard-layout
223 keyboard-layout->console-keymap)
224 #:qemu-guest-networking? #$qemu-networking?
225 #:volatile-root? '#$volatile-root?
226 #:on-error '#$on-error))))
227 #:name "zfs-initrd"))
228
229(define* (epistemia-zfs-initrd file-systems
230 #:key
231 (linux linux-libre)
232 (zfs-package zfs)
233 (linux-modules '())
234 (mapped-devices '())
235 (keyboard-layout #f)
236 qemu-networking?
237 volatile-root?
238 (extra-modules '())
239 (on-error 'debug)
240 (monkey-patch? #t)
241 #:allow-other-keys)
242
243 (define linux-modules*
244 (cons "zfs"
245 `(,@linux-modules
246 ,@(file-system-modules file-systems)
247 ,@(if volatile-root? '("overlay") '())
248 ,@extra-modules)))
249
250 (define helper-packages
251 (cons zfs-package
252 (append (file-system-packages file-systems
253 #:volatile-root? volatile-root?)
254 (if keyboard-layout
255 (list loadkeys-static)
256 '()))))
257
258 (zfs-raw-initrd file-systems
259 #:linux linux
260 #:zfs-package zfs-package
261 #:linux-modules linux-modules*
262 #:mapped-devices mapped-devices
263 #:helper-packages helper-packages
264 #:keyboard-layout keyboard-layout
265 #:qemu-networking? qemu-networking?
266 #:volatile-root? volatile-root?
267 #:on-error on-error
268 #:monkey-patch? monkey-patch?))