Blame README.SUSE

Bernhard M. Wiedemann 6ebc4a
WORKING WITH THE SUSE 2.6.x and 3.x KERNEL SOURCES
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Andreas Gruenbacher <agruen@suse.de>, SUSE Labs, 2003, 2004, 2005, 2006
Bernhard M. Wiedemann 6ebc4a
Michal Marek <mmarek@suse.de>, SUSE Labs, 2010
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
This document gives an overview of how SUSE Linux kernels are
Bernhard M. Wiedemann 6ebc4a
created, and describes tasks like building individual kernels
Bernhard M. Wiedemann 6ebc4a
and creating external kernel modules.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
A companion HOWTO that describes how to build driver update disks (among
Bernhard M. Wiedemann 6ebc4a
other things) is available at:
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
    http://developer.novell.com/wiki/index.php/Creating_a_Driver_Update_Disk_%28DUD%29
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
TABLE OF CONTENTS
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  Overview
Bernhard M. Wiedemann 6ebc4a
  Compiling your own kernel
Bernhard M. Wiedemann 6ebc4a
  Building additional (external) modules
Bernhard M. Wiedemann 6ebc4a
  Supported vs. unsupported modules
Bernhard M. Wiedemann 6ebc4a
  Patch selection mechanism
Bernhard M. Wiedemann 6ebc4a
  Where to find configuration files
Bernhard M. Wiedemann 6ebc4a
  How to configure the kernel sources
Bernhard M. Wiedemann 6ebc4a
  Module load paths
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
OVERVIEW
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
The kernels for SUSE are generated from the vanilla Linux kernel sources
Bernhard M. Wiedemann 6ebc4a
found at http://ftp.kernel.org, on top of which a number of patches are
Bernhard M. Wiedemann 6ebc4a
applied. The resulting kernel source tree is configured and built,
Bernhard M. Wiedemann 6ebc4a
resulting in a binary kernel.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
The add-on patches and configuration files are maintained in
Bernhard M. Wiedemann 6ebc4a
a GIT repository at
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
    https://github.com/openSUSE/kernel-source
Bernhard M. Wiedemann 6ebc4a
    
Bernhard M. Wiedemann 6ebc4a
A script (scripts/tar-up.sh) packs up the files in the repository in a
Bernhard M. Wiedemann 6ebc4a
form suitable for rpmbuild. When building the RPM packages, the
Bernhard M. Wiedemann 6ebc4a
following binary packages get created:
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  *  kernel-source
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
     The kernel source tree, generated by unpacking the vanilla kernel
Bernhard M. Wiedemann 6ebc4a
     sources and applying the patches. The kernel sources are used by
Bernhard M. Wiedemann 6ebc4a
     a number of other packages. They can also be used for compiling
Bernhard M. Wiedemann 6ebc4a
     additional kernel modules.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  *  kernel-devel
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
     A subset of the kernel-source package that is needed to build
Bernhard M. Wiedemann 6ebc4a
     external modules.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  *  kernel-$FLAVOR
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
     A number of binary kernels (for example, kernel-default for
Bernhard M. Wiedemann 6ebc4a
     uniprocessor machines, kernel-smp for smp machines, etc.). These
Bernhard M. Wiedemann 6ebc4a
     packages are all generated from the same kernel sources, and
Bernhard M. Wiedemann 6ebc4a
     differ in the kernel configurations used.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  *  kernel-$FLAVOR-base
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
     A subset of kernel-$FLAVOR, for use in paravirtualized quests that
Bernhard M. Wiedemann 6ebc4a
     only require a few device and filesystem drivers.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  *  kernel-$FLAVOR-devel
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
     The files used for generating kernel module packages for use with
Bernhard M. Wiedemann 6ebc4a
     kernel-$FLAVOR.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  *  kernel-syms
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
     A meta package that pulls in the relevant kernel-$FLAVOR-devel
Bernhard M. Wiedemann 6ebc4a
     packages for a given architecture.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
The repository contains the configuration files (.config) for all SUSE
Bernhard M. Wiedemann 6ebc4a
kernel flavors. All configuration files are included in the dependencies
Bernhard M. Wiedemann 6ebc4a
of the kernel-syms package (see WHERE TO FIND CONFIGURATION FILES below).
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
In the installed system, the kernel-source package installs files in the
Bernhard M. Wiedemann 6ebc4a
following directories:
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  *  /usr/src/linux-$VERSION-$RELEASE/
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
     The kernel sources.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  *  /usr/src/linux
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
     A symbolic link to /usr/src/linux-$VERSION-$RELEASE.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  *  /usr/share/doc/packages/kernel-source/
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
     This document.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
