Linuxカーネルのビルド方法

この記事では、Linuxカーネルをビルドする方法を紹介します。Linuxコミュニティの最新カーネルでのみサポートされる機能を使う場合や、独自のLinux OSを作成する際に有用です。ここに掲載したコマンドは、Debian 11で実行を確認しましたが、他のLinux OSでも(パッケージのインストール方法を除いて)基本的には同じです。

ビルド準備

以下のパッケージをインストールします。
sudo apt install gcc make flex bison bc libncurses-dev libelf-dev libssl-dev

カーネルソースコードの取得

以下のサイトにカーネルのソースコードが掲載されています。

この記事を書いた日の最新安定版は6.2.7でした。以下は、それをビルド用マシンの作業用ディレクトリにダウンロードする例です。
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.2.7.tar.xz

ビルド

ソースコード展開

tar xf linux-6.2.7.tar.xz

設定

ここではデフォルト設定を行います。
cd linux-6.2.7
make defconfig

さらなる設定を行う場合 (TUI)

make menuconfig
上記のように入力すると、次のTUIベースの設定画面が表示されます。これを使って必要なCONFIGを追加/削除できます。

さらなる設定を行う場合 (コマンドライン)

以下のようにscript/configを使用する
scripts/config -e CONFIG_DEBUG_INFO_DWARF5
その後、設定されていないシンボルをデフォルトにする
make olddefconfig

参考

以下にコマンドラインでCONFIGを設定する方法を説明しています。

コンパイル

make -j32

上記の-j32は、32並列でのコンパイルを行うオプション。実際のCPU数に合わせて適宜変更。

次のメッセージが表示されればビルド成功。下記のbzImageは、多くのLinux OSでvmlinuz-6.1.0-5-amd64のような名前になっているものと同じです。

Kernel: arch/x86/boot/bzImage is ready  (#1)

起動テスト

ここではrootfsにDebian 11のドライブイメージを使い、QEMUで起動してみます。なお、QEMUの使用方法に関しては、以下に関連記事がまとめられています。

rootfsドライブイメージのダウンロード

以下のようにrootfsのイメージをダウンロードします。
wget https://cloud.debian.org/images/cloud/bullseye/20230124-1270/debian-11-nocloud-amd64-20230124-1270.qcow2

起動

次のとおりQEMUを実行します。--nographicオプションを付与しているので、仮想マシンにシリアルデバイスが作成されます。 また、カーネルオプションにconsole=ttyS0を付与して、コンソールをシリアルデバイスに設定しています。 これらによりQEMUを実行している端末が、そのままシリアルデバイスへの入出力端末となります。

なお、defconfigで設定した場合、virtio経由のストレージ機能がカーネルに組み込まれます。 initrdなしで直接rootfsをカーネルがマウントできます。

sudo qemu-system-x86_64 \
-cpu host \
--enable-kvm \
-m 1024 \
-nographic \
-drive id=drive0,format=qcow2,file=debian-11-nocloud-amd64-20230124-1270.qcow2,if=virtio \
-kernel arch/x86_64/boot/bzImage \
-append "root=/dev/vda1 console=ttyS0"
以下のようなログインプロンプトが表示されれば成功です。
(省略)
Debian GNU/Linux 11 debian ttyS0

debian login:
このイメージでは、ユーザ名としてrootと入力すると、パスワードなしで以下のようにログインできます。
Linux debian 6.2.7 #1 SMP PREEMPT_DYNAMIC Sun Mar 19 02:39:21 UTC 2023 x86_64
(省略)
root@debian:~#

起動失敗時のQEMU強制終了方法

QEMU起動中にCtrl-a、続いてcを入力するとQEMUのモニタ画面に移行します。ここでqを入力します。
(Ctrl-a, cを入力)
QEMU 7.2.0 monitor - type 'help' for more information
(qemu) q

0 件のコメント: