Ubuntu向けのLinuxカーネル関連debパッケージであるlinux-image, linux-headersに加えてlinux-tools(perf等が含まれる)を作成するための手順/スクリプトについて整理しています。
最新Linuxカーネルをビルドして適用したものの、カーネルバージョンの不一致によりperf, ftrace等を利用できず困ってる人向けです。
背景
Linuxカーネルはバージョンが上がる度に様々な機能、バグフィックス、最適化が加わります。また、パフォーマンスチューニングや解析のために必要なカーネル周りのメトリクス・ツール周りも積極的に強化されるため、新しいLinuxカーネルを積極的に導入&検証する方も多いと思います。
しかし新しいLinuxカーネルをビルドして適用した場合、perf, ftrace等のカーネル周りのイベント等を監視するためのツールもカーネルのバージョンに合わせて更新しなければ利用できなくなります。
apt/yum等のレポジトリに登録されているLinuxカーネルの場合、基本的にそのカーネルバージョンに対応するパッケージ(ex. linux-tools)が提供されているため特に問題はありません。
しかしそれ以外の手段(ex. Linux本家のソースコード、Ubuntu mailine ppa)でLinuxカーネルを適用する場合、perf, ftrace等がデフォルトでは含まれていなかったり、これらを含めるために結構色々な知識や試行錯誤が必要となることが多いです。
Linuxカーネルの最新版を適用しても、perf, ftraceを利用できなければ解析や検証の幅が極めて狭くなってしまいます。
このため本記事では以下のものを利用して、linux-image, linux-headers等のdebパッケージに加えてlinux-toolsのdebパッケージを作成するための「Dockerを活用した手順/スクリプト」について記載しています。
- Linux本家のLinuxカーネル ソースコード
- Ubuntu mainline ppaのパッチファイル
前提
- ビルドマシン環境の前提
- Ubuntu 16.04 or 18.04
- Docker 18.09 (おそらく17.xxでも問題なし)
- ビルド実施者の前提
- Linuxカーネルのビルド、コンフィグ設定、インストール等ができることを想定。
- perf, ftrace等のツールの重要性を理解している。
- プロダクト環境等に導入する場合は、事前に十分な検証を行ったり、リスク評価を行ったりする必要があると十分に理解していることを想定。
ビルド手順
下記gistに手順および資材ファイルを載せています。
手順はgistのREADME.mdにも記載していますが、簡単に日本語で記載しておきます:
gistにあるDockerfile
とbuild-kernel-with-perf.sh
を同じディレクトリにダウンロードします。
ダウンロードしたディレクトリにcdして、下記コマンドを実行してカーネルビルド用のDockerイメージを作成します。何故Dockerを使っているかは簡単に後ろの節で説明しています。
docker build -t kernel-build .
Dockerイメージを作成後、Dockerコンテナを起動してカーネルをビルドします。コマンドの最後のパラメータはLinuxカーネルのバージョンなので、ビルドしたい適切なバージョンに適宜変更してください。
ちなみにLinuxカーネルのビルドには数時間レベルの時間がかかるので注意しましょう。
TARGET_KERNEL_VERSION="4.20.13"
docker run \
--rm \
-u $(id -u):$(id -g) \
-v $PWD:/Output \
kernel-build $TARGET_KERNEL_VERSION
ビルドが完了すると、同じディレクトリ配下に*.debのLinuxカーネル関連のdebパッケージが配置された状態となります。debパッケージは以下のコマンドでインストールすることができます。(インストール順は重要です)
dpkg -i linux-headers-*
dpkg -i linux-modules-* linux-image-*
dpkg -i linux-tools-*
(補足) ビルド用Dockerイメージを使う理由
Linuxカーネルの各種debパッケージをビルドをするためには様々なUbuntuパッケージが必要となります。さらにUbuntuの16.04/18.04とかDesktop/Serverでも微妙に必要なパッケージ条件が異なる可能性があります。
このためDockerを使わずに様々なバージョンのUbuntu環境でカーネルビルドを実施すると、どうしても試行錯誤を繰り返しがちですし、Ubuntu環境自体に色々なパッケージがインストールされて汚れてしまいます。そして色々入れ過ぎたり設定したりした結果、何が正しいビルド条件なのかが把握できなくなることも珍しくはありません。
このため本手順ではカーネルビルド用のDockerイメージ(ベースイメージをubuntu 18.04に固定)を作成することで「より確実かつ環境を汚さず」にビルドを実施できるようにしています。