OpenSUSE 13: カーネルを再ビルドする

OpenSUSE 13のカーネルコンフィグとソースコードを変更して、カーネルを再ビルドする手順を記載します。

1 カーネルのビルドに必要なパッケージのインストール

rpmbuildの為にrpm-buildを、カーネルビルドの為にpatterns-openSUSE-devel_kernelをインストールします。

> sudo zypper -n in rpm-build patterns-openSUSE-devel_kernel

2 カーネルソースコードのダウンロード

デスクトップ向けのkernel-desktopをダウンロードします。カーネルのビルドに必要なkernel-macrosもダウンロードします。

> # If you have already downloaded other package, clear /usr/src/packages.
> # sudo rm -rf /usr/src/packages/*
> sudo zypper -n si kernel-desktop kernel-macros
> cp -a /usr/src/packages ~/rpmbuild
> cd ~/rpmbuild
> rpmbuild -bp SPECS/kernel-desktop.spec

その他のカーネルについては、例えばvanillaカーネルをビルドする場合はkernel-vanillaとkernel-macrosをダウンロードします。

3 バージョンの変更

バージョンを変更しないとインストール時に既存のカーネルとコンフリクトします。specファイルの変数Releaseを変更することでバージョンを変更します。

> sed -i -e 's/^Release:\(.*\)/Release:\1.hiroom2/g' SPECS/kernel-desktop.spec
> diff -uprN SPECS/kernel-desktop.spec{.org,}
--- SPECS/kernel-desktop.spec.org       2016-12-25 17:35:06.963941101 +0900
+++ SPECS/kernel-desktop.spec   2016-12-25 17:36:07.145422377 +0900
@@ -61,9 +61,9 @@ License:        GPL-2.0
 Group:          System/Kernel
 Version:        3.16.7
 %if 0%{?is_kotd}
-Release:        53.1.g7b4a1f9
+Release:        53.1.g7b4a1f9.hiroom2
 %else
-Release:        53.1
+Release:        53.1.hiroom2
 %endif
 Url:            http://www.kernel.org/
 BuildRequires:  bc

4 カーネルコンフィグの変更

カーネルコンフィグはSOURCES/config.tar.bz2にまとめられており、config/<arch>/<type>に置かれています。archはx86_64等で、typeはdesktop等です。

config.tar.bz2を展開し、カーネルディレクトリの.configへコピーします。カーネルディレクトリへ移動してmake menuconfig等でコンフィグを変更し、変更が完了したらconfig.tar.bz2を更新します。

> tar jxf SOURCES/config.tar.bz2
> cp config/x86_64/desktop BUILD/kernel-desktop-3.16.7/linux-3.16/.config
> cd BUILD/kernel-desktop-3.16.7/linux-3.16
> make menuconfig # Change kernel config
> cp .config ../../../config/x86_64/desktop
> cd ../../..
> tar jcf SOURCES/config.tar.bz2 config

この記事ではCONFIG_PRINTK_TIMEを無効にします。

> tar jxf SOURCES/config.tar.bz2
> sed -i -e 's/CONFIG_PRINTK_TIME=y/# CONFIG_PRINTK_TIME is not set/g' \
config/x86_64/desktop
> tar jcf SOURCES/config.tar.bz2 config

5 カーネルソースコードの変更

パッチはSOURCES/patches.<type>.tar.bz2に格納されており、SOURCES/series.confに読み込むパッチが記載されています。

独自にパッチを追加するにはSOURCES/patches.addon.tar.bz2にパッチを格納し、SOURCES/series.confにパッチのファイル名を記載します。

tar jxf SOURCES/patches.addon.tar.bz2
cat <<EOF > patches.addon/hello.patch
diff -uprN linux-3.16.org/init/main.c linux-3.16/init/main.c
--- linux-3.16.org/init/main.c  2016-12-25 22:38:14.721618205 +0900
+++ linux-3.16/init/main.c      2016-12-25 22:40:09.678637730 +0900
@@ -944,6 +944,8 @@ static int __ref kernel_init(void *unuse

        flush_delayed_fput();

+       printk("Hello, World\n");
+
        if (ramdisk_execute_command) {
                ret = run_init_process(ramdisk_execute_command);
                if (!ret)
EOF
tar jcf SOURCES/patches.addon.tar.bz2 patches.addon
echo "patches.addon/hello.patch" >> SOURCES/series.conf

6 カーネルのビルド

カーネルのビルドには1時間ほど掛かります。

> rpmbuild -ba SPECS/kernel-desktop.spec

ビルドしたカーネルをインストールします。

> sudo zypper -n in RPMS/x86_64/kernel-desktop-3.16.7-53.1.hiroom2.x86_64.rpm

再起動してインストールしたカーネルを起動します。

> sudo reboot

7 動作確認

以下の出力が得られました。

> uname -r
3.16.7-53.1.hiroom2-desktop
> zcat /proc/config.gz | grep CONFIG_PRINTK_TIME
# CONFIG_PRINTK_TIME is not set
> dmesg | grep Hello
[    2.158619] Hello, World