人生は勉強ブログ

https://github.com/dooooooooinggggg

Linux KernelをビルドしてQEMUで動かす.

環境

cat /etc/debian_version
# 9.9

qemu-system-x86_64 --version
# QEMU emulator version 2.8.1(Debian 1:2.8+dfsg-6+deb9u7)
# Copyright (c) 2003-2016 Fabrice Bellard and the QEMU Project developers

必要なパッケージを取得

参考: 初心者向けKernelのビルド手順 | ガジェット好きの日記

sudo apt-get -y update
sudo apt-get -y install build-essential libncurses-dev fakeroot linux-source libssl-dev bison flex libelf-dev libelf-devel elfutils-libelf-devel

Linux Kernelのビルド

今回のビルドでは,~/build_kernelというディレクトリを作成し,その中で作業を行う.

The Linux Kernel Archivesから,好きなバージョンのLinux Kernelを落としてきて,解凍.

次に,ビルドターゲットとなるディレクトリを作成する.今回は,管理をしやすくするため,linux-4.9.183.tar.xzと同じ階層で行う.

cd ~/build_kernel
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.183.tar.xz
tar -Jxvf linux-4.9.183.tar.xz
mkdir build # ビルドターゲット
cd linux-4.9.183

次に,Kernelの設定をする.というのもLinux Kernelでは,あらゆるCPU,あらゆるドライバに対応したソースが含まれているが, 全てをビルドすると時間もかかってしまい,出来上がるバイナリも巨大になってしまうので,ビルドしたいものとしたくないものを決めることができる.

make menuconfigで設定画面が開くので,ポチポチと設定をしていく.ちなみに僕はよくわからなかったのでほぼ初期値のまま適当に終わらせてしまった. 今後,慣れてきたら最適化をしていこうと思う.今回はとりあえずビルドして,QEMUで動くが動かないかを試すだけなので一旦これでいい.一旦.

設定が終わったら,makeする.この際に,ビルドのターゲットをさっき作ったディレクトリに設定するのを忘れないようにする.

make menuconfig
make O=../build/kernel

とても時間がかかるので待つ.

BusyBox

この章はほぼ下の参考にしたサイトと同じことをやっているので,そっちを見た方が早い.が一応自分でも書く.

参考: ビルドしたLinuxカーネルをブートできる最低限の環境を用意する(with Busybox & qemu) - 豆腐の豆腐和え

Linux Kernelにはユーザーランドの実装が含まれていないため,最低限のコマンドすらない. BusyBoxとは,この最低限のコマンドを用意してくれているやつ.(?)

とりあえず準備してみる.BusyBoxからソースを落とす.

解凍したら,make menuconfigで設定する.ここでは,ライブラリを静的リンクするように設定する.(staticとあるところを探す.) 完了したら,ビルド.

ビルドが完了すると,busybox-1.31.0/_installというフォルダができているので移動してコマンドを叩く.

起動後ルートファイルシステムをになるファイルを作る

らしい.

cd ~/build_kernel
wget https://busybox.net/downloads/busybox-1.31.0.tar.bz2
tar -jxvf busybox-1.31.0.tar.bz2
cd busybox-1.31.0
make menuconfig # ライブラリを静的にリンクするように設定
make install
cd _install
find . | cpio -o --format=newc > ../rootfs.img

QEMUで起動する

ビルドが完了したので,QEMUで起動する.

~/kernel_build/build/kernel/arch/x86/boot/bzImageというものができているので,これを使ってビルドする.

qemu-system-x86_64 -kernel ~/kernel_build/build/kernel/arch/x86/boot/bzImage -initrd ~/kernel_build/busybox-1.31.0/rootfs.img -append "root=/dev/ram rdinit=/bin/sh"

以上で,特になんの変更も加えてないLinux Kernel + BusyBoxを動かすことができた.

今後は,各Kconfigを適切に設定し,ビルド時間の短縮など,より最適化していく.

参考