docs: verify/bisect: describe how to use a build host

Describe how to build kernels on another system (with and without
cross-compiling), as building locally can be quite painfully on some
slow systems. This is done in an add-on section, as it would make the
step-by-step guide to complicated if this special case would be
described there.

Signed-off-by: Thorsten Leemhuis <linux@leemhuis.info>
Signed-off-by: Jonathan Corbet <corbet@lwn.net>
Link: https://lore.kernel.org/r/288160cb4769e46a3280250ca71da0abc4aa002d.1712647788.git.linux@leemhuis.info
This commit is contained in:
Thorsten Leemhuis 2024-04-09 09:30:48 +02:00 committed by Jonathan Corbet
parent a421835a2a
commit 2bcfd71e8d
1 changed files with 74 additions and 4 deletions

View File

@ -276,6 +276,10 @@ Preparations: set up everything to build your own kernels
The following steps lay the groundwork for all further tasks.
Note: the instructions assume you are building and testing on the same
machine; if you want to compile the kernel on another system, check
:ref:`Build kernels on a different machine <buildhost_bis>` below.
.. _backup_bissbs:
* Create a fresh backup and put system repair and restore tools at hand, just
@ -2103,11 +2107,77 @@ problems will arise if the kernelrelease identifier exceeds 63 characters.
[:ref:`back to step-by-step guide <introoptional_bissbs>`].
Additional reading material
===========================
Additional information
======================
Further sources
---------------
.. _buildhost_bis:
Build kernels on a different machine
------------------------------------
To compile kernels on another system, slightly alter the step-by-step guide's
instructions:
* Start following the guide on the machine where you want to install and test
the kernels later.
* After executing ':ref:`Boot into the working kernel and briefly use the
apparently broken feature <bootworking_bissbs>`', save the list of loaded
modules to a file using ``lsmod > ~/test-machine-lsmod``. Then locate the
build configuration for the running kernel (see ':ref:`Start defining the
build configuration for your kernel <oldconfig_bisref>`' for hints on where
to find it) and store it as '~/test-machine-config-working'. Transfer both
files to the home directory of your build host.
* Continue the guide on the build host (e.g. with ':ref:`Ensure to have enough
free space for building [...] <diskspace_bissbs>`').
* When you reach ':ref:`Start preparing a kernel build configuration[...]
<oldconfig_bissbs>`': before running ``make olddefconfig`` for the first time,
execute the following command to base your configuration on the one from the
test machine's 'working' kernel::
cp ~/test-machine-config-working ~/linux/.config
* During the next step to ':ref:`disable any apparently superfluous kernel
modules <localmodconfig_bissbs>`' use the following command instead::
yes '' | make localmodconfig LSMOD=~/lsmod_foo-machine localmodconfig
* Continue the guide, but ignore the instructions outlining how to compile,
install, and reboot into a kernel every time they come up. Instead build
like this::
cp ~/kernel-config-working .config
make olddefconfig &&
make -j $(nproc --all) targz-pkg
This will generate a gzipped tar file whose name is printed in the last
line shown; for example, a kernel with the kernelrelease identifier
'6.0.0-rc1-local-g928a87efa423' built for x86 machines usually will
be stored as '~/linux/linux-6.0.0-rc1-local-g928a87efa423-x86.tar.gz'.
Copy that file to your test machine's home directory.
* Switch to the test machine to check if you have enough space to hold another
kernel. Then extract the file you transferred::
sudo tar -xvzf ~/linux-6.0.0-rc1-local-g928a87efa423-x86.tar.gz -C /
Afterwards :ref:`generate the initramfs and add the kernel to your boot
loader's configuration <install_bisref>`; on some distributions the following
command will take care of both these tasks::
sudo /sbin/installkernel 6.0.0-rc1-local-g928a87efa423 /boot/vmlinuz-6.0.0-rc1-local-g928a87efa423
Now reboot and ensure you started the intended kernel.
This approach even works when building for another architecture: just install
cross-compilers and add the appropriate parameters to every invocation of make
(e.g. ``make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- [...]``).
Additional reading material
---------------------------
* The `man page for 'git bisect' <https://git-scm.com/docs/git-bisect>`_ and
`fighting regressions with 'git bisect' <https://git-scm.com/docs/git-bisect-lk2009.html>`_