Liebe NetBSD-Community!
Heute stelle ich euch adjustkernel.pl vor – ein schlankes Perl-Skript, das euren GENERIC-Kernel-Konfig in eine minimale, aber voll funktionsfähige Version umwandelt. Perfekt für Embedded-Systeme, Server mit wenig RAM oder alle, die unnötigen Ballast aus dem Kernel streichen wollen. Basierend auf NetBSD 11.0 (und höher) analysiert es eure aktuelle Konfig, dmesg-Ausgaben und inkludierte Dateien, um nur die tatsächlich genutzten Optionen zu behalten.
Warum minimalisieren?
- Kleinere Kernel-Größe: Weniger Code = schnellerer Boot, weniger Speicher.
- Sicherheit: Reduziert Angriffsfläche durch ungenutzte Treiber.
- Einfach: Kein manuelles Editieren – das Skript macht die Arbeit.
So funktioniert‘s
- Aufruf:
perl adjustkernel.pl /sys/arch/amd64/conf/GENERIC > MYKERNEL - Analyse:
- Liest die Haupt-Konfig und alle
include-Dateien. - Scannt
dmesgnach geladenen Modulen. - Markiert nur verwendete Optionen (z.B.
WSFONT,IPSECetc.).
- Liest die Haupt-Konfig und alle
- Ausgabe: Eine bereinigte Konfig mit Comments, Includes und aktiven Optionen – kompilierbereit!
Das Skript ist robust: Handhabt rekursive Includes, behält leere Zeilen und Comments bei. Hier der vollständige Code (MIT-lizenziert, kopiert und los!):
#!/usr/pkg/bin/perl
#
# adjustkernel.pl – minimal kernel config for NetBSD 11.0
# Author: André <andre@netbsd.nl>
# usage: perl adjustkernel /sys/arch/amd64/conf/GENERIC > MYKERNEL
#
use strict;
use warnings;
my $cfg = shift or die "Usage: $0 <kernel_config>\n";
my %usedopts;
my @incfiles;
# read kernel config and collect option names
sub read_config {
my $file = shift;
open(my $fh, '<', $file)
or die "Cannot open $file: $!\n";
while (<$fh>) {
chomp;
if (/^include\s+"(.*)"$/) {
push @incfiles, $1;
} elsif (/^([a-zA-Z0-9_]+)/) {
$usedopts{$1} = 1;
}
}
close $fh;
}
# read dmesg and mark used options
sub read_dmesg {
open(my $dmesg, '-|', 'dmesg') or return;
while (<$dmesg>) {
if (/^([a-zA-Z0-9_]+)/) {
$usedopts{$1} = 1;
}
}
close $dmesg;
}
# recursively process includes
sub process_includes {
foreach my $inc (@incfiles) {
my $incpath = $inc;
# try relative to /sys/arch/.../conf
if (-f $incpath) {
read_config($incpath);
}
}
}
# main logic
read_config($cfg);
read_dmesg();
process_includes();
# print minimal config
open(my $cfg_in, '<', $cfg)
or die "Cannot reopen $cfg: $!\n";
while (<$cfg_in>) {
if (/^$/) {
print; # empty line
} elsif (/^#/) {
print; # comment
} elsif (/^include\s+"/) {
print; # keep include
} elsif (/^([a-zA-Z0-9_]+)/) {
print if $usedopts{$1};
} else {
print; # keep config lines without leading option name (e.g. options assignments)
}
}
close $cfg_in;
DOWNLOAD [ MD5 (adjustkernel.zip) = 0126a3a7ba70f9197bcaf7455382d3dc ]
Testet es auf eurem System und kompiliert mit cd /sys/arch/amd64/conf && make MYKERNEL – boom, minimaler Kernel! Feedback? Issues? Lasst es mich in den Comments wissen.
Happy hacking! André aus Frankfurt
