Skip to main content

rvf_kernel/
config.rs

1//! Real Linux kernel configuration for microVM boot.
2//!
3//! This module provides a minimal, valid Linux kernel `.config` suitable for
4//! building a microVM kernel (Firecracker / QEMU microvm). The config enables
5//! only what is needed: VirtIO drivers, networking, BPF, security hardening,
6//! and a minimal filesystem. Everything else (sound, USB, DRM, wireless,
7//! loadable modules) is disabled to keep the image small.
8
9/// Minimal Linux kernel configuration for RVF microVM boot.
10///
11/// This is a valid Linux kernel `.config` file content. Key design decisions:
12/// - No loadable modules (CONFIG_MODULES is not set) for security
13/// - VirtIO PCI/block/net/vsock for Firecracker/QEMU compatibility
14/// - BPF + JIT for eBPF programs embedded in RVF
15/// - Security hardening (KASLR, stack protector, lockdown LSM)
16/// - PREEMPT_NONE + NO_HZ_FULL for low-latency microVM
17/// - Minimal filesystem support (ext4 + tmpfs + proc/sys/devtmpfs)
18/// - No sound, USB, DRM, wireless, or other desktop hardware
19pub 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
271/// Required config options that MUST be present for a valid RVF microVM kernel.
272///
273/// These are checked by `validate_config()` to ensure the config wasn't
274/// accidentally stripped of critical options.
275pub 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
299/// Validate that a kernel config string contains all required options.
300///
301/// Returns `Ok(())` if all required options are present, or `Err` with
302/// a list of missing options.
303pub 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}