環境
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
を適切に設定し,ビルド時間の短縮など,より最適化していく.