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 は、以下のページで確認できます。
設定
カーネルをビルドする際の設定として、/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
追加したログが反映されていました。