The kernel-$FLAVOR-devel packages install the following files:
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  *  /usr/src/linux-$VERSION-$RELEASE-obj/$ARCH/$FLAVOR/
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
     Kernel build object files for one kernel flavor. These
Bernhard M. Wiedemann 6ebc4a
     files are used for compiling additional kernel modules.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  *  /usr/src/linux-obj/$ARCH/$FLAVOR
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
     A symbolic link to /usr/src/linux-$VERSION-$RELEASE-obj/$ARCH/$FLAVOR.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
COMPILING YOUR OWN KERNEL
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
The kernel sources are found in the kernel-source package. The
Bernhard M. Wiedemann 6ebc4a
recommended way to produce a binary kernel is:
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  (1)  Install kernel-source. Change to the /usr/src/linux directory.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  (2)  Create a build directory for use in configuring and building
Bernhard M. Wiedemann 6ebc4a
       the kernel. Using /usr/src/linux directly requires root priviledges
Bernhard M. Wiedemann 6ebc4a
       and will cause problems if you need to build kernel modules for
Bernhard M. Wiedemann 6ebc4a
       other installed kernels.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  (3)  Configure the kernel (for example, ``make -C /usr/src/linux
Bernhard M. Wiedemann 6ebc4a
       O=$(pwd) oldconfig'', see HOW TO CONFIGURE THE KERNEL SOURCES).
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  (4)  Build the kernel and all its modules (``make'').
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  (5)  Make sure that /etc/modprobe.d/unsupported-modules contains
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
           allow_unsupported_modules 1
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
       otherwise modprobe will refuse to load any modules.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  (6)  Install the kernel and the modules (``make modules_install'',
Bernhard M. Wiedemann 6ebc4a
       followed by ``make install''). This will automatically create
Bernhard M. Wiedemann 6ebc4a
       an initrd for the new kernel as well (see ``mkinitrd -h'').
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  (7)  Add the kernel to the boot manager. When using lilo, run ``lilo''
Bernhard M. Wiedemann 6ebc4a
       to update the boot map.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Instead of building binary kernels by hand, you can also build
Bernhard M. Wiedemann 6ebc4a
one of the kernel-$FLAVOR packages using RPM.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
BUILDING ADDITIONAL (EXTERNAL) MODULES
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
A single binary kernel module generally only works for a specific
Bernhard M. Wiedemann 6ebc4a
version of the kernel source tree, for a specific architecture and
Bernhard M. Wiedemann 6ebc4a
configuration. This means that for each binary kernel that SUSE ships, a
Bernhard M. Wiedemann 6ebc4a
custom module must be built. This requirement is to some extent relaxed
Bernhard M. Wiedemann 6ebc4a
by the modversion mechanism: modversions attach a checksum to each
Bernhard M. Wiedemann 6ebc4a
symbol (function or variable) exported to modules by the kernel. This
Bernhard M. Wiedemann 6ebc4a
allows to use kernel modules that have been built for a kernel with a
Bernhard M. Wiedemann 6ebc4a
different version or release number in many cases, as long as none of
Bernhard M. Wiedemann 6ebc4a
the symbols the module uses have changed between the two kernel
Bernhard M. Wiedemann 6ebc4a
versions.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
When releasing maintenance or security update kernels for a specific
Bernhard M. Wiedemann 6ebc4a
product, we carefully try to keep the kernel ABI stable.  Despite this,
Bernhard M. Wiedemann 6ebc4a
we sometimes have no choice but to break binary compatibility. In this
Bernhard M. Wiedemann 6ebc4a
case, those kernel modules must be rebuilt.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Additional kernel modules for one of the SUSE kernel flavors can be
Bernhard M. Wiedemann 6ebc4a
built in three different ways:
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  (1) by configuring the kernel sources in a separate build directory
Bernhard M. Wiedemann 6ebc4a
      (see HOW TO CONFIGURE THE KERNEL SOURCES), or
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  (2) by using one of the standard configurations in
Bernhard M. Wiedemann 6ebc4a
      /usr/src/linux-obj/$ARCH/$FLAVOR, or
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  (3) by creating a Kernel Module Package (KMP) as described in the
Bernhard M. Wiedemann 6ebc4a
      Kernel Module Packages Manual, https://drivers.suse.com/doc/kmpm/.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
