Difference between revisions of "Building external kernel modules"
m |
(→Building a kernel module using Dynamic Kernel Module Support (DKMS): small and simplistic example of using DKMS with Virtuozzo 7.0.1) |
||
(3 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
− | This article describes how to build | + | {{Virtuozzo}} |
+ | |||
+ | This article describes how to build a kernel module which is not included into the stock Virtuozzo kernel.<br> | ||
(This article applies to Virtuozzo 7) | (This article applies to Virtuozzo 7) | ||
Line 48: | Line 50: | ||
== Building a kernel module using Dynamic Kernel Module Support (DKMS) == | == Building a kernel module using Dynamic Kernel Module Support (DKMS) == | ||
− | + | (draft : this is a small example of adding back the support of an old network card just after the installation of Virtuozzo 7.0.1 on a bare metal server) | |
+ | |||
+ | First, you need to figure out which kernel source files are needed to build your modules. Here, what we needed wasn't in the source package https://download.openvz.org/virtuozzo/releases/openvz-7.0.1-554/source/SRPMS/v/vzkernel-3.10.0-327.36.1.vz7.18.7.src.rpm but we were lucky and needed only one file : <tt>3c59x.c</tt> from https://src.openvz.org/projects/OVZ/repos/vzkernel/browse/drivers/net/ethernet/3com (beware of branch and/or tag). | ||
+ | |||
+ | Note : if network is unavailable on the target host, download these packets (lookup /etc/yum.repos.d/ for the EPEL and Virtuozzo URL). Adapt the version numbers to your release : | ||
+ | cpp-4.8.5-11.vl7.x86_64 | ||
+ | dkms-2.3-2.20161202gitde1dca9.vl7.noarch | ||
+ | gcc-4.8.5-11.vl7.x86_64 | ||
+ | U glibc-2.17-157.vl7.2.x86_64 | ||
+ | U glibc-common-2.17-157.vl7.2.x86_64 | ||
+ | glibc-devel-2.17-157.vl7.2.x86_64 | ||
+ | glibc-headers-2.17-157.vl7.2.x86_64 | ||
+ | U libgcc-4.8.5-11.vl7.x86_64 | ||
+ | U libgomp-4.8.5-11.vl7.x86_64 | ||
+ | libmpc-1.0.1-3.vl7.x86_64 | ||
+ | mpfr-3.1.1-4.vl7.x86_64 | ||
+ | vzkernel-devel-3.10.0-327.36.1.vz7.18.7.x86_64 | ||
+ | vzkernel-headers-3.10.0-327.36.1.vz7.18.7.x86_64 | ||
+ | |||
+ | (U = already present but seems to require an update) | ||
+ | |||
+ | The rest of this doc is heavily inspired from https://wiki.centos.org/HowTos/BuildingKernelModules | ||
+ | |||
+ | Install dkms and vzkernel-devel. | ||
+ | |||
+ | Create a <tt>/usr/src</tt> subdirectory named like this <tt>modulename-buildversion</tt> and place your file(s) there : | ||
+ | mkdir /usr/src/3c59x-0.1 | ||
+ | cd /usr/src/3c59x-0.1 | ||
+ | cp 3c59x.c /usr/src/3c59x-0.1 | ||
+ | echo "obj-m += 3c59x.o" >/usr/src/3c59x-0.1/Makefile | ||
+ | |||
+ | Create the /usr/src/3c59x-0.1/dkms.conf file : | ||
+ | PACKAGE_NAME="3c59x" | ||
+ | PACKAGE_VERSION="0.1" | ||
+ | BUILT_MODULE_NAME[0]="3c59x" | ||
+ | DEST_MODULE_LOCATION[0]="/kernel/drivers/net/ethernet/3com/" | ||
+ | AUTOINSTALL="yes" | ||
+ | |||
+ | Then add dkms support : | ||
+ | dkms add -m 3c59x -v 0.1 | ||
+ | dkms build -m 3c59x -v 0.1 | ||
+ | dkms install -m 3c59x -v 0.1 | ||
+ | |||
+ | For each kernel update, dkms should rebuild the module for you. | ||
+ | There is an option in dkms to build a RPM and maybe allow to do all that work remotely, but not tested, sorry. | ||
== Building a kernel module rpm package (kmod) == | == Building a kernel module rpm package (kmod) == |
Latest revision as of 12:20, 22 March 2017
This article describes how to build a kernel module which is not included into the stock Virtuozzo kernel.
(This article applies to Virtuozzo 7)
Building a kernel module (*.ko)[edit]
Here is an example how to build "via-rhine" kernel module which is in the Virtuozzo kernel source tree, but not enabled in kernel config by default.
// You need to install some dev packages in advance (the list here may be incomplete). # yum install rpm-build gcc xmlto asciidoc hmaccalc python-devel newt-devel pesign
// If you are going to build a kernel module against some kernel, you need kernel headers for that kernel. // Assume you want to build a kernel module against currently running kernel. # yum install vzkernel-devel.x86_64
// Get sources of the module you'd like to build, // in this particular example the easiest way i believe is just to download the kernel src.rpm. # cd /tmp # wget https://download.openvz.org/virtuozzo/factory/source/SRPMS/v/vzkernel-3.10.0-327.3.1.vz7.10.10.src.rpm # rpm -ihv vzkernel-3.10.0-327.3.1.vz7.10.10.src.rpm // "Prepare" source tree, it's not enough just to take the archive stored in it, // you need to apply additional patch(es), rpmbuild does this for us. # rpmbuild -bp /root/rpmbuild/SPECS/kernel.spec --nodeps
// Go to the module source directory. # cd /root/rpmbuild/BUILD/kernel-3.10.0-327.3.1.el7/linux-3.10.0-327.3.1.vz7.10.10/drivers/net/ethernet/via
// Edit the Makefile so you get the required kernel module compiled. // In this particular example the via-rhine compiles in-kernel by default, so we need to force it to be built as a module. # sed -ie 's/$(CONFIG_VIA_RHINE)/m/' Makefile
// Build and install the module. # make -C /lib/modules/`uname -r`/build M=$PWD # make -C /lib/modules/`uname -r`/build M=$PWD modules_install
// Check the module has been really copied and load it. # find /lib/modules -name \*rhine\* /lib/modules/3.10.0-327.3.1.vz7.10.10/extra/via-rhine.ko # modprobe via-rhine # lsmod |grep rhine via_rhine 32501 0 mii 13934 1 via_rhine
Here you are!
Note: Your case is a bit more complicated? Read Building External Modules |
Building a kernel module using Dynamic Kernel Module Support (DKMS)[edit]
(draft : this is a small example of adding back the support of an old network card just after the installation of Virtuozzo 7.0.1 on a bare metal server)
First, you need to figure out which kernel source files are needed to build your modules. Here, what we needed wasn't in the source package https://download.openvz.org/virtuozzo/releases/openvz-7.0.1-554/source/SRPMS/v/vzkernel-3.10.0-327.36.1.vz7.18.7.src.rpm but we were lucky and needed only one file : 3c59x.c from https://src.openvz.org/projects/OVZ/repos/vzkernel/browse/drivers/net/ethernet/3com (beware of branch and/or tag).
Note : if network is unavailable on the target host, download these packets (lookup /etc/yum.repos.d/ for the EPEL and Virtuozzo URL). Adapt the version numbers to your release :
cpp-4.8.5-11.vl7.x86_64 dkms-2.3-2.20161202gitde1dca9.vl7.noarch gcc-4.8.5-11.vl7.x86_64 U glibc-2.17-157.vl7.2.x86_64 U glibc-common-2.17-157.vl7.2.x86_64 glibc-devel-2.17-157.vl7.2.x86_64 glibc-headers-2.17-157.vl7.2.x86_64 U libgcc-4.8.5-11.vl7.x86_64 U libgomp-4.8.5-11.vl7.x86_64 libmpc-1.0.1-3.vl7.x86_64 mpfr-3.1.1-4.vl7.x86_64 vzkernel-devel-3.10.0-327.36.1.vz7.18.7.x86_64 vzkernel-headers-3.10.0-327.36.1.vz7.18.7.x86_64 (U = already present but seems to require an update)
The rest of this doc is heavily inspired from https://wiki.centos.org/HowTos/BuildingKernelModules
Install dkms and vzkernel-devel.
Create a /usr/src subdirectory named like this modulename-buildversion and place your file(s) there :
mkdir /usr/src/3c59x-0.1 cd /usr/src/3c59x-0.1 cp 3c59x.c /usr/src/3c59x-0.1 echo "obj-m += 3c59x.o" >/usr/src/3c59x-0.1/Makefile
Create the /usr/src/3c59x-0.1/dkms.conf file :
PACKAGE_NAME="3c59x" PACKAGE_VERSION="0.1" BUILT_MODULE_NAME[0]="3c59x" DEST_MODULE_LOCATION[0]="/kernel/drivers/net/ethernet/3com/" AUTOINSTALL="yes"
Then add dkms support :
dkms add -m 3c59x -v 0.1 dkms build -m 3c59x -v 0.1 dkms install -m 3c59x -v 0.1
For each kernel update, dkms should rebuild the module for you. There is an option in dkms to build a RPM and maybe allow to do all that work remotely, but not tested, sorry.
Building a kernel module rpm package (kmod)[edit]
TBD, you are welcome to put the description here. :)