Multiple Gentoo packages may need kernel sources to compile. There are packages, which are external modules such as virtualbox-modules or video drivers or wifi drivers or more. All these packages expect the current loaded kernel sources are present and to use them when compiling the external kernel module. But sometimes the proper kernel sources are missing, those needed to compile the kernel module in such a way to load it in the currently loaded kernel.
This article is valid not only for Gentoo Linux distribution but any Linux and kernel sources. So, if the user needs to have properly configured kernel sources for the currently loaded kernel, this is one way to do it right.
Here is an example: Updated kernel, but no sources are kept and then the VirtualBox needs to update to a newer version, but with the missing kernel sources of the currently loaded kernel updating the VirtualBox will cause the VirtualBox to stop working!
root@srv ~ # uname -a Linux srv 5.15.5-gentoo #2 SMP Tue Nov 30 16:08:49 EET 2021 x86_64 Intel(R) Core(TM) i7-5500U CPU @ 2.40GHz GenuineIntel GNU/Linux root@srv ~ # emerge -va app-emulation/virtualbox-modules These are the packages that would be merged, in order: [ebuild U ] app-emulation/virtualbox-modules-6.1.32:0/6.1::gentoo [6.1.26:0/6.1::gentoo] USE="dist-kernel -pax-kernel" 660 KiB Total: 1 packages (1 upgrades), Size of downloads: 0 KiB Would you like to merge these packages? [Yes/No] yes >>> Verifying ebuild manifests >>> Running pre-merge checks for app-emulation/virtualbox-6.1.32-r1 >>> Emerging (1 of 1) app-emulation/virtualbox-modules-6.1.32::gentoo * Fetching files in the background. * To view fetch progress, run in another terminal: * tail -f /var/log/emerge-fetch.log * vbox-kernel-module-src-6.1.32.tar.xz BLAKE2B SHA512 size ;-) ... [ ok ] * Determining the location of the kernel source code * Found kernel source directory: * /usr/src/linux * Found sources for kernel version: * 5.14.2-gentoo-x86_64-genkernel-NEW2 * Checking for suitable kernel configuration options... [ ok ] >>> Unpacking source... >>> Unpacking vbox-kernel-module-src-6.1.32.tar.xz to /var/tmp/portage/app-emulation/virtualbox-modules-6.1.32/work >>> Source unpacked in /var/tmp/portage/app-emulation/virtualbox-modules-6.1.32/work >>> Preparing source in /var/tmp/portage/app-emulation/virtualbox-modules-6.1.32/work ... >>> Source prepared. >>> Configuring source in /var/tmp/portage/app-emulation/virtualbox-modules-6.1.32/work ... >>> Source configured. >>> Compiling source in /var/tmp/portage/app-emulation/virtualbox-modules-6.1.32/work ...
Here is the problem: the currently loaded kernel is version 5.15.5-gentoo and the emerge system finds only sources for 5.14.2-gentoo-x86_64-genkernel-NEW2, which will use to produce modules for the 5.14.2-gentoo-x86_64-genkernel-NEW2. It is obvious enough the modules compiled against kernel sources of 5.14.2-gentoo-x86_64-genkernel-NEW2 version won’t be possible to be loaded under the currently load kernel with version 5.15.5-gentoo.
Here is how to fix this:
- Get the kernel sources for 5.15.5-gentoo in /usr/src/linux
- Save the currently loaded kernel config in /usr/src/linux/.config
- Load the configuration and prepare the kernel sources. No need to compile the kernel sources.
STEP 1) Get the kernel sources for 5.15.5-gentoo
emerge -v =gentoo-sources-5.15.5 rm -f /usr/src/linux ln -s /usr/src/linux-5.15.5-gentoo /usr/src/linux
These commands will install the needed kernel version and a link to the kernel sources will be created.
Of course, change the kernel version to the proper version if needed.
STEP 2) Save the currently loaded kernel config in /usr/src/linux/.config
zcat /proc/config.gz > /usr/src/linux/.config
If the /proc/config.gz is missing, copy the configuration from the /boot for the currently loaded kernel:
cat /boot/config-5.15.5-gentoo > /usr/src/linux-5.15.5-gentoo/.config
STEP 3) Load the configuration and prepare the kernel sources.
No need to compile the whole kernel source tree. Just to commands to configure and prepare the kernel sources:
cd /usr/src/linux-5.15.5-gentoo make oldconfig make prepare
The commands take Here is the output of the last commands:
root@srv1 ~ # cd /usr/src/linux-5.15.5-gentoo root@srv1 linux # make oldconfig HOSTCC scripts/basic/fixdep HOSTCC scripts/kconfig/conf.o HOSTCC scripts/kconfig/confdata.o HOSTCC scripts/kconfig/expr.o HOSTCC scripts/kconfig/lexer.lex.o HOSTCC scripts/kconfig/menu.o HOSTCC scripts/kconfig/parser.tab.o HOSTCC scripts/kconfig/preprocess.o HOSTCC scripts/kconfig/symbol.o HOSTCC scripts/kconfig/util.o HOSTLD scripts/kconfig/conf # # configuration written to .config # root@srv1 linux # make prepare SYNC include/config/auto.conf.cmd HOSTCC arch/x86/tools/relocs_32.o HOSTCC arch/x86/tools/relocs_64.o HOSTCC arch/x86/tools/relocs_common.o HOSTLD arch/x86/tools/relocs HOSTCC scripts/selinux/genheaders/genheaders HOSTCC scripts/selinux/mdp/mdp HOSTCC scripts/bin2c HOSTCC scripts/kallsyms HOSTCC scripts/sorttable HOSTCC scripts/asn1_compiler HOSTCC scripts/extract-cert UPD include/config/kernel.release UPD include/generated/utsrelease.h CC scripts/mod/empty.o HOSTCC scripts/mod/mk_elfconfig MKELF scripts/mod/elfconfig.h HOSTCC scripts/mod/modpost.o CC scripts/mod/devicetable-offsets.s HOSTCC scripts/mod/file2alias.o HOSTCC scripts/mod/sumversion.o HOSTLD scripts/mod/modpost CC kernel/bounds.s UPD include/generated/bounds.h CC arch/x86/kernel/asm-offsets.s UPD include/generated/asm-offsets.h CALL scripts/checksyscalls.sh CALL scripts/atomic/check-atomics.sh DESCEND objtool HOSTCC /usr/src/linux-5.15.5-gentoo/tools/objtool/fixdep.o HOSTLD /usr/src/linux-5.15.5-gentoo/tools/objtool/fixdep-in.o LINK /usr/src/linux-5.15.5-gentoo/tools/objtool/fixdep CC /usr/src/linux-5.15.5-gentoo/tools/objtool/exec-cmd.o CC /usr/src/linux-5.15.5-gentoo/tools/objtool/help.o CC /usr/src/linux-5.15.5-gentoo/tools/objtool/pager.o CC /usr/src/linux-5.15.5-gentoo/tools/objtool/parse-options.o CC /usr/src/linux-5.15.5-gentoo/tools/objtool/run-command.o CC /usr/src/linux-5.15.5-gentoo/tools/objtool/sigchain.o CC /usr/src/linux-5.15.5-gentoo/tools/objtool/subcmd-config.o LD /usr/src/linux-5.15.5-gentoo/tools/objtool/libsubcmd-in.o AR /usr/src/linux-5.15.5-gentoo/tools/objtool/libsubcmd.a CC /usr/src/linux-5.15.5-gentoo/tools/objtool/arch/x86/special.o CC /usr/src/linux-5.15.5-gentoo/tools/objtool/arch/x86/decode.o LD /usr/src/linux-5.15.5-gentoo/tools/objtool/arch/x86/objtool-in.o CC /usr/src/linux-5.15.5-gentoo/tools/objtool/weak.o CC /usr/src/linux-5.15.5-gentoo/tools/objtool/check.o CC /usr/src/linux-5.15.5-gentoo/tools/objtool/special.o CC /usr/src/linux-5.15.5-gentoo/tools/objtool/orc_gen.o CC /usr/src/linux-5.15.5-gentoo/tools/objtool/orc_dump.o CC /usr/src/linux-5.15.5-gentoo/tools/objtool/builtin-check.o CC /usr/src/linux-5.15.5-gentoo/tools/objtool/builtin-orc.o CC /usr/src/linux-5.15.5-gentoo/tools/objtool/elf.o CC /usr/src/linux-5.15.5-gentoo/tools/objtool/objtool.o CC /usr/src/linux-5.15.5-gentoo/tools/objtool/libstring.o CC /usr/src/linux-5.15.5-gentoo/tools/objtool/libctype.o CC /usr/src/linux-5.15.5-gentoo/tools/objtool/str_error_r.o CC /usr/src/linux-5.15.5-gentoo/tools/objtool/librbtree.o LD /usr/src/linux-5.15.5-gentoo/tools/objtool/objtool-in.o LINK /usr/src/linux-5.15.5-gentoo/tools/objtool/objtool
And from now on whenever the kernel sources are needed to compile modules or libraries against, the proper kernel sources will be used of the currently loaded kernel.
The Gentoo emerge command from the begging of this article, but this time with the properly configured kernel sources. The VirtualBox modules are compiled against the loaded kernel, so loading them is not an issue anymore!
root@srv ~ # uname -a Linux srv 5.15.5-gentoo #2 SMP Tue Nov 30 16:08:49 EET 2021 x86_64 Intel(R) Core(TM) i7-5500U CPU @ 2.40GHz GenuineIntel GNU/Linux root@srv ~ # emerge -va app-emulation/virtualbox-modules These are the packages that would be merged, in order: [ebuild U ] app-emulation/virtualbox-modules-6.1.32:0/6.1::gentoo [6.1.26:0/6.1::gentoo] USE="dist-kernel -pax-kernel" 660 KiB Total: 1 packages (1 upgrades), Size of downloads: 0 KiB Would you like to merge these packages? [Yes/No] yes >>> Verifying ebuild manifests >>> Running pre-merge checks for app-emulation/virtualbox-6.1.32-r1 >>> Emerging (1 of 1) app-emulation/virtualbox-modules-6.1.32::gentoo * Fetching files in the background. * To view fetch progress, run in another terminal: * tail -f /var/log/emerge-fetch.log * vbox-kernel-module-src-6.1.32.tar.xz BLAKE2B SHA512 size ;-) ... [ ok ] * Determining the location of the kernel source code * Found kernel source directory: * /usr/src/linux * Found sources for kernel version: * 5.15.5-gentoo-gentoo * Checking for suitable kernel configuration options... [ ok ] >>> Unpacking source... >>> Unpacking vbox-kernel-module-src-6.1.32.tar.xz to /var/tmp/portage/app-emulation/virtualbox-modules-6.1.32/work >>> Source unpacked in /var/tmp/portage/app-emulation/virtualbox-modules-6.1.32/work >>> Preparing source in /var/tmp/portage/app-emulation/virtualbox-modules-6.1.32/work ... >>> Source prepared. >>> Configuring source in /var/tmp/portage/app-emulation/virtualbox-modules-6.1.32/work ... >>> Source configured. >>> Compiling source in /var/tmp/portage/app-emulation/virtualbox-modules-6.1.32/work ... .... .... root@srv ~ # modprobe vboxdrv Feb 15 14:15:10 www kernel: vboxdrv: loading out-of-tree module taints kernel. Feb 15 14:15:10 www kernel: vboxdrv: Found 4 processor cores Feb 15 14:15:10 www kernel: vboxdrv: TSC mode is Invariant, tentative frequency 2394461773 Hz Feb 15 14:15:10 www kernel: vboxdrv: Successfully loaded version 6.1.32 r149290 (interface 0x00320000) Feb 15 14:15:10 www kernel: VBoxNetFlt: Successfully started.