Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Trying to find all the kernel modules needed for my machine using shell script

I'm developing kernel modules right now, and the build times are starting to get under my skin. As a side effect I'm taking way too many "coffee" breaks during builds.

So I was looking for a way to build only the stuffs I need for my platform. Chapter 7 and 8 of "linux kernel in a nutshell" gave a good detail of how to do that by hand. Its a good read : http://www.kroah.com/lkn/

But Although I understand the stuffs, this is still a lot of tweaks to make that work.

2.6.32 and later kernels added a new target make localmodconfig. which scans through lsmod and change the .config appropriately. So I thought I found my "automation". But this perl script has some problem too.

This thread describes the problems : https://bbs.archlinux.org/viewtopic.php?pid=845113

There was also a proposed solution which apparently worked for others , is to run the script directly instead of using make's target.

Although for me, make localmodconfig does not work at all. its because of the following :

make clean
make mrproper
cp /boo/config-'uname -r' .config
make localmodconfig

and it halts with

vboxguest config not found!!
nf_defrag_ipv6 config not found!!
vboxsf config not found!!
vboxvideo config not found!!

The thing is my kernel development environment is inside virtualbox. These vbox modules were installed when I chose to install "virtualbox guest addtion".

And the netfilter module might be a Distribution specific module(Lot of netfilter modules are not part of the mainline kernel, so its not a shock to me), which is not included in mainline kernel.

Now the workaround this obviously unloading these module and trying again. But I'm thinking if there is patch for the streamline_config.pl which will enable the user to exclude certain modules if s/he wants. Problem is I have zero knowledge about perl and I like it that way.

So my problems in nutshell

  1. Patching streamline_config.pl so I can give a list of module name as argument which it will exclude from processing the config file.

    The script is located at kernel.org

  2. EDIT: Removed the stuff about perl script not running. As mugen kenichi pointed out (How dumb I can be?). But still make localmodconfig does not work because of not having some modules code under source tree. patching streamline_config.pl still valid requirement.

like image 990
Aftnix Avatar asked Jul 13 '12 12:07

Aftnix


People also ask

How can I see all kernel modules?

You need to use the lsmod command, which show the status of loaded modules in the Linux Kernel. Linux kernel use a term modules for all hardware device drivers. This is an important task. With lsmod you can verify that device driver is loaded for particular hardware.

How do I see all the kernel modules installed on Linux?

Under Linux use the file /proc/modules shows what kernel modules (drivers) are currently loaded into memory.

Which command is used to check kernel modules?

modinfo command in Linux system is used to display the information about a Linux Kernel module. This command extracts the information from the Linux kernel modules given on the command line.

What is the command to list all currently loaded kernel modules?

Use the lsmod command to see what kernel modules are currently loaded. This is a list of the kernel module drivers which are currently loaded, as produced by the lsmod command.


1 Answers

Anyone else trying to build a minimum kernel image also looking for reducing build time, should do the following:

1) copy distribution kernel config in your source tree. It can be done with either command given below:

$zcat /proc/config.gz > .config

or

$cp /boot/config-'uname -r' .config

2) Use localmodconfig target.

$make localmodconfig

It will use lsmod to find which modules are loaded at this moment. Then it will search through distribution's .config to enable them and disable others.

Its important to know that it does not always work flawlessly. So you should tweak your config further using make menuconfig. You will see some modules are still marked to be built which is in reality unnecessary for your system.

Sometimes out of tree modules may cause make localmodconfig to fail. If that's the case you can work around that issue in two ways :

a) unload the out of tree modules and try make localmodconfig again. b) Run the perl script directly:

$chmod +x script/kconfig/streamline_config.pl
$perl script/kconfig/streamline_config.pl > .config

3) Install ccache[1]. It will improve your build time dramatically. It caches objects. So it will reduce subsequent builds.

Its possible that ccache is included in the distribution's repository so that you can install it through apt-get or yum. In CentOS its available in EPEL repo.[2]

4) Give as many cores as possible for the build job

$make -j8 CC="ccache gcc"

My results are :

real 3m10.871s
user 4m36.949s
sys 1m52.656s

[1] http://ccache.samba.org/ [2] http://fedoraproject.org/wiki/EPEL

like image 184
Aftnix Avatar answered Oct 01 '22 16:10

Aftnix