The first method involves the following steps:
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  (1)  Install the kernel-source package.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  (2)  Configure the kernel, see HOW TO CONFIGURE THE KERNEL SOURCES.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  (3)  Create files required for compiling external modules:
Bernhard M. Wiedemann 6ebc4a
       ``make prepare'' and ``make scripts''.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  (4)  Compile the module(s) by changing into the module source directory
Bernhard M. Wiedemann 6ebc4a
       and typing ``make -C $(your_build_dir) M=$(pwd)''.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  (5)  Install the module(s) by typing
Bernhard M. Wiedemann 6ebc4a
       ``make -C $(your_build_dir) M=$(pwd) modules_install''.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
The second method involves the following steps:
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  (1)  Install the kernel-devel package.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  (2)  Install the kernel-$FLAVOR-devel package. This is necessary for
Bernhard M. Wiedemann 6ebc4a
       symbol version information (CONFIG_MODVERSIONS).
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  (3)  Compile the module(s) by changing into the module source directory
Bernhard M. Wiedemann 6ebc4a
       and typing ``make -C /usr/src/linux-obj/$ARCH/$FLAVOR M=$(pwd)''.
Bernhard M. Wiedemann 6ebc4a
       Substitute $ARCH and $FLAVOR with the architecture and flavor
Bernhard M. Wiedemann 6ebc4a
       for which to build the module(s).
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
       If the installed kernel sources match the running kernel, you
Bernhard M. Wiedemann 6ebc4a
       can build modules for the running kernel by using the path
Bernhard M. Wiedemann 6ebc4a
       /lib/modules/$(uname -r)/build as the -C option in the above
Bernhard M. Wiedemann 6ebc4a
       command. (build is a symlink to /usr/src/linux-obj/$ARCH/$FLAVOR).
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  (4)  Install the module(s) with
Bernhard M. Wiedemann 6ebc4a
       ``make -C /usr/src/linux-obj/$ARCH/$FLAVOR M=$(pwd) modules_install''.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Whenever building modules, please use the kernel build infrastructure as
Bernhard M. Wiedemann 6ebc4a
much as possible, and do not try to circumvent it. The
Bernhard M. Wiedemann 6ebc4a
Documentation/kbuild directory in the kernel sources documents kbuild
Bernhard M. Wiedemann 6ebc4a
makefiles.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
SUPPORTED VS. UNSUPPORTED MODULES
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
As an extension to the mainline kernel, modules can be tagged as
Bernhard M. Wiedemann 6ebc4a
supported (directly by SUSE, or indirectly by a third party) or
Bernhard M. Wiedemann 6ebc4a
unsupported. Modules which are known to be flakey or for which SUSE does
Bernhard M. Wiedemann 6ebc4a
not have the necessary expertise are marked as unsupported.  Modules for
Bernhard M. Wiedemann 6ebc4a
which SUSE has third-party support agreements are marked as externally
Bernhard M. Wiedemann 6ebc4a
supported. Modules for which SUSE provides direct support are marked as
Bernhard M. Wiedemann 6ebc4a
supported.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
The support status of a module can be queried with the modinfo tool.
Bernhard M. Wiedemann 6ebc4a
Modinfo will report one of the following:
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  - direct support by SUSE: "supported: yes"
Bernhard M. Wiedemann 6ebc4a
  - third-party support: "supported: external"
Bernhard M. Wiedemann 6ebc4a
  - unsupported modules: no supported tag.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
At runtime, the setting of the" unsupported" kernel command line
Bernhard M. Wiedemann 6ebc4a
parameter and /proc/sys/kernel/unsupported determines whether
Bernhard M. Wiedemann 6ebc4a
unsupported modules can be loaded or not, and whether or not loading an
Bernhard M. Wiedemann 6ebc4a
unsupported module causes a warning in the system log:
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  0 = only allow supported modules,
Bernhard M. Wiedemann 6ebc4a
  1 = warn when loading unsupported modules,
Bernhard M. Wiedemann 6ebc4a
  2 = don't warn.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Irrespective of this setting, loading an externally supported or unsupported
Bernhard M. Wiedemann 6ebc4a
module both set a kernel taint flag. The taint flags are included in
Bernhard M. Wiedemann 6ebc4a
Oopses. The taint status of the kernel can be inspected in
Bernhard M. Wiedemann 6ebc4a
/proc/sys/kernel/tainted: Bits 0 to 4 have the following meanings:
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  bit  0 = a module with a GPL-incompatible license was loaded (tainted & 1),
Bernhard M. Wiedemann 6ebc4a
  bit  1 = module load was enforced (tainted & 2),
