24f96dd290
6.11.8 & memattr fix & CET enablement; bugs: bsc#1012628 bsc#1225770 bsc#1231173 bsc#1231465 bsc#1231541 bsc#1231849 bsc#1231853 bsc#1231854 bsc#1231855 bsc#1231856 bsc#1231857 bsc#1231858 bsc#1231859 bsc#1231860 bsc#1231861 bsc#1231864 bsc#1231865 bsc#1231867 bsc#1231868 bsc#1231869 bsc#1231871 bsc#1231872 bsc#1231899 bsc#1231901 bsc#1231902 bsc#1231903 bsc#1231904 bsc#1231905 bsc#1231906 bsc#1231907 bsc#1231908 bsc#1231909 bsc#1231910 bsc#1231911 bsc#1231912 bsc#1231913 bsc#1231914 bsc#1231915 bsc#1231916 bsc#1231919 bsc#1231920 bsc#1231924 bsc#1231926 bsc#1231927 bsc#1231930 bsc#1231931 bsc#1231933 bsc#1231935 bsc#1231942 bsc#1231944 bsc#1231946 bsc#1231947 bsc#1231948 bsc#1231949 bsc#1231950 bsc#1231951 bsc#1231952 bsc#1231953 bsc#1231954 bsc#1231955 bsc#1231956 bsc#1231957 bsc#1231963 bsc#1231964 bsc#1231965 bsc#1231967 bsc#1231968 bsc#1231970 bsc#1231975 bsc#1231987 bsc#1231989 bsc#1231990 bsc#1231998 bsc#1232000 bsc#1232003 bsc#1232009 bsc#1232010 bsc#1232011 bsc#1232012 bsc#1232013 bsc#1232014 bsc#1232015 bsc#1232016 bsc#1232017 bsc#1232018 bsc#1232041 bsc#1232043 bsc#1232048 bsc#1232049 bsc#1232050 bsc#1232052 bsc#1232053 bsc#1232054 bsc#1232055 bsc#1232056 bsc#1232073 bsc#1232075 bsc#1232076 bsc#1232077 bsc#1232078 bsc#1232079 bsc#1232080 bsc#1232081 bsc#1232082 bsc#1232083 bsc#1232084 bsc#1232085 bsc#1232086 bsc#1232087 bsc#1232088 bsc#1232089 bsc#1232093 bsc#1232094 bsc#1232095 bsc#1232096 bsc#1232097 bsc#1232098 bsc#1232099 bsc#1232100 bsc#1232101 bsc#1232102 bsc#1232103 bsc#1232104 bsc#1232105 bsc#1232109 bsc#1232110 bsc#1232111 bsc#1232112 bsc#1232113 bsc#1232114 bsc#1232116 bsc#1232117 bsc#1232124 bsc#1232126 bsc#1232127 bsc#1232129 bsc#1232130 bsc#1232131 bsc#1232132 bsc#1232134 bsc#1232135 bsc#1232137 bsc#1232140 bsc#1232141 bsc#1232142 bsc#1232144 bsc#1232145 bsc#1232147 bsc#1232148 bsc#1232149 bsc#1232151 bsc#1232152 bsc#1232153 bsc#1232154 bsc#1232155 bsc#1232156 bsc#1232157 bsc#1232158 bsc#1232159 bsc#1232160 bsc#1232161 bsc#1232162 bsc#1232164 bsc#1232165 bsc#1232166 bsc#1232167 bsc#1232168 bsc#1232169 bsc#1232174 bsc#1232180 bsc#1232182 bsc#1232185 bsc#1232187 bsc#1232189 bsc#1232192 bsc#1232193 bsc#1232195 bsc#1232196 bsc#1232197 bsc#1232198 bsc#1232199 bsc#1232200 bsc#1232201 bsc#1232202 bsc#1232203 bsc#1232205 bsc#1232206 bsc#1232208 bsc#1232215 bsc#1232217 bsc#1232218 bsc#1232220 bsc#1232221 bsc#1232222 bsc#1232224 bsc#1232232 bsc#1232247 bsc#1232249 bsc#1232250 bsc#1232251 bsc#1232252 bsc#1232253 bsc#1232254 bsc#1232255 bsc#1232256 bsc#1232257 bsc#1232258 bsc#1232259 bsc#1232260 bsc#1232262 bsc#1232263 bsc#1232264 bsc#1232272 bsc#1232275 bsc#1232278 bsc#1232279 bsc#1232282 bsc#1232285 bsc#1232287 bsc#1232288 bsc#1232291 bsc#1232295 bsc#1232305 bsc#1232307 bsc#1232309 bsc#1232310 bsc#1232312 bsc#1232313 bsc#1232314 bsc#1232315 bsc#1232317 bsc#1232318 bsc#1232329 bsc#1232332 bsc#1232333 bsc#1232334 bsc#1232335 bsc#1232336 bsc#1232337 bsc#1232339 bsc#1232340 bsc#1232345 bsc#1232349 bsc#1232350 bsc#1232352 bsc#1232354 bsc#1232355 bsc#1232356 bsc#1232357 bsc#1232358 bsc#1232359 bsc#1232361 bsc#1232362 bsc#1232364 bsc#1232365 bsc#1232366 bsc#1232367 bsc#1232368 bsc#1232369 bsc#1232370 bsc#1232371 bsc#1232374 bsc#1232376 bsc#1232378 bsc#1232381 bsc#1232383 bsc#1232385 bsc#1232386 bsc#1232387 bsc#1232388 bsc#1232389 bsc#1232392 bsc#1232393 bsc#1232394 bsc#1232395 bsc#1232396 bsc#1232416 bsc#1232417 bsc#1232418 bsc#1232419 bsc#1232420 bsc#1232424 bsc#1232427 bsc#1232430 bsc#1232432 bsc#1232435 bsc#1232442 bsc#1232446 bsc#1232473 bsc#1232482 bsc#1232483 bsc#1232484 bsc#1232493 bsc#1232494 bsc#1232495 bsc#1232498 bsc#1232499 bsc#1232500 bsc#1232501 bsc#1232502 bsc#1232503 bsc#1232504 bsc#1232505 bsc#1232506 bsc#1232507 bsc#1232508 bsc#1232509 bsc#1232510 bsc#1232511 bsc#1232512 bsc#1232513 bsc#1232516 bsc#1232519 bsc#1232520 bsc#1232521 bsc#1232552 bsc#1232812 bsc#1232819 bsc#1232854 bsc#1232856 bsc#1232857 bsc#1232858 bsc#1232859 bsc#1232860 bsc#1232861 bsc#1232862 bsc#1232866 bsc#1232867 bsc#1232868 bsc#1232869 bsc#1232870 bsc#1232871 bsc#1232872 bsc#1232873 bsc#1232874 bsc#1232875 bsc#1232876 bsc#1232877 bsc#1232878 bsc#1232879 bsc#1232880 bsc#1232881 bsc#1232882 bsc#1232883 bsc#1232884 bsc#1232885 bsc#1232886 bsc#1232887 bsc#1232888 bsc#1232890 bsc#1232891 bsc#1232892 bsc#1232894 bsc#1232895 bsc#1232896 bsc#1232897 bsc#1232905 bsc#1232907 bsc#1232912 bsc#1232914 bsc#1232919 bsc#1232924 bsc#1232925 bsc#1232926 bsc#1232928 bsc#1232930 bsc#1232932 bsc#1232935 bsc#1233028 bsc#1233029 bsc#1233030 bsc#1233031 bsc#1233032 bsc#1233033 bsc#1233034 bsc#1233035 bsc#1233036 bsc#1233037 bsc#1233038 bsc#1233040 bsc#1233041 bsc#1233044 bsc#1233049 bsc#1233050 bsc#1233051 bsc#1233055 bsc#1233056 bsc#1233057 bsc#1233059 bsc#1233060 bsc#1233061 bsc#1233062 bsc#1233063 bsc#1233065 bsc#1233067 bsc#1233072 bsc#1233073 bsc#1233074 bsc#1233075 bsc#1233088 bsc#1233089 bsc#1233090 bsc#1233091 bsc#1233092 bsc#1233093 bsc#1233094 bsc#1233096 bsc#1233097 bsc#1233098 bsc#1233099 bsc#1233100 bsc#1233101 bsc#1233102 bsc#1233103 bsc#1233104 bsc#1233105 bsc#1233106 bsc#1233107 bsc#1233108 bsc#1233109 bsc#1233110 bsc#1233111 bsc#1233112 bsc#1233113 bsc#1233114 bsc#1233115 bsc#1233117 bsc#1233121 bsc#1233122 bsc#1233123 bsc#1233125 bsc#1233127 bsc#1233129 bsc#1233130 bsc#1233135 bsc#1233173 bsc#1233174 bsc#1233175 bsc#1233176 bsc#1233177 bsc#1233178 bsc#1233179 bsc#1233180 bsc#1233181 bsc#1233182 bsc#1233183 bsc#1233184 bsc#1233185 bsc#1233186 bsc#1233187 bsc#1233188 bsc#1233189 bsc#1233191 bsc#1233192 bsc#1233193 bsc#1233194 bsc#1233195 bsc#1233197 bsc#1233200 bsc#1233201 bsc#1233203 bsc#1233204 bsc#1233205 bsc#1233206 bsc#1233207 bsc#1233208 bsc#1233209 bsc#1233210 bsc#1233211 bsc#1233212 bsc#1233214 bsc#1233216 bsc#1233217 bsc#1233219 bsc#1233221 bsc#1233226 bsc#1233238 bsc#1233239 bsc#1233244 bsc#1233248 bsc#1233253 bsc#1233254 bsc#1233263 bsc#1233268 bsc#1233269 bsc#1233270 bsc#1233271 bsc#1233288 bsc#1233293 OBS-URL: https://build.opensuse.org/request/show/1224199 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/kernel-source?expand=0&rev=759 |
||
---|---|---|
_constraints | ||
_multibuild | ||
.gitattributes | ||
.gitignore | ||
apply-patches | ||
arch-symbols | ||
check-for-config-changes | ||
check-module-license | ||
compress-vmlinux.sh | ||
compute-PATCHVERSION.sh | ||
config.addon.tar.bz2 | ||
config.conf | ||
config.sh | ||
config.tar.bz2 | ||
constraints.in | ||
dtb-aarch64.changes | ||
dtb-aarch64.spec | ||
dtb-armv6l.changes | ||
dtb-armv6l.spec | ||
dtb-armv7l.changes | ||
dtb-armv7l.spec | ||
dtb-riscv64.changes | ||
dtb-riscv64.spec | ||
dtb.spec.in.in | ||
group-source-files.pl | ||
guards | ||
host-memcpy-hack.h | ||
kabi.pl | ||
kabi.tar.bz2 | ||
kernel-64kb.changes | ||
kernel-64kb.spec | ||
kernel-binary-conflicts | ||
kernel-binary.spec.in | ||
kernel-cert-subpackage | ||
kernel-debug.changes | ||
kernel-debug.spec | ||
kernel-default-base.spec.txt | ||
kernel-default.changes | ||
kernel-default.spec | ||
kernel-docs.changes | ||
kernel-docs.spec | ||
kernel-docs.spec.in | ||
kernel-kvmsmall.changes | ||
kernel-kvmsmall.spec | ||
kernel-lpae.changes | ||
kernel-lpae.spec | ||
kernel-module-subpackage | ||
kernel-obs-build.changes | ||
kernel-obs-build.spec | ||
kernel-obs-build.spec.in | ||
kernel-obs-qa.changes | ||
kernel-obs-qa.spec | ||
kernel-obs-qa.spec.in | ||
kernel-pae.changes | ||
kernel-pae.spec | ||
kernel-source.changes | ||
kernel-source.rpmlintrc | ||
kernel-source.spec | ||
kernel-source.spec.in | ||
kernel-spec-macros | ||
kernel-subpackage-build | ||
kernel-subpackage-spec | ||
kernel-syms.changes | ||
kernel-syms.spec | ||
kernel-syms.spec.in | ||
kernel-vanilla.changes | ||
kernel-vanilla.spec | ||
kernel-zfcpdump.changes | ||
kernel-zfcpdump.spec | ||
klp-symbols | ||
linux-6.11.tar.sign | ||
linux-6.11.tar.xz | ||
linux.keyring | ||
log.sh | ||
macros.kernel-source | ||
mergedep | ||
mkspec | ||
mkspec-dtb | ||
moddep | ||
modflist | ||
modules.fips | ||
modversions | ||
obsolete-kmps | ||
old_changelog.txt | ||
old-flavors | ||
package-descriptions | ||
patches.addon.tar.bz2 | ||
patches.apparmor.tar.bz2 | ||
patches.arch.tar.bz2 | ||
patches.drivers.tar.bz2 | ||
patches.drm.tar.bz2 | ||
patches.fixes.tar.bz2 | ||
patches.kabi.tar.bz2 | ||
patches.kernel.org.tar.bz2 | ||
patches.rpmify.tar.bz2 | ||
patches.rt.tar.bz2 | ||
patches.suse.tar.bz2 | ||
README.KSYMS | ||
README.PATCH-POLICY.SUSE | ||
README.SUSE | ||
release-projects | ||
series.conf | ||
source-timestamp | ||
split-modules | ||
splitflist | ||
supported.conf | ||
sysctl.tar.bz2 | ||
try-disable-staging-driver |
Working with the SUSE Kernel Sources ==================================== This document gives an overview of how SUSE Linux kernels are created, and describes tasks like building individual kernels and creating external kernel modules. Overview -------- The SUSE kernels are generated from the upstream Linux kernel sources found at <https://kernel.org/>, on top of which a number of patches are applied. The expanded kernel source tree is configured and built, resulting in a binary kernel. The add-on patches and configuration files are maintained in a Git repository at <https://github.com/SUSE/kernel-source>, with an alternative mirror at <https://github.com/openSUSE/kernel-source>. A script named `scripts/tar-up.sh` packs up the files in the repository in a form suitable for rpmbuild. When building the RPM packages, the following binary packages get created: * kernel-source The kernel source tree, generated by unpacking the vanilla kernel sources and applying the patches. The kernel sources are used by a number of other packages. They can also be used for compiling additional kernel modules. * kernel-devel A complement of the kernel-source package that is needed to build external modules. * kernel-`$FLAVOR` A number of binary kernels, for example, kernel-default for standard use, kernel-debug with extra debugging features, etc. These packages are all generated from the same kernel sources, and differ in the kernel configurations used. * kernel-`$FLAVOR`-base A subset of kernel-`$FLAVOR`, for use in virtualized guests that only require a few device and filesystem drivers. * kernel-`$FLAVOR`-devel The files used for generating kernel module packages for use with kernel-`$FLAVOR`. * kernel-syms A meta package that pulls in the relevant kernel-`$FLAVOR`-devel packages for a given architecture. The repository contains configuration files (`.config`) for all SUSE kernel flavors. All configuration files are included in the dependencies of the kernel-syms package, see [Where to find configuration files](#where-to-find-configuration-files) below. In the installed system, the kernel-source package installs files in the following directories: * `/usr/src/linux-$VERSION-$RELEASE/` The kernel sources. * `/usr/src/linux` A symbolic link to `/usr/src/linux-$VERSION-$RELEASE/`. * `/usr/share/doc/packages/kernel-source-$VERSION-$RELEASE/` This document. The kernel-`$FLAVOR`-devel packages install the following files: * `/usr/src/linux-$VERSION-$RELEASE-obj/$ARCH/$FLAVOR/` Kernel build object files for one kernel flavor. These files are used for compiling additional kernel modules. * `/usr/src/linux-obj/$ARCH/$FLAVOR` A symbolic link to `/usr/src/linux-$VERSION-$RELEASE-obj/$ARCH/$FLAVOR/`. Compiling your own kernel ------------------------- The kernel sources are found in the kernel-source package. A binary kernel can be built from these sources as follows: 1. Install the kernel-source package. 2. Create a build directory for use in configuring and building the kernel. Using `/usr/src/linux/` directly requires root privileges and will cause problems if you need to build kernel modules for other installed kernels. 3. Configure the kernel, see [How to configure the kernel sources](#how-to-configure-the-kernel-sources). For example, `make -C /usr/src/linux O=$PWD oldconfig`. 4. Build the kernel and all its modules by invoking `make`. 5. Make sure that `/etc/modprobe.d/10-unsupported-modules.conf` contains allow_unsupported_modules 1 otherwise modprobe will refuse to load any modules. 6. Install the modules and kernel: `make modules_install`, followed by `make install`. This automatically creates an initrd for the new kernel and adds an entry to the GRUB boot menu. Instead of building binary kernels by hand, you can also build one of the kernel-`$FLAVOR` packages using RPM. Building additional (external) modules -------------------------------------- A single binary kernel module generally only works for a specific version of the kernel source tree, for a specific architecture and configuration. This means that for each binary kernel that SUSE ships, a custom module must be built. This requirement is to some extent relaxed by the modversion mechanism: modversions attach a checksum to each symbol (function or variable) exported to modules by the kernel. This allows to use kernel modules that have been built for a kernel with a different version or release number in many cases, as long as none of the symbols the module uses have changed between the two kernel versions. When releasing maintenance or security update kernels for a specific product, we carefully try to keep the kernel ABI stable. Despite this, we sometimes have no choice but to break binary compatibility. In this case, those kernel modules must be rebuilt. Additional kernel modules for one of the SUSE kernel flavors can be built in the following ways: 1. by doing an ad-hoc module build, using one of the standard configurations in `/usr/src/linux-obj/$ARCH/$FLAVOR`, or 2. by creating a Kernel Module Package (KMP) as described in the Kernel Module Packages Manual, <https://documentation.suse.com/sbp/all/html/SBP-KMP-Manual-SLE12SP2/index.html>. The first method involves the following steps: 1. Install the kernel-devel package. 2. Install the kernel-`$FLAVOR`-devel package. This is necessary for symbol version information (`CONFIG_MODVERSIONS`). 3. Compile the module(s) by changing into the module source directory and typing `make -C /usr/src/linux-obj/$ARCH/$FLAVOR M=$PWD`. Substitute `$ARCH` and `$FLAVOR` with the architecture and flavor for which to build the module(s). If the installed kernel sources match the running kernel, you can build modules for the running kernel by using the path `/lib/modules/$(uname -r)/build` as the `-C` option in the above command. (`build` is a symlink to `/usr/src/linux-obj/$ARCH/$FLAVOR`.) 4. Install the module(s) with `make -C /usr/src/linux-obj/$ARCH/$FLAVOR M=$PWD modules_install`. Whenever building modules, please use the kernel build infrastructure as much as possible, and do not try to circumvent it. The `Documentation/kbuild` directory in the kernel sources documents kbuild makefiles. Supported vs. unsupported modules --------------------------------- As an extension to the mainline kernel, modules can be tagged as supported (directly by SUSE, or indirectly by a third party) or unsupported. Modules which are known to be flakey or for which SUSE does not have the necessary expertise are marked as unsupported. Modules for which SUSE has third-party support agreements are marked as externally supported. Modules for which SUSE provides direct support are marked as supported. The support status of a module can be queried with the modinfo tool. Modinfo will report one of the following: * direct support by SUSE: "supported: yes", * third-party support: "supported: external", * unsupported modules: no supported tag. At runtime, the support status of a module can be obtained by reading `/sys/module/$MODULE/supported`. Note that this information is available only if the module was not built directly into the kernel. Builtin modules are implicitly supported. The aggregated support status for the entire kernel can be inspected by reading `/sys/kernel/supported`. The value is also included in Oopses. The setting of the "unsupported" kernel command line parameter and `/proc/sys/kernel/unsupported` controls whether unsupported modules can be loaded or not, and whether or not loading an unsupported module causes a warning in the system log: * 0 = only allow supported modules, * 1 = warn when loading unsupported modules, * 2 = don't warn. Irrespective of this setting, loading an unsupported module sets a kernel taint flag. The taint status of the kernel can be inspected in `/proc/sys/kernel/tainted`. The taint flags are also included in Oopses. Relevant bits have the following meaning: | Bit | Log | Number | Reason that got the kernel tainted | |----:|----:|-----------:|----------------------------------------------------| | 0 | G/P | 1 | proprietary module was loaded | | 12 | ␣/O | 4096 | externally-built ("out-of-tree") module was loaded | | 13 | ␣/E | 8192 | unsigned module was loaded | | 16 | ␣/X | 65536 | module with third-party support was loaded | | 31 | ␣/N | 2147483648 | unsupported module was loaded | Bits 16 and 31 are specific to the SUSE kernels. Since SLE15-SP6, loading an externally supported module does not taint the kernel, but bit 16 (X) is still tracked per module and can be read in `/sys/module/$MODULE/taint`. Out-of-tree modules do not have the supported flag set by default; that is, they are marked as unsupported. For building externally supported modules, please get in touch with the Solid Driver Program team, led by Scott Bahling, at <mailto:soliddriver@suse.com>. Patch selection mechanism ------------------------- The SUSE kernels consist of the upstream kernel sources on top of which a number of patches is applied. The file `series.conf` determines which patches are applied and which are excluded. A script named `guards` converts `series.conf` into a plain list of patch files to be applied. Guards decides which patches to include and exclude based on a list of symbols. From the kernel-source.src.rpm package, a fully patched kernel source tree can be generated from vanilla sources + patches like this: 1. Install the package: # rpm -i kernel-source-$RPMVERSION-$RPMRELEASE.src.rpm 2. Unpack the patches and the kernel sources: # cd /usr/src/packages/SOURCES/ # for f in patches.*.tar.bz2; do \ tar -xjf "$f" || break; \ done # tar -xJf linux-$SRCVERSION.tar.xz 3. Apply the patches # for p in $(./guards < series.conf); do \ patch -d linux-$SRCVERSION -p1 < $p || break; \ done The configuration script `config.conf` which is similar to `series.conf` is used for configuration file selection, see the section [Where to find configuration files](#where-to-find-configuration-files). The file format of `series.conf` and `config.conf` should be apparent from the comments in `series.conf` and from the guards(1) manual page. You can generate this page by running `pod2man` on the `guards` script. Where to find configuration files --------------------------------- Kernel configuration files are stored in the kernel Git repository. When packing up the repository, they end up in `config.tar.bz2`. The kernel-`$FLAVOR` packages are based on `config/$ARCH/$FLAVOR`, for instance, kernel-default is based on `config/$ARCH/default`. The kernel-`$FLAVOR` packages install their configuration files as `/boot/config-$VERSION-$RELEASE-$FLAVOR`. The config is also packaged in the kernel-`$FLAVOR`-devel package as `/usr/src/linux-obj/$ARCH/$FLAVOR/.config`. In addition, the running kernel exposes a gzip compressed version of its configuration file as `/proc/config.gz`. How to configure the kernel sources ----------------------------------- Before a binary kernel is built or an additional loadable module for an existing kernel is created, the kernel must be configured. In order for a loadable module to work with an existing kernel, it must be created with a configuration that is identical to the kernel's configuration, or at least very close to that. Each configuration is contained in a single file. The kernel-syms package installs configurations for all standard SUSE kernel variants, so for building only external kernel modules it is not necessary to configure the kernel sources. Configuring the kernel sources for a specific configuration is straightforward: * Locate the configuration file you want to use, see [Where to find configuration files](#where-to-find-configuration-files) above. * Copy the configuration to the file `.config` in your build directory. * Run the following commands in sequence to apply the configuration, generate version information files, etc.: $ make -C /usr/src/linux O=$PWD clean $ make -C /usr/src/linux O=$PWD oldconfig If the kernel sources do not match the configuration file exactly, `make oldconfig` will prompt for settings that are undefined. When no `.config` file is initially copied to the target build directory, the command automatically uses `/boot/config-$(uname -r)` as the starting configuration. Alternatively to `make oldconfig`, you can also use `make menuconfig` for a text menu oriented user interface. Once this step is completed, a `Makefile` will have been created that eliminates the need to specify the locations of the kernel source and the build directory. * Update the configuration appropriately for the target use. Configuration files for SUSE kernels include settings to integrate with signing support provided by the Open Build Service. When using such a configuration file directly, the build might fail due to missing files needed for signing kernel modules. The minimal steps to enable module signing and have the kernel build automatically generate a new key pair are as follows: $ ./source/scripts/config --enable CONFIG_MODULE_SIG \ --enable CONFIG_MODULE_SIG_ALL --undefine CONFIG_MODULE_SIG_KEY $ make olddefconfig Please refer to the upstream documentation located at `/usr/src/linux/Documentation/admin-guide/module-signing.rst` for complete information on how to configure module signing. How to add custom patches ------------------------- Patches are typically added to the `patches.suse/` directory and an appropriate place in `series.conf`. When the kernel-source package is exported from the Git repository, the patch will be automatically added to the matching patch tarball. If your goal is to create a kernel with only a few additional patches and you don't want to be bothered with using the Git repository, there is an easier way. The kernel-source SRPM ships with two empty archives that can be filled and automatically expanded when building the kernel. You can use these to add your own patches and config options without disturbing the rest of the kernel package. This is useful if you are using the openSUSE Build Service and link to the main kernel-source project instead of creating your own branch. The advantage to this is that your project will automatically receive all the changes that go into the main project without any further effort. To add a patch using this mechanism, just add it to the `patches.addon.tar.bz2` archive and add an entry to a `series` file inside the archive. The archive will be expanded automatically after the other kernel patches when the source tree is constructed. Some patches may add new Kconfig options. The `config.addon.tar.bz2` archive contains the same hierarchy as `config.tar.bz2`, but is under `config.addon/`. You can add your new config options to files named after their `config/` counterparts. For example, the file used to configure the x86_64 default kernel is named `config/x86_64/default`. To add config options to that kernel, you would create a new file called `config.addon/x86_64/default` with the options as formatted in a normal Linux kernel `.config` file. This is important because the kernel build is non-interactive and will fail if it encounters new config options without entries in the config file. Module load paths ----------------- Modules that belong to a specific kernel release are installed in `/lib/modules/$VERSION-$RELEASE-$FLAVOR/`. Modules from KMPs must be installed below `/lib/modules/$VERSION-$RELEASE-$FLAVOR/updates/` and similar: modules below `updates/` have priority over other modules. When KMPs contain modules that are compatible between multiple installed kernels, symlinks are used to make those modules available to those compatible kernels like this: `/lib/modules/$VERSION-$OTHER_RELEASE-$FLAVOR/weak-updates/foo.ko` → `/lib/modules/$VERSION-$RELEASE-$FLAVOR/updates/foo.ko` Modules in the `weak-updates/` directory have lower priority than modules in `/lib/modules/$VERSION-$OTHER_RELEASE-$FLAVOR/updates/`, and higher priority than other modules in `/lib/modules/$VERSION-$OTHER_RELEASE-$FLAVOR/`. Driver update disks ------------------- A Driver Update Disk (DUD) is an update archive which makes it possible to use new device drivers to run installation of an (open)SUSE distribution. It allows to install the distribution on devices that were not supported at the time the distribution was created and be able to boot the installed system afterwards without having to manually install the new device drivers after the installation. For information how to create such an update, refer to the mkdud and mksusecd tools, and their documentation: * <https://github.com/openSUSE/mkdud>, * <https://github.com/openSUSE/mksusecd>. References ---------- General: * Documentation in the kernel source tree, * LWN.net (Linux Weekly News), <https://lwn.net/>, * Kernel newbies, <https://kernelnewbies.org/>. Loadable kernel modules: * Peter Jay Salzman, Michael Burian, Ori Pomerantz: The Linux Kernel Module Programming Guide, Version 2.6, <https://tldp.org/LDP/lkmpg/2.6/html/index.html>. Kernel module packages: * Kernel Module Packages Manual, SUSE Linux Enterprise 12 SP2 or later and SUSE Linux Enterprise 15, <https://documentation.suse.com/sbp/all/html/SBP-KMP-Manual-SLE12SP2/index.html>, * SUSE SolidDriver Program, <https://drivers.suse.com/doc/SolidDriver/>.