All Articles

Linux カーネルのコードを少しだけ書き換えてビルド・インストールする

Linux カーネルのソースコードを少しだけ書き換えてビルド・インストールしてみたので、手順などを残しておきます。

環境

KVM 上の Ubuntu 20.04

$ uname -r
5.8.0-63-generic

Linux カーネルのダウンロード

Linux カーネルのソースコードは /usr/src 以下に配置するので、/usr/src に移動してソースコードをダウンロード・展開します。

$ cd /usr/src
$ sudo curl -LO https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.13.7.tar.xz
$ xz -dc linux-5.13.7.tar.xz | sudo tar xvf -
$ cd linux-5.13.7

これで linux-5.13.7 というディレクトリにソースコードが展開されました。

なお、カーネルのダウンロード URL は、以下のページで確認できます。

https://www.kernel.org/

設定

カーネルをビルドする際の設定として、/usr/src/linux-5.13.7 以下に .config というファイルを作成する必要があります。

このファイルは

  • make oldconfig
  • make localmodconfig

などで作成できます。

カーネルのビルド時間を短くしたり、サイズを小さくしたりするには、make localmodconfig を使って、必要なモジュールだけでビルドするのが簡単です。

参考

少し書き換えてみる

./init/main.c の kernel_init 関数を少しだけ書き換えてみます。

GitHub 上のソースコードの該当箇所は こちら です。

ひとまずログ出力を追加するだけとします。

 	do_sysctl_args();
 
+	pr_info("[MYLOG] log1 ramdisk_execute_command: %s\n", ramdisk_execute_command);
 	if (ramdisk_execute_command) {
+		pr_info("[MYLOG] log2 ramdisk_execute_command: %s\n", ramdisk_execute_command);
 		ret = run_init_process(ramdisk_execute_command);
 		if (!ret)
 			return 0;

ビルド

ビルド自体は sudo make だけで実行可能ですが、高速化するために 2 つほど工夫をいれます。

ccache のインストール

カーネルのビルド時間を短縮する技 | ガジェット好きの日記」という記事を参考に、ccache を導入しました。

一回目のビルドは高速化しませんが、二回目以降は高速になるはずです。

並列での実行

CPU の複数コアを活かしてビルドするため、make コマンドにオプションをつけます。

sudo make -j8

しばらく待てばビルドが完了します。

CONFIGSYSTEMTRUSTED_KEYS に対応するファイルがない旨のエラー

.config 内の CONFIGSYSTEMTRUSTED_KEYS の設定に対応するファイルがない場合、エラーが発生します。

とりあえずビルドを通すだけでよければ、.config を

CONFIG_SYSTEM_TRUSTED_KEYS=""

のように書き換えることで解消できます。

インストール

カーネルモジュールのインストール

$ sudo make modules_install

カーネルのインストール

$ sudo make install

再起動

新しくインストールしたカーネルで起動するか、再起動して確認します。

sudo reboot

uname で確認すると…

$ uname -r
5.13.7

カーネルのバージョンが 5.13.7 になっています。

ログを確認

dmesg で、カーネルのログを確認すると…

$ dmesg | grep MYLOG
[    0.633390] [MYLOG] log1 ramdisk_execute_command: /init
[    0.633391] [MYLOG] log2 ramdisk_execute_command: /init

追加したログが反映されていました。