Bernhard M. Wiedemann 6ebc4a
  bit  2 = an SMP-unsafe module was loaded (tainted & 4),
Bernhard M. Wiedemann 6ebc4a
  bit  3 = (reserved),
Bernhard M. Wiedemann 6ebc4a
  bit  4 = an unsupported module was loaded (tainted & 16),
Bernhard M. Wiedemann 6ebc4a
  bit  5 = a module with third-party support was loaded (tainted & 32).
Bernhard M. Wiedemann 6ebc4a
  bit 10 = a machine check exception has occurred (taint & 1024; x86_64 only
Bernhard M. Wiedemann 6ebc4a
	   so far).
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
The corresponding codes for the taint flags in Oopses are (x = unknown):
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  - "Pxxx" if bit 0 set or else
Bernhard M. Wiedemann 6ebc4a
    "Gxxx" if bit 0 unset,
Bernhard M. Wiedemann 6ebc4a
  
Bernhard M. Wiedemann 6ebc4a
  - "xFxx" if bit 1 set or else
Bernhard M. Wiedemann 6ebc4a
    "x xx" if bit 1 unset,
Bernhard M. Wiedemann 6ebc4a
  
Bernhard M. Wiedemann 6ebc4a
  - "xxSx" if set or else
Bernhard M. Wiedemann 6ebc4a
    "xx x" if bit 2 unset,
Bernhard M. Wiedemann 6ebc4a
  
Bernhard M. Wiedemann 6ebc4a
  - "xxxU" if bit 4 set or else
Bernhard M. Wiedemann 6ebc4a
    "xxxX" if bit 5 set or else
Bernhard M. Wiedemann 6ebc4a
    "xxx ".
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
By default, out-of-tree modules will not have the supported flag (that
Bernhard M. Wiedemann 6ebc4a
is, they will be marked as unsupported). For building externally
Bernhard M. Wiedemann 6ebc4a
supported modules, please get in touch with Solid Driver Program team,
Bernhard M. Wiedemann 6ebc4a
led by Scott Bahling, at <soliddriver@suse.com>.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
PATCH SELECTION MECHANISM
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
The SUSE kernels consist of the vanilla kernel sources on top of which a
Bernhard M. Wiedemann 6ebc4a
number of patches is applied. The file series.conf determines which
Bernhard M. Wiedemann 6ebc4a
patches are applied and which are excluded. A script named "guards"
Bernhard M. Wiedemann 6ebc4a
converts series.conf into a plain list of patch files to be applied.
Bernhard M. Wiedemann 6ebc4a
Guards decides which patches to include and exclude based on a list of
Bernhard M. Wiedemann 6ebc4a
symbols. From the kernel-source.src.rpm package, a fully patched
Bernhard M. Wiedemann 6ebc4a
kernel source tree can be generated from vanilla sources + patches like
Bernhard M. Wiedemann 6ebc4a
this:
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
    # Install the package:
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
      $ rpm -i kernel-source.src.rpm
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
    # Unpack the patches and the kernel sources:
Bernhard M. Wiedemann 6ebc4a
    
Bernhard M. Wiedemann 6ebc4a
      $ cd /usr/src/packages/SOURCES
Bernhard M. Wiedemann 6ebc4a
      $ for f in patches.*.tar.bz2; do		\
Bernhard M. Wiedemann 6ebc4a
	  tar -xjf "$f" || break;		\
Bernhard M. Wiedemann 6ebc4a
	done
Bernhard M. Wiedemann 6ebc4a
      $ tar -xjf linux-2.6.5.tar.bz2
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
    # Apply the patches
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
      $ for p in $(./guards < series.conf); do
Bernhard M. Wiedemann 6ebc4a
	  patch -d linux-2.6.5 -p1 < $p || break
Bernhard M. Wiedemann 6ebc4a
	done
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
The configuration script config.conf which is similar to series.conf is
Bernhard M. Wiedemann 6ebc4a
used for configuration file selection. See the section WHERE TO FIND
Bernhard M. Wiedemann 6ebc4a
CONFIGURATION FILES.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
The file format of series.conf and config.conf should be obvious from
Bernhard M. Wiedemann 6ebc4a
the comments in series.conf, and from the guards(1) manual page. (The
Bernhard M. Wiedemann 6ebc4a
guards(1) manual page can be generated by running pod2man on the guards
Bernhard M. Wiedemann 6ebc4a
script.)
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
WHERE TO FIND CONFIGURATION FILES
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Kernel configuration files are stored in the kernel GIT repository. When
Bernhard M. Wiedemann 6ebc4a
packing up the repository, they end up in config.tar.bz2.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
The kernel-$FLAVOR packages are based on config/$ARCH/$FLAVOR.
Bernhard M. Wiedemann 6ebc4a
(kernel-default is based on config/$ARCH/default, for example). The
Bernhard M. Wiedemann 6ebc4a
kernel-$FLAVOR packages install their configuration files as
Bernhard M. Wiedemann 6ebc4a
/boot/config-$VER_STR (for example, /boot/config-2.6.5-99-default). The
Bernhard M. Wiedemann 6ebc4a
config is also packaged in the kernel-$FLAVOR-devel package as
Bernhard M. Wiedemann 6ebc4a
/usr/src/linux-obj/$ARCH/$FLAVOR/.config.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
In addition, the running kernel exposes a gzip compressed version of its
Bernhard M. Wiedemann 6ebc4a
configuration file as /proc/config.gz. The kernel sources can be
Bernhard M. Wiedemann 6ebc4a
configured based on /proc/config.gz with ``make silentoldconfig''.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
HOW TO CONFIGURE THE KERNEL SOURCES
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Before a binary kernel is built or an additional loadable module
Bernhard M. Wiedemann 6ebc4a
for an existing kernel is created, the kernel must be configured.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
In order for a loadable module to work with an existing kernel, it must
Bernhard M. Wiedemann 6ebc4a
be created with a configuration that is identical to the kernel's
Bernhard M. Wiedemann 6ebc4a
configuration, or at least very close to that. Each configuration is
Bernhard M. Wiedemann 6ebc4a
contained in a single file. The kernel-syms package installs
Bernhard M. Wiedemann 6ebc4a
configurations for all standard SUSE kernel variants, so for building
Bernhard M. Wiedemann 6ebc4a
only external kernel modules it is not necessary to configure the kernel
Bernhard M. Wiedemann 6ebc4a
sources.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Configuring the kernel sources for a specific configuration is
Bernhard M. Wiedemann 6ebc4a
straightfoward:
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  - Locate the configuration file you want to use. (See WHERE TO FIND
Bernhard M. Wiedemann 6ebc4a
    CONFIGURATION FILES above).
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  - Copy the configuration to the file .config in your build directory.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  - Run the following commands in sequence to apply the configuration,
Bernhard M. Wiedemann 6ebc4a
    generate version information files, etc.:
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
        make -C /usr/src/linux O=$PWD clean
Bernhard M. Wiedemann 6ebc4a
        make -C /usr/src/linux O=$PWD oldconfig
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
    Alternatively to ``make oldconfig'', you can also use ``make
Bernhard M. Wiedemann 6ebc4a
    menuconfig'' for a text menu oriented user interface. If the kernel
Bernhard M. Wiedemann 6ebc4a
    sources do not match the configuration file exactly, ``make
Bernhard M. Wiedemann 6ebc4a
    oldconfig'' will prompt for settings that are undefined. Once this
Bernhard M. Wiedemann 6ebc4a
    step is completed, a Makefile will have been created that eliminates
Bernhard M. Wiedemann 6ebc4a
    the need to specify the locations of the kernel source and the build
Bernhard M. Wiedemann 6ebc4a
    directory.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
    For configuring the kernel to match the running kernel, you can use
Bernhard M. Wiedemann 6ebc4a
    the file /proc/config.gz, unpack it into into .config, and then run
Bernhard M. Wiedemann 6ebc4a
    ``make oldconfig''.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
HOW TO ADD CUSTOM PATCHES
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Typically patches are added to the appropriate patches.* directory (e.g.
Bernhard M. Wiedemann 6ebc4a
patches.fixes) and to series.conf. When the kernel-source package is
Bernhard M. Wiedemann 6ebc4a
exported from the git repository, the patch will be automatically added
Bernhard M. Wiedemann 6ebc4a
to the appropriate patch tarball.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
If your goal is to create a kernel with only a few additional patches
Bernhard M. Wiedemann 6ebc4a
and you don't want to be bothered with using the git repository, there
Bernhard M. Wiedemann 6ebc4a
is an easier way.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
The kernel-source SRPM ships with two empty archives that can be be
Bernhard M. Wiedemann 6ebc4a
filled and automatically expanded when building the kernel. You can use
Bernhard M. Wiedemann 6ebc4a
these to add your own patches and config options without disturbing the
Bernhard M. Wiedemann 6ebc4a
rest of the kernel package. This is useful if you are using the openSUSE
Bernhard M. Wiedemann 6ebc4a
Build Service and link to the main kernel-source project instead of
Bernhard M. Wiedemann 6ebc4a
creating your own branch. The advantage to this is that your project
Bernhard M. Wiedemann 6ebc4a
will automatically receive all the changes that go into the main project
Bernhard M. Wiedemann 6ebc4a
without any further effort.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
To add a patch using this mechanism, just add it to the
Bernhard M. Wiedemann 6ebc4a
patches.addon.tar.bz2 archive and add an entry to the series.conf file.
Bernhard M. Wiedemann 6ebc4a
The archive will be expanded automatically with the other kernel patches
Bernhard M. Wiedemann 6ebc4a
when the source tree is constructed.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Some patches may add new Kconfig options. The config.addon.tar.bz2
Bernhard M. Wiedemann 6ebc4a
archive contains the same hierarchy as config.tar.bz2, but is under
Bernhard M. Wiedemann 6ebc4a
config.addon. You can add your new config options to files named after
Bernhard M. Wiedemann 6ebc4a
their config/ counterparts.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
For example, the file used to configure the i386 default kernel is named
Bernhard M. Wiedemann 6ebc4a
config/i386/default. To add config options to that kernel, you would
Bernhard M. Wiedemann 6ebc4a
create a new file called config.addon/i386/default with the options as
Bernhard M. Wiedemann 6ebc4a
formatted in a normal Linux kernel .config file. This is important
Bernhard M. Wiedemann 6ebc4a
because the kernel build is non-interactive and will fail if it
Bernhard M. Wiedemann 6ebc4a
encounters new config options without entries in the config file.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
MODULE LOAD PATHS
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Modules that belong to a specific kernel release are installed in
Bernhard M. Wiedemann 6ebc4a
/lib/modules/2.6.5-99-smp and similar. Note that this path contains the
Bernhard M. Wiedemann 6ebc4a
kernel package release number. Modules from KMPs must be installed
Bernhard M. Wiedemann 6ebc4a
below /lib/modules/2.6.5-99-smp/updates/ and similar: modules below
Bernhard M. Wiedemann 6ebc4a
updates/ have priority over other modules.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
When KMPs contain modules that are compatible between multiple installed
Bernhard M. Wiedemann 6ebc4a
kernels, symlinks are used to make those modules available to those
Bernhard M. Wiedemann 6ebc4a
compatible kernels like this:
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  /lib/modules/2.6.16-100-smp/weak-updates/foo.ko ->
Bernhard M. Wiedemann 6ebc4a
      /lib/modules/2.6.16-99-smp/updates/foo.ko
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Modules in the weak-updates directory have lower priority than modules
Bernhard M. Wiedemann 6ebc4a
in /lib/modules/2.6.16-100-smp/updates/, and higher priority than other
Bernhard M. Wiedemann 6ebc4a
modules in /lib/modules/2.6.16-100-smp.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
REFERENCES
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
General
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  Documentation in the kernel source tree.
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  Linux Documentation Project, http://www.tldp.org/
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  Linux Weekly News, http://lwn.net
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  Rusty's Remarkably Unreliable Guides (Kernel Hacking
Bernhard M. Wiedemann 6ebc4a
    and Kernel Locking guides),
Bernhard M. Wiedemann 6ebc4a
    http://www.netfilter.org/unreliable-guides/
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  Kernel newbies, http://www.kernelnewbies.org/
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Loadable Kernel Modules
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
  Peter Jay Salzman and Ori Pomerantz: Linux Kernel Module
Bernhard M. Wiedemann 6ebc4a
    Programming Guide, Version 2.4, April 2003,
Bernhard M. Wiedemann 6ebc4a
    http://www.tldp.org/guides.html
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
Kernel Module Packages
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
    Andreas Gruenbacher: Kernel Module Packages Manual.
Bernhard M. Wiedemann 6ebc4a
    Versions for CODE9 (SLES9, SUSE LINUX 10.0) and CODE10
Bernhard M. Wiedemann 6ebc4a
    (SUSE Linux 10.1, SLES10),
Bernhard M. Wiedemann 6ebc4a
    https://drivers.suse.com/doc/kmpm/