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 :).