What is the minimal set of firmware files I need for my hardware?

Doron Behar doron.behar at gmail.com
Mon May 4 11:20:57 EDT 2020


On Mon, May 04, 2020 at 03:06:10PM +0200, Greg KH wrote:
> On Mon, May 04, 2020 at 03:56:40PM +0300, Doron Behar wrote:
> > On Mon, May 04, 2020 at 12:45:55PM +0200, Greg KH wrote:
> > > On Mon, May 04, 2020 at 01:26:35PM +0300, Doron Behar wrote:
> > > > I hope this question fits to this List.
> > > > 
> > > > Today I learned that my distro's `linux-unfree-firmware` package is 491
> > > > Mb in size. I'm pretty sure my hardware doesn't need all of these files.
> > > > Maybe different Linux distros call this package differently, but I'm talking
> > > > about the firmware files that come from:
> > > > https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/
> > > > 
> > > > I think I can reduce this disk usage if I'll only know what files
> > > > I can exclude from there.
> > > > 
> > > > Is there any official documentation, that states exactly what files from
> > > > That git repo are needed per device / computer model? Perhaps the official
> > > > documentation of my Computer's hardware will state that? There's a Linux
> > > > from scratch webpage[1] that gives some info for popular hardware, but I'm
> > > > wondering if there's a bit more "official" information available
> > > > somewhere.
> > > > 
> > > > [1]: http://linuxfromscratch.org/blfs/view/svn/postlfs/firmware.html
> > > 
> > > The kernel macro MODULE_FIRMWARE() will show the firmware file that a
> > > specific kernel module needs.  So if you look a the output of modinfo
> > > for all of the modules that your system needs, you will see a "firmware"
> > > line that shows the name that your hardware needs for that specific
> > > driver/module.
> > 
> > Thanks for replying greg,
> > 
> > So I have the command `modinfo` available, should I just iterate _all_
> > the files in /usr/lib/modules/5.6.7/kernel ? For example:
> 
> No, don't iterate all kernel modules, unless you only built the modules
> that you know you need for your hardware (like you can get by running
> 'make localmodconfig').
> 
> > 
> > ```
> > $ modinfo /usr/lib/modules/5.6.7/kernel/net/ieee802154/ieee802154.ko.xz
> > filename:       /usr/lib/modules/5.6.7/kernel/net/ieee802154/ieee802154.ko.xz
> > author:         Dmitry Eremin-Solenikov
> > description:    IEEE 802.15.4 configuration interface
> > license:        GPL v2
> > depends:        
> > retpoline:      Y
> > intree:         Y
> > name:           ieee802154
> > vermagic:       5.6.7 SMP mod_unload 
> > sig_id:         PKCS#7
> > signer:         
> > sig_key:        
> > sig_hashalgo:   unknown
> > signature:      
> > ```
> > 
> > Doesn't seem informative regarding firmware files. Should I expect other
> > .ko.xz files to give a line with `firmware: `?
> 
> Yes, try looking at btrtl.ko for an example.
> 
> The module you picked above does not need any firmware to control the
> hardware it manages (hint, it's not a driver for any specific hardware,
> just a protocol that other drivers use.)

Cool! I see it now.

> > Plus, how do I know what modules does my system need and which it
> > doesn't?
> 
> That's up to you to figure out if you are building your own kernel
> image.
> 
> As I mentioned above, the 'make localmodconfig' is a nice quick shortcut
> to get that done, I recommend using it by doing:
> 	- boot a distro kernel
> 	- plug in all devices you want to support
> 	- run 'make localmodconfig' to create a .config file based only
> 	  on the modules you have loaded in the system at that point in
> 	  time.
> 	- build the kernel with that .config file

OK! I did all that, and ran make afterwards. Now, I got a few .ko files
found in the build directory, and it seems that these are definitely
just a selection of those found in my distro's kernel. I ran then:

    find -name '*.ko' -exec modinfo {} \; | grep '^firmware:'

So if I understand correctly. The files listed in the output of this
command are the only files I do need, assuming all of the modules where
loaded when I ran `make localmodconfig`.

I was connected to a WiFi network and I connected to a Bluetooth device
prior to running `make localmodconfig` - just to make sure I used all of
my hardware and that all of the kernel modules that might be relevant
were loaded.

I guess that now I just have to download these files only from
https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/

> 
> hope this helps,
> 
> greg k-h
> 

Thank you greg for you help and guidance :).



More information about the Kernelnewbies mailing list