1pub const MICROVM_KERNEL_CONFIG: &str = r#"#
20# RVF MicroVM Kernel Configuration
21# Target: Linux 6.8.x for Firecracker / QEMU microvm
22# Generated by rvf-kernel for RuVector Format computational containers
23#
24
25#
26# General setup
27#
28CONFIG_LOCALVERSION="-rvf"
29CONFIG_DEFAULT_HOSTNAME="rvf"
30CONFIG_SWAP=y
31CONFIG_SYSVIPC=y
32CONFIG_POSIX_MQUEUE=y
33CONFIG_AUDIT=y
34CONFIG_NO_HZ_FULL=y
35CONFIG_HIGH_RES_TIMERS=y
36CONFIG_PREEMPT_NONE=y
37CONFIG_TICK_CPU_ACCOUNTING=y
38CONFIG_IKCONFIG=y
39CONFIG_IKCONFIG_PROC=y
40CONFIG_LOG_BUF_SHIFT=14
41CONFIG_CGROUPS=y
42CONFIG_CGROUP_SCHED=y
43CONFIG_CGROUP_PIDS=y
44CONFIG_CGROUP_CPUACCT=y
45CONFIG_MEMCG=y
46CONFIG_NAMESPACES=y
47CONFIG_UTS_NS=y
48CONFIG_IPC_NS=y
49CONFIG_PID_NS=y
50CONFIG_NET_NS=y
51CONFIG_USER_NS=y
52# CONFIG_MODULES is not set
53CONFIG_CC_OPTIMIZE_FOR_SIZE=y
54CONFIG_EXPERT=y
55CONFIG_MULTIUSER=y
56CONFIG_SYSFS_SYSCALL=y
57CONFIG_FHANDLE=y
58CONFIG_POSIX_TIMERS=y
59CONFIG_PRINTK=y
60CONFIG_BUG=y
61CONFIG_ELF_CORE=y
62CONFIG_BASE_FULL=y
63CONFIG_FUTEX=y
64CONFIG_EPOLL=y
65CONFIG_SIGNALFD=y
66CONFIG_TIMERFD=y
67CONFIG_EVENTFD=y
68CONFIG_AIO=y
69CONFIG_IO_URING=y
70CONFIG_ADVISE_SYSCALLS=y
71CONFIG_KALLSYMS=y
72CONFIG_EMBEDDED=y
73
74#
75# Processor type and features
76#
77CONFIG_64BIT=y
78CONFIG_SMP=y
79CONFIG_NR_CPUS=64
80CONFIG_SCHED_SMT=y
81CONFIG_X86_X2APIC=y
82CONFIG_X86_LOCAL_APIC=y
83CONFIG_X86_IO_APIC=y
84CONFIG_X86_TSC=y
85CONFIG_MICROCODE=y
86CONFIG_X86_MSR=y
87CONFIG_X86_CPUID=y
88CONFIG_PARAVIRT=y
89CONFIG_PARAVIRT_SPINLOCKS=y
90CONFIG_KVM_GUEST=y
91CONFIG_HYPERVISOR_GUEST=y
92CONFIG_RANDOMIZE_BASE=y
93CONFIG_X86_DIRECT_GBPAGES=y
94CONFIG_NUMA=y
95CONFIG_MTRR=y
96CONFIG_X86_PAT=y
97
98#
99# Memory management
100#
101CONFIG_SPARSEMEM_VMEMMAP=y
102CONFIG_MEMORY_HOTPLUG=y
103CONFIG_TRANSPARENT_HUGEPAGE=y
104CONFIG_COMPACTION=y
105CONFIG_KSM=y
106
107#
108# Networking
109#
110CONFIG_NET=y
111CONFIG_PACKET=y
112CONFIG_UNIX=y
113CONFIG_INET=y
114CONFIG_IP_MULTICAST=y
115CONFIG_IP_ADVANCED_ROUTER=y
116CONFIG_IP_ROUTE_MULTIPATH=y
117CONFIG_IP_PNP=y
118CONFIG_IP_PNP_DHCP=y
119CONFIG_TCP_CONG_CUBIC=y
120CONFIG_TCP_CONG_BBR=y
121CONFIG_DEFAULT_BBR=y
122CONFIG_IPV6=y
123CONFIG_NETFILTER=y
124CONFIG_NF_CONNTRACK=y
125CONFIG_NF_TABLES=y
126CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
127CONFIG_IP_NF_IPTABLES=y
128CONFIG_IP_NF_FILTER=y
129CONFIG_IP_NF_NAT=y
130CONFIG_IP_NF_MANGLE=y
131CONFIG_VSOCKETS=y
132CONFIG_VIRTIO_VSOCKETS=y
133CONFIG_BRIDGE=y
134CONFIG_VLAN_8021Q=y
135
136#
137# Device drivers — VirtIO (Firecracker/QEMU)
138#
139CONFIG_VIRTIO_PCI=y
140CONFIG_VIRTIO_BLK=y
141CONFIG_VIRTIO_NET=y
142CONFIG_VIRTIO_BALLOON=y
143CONFIG_VIRTIO_CONSOLE=y
144CONFIG_VIRTIO_MMIO=y
145CONFIG_VIRTIO_INPUT=y
146CONFIG_HW_RANDOM_VIRTIO=y
147
148#
149# Block devices
150#
151CONFIG_BLK_DEV=y
152CONFIG_BLK_DEV_LOOP=y
153CONFIG_BLK_DEV_RAM=y
154CONFIG_BLK_DEV_RAM_SIZE=65536
155
156#
157# SCSI (for virtio-scsi)
158#
159CONFIG_SCSI=y
160CONFIG_BLK_DEV_SD=y
161CONFIG_SCSI_VIRTIO=y
162
163#
164# Serial / console
165#
166CONFIG_SERIAL_8250=y
167CONFIG_SERIAL_8250_CONSOLE=y
168CONFIG_HW_RANDOM=y
169CONFIG_TTY=y
170CONFIG_VT=y
171CONFIG_VT_CONSOLE=y
172
173#
174# Filesystems
175#
176CONFIG_EXT4_FS=y
177CONFIG_EXT4_FS_POSIX_ACL=y
178CONFIG_EXT4_FS_SECURITY=y
179CONFIG_TMPFS=y
180CONFIG_TMPFS_POSIX_ACL=y
181CONFIG_PROC_FS=y
182CONFIG_PROC_SYSCTL=y
183CONFIG_SYSFS=y
184CONFIG_DEVTMPFS=y
185CONFIG_DEVTMPFS_MOUNT=y
186# CONFIG_FUSE_FS is not set
187# CONFIG_NFS_FS is not set
188# CONFIG_CIFS is not set
189
190#
191# BPF subsystem
192#
193CONFIG_BPF=y
194CONFIG_BPF_SYSCALL=y
195CONFIG_BPF_JIT=y
196CONFIG_BPF_JIT_ALWAYS_ON=y
197CONFIG_BPF_UNPRIV_DEFAULT_OFF=y
198CONFIG_CGROUP_BPF=y
199CONFIG_BPF_LSM=y
200CONFIG_BPF_STREAM_PARSER=y
201
202#
203# Security
204#
205CONFIG_SECURITY=y
206CONFIG_SECURITY_NETWORK=y
207CONFIG_SECURITY_LOCKDOWN_LSM=y
208CONFIG_SECURITY_LOCKDOWN_LSM_EARLY=y
209CONFIG_LOCK_DOWN_KERNEL_FORCE_INTEGRITY=y
210CONFIG_SECURITY_YAMA=y
211CONFIG_SECURITY_LANDLOCK=y
212CONFIG_SECCOMP=y
213CONFIG_SECCOMP_FILTER=y
214CONFIG_STACKPROTECTOR=y
215CONFIG_STACKPROTECTOR_STRONG=y
216CONFIG_FORTIFY_SOURCE=y
217CONFIG_HARDENED_USERCOPY=y
218CONFIG_STATIC_USERMODEHELPER=y
219CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y
220# CONFIG_SECURITY_SELINUX is not set
221# CONFIG_SECURITY_APPARMOR is not set
222
223#
224# Crypto
225#
226CONFIG_CRYPTO=y
227CONFIG_CRYPTO_SHA256=y
228CONFIG_CRYPTO_SHA512=y
229CONFIG_CRYPTO_AES=y
230CONFIG_CRYPTO_GCM=y
231CONFIG_CRYPTO_CHACHA20POLY1305=y
232CONFIG_CRYPTO_ECDH=y
233CONFIG_CRYPTO_CURVE25519=y
234
235#
236# Disabled subsystems (keep image small)
237#
238# CONFIG_SOUND is not set
239# CONFIG_USB_SUPPORT is not set
240# CONFIG_DRM is not set
241# CONFIG_WIRELESS is not set
242# CONFIG_WLAN is not set
243# CONFIG_BLUETOOTH is not set
244# CONFIG_INPUT_JOYSTICK is not set
245# CONFIG_INPUT_TABLET is not set
246# CONFIG_INPUT_TOUCHSCREEN is not set
247# CONFIG_MEDIA_SUPPORT is not set
248# CONFIG_AGP is not set
249# CONFIG_PCMCIA is not set
250# CONFIG_INFINIBAND is not set
251# CONFIG_ISDN is not set
252# CONFIG_PARPORT is not set
253# CONFIG_PHONE is not set
254# CONFIG_ACCESSIBILITY is not set
255# CONFIG_FIRMWARE_EDID is not set
256# CONFIG_LOGO is not set
257# CONFIG_FB is not set
258# CONFIG_BACKLIGHT_CLASS_DEVICE is not set
259
260#
261# Debugging (minimal for production)
262#
263CONFIG_PRINTK_TIME=y
264CONFIG_MAGIC_SYSRQ=y
265CONFIG_DEBUG_KERNEL=y
266# CONFIG_DEBUG_INFO_DWARF5 is not set
267# CONFIG_KPROBES is not set
268# CONFIG_FTRACE is not set
269"#;
270
271pub const REQUIRED_OPTIONS: &[&str] = &[
276 "CONFIG_64BIT=y",
277 "CONFIG_SMP=y",
278 "CONFIG_VIRTIO_PCI=y",
279 "CONFIG_VIRTIO_BLK=y",
280 "CONFIG_VIRTIO_NET=y",
281 "CONFIG_BPF=y",
282 "CONFIG_BPF_JIT=y",
283 "CONFIG_BPF_SYSCALL=y",
284 "CONFIG_VSOCKETS=y",
285 "CONFIG_VIRTIO_VSOCKETS=y",
286 "CONFIG_EXT4_FS=y",
287 "CONFIG_SECURITY_LOCKDOWN_LSM=y",
288 "CONFIG_STACKPROTECTOR_STRONG=y",
289 "CONFIG_RANDOMIZE_BASE=y",
290 "CONFIG_PREEMPT_NONE=y",
291 "CONFIG_NO_HZ_FULL=y",
292 "# CONFIG_MODULES is not set",
293 "# CONFIG_SOUND is not set",
294 "# CONFIG_USB_SUPPORT is not set",
295 "# CONFIG_DRM is not set",
296 "# CONFIG_WIRELESS is not set",
297];
298
299pub fn validate_config(config: &str) -> Result<(), Vec<&'static str>> {
304 let missing: Vec<&str> = REQUIRED_OPTIONS
305 .iter()
306 .filter(|&&opt| !config.lines().any(|line| line.trim() == opt))
307 .copied()
308 .collect();
309
310 if missing.is_empty() {
311 Ok(())
312 } else {
313 Err(missing)
314 }
315}
316
317#[cfg(test)]
318mod tests {
319 use super::*;
320
321 #[test]
322 fn microvm_config_has_all_required_options() {
323 let result = validate_config(MICROVM_KERNEL_CONFIG);
324 assert!(
325 result.is_ok(),
326 "missing required options: {:?}",
327 result.unwrap_err()
328 );
329 }
330
331 #[test]
332 fn config_disables_modules() {
333 assert!(MICROVM_KERNEL_CONFIG.contains("# CONFIG_MODULES is not set"));
334 }
335
336 #[test]
337 fn config_enables_virtio() {
338 assert!(MICROVM_KERNEL_CONFIG.contains("CONFIG_VIRTIO_PCI=y"));
339 assert!(MICROVM_KERNEL_CONFIG.contains("CONFIG_VIRTIO_BLK=y"));
340 assert!(MICROVM_KERNEL_CONFIG.contains("CONFIG_VIRTIO_NET=y"));
341 assert!(MICROVM_KERNEL_CONFIG.contains("CONFIG_VIRTIO_VSOCKETS=y"));
342 }
343
344 #[test]
345 fn config_enables_bpf() {
346 assert!(MICROVM_KERNEL_CONFIG.contains("CONFIG_BPF=y"));
347 assert!(MICROVM_KERNEL_CONFIG.contains("CONFIG_BPF_JIT=y"));
348 assert!(MICROVM_KERNEL_CONFIG.contains("CONFIG_BPF_SYSCALL=y"));
349 assert!(MICROVM_KERNEL_CONFIG.contains("CONFIG_BPF_JIT_ALWAYS_ON=y"));
350 }
351
352 #[test]
353 fn config_enables_security_hardening() {
354 assert!(MICROVM_KERNEL_CONFIG.contains("CONFIG_SECURITY_LOCKDOWN_LSM=y"));
355 assert!(MICROVM_KERNEL_CONFIG.contains("CONFIG_STACKPROTECTOR_STRONG=y"));
356 assert!(MICROVM_KERNEL_CONFIG.contains("CONFIG_RANDOMIZE_BASE=y"));
357 assert!(MICROVM_KERNEL_CONFIG.contains("CONFIG_SECCOMP=y"));
358 assert!(MICROVM_KERNEL_CONFIG.contains("CONFIG_SECCOMP_FILTER=y"));
359 assert!(MICROVM_KERNEL_CONFIG.contains("CONFIG_FORTIFY_SOURCE=y"));
360 }
361
362 #[test]
363 fn config_disables_desktop_hardware() {
364 assert!(MICROVM_KERNEL_CONFIG.contains("# CONFIG_SOUND is not set"));
365 assert!(MICROVM_KERNEL_CONFIG.contains("# CONFIG_USB_SUPPORT is not set"));
366 assert!(MICROVM_KERNEL_CONFIG.contains("# CONFIG_DRM is not set"));
367 assert!(MICROVM_KERNEL_CONFIG.contains("# CONFIG_WIRELESS is not set"));
368 assert!(MICROVM_KERNEL_CONFIG.contains("# CONFIG_BLUETOOTH is not set"));
369 }
370
371 #[test]
372 fn validate_catches_missing_options() {
373 let incomplete = "CONFIG_64BIT=y\nCONFIG_SMP=y\n";
374 let result = validate_config(incomplete);
375 assert!(result.is_err());
376 let missing = result.unwrap_err();
377 assert!(missing.contains(&"CONFIG_VIRTIO_PCI=y"));
378 }
379
380 #[test]
381 fn config_sets_localversion() {
382 assert!(MICROVM_KERNEL_CONFIG.contains("CONFIG_LOCALVERSION=\"-rvf\""));
383 }
384
385 #[test]
386 fn config_is_nonzero_length() {
387 assert!(MICROVM_KERNEL_CONFIG.len() > 1000);
388 }
389}