LinuxカーネルをビルドしてQEMU上で動かす



Linuxカーネルの勉強のために、LinuxカーネルをビルドしてQEMU上で動かしてみたときのメモです。

準備物

  • ビルドマシン(x64 / Ubuntu Server 20.04 LTS)

ビルド手順

必要なパッケージのインストール

sudo apt update
sudo apt install make gcc g++ flex bison libelf-dev libssl-dev libncurses-dev unzip bzip2

Linuxカーネルのビルド

Linuxカーネルは以下のレポジトリで開発されている。 https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git

執筆時点で最新の v6.2 をビルドする方法は以下の通り。

cd /tmp
git clone https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/ --depth 1 -b v6.2
cd linux-next
make x86_64_defconfig ARCH=x86
make -j $(nproc)

ビルドすると arch/x86/boot/bzImage は生成される。

ルートファイルシステムのビルド

ルートファイルシステムとは、Linuxにおける / から始まるファイルシステムのことで、Linuxカーネルの起動後に必要なファイル群が配置されています。必要なOSSを1つずつ持ってきてルートファイルシステムを作成することもできますが、buildrootを使用し一括インストールをした。他にもyoctoなどが有名らしい。

執筆時点で最新の 2022.02.11 をビルドする方法は以下の通り。

cd /tmp
git clone git://git.buildroot.net/buildroot --depth 1 -b 2022.02.11
cd buildroot
make menuconfig
make -j $(nproc)

make menuconfig を実行すると、設定画面が出るので以下の項目を選択した。

  • Target options → Target Architecture → x86_64 を選択
  • Filesystem images → ext2/3/4 root filesystem → ext4 を選択

QEMUの起動

QEMUのインストール

sudo apt install qemu-system qemu-system-common qemu-utils

ビルドしたLinuxの起動

cd /tmp
qemu-system-x86_64 -boot c -m 2048M -kernel ./linux-next/arch/x86/boot/bzImage -hda ./buildroot/output/images/rootfs.ext4 -append "root=/dev/sda rw console=ttyS0,115200 acpi=off nokaslr" -serial stdio -display none

起動したLinuxを終了する時はkillコマンドを使用する

pkill -KILL -f qemu-system-x86_64