[<prev] [next>] [day] [month] [year] [list]
Message-ID: <alpine.DEB.1.10.0809181330410.11972@gandalf.stny.rr.com>
Date: Thu, 18 Sep 2008 13:34:04 -0400 (EDT)
From: Steven Rostedt <rostedt@...dmis.org>
To: LKML <linux-kernel@...r.kernel.org>
cc: Linus Torvalds <torvalds@...ux-foundation.org>,
Andrew Morton <akpm@...ux-foundation.org>,
Thomas Gleixner <tglx@...utronix.de>,
Ingo Molnar <mingo@...e.hu>, Theodore Tso <tytso@....edu>,
gregkh@...e.de
Subject: [PATCH] script to remove unused modules from config file
I heard that at KS my script was mentioned, and that I should submit
it as a patch to be added to the scripts directory. Well here's the patch.
The way this script works is that you must boot into the kernel that
you want to clean up the config. Then change into the directory that holds
the source of the kernel you booted into. Make sure all the modules you
want are loaded (remember to plug in a USB stick ;-) Then simply run
this script redirecting the output into another file.
$ cd ~/kernels/linux.git
$ scripts/streamline_config.pl > config-sl
$ mv .config config-orig
$ mv config-sl .config
$ make oldconfig
That's it!
The way this works is that the script reads what modules are loaded by doing
a lsmod. Then it reads all the Makefiles finding the configurations that
turn on those modules. Finally it reads the config and disables all modules
that were not used.
Note, this script does not touch any "y" option, only "m".
Signed-off-by: Steven Rostedt <srostedt@...hat.com>
---
scripts/streamline_config.pl | 121 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 121 insertions(+)
Index: linux-tip.git/scripts/streamline_config.pl
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ linux-tip.git/scripts/streamline_config.pl 2008-09-17 14:56:52.000000000 -0400
@@ -0,0 +1,121 @@
+#!/usr/bin/perl -w
+#
+# Copywrite 2005-2008 - Steven Rostedt
+# Licensed under the terms of the GNU GPL License version 2
+#
+# It's simple enough to figure out how this works.
+# If not, then you can ask me at rostedt@...dmis.org
+#
+# What it does?
+#
+# If you have installed a Linux kernel from a distribution
+# that turns on way too many modules than you need, and
+# you only want the modules you use, than this program
+# is perfect for you.
+#
+# It gives you the ability to turn off all the modules that are
+# not loaded on your system.
+#
+# Howto:
+#
+# 1. Boot up the kernel that you want to stream line the config on.
+# 2. Change directory to the directory holding the source of the
+# kernel that you just booted.
+# 3. Copy the configuraton file to this directory as .config
+# 4. Have all your devices that you need modules for connected and
+# operational (make sure that their corresponding modules are loaded)
+# 5. Run this script redirecting the output to some other file
+# like config_strip.
+# 6. Back up your old config (if you want too).
+# 7. copy the config_strip file to .config
+# 8. Run "make oldconfig"
+#
+# Now your kernel is ready to be built with only the modules that
+# are loaded.
+#
+# Here's what I did with my Debian distribution.
+#
+# cd /usr/src/linux-2.6.10
+# cp /boot/config-2.6.10-1-686-smp .config
+# ~/bin/streamline_config > config_strip
+# mv .config config_sav
+# mv config_strip .config
+# make oldconfig
+#
+my $config = ".config";
+my $linuxpath = ".";
+
+open(CIN,$config) || die "Can't open current config file: $config";
+my @makefiles = `find $linuxpath -name Makefile`;
+
+my %objects;
+my $var;
+my $cont = 0;
+
+foreach my $makefile (@makefiles) {
+ chomp $makefile;
+
+ open(MIN,$makefile) || die "Can't open $makefile";
+ while (<MIN>) {
+ my $catch = 0;
+
+ if ($cont && /(\S.*)$/) {
+ $objs = $1;
+ $catch = 1;
+ }
+ $cont = 0;
+
+ if (/obj-\$\((CONFIG_[^)]*)\)\s*[+:]?=\s*(.*)/) {
+ $var = $1;
+ $objs = $2;
+ $catch = 1;
+ }
+ if ($catch) {
+ if ($objs =~ m,(.*)\\$,) {
+ $objs = $1;
+ $cont = 1;
+ }
+
+ foreach my $obj (split /\s+/,$objs) {
+ $obj =~ s/-/_/g;
+ if ($obj =~ /(.*)\.o$/) {
+ $objects{$1} = $var;
+ }
+ }
+ }
+ }
+ close(MIN);
+}
+
+my %modules;
+
+open(LIN,"/sbin/lsmod|") || die "Cant lsmod";
+while (<LIN>) {
+ next if (/^Module/); # Skip the first line.
+ if (/^(\S+)/) {
+ $modules{$1} = 1;
+ }
+}
+close (LIN);
+
+my %configs;
+foreach my $module (keys(%modules)) {
+ if (defined($objects{$module})) {
+ $configs{$objects{$module}} = $module;
+ } else {
+ print STDERR "$module config not found!!\n";
+ }
+}
+
+while(<CIN>) {
+ if (/^(CONFIG.*)=m/) {
+ if (defined($configs{$1})) {
+ print;
+ } else {
+ print "# $1 is not set\n";
+ }
+ } else {
+ print;
+ }
+}
+close(CIN);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists