(Created page with "This patch contains instructions for building a kernel from the source RPM. Make sure you have installed all dependencies = Get the Source = {{Admon/warning |Do Not Build Pac...") |
No edit summary |
||
Line 24: | Line 24: | ||
{{Admon/warning | Space Required. The full kernel building process requires several gigabytes of extra space on the file system containing your home directory.}} | {{Admon/warning | Space Required. The full kernel building process requires several gigabytes of extra space on the file system containing your home directory.}} | ||
= Copy the Source Tree and Generate a Patch = | |||
This step is for applying a patch to the kernel source. If a patch is not needed, proceed to "Configure Kernel Options". | |||
{{admon/note|Advanced Users|There are tools such as 'quilt' that allow you to avoid copying the source tree. For advanced users, such tools are often a time saver over the steps below|}} | |||
Copy the source tree to preserve the original tree while making changes to the | |||
<pre> | |||
export arch=x86_64 # replace x86_64 with your arch | |||
export ver=3.7 # replace 3.1 with your kernel version | |||
export subver=4-204 | |||
export fedver=fc16 # replace fc16 with your fedora version | |||
cp -r ~/rpmbuild/BUILD/kernel-$ver.$subver.$fedver ~/rpmbuild/BUILD/kernel-$ver.$fedver.orig | |||
cp -al ~/rpmbuild/BUILD/kernel-$ver.$subver.$fedver.orig ~/rpmbuild/BUILD/kernel-$ver.$fedver.new | |||
</pre> | |||
{{Admon/warning | The second <code>cp</code> command hardlinks the <code>.orig</code> and <code>.new</code> trees to make <code>diff</code> run faster. Most text editors know how to break the hardlink correctly to avoid problems. Vim does not break hard links by default, so don't use 'cp -al' use 'cp -r', or look into the 'breakhardlink' setting.}} | |||
Using vim on FC14, it treated the hard link as a hard link and thus the above technique failed. It was necessary to repeat the original copy used for the .orig directory for the .new directory. Note that this uses twice the space. | |||
Make changes directly to the code in the <code>.new</code> source tree, or copy in a modified file. This file might come from a developer who has requested a test, from the upstream kernel sources, or from a different distribution. | |||
After the <code>.new</code> source tree is modified, generate a patch. To generate the patch, run <code>diff</code> against the entire <code>.new</code> and <code>.orig</code> source trees with the following command: | |||
<pre> | |||
cd ~/rpmbuild/BUILD | |||
diff -uNrp kernel-$ver.$subver.$fedver.orig kernel-$ver.$subver.$fedver.new > ../SOURCES/linux-$ver.$subver.$fedver-mynewpatch.patch | |||
</pre> | |||
Replace 'linux-$ver.$subver.$fedver-mynewpatch.patch' with the desired name for the new patch. | |||
Lastly edit the patch file to remove the leading directory, this is required because the kernel spec file applies patches with '-p1' only. | |||
For example the following: | |||
<pre> | |||
--- kernel-3.8.fc18.orig/linux-3.8.11-200.bz708406.fc18.x86_64/kernel/kexec.c 2013-02-18 18:58:34.000000000 -0500 | |||
+++ kernel-3.8.fc18.new/linux-3.8.11-200.bz708406.fc18.x86_64/kernel/kexec.c 1969-12-31 19:00:00.000000000 -0500 | |||
</pre> | |||
Should be changed to: | |||
<pre> | |||
--- linux-3.8.11-200.bz708406.fc18.x86_64/kernel/kexec.c 2013-02-18 18:58:34.000000000 -0500 | |||
+++ linux-3.8.11-200.bz708406.fc18.x86_64/kernel/kexec.c 1969-12-31 19:00:00.000000000 -0500 | |||
</pre> | |||
{{Admon/warning | For more information on patching refer to the man pages for <code>diff(1)</code> and <code>patch(1)</code>.}} | |||
= Configure Kernel Options = | |||
This step is for modifying the options the kernel is configured with. This step is optional. If no configuration changes are needed, proceed to "Prepare Build Files". | |||
{{admon/important|Small changes|If you only want to make a small number of configuration changes, you should simply set the options as desired in the config-local file. This will be sourced and override the remaining config-* files and avoids a lot of unnecessary work. You can skip the steps below if you use config-local}} | |||
# Change to the kernel source tree directory:<pre>cd ~/rpmbuild/BUILD/kernel-$ver.$fedver/linux-$ver.$subver.$fedver.$arch/</pre> If you only want to make minor changes to the default fedora kernel, skip to step 4., and use one of the two configuration tools to edit those minor changes into the default config file. | |||
# Select the desired configuration file from <code>~/rpmbuild/BUILD/kernel-$ver.$fedver/linux-$ver.$subver.$fedver.$arch/configs</code>. Copy the desired config file to <code>~/rpmbuild/BUILD/kernel-$ver.$fedver/linux-$ver.$subver.$fedver.$arch/.config</code>: <pre>cp configs/<desired-config-file> .config</pre> | |||
# Run the following command: <pre>make oldconfig</pre> | |||
# Then run the following command, selecting and saving the desired kernel options from the text-based UI:<pre>make menuconfig</pre> | |||
#* For a graphical UI, instead run: <pre>make xconfig</pre> | |||
# Add a new line to the top of the config file that contains the hardware platform the kernel is built for (the output of <code>uname -i</code>). The line is preceded by a <code>#</code> sign. For example, an x86_64 machine would have the following line added to the top of the config file:<pre># x86_64</pre> | |||
# Copy the config file to <code>~/rpmbuild/SOURCES/</code>: <pre>cp .config ~/rpmbuild/SOURCES/config-`uname -m`-generic</pre> | |||
{{admon/important|32-bit x86 kernels|The 32-bit PAE kernel uses the config-i686-PAE configuration file. If you are building a PAE kernel, you will need to copy your config file to <code>~/rpmbuild/SOURCES/</code>: <pre> cp .config ~/rpmbuild/SOURCES/config-i686-PAE</pre> If you are building a non-PAE kernel, you will need to copy your config file to <pre> cp .config ~/rpmbuild/SOURCES/config-x86-32-generic</pre>. Again, the use of config-local is encouraged unless you are making a large number of configuration changes.}} | |||
= Prepare Build Files = | = Prepare Build Files = |
Revision as of 18:20, 19 September 2016
This patch contains instructions for building a kernel from the source RPM. Make sure you have installed all dependencies
Get the Source
If you've never built an RPM before, prepare an RPM package-building environment in your (non-root) home directory by running the following command:
$ rpmdev-setuptree
This command creates a new directory ~/rpmbuild
, with several empty subdirectories including SPECS
, SOURCES
, BUILD
and others. It also creates an initial ~/.rpmmacros
customization file for you. This only needs to be done once.
Download the kernel-<version>.src.rpm
file:
$ koji download-build --arch=src kernel-<version>
Install kernel-<version>.src.rpm
with the following command:
$ rpm -Uvh kernel-<version>.src.rpm
This command writes the RPM contents into ${HOME}/rpmbuild/SOURCES
and ${HOME}/rpmbuild/SPECS
, where ${HOME}
is your home directory. It is safe to ignore any messages similar to the following:
warning: user kojibuilder does not exist - using root warning: group kojibuilder does not exist - using root
Copy the Source Tree and Generate a Patch
This step is for applying a patch to the kernel source. If a patch is not needed, proceed to "Configure Kernel Options".
Copy the source tree to preserve the original tree while making changes to the
export arch=x86_64 # replace x86_64 with your arch export ver=3.7 # replace 3.1 with your kernel version export subver=4-204 export fedver=fc16 # replace fc16 with your fedora version cp -r ~/rpmbuild/BUILD/kernel-$ver.$subver.$fedver ~/rpmbuild/BUILD/kernel-$ver.$fedver.orig cp -al ~/rpmbuild/BUILD/kernel-$ver.$subver.$fedver.orig ~/rpmbuild/BUILD/kernel-$ver.$fedver.new
Using vim on FC14, it treated the hard link as a hard link and thus the above technique failed. It was necessary to repeat the original copy used for the .orig directory for the .new directory. Note that this uses twice the space.
Make changes directly to the code in the .new
source tree, or copy in a modified file. This file might come from a developer who has requested a test, from the upstream kernel sources, or from a different distribution.
After the .new
source tree is modified, generate a patch. To generate the patch, run diff
against the entire .new
and .orig
source trees with the following command:
cd ~/rpmbuild/BUILD diff -uNrp kernel-$ver.$subver.$fedver.orig kernel-$ver.$subver.$fedver.new > ../SOURCES/linux-$ver.$subver.$fedver-mynewpatch.patch
Replace 'linux-$ver.$subver.$fedver-mynewpatch.patch' with the desired name for the new patch.
Lastly edit the patch file to remove the leading directory, this is required because the kernel spec file applies patches with '-p1' only.
For example the following:
--- kernel-3.8.fc18.orig/linux-3.8.11-200.bz708406.fc18.x86_64/kernel/kexec.c 2013-02-18 18:58:34.000000000 -0500 +++ kernel-3.8.fc18.new/linux-3.8.11-200.bz708406.fc18.x86_64/kernel/kexec.c 1969-12-31 19:00:00.000000000 -0500
Should be changed to:
--- linux-3.8.11-200.bz708406.fc18.x86_64/kernel/kexec.c 2013-02-18 18:58:34.000000000 -0500 +++ linux-3.8.11-200.bz708406.fc18.x86_64/kernel/kexec.c 1969-12-31 19:00:00.000000000 -0500
Configure Kernel Options
This step is for modifying the options the kernel is configured with. This step is optional. If no configuration changes are needed, proceed to "Prepare Build Files".
- Change to the kernel source tree directory:
cd ~/rpmbuild/BUILD/kernel-$ver.$fedver/linux-$ver.$subver.$fedver.$arch/
If you only want to make minor changes to the default fedora kernel, skip to step 4., and use one of the two configuration tools to edit those minor changes into the default config file. - Select the desired configuration file from
~/rpmbuild/BUILD/kernel-$ver.$fedver/linux-$ver.$subver.$fedver.$arch/configs
. Copy the desired config file to~/rpmbuild/BUILD/kernel-$ver.$fedver/linux-$ver.$subver.$fedver.$arch/.config
:cp configs/<desired-config-file> .config
- Run the following command:
make oldconfig
- Then run the following command, selecting and saving the desired kernel options from the text-based UI:
make menuconfig
- For a graphical UI, instead run:
make xconfig
- For a graphical UI, instead run:
- Add a new line to the top of the config file that contains the hardware platform the kernel is built for (the output of
uname -i
). The line is preceded by a#
sign. For example, an x86_64 machine would have the following line added to the top of the config file:# x86_64
- Copy the config file to
~/rpmbuild/SOURCES/
:cp .config ~/rpmbuild/SOURCES/config-`uname -m`-generic
Prepare Build Files
This step makes the necessary changes to the kernel.spec
file. This step is required for building a custom kernel.
1. Change to the ~/rpmbuild/SPECS
directory:
$ cd ~/rpmbuild/SPECS
2. Open the kernel.spec
file for editing.
3. Give the kernel a unique name. This is important to ensure the custom kernel is not confused with any released kernel. Add a unique string to the kernel name by changing the 'buildid' line. Optionally, change ".local" to your initials, a bug number, the date or any other unique string.
Change this line:
# define buildid .local
To this (note the extra space is removed in addition to the pound sign):
%define buildid .<custom_text>
4. If you generated a patch, add the patch to the kernel.spec
file, preferably at the end of all the existing patches and clearly commented.
# cputime accounting is broken, revert to 2.6.22 version Patch2220: linux-2.6-cputime-fix-accounting.patch Patch9999: linux-2.6-samfw-test.patch
Build the New Kernel
This step actually generates the kernel RPM files. This step is required for building a custom kernel.
Use the rpmbuild
utility to build the new kernel:
- Ensure /usr/sbin is in your path (to pull in /usr/sbin/modinfo):
$ export PATH=/usr/sbin:$PATH
- To build all kernel flavors:
$ rpmbuild -bb --target=
uname -m
kernel.spec
- To disable specific kernel flavors from the build (for a faster build):
$ rpmbuild -bb --without <option> --target=
uname -m
kernel.spec
Valid values for "option" above include debug
and debuginfo
. Specifying --without debug
strips out some debugging code from the kernels, where specifying --without debuginfo
disables the building of the kernel-debuginfo
packages.
- To specify that only a specific kernel should be built:
$ rpmbuild -bb --with <option> --target=
uname -m
kernel.spec
Valid values for "option" above include baseonly
.
- For example, to build just the kernel and kernel-devel packages, the command would be:
$ rpmbuild -bb --with baseonly --without debuginfo --target=
uname -m
kernel.spec
The build process takes a long time to complete. A lot of messages will be printed to the screen. These messages can be ignored, unless the build ends with an error. If the build completes successfully, the new kernel packages will be located in the ~/rpmbuild/RPMS
directory.
Following Generic Textbooks
Many of the tutorials, examples, and textbooks about Linux kernel development assume the kernel sources are installed under the /usr/src/linux/
directory. If you make a symbolic link, as shown below, you should be able to use those learning materials with the Fedora packages. Install the appropriate kernel sources, as shown earlier, and then run the following command:
su -c 'ln -s /usr/src/kernels/<version>.<release>-<arch> /usr/src/linux'
Enter the root
password when prompted.
Install the New Kernel
This step actually installs the new kernel into the running system.
To install the new kernel, use the rpm -ivh
command, not the -U
or --upgrade
options:
su -c "rpm -ivh $HOME/rpmbuild/RPMS/<arch>/kernel-<version>.<arch>.rpm"
This command will install your kernel in /boot, create a new initramfs to bootstrap your kernel, and automatically add your new kernel to your grub bootloader "menu.lst". At this point, you can reboot to give control to your new kernel.