Files
clear-linux-documentation/source/guides/kernel/kernel-modules-dkms.rst
puneetse 6c1d61b9d2 Add path to kernel source headers (#1092)
Add the path to kernel source headers in kernel module documentation for reference.
2020-03-24 11:25:42 -07:00

314 lines
9.5 KiB
ReStructuredText

.. _kernel-modules-dkms:
Add kernel modules with DKMS
############################
This guide describes how to add kernel modules with
:abbr:`DKMS (Dynamic Kernel Module System)`.
.. contents:: :local:
:depth: 1
:backlinks: top
Overview
********
Certain kernel modules are enabled by default in |CL-ATTR|. To use additional
kernel modules that are not part of the Linux source tree, you may need to
build out-of-tree kernel modules. Use this guide to add kernel modules with
DKMS or refer to :ref:`kernel-modules`.
Description
***********
Kernel modules are additional pieces of software capable of being inserted
into the Linux kernel to add functionality, such as a hardware driver.
Kernel modules may already be part of the Linux source tree (in-tree) or may
come from an external source, such as directly from a vendor (out-of-tree).
DKMS is a framework that facilitates the building and installation of kernel
modules. DKMS allows |CL| to provide hooks that automatically rebuild modules
against new kernel versions.
.. include:: kernel-modules.rst
:start-after: kernel-modules-availability-begin:
:end-before: kernel-modules-availability-end:
Install DKMS
************
.. _kernel-modules-dkms-install-begin:
The :command:`kernel-native-dkms` bundle provides the DKMS program and Linux
kernel headers, which are placed under :file:`/usr/lib/modules/$(uname
-r)/build/include/` and are required to compile kernel modules.
The :command:`kernel-native-dkms` bundle also:
* Adds a `systemd` update trigger
(:file:`/usr/lib/systemd/system/dkms-new-kernel.service`) to automatically
run DKMS to rebuild modules after a kernel upgrade occurs with :ref:`swupd
update <swupd-guide>`.
* Disables kernel module signature verification by appending a kernel
command-line parameter (:command:`module.sig_unenforce`) from the
:file:`/usr/share/kernel/cmdline.d/clr-ignore-mod-sig.conf` file.
* Adds a notification to the Message of the Day (MOTD) indicating kernel
module signature verification is disabled.
.. warning::
We recommend that you always review the :command:`swupd update` output
to make sure kernel modules were successfully rebuilt against the new
kernel. This is especially important for systems where a successful boot
relies on a kernel module.
Install the :command:`kernel-native-dkms` or :command:`kernel-lts-dkms`
bundle:
#. Determine which kernel variant is running on |CL|. Only the *native*
and *lts* kernels are enabled to build and load out-of-tree kernel modules
with DKMS.
.. code-block:: bash
$ uname -r
5.XX.YY-ZZZZ.native
Ensure *.native* or *.lts* is in the kernel name.
#. Install the DKMS bundle corresponding to the installed kernel. Use
:command:`kernel-native-dkms` for the native kernel or
:command:`kernel-lts-dkms` for the lts kernel.
.. code-block:: bash
sudo swupd bundle-add kernel-native-dkms
or
.. code-block:: bash
sudo swupd bundle-add kernel-lts-dkms
#. Update the |CL| bootloader and reboot.
.. code-block:: bash
sudo clr-boot-manager update
reboot
.. _kernel-modules-dkms-install-end:
Build, install, and load an out-of-tree module
**********************************************
Follow the steps in this section if you are an individual user or testing,
and you need an out-of-tree kernel module that is not available through
|CL|. For a more scalable and customizable approach, we recommend using
:ref:`mixer` to provide a custom kernel and updates.
Prerequisites
=============
Before you begin, you must:
* Disable Secure Boot in UEFI/BIOS. The loading of new out-of-tree modules
modifies the signatures that Secure Boot relies on for trust.
* Obtain a kernel module package in the form of source code or
pre-compiled binaries.
Obtain kernel module source
===========================
A required :file:`dkms.conf` file inside of the kernel module's source code
directory informs DKMS how the kernel module should be compiled.
Kernel modules may come packaged as:
- Source code without a :file:`dkms.conf` file
- Source code with a premade :file:`dkms.conf` file
- Source code with a premade :file:`dkms.conf` file and precompiled module
binaries
- Precompiled module binaries only (without source code)
Of the package types listed above, only precompiled kernel module binaries
will not work, because |CL| requires kernel modules to be built against the
same kernel source tree before they can be loaded. If you are only able to
obtain source code without a :file:`dkms.conf` file, you must manually create
a :file:`dkms.conf` file, described later in this document.
#. Download the kernel module's source code.
* Review the available download options. Some kernel modules provide
separate archives that are specifically enabled for DKMS support.
* Review the README documentation, because it often provides required
information to build the module with DKMS support.
.. code-block:: bash
curl -O http://<URL-TO-KERNEL-MODULE-SOURCE>.tar.gz
tar -xvf <KERNEL-MODULE-SOURCE>.tar.gz
cd <KERNEL-MODULE-SOURCE>/
cat README
Build kernel module with an existing dkms.conf
==============================================
If the kernel module maintainer packaged the source archive with the
:command:`dkms mktarball` command, the entire archive can be passed to the
:command:`dkms ldtarball` which completes many steps for you.
The archive contains the required :file:`dkms.conf` file, and may contain
a :file:`dkms_source_tree` directory and a :file:`dkms_binaries_only`
directory.
#. Run the :command:`dkms ldtarball` command against the kernel
module archive.
.. code-block:: bash
dkms ldtarball <KERNEL-MODULE-SOURCE_WITH_DKMS>.tar.gz
:command:`dkms ldtarball` places the kernel module source under
:file:`/usr/src/<MODULE-NAME>-<MODULE-VERSION>/`, builds it if necessary,
and adds the module into the DKMS tree.
#. Verify the kernel module is detected by checking the output of the
:command:`dkms status` command.
.. code-block:: bash
dkms status
#. Install the kernel module.
.. code-block:: bash
dkms install -m <MODULE-NAME> -v <MODULE-VERSION>
Build kernel module without an existing dkms.conf
=================================================
If the kernel module source does not contain a :file:`dkms.conf` file or the
:command:`dkms ldtarball` command encounters errors, you must manually
create the file.
Review the kernel module README documentation for guidance on what needs to be
in the :file:`dkms.conf` file, including special variables that may be
required to build successfully.
Here are some additional resources that can be used for reference:
* DKMS manual page (:command:`man dkms`) shows detailed syntax in the
DKMS.CONF section.
* Ubuntu community wiki entry for the `Kernel DKMS Package`_ shows an example
where a single package contains multiple modules.
* Sample `dkms.conf`_ file in the GitHub\* repository for the DKMS project.
.. note::
:command:`AUTOINSTALL=yes` must be set in the dkms.conf for the module to
be automatically recompiled with |CL| updates.
The instructions below show a generic example:
#. Create or modify the :file:`dkms.conf` file inside of the extracted source
code directory.
.. code-block:: bash
$EDITOR dkms.conf
MAKE="make -C src/ KERNELDIR=/lib/modules/${kernelver}/build"
CLEAN="make -C src/ clean"
BUILT_MODULE_NAME=custom_module
BUILT_MODULE_LOCATION=src/
PACKAGE_NAME=custom_module
PACKAGE_VERSION=1.0
DEST_MODULE_LOCATION=/kernel/drivers/other
AUTOINSTALL=yes
This example identifies a kernel module named *custom_module* with version
*1.0*.
#. Copy the kernel module source code into the :file:`/usr/src/` directory.
.. code-block:: bash
sudo mkdir /usr/src/<PACKAGE_NAME>-<PACKAGE_VERSION>
sudo cp -Rv . /usr/src/<PACKAGE_NAME>-<PACKAGE_VERSION>
.. note::
*<PACKAGE_NAME>* and *<PACKAGE_VERSION>* must match the entries in the
:file:`dkms.conf` file.
#. Add the kernel module to the DKMS tree so that it is tracked by DKMS.
.. code-block:: bash
sudo dkms add -m <MODULE-NAME>
#. Build the kernel module using DKMS. If the build encounters errors,
you may need to edit the :file:`dkms.conf` file.
.. code-block:: bash
sudo dkms build -m <MODULE-NAME> -v <MODULE-VERSION>
#. Install the kernel module using DKMS.
.. code-block:: bash
sudo dkms install -m <MODULE-NAME> -v <MODULE-VERSION>
Load kernel module
==================
By default, DKMS installs modules "in-tree" under :file:`/lib/modules` so the
:command:`modprobe` command can be used to load them.
#. Load the installed module with the :command:`modprobe` command.
.. code-block:: bash
sudo modprobe <MODULE-NAME>
#. Validate the kernel module is loaded.
.. code-block:: bash
lsmod | grep <MODULE-NAME>
Examples
********
.. include:: kernel-modules.rst
:start-after: kernel-modules-autoload-begin:
:end-before: kernel-modules-autoload-end:
Related topics
**************
* `Dynamic Kernel Module System (DKMS)`_
* `Dell Linux Engineering Dynamic Kernel Module Support: From Theory to Practice <https://www.kernel.org/doc/ols/2004/ols2004v1-pages-187-202.pdf>`_
* `Linux Journal: Exploring Dynamic Kernel Module Support <https://www.linuxjournal.com/article/6896>`_
.. _Dynamic Kernel Module System (DKMS): https://github.com/dell/dkms
.. _Kernel DKMS Package: https://help.ubuntu.com/community/Kernel/DkmsDriverPackage#Configure_DKMS
.. _dkms.conf: https://github.com/dell/dkms/blob/master/sample.conf