wslでlinuxをビルドします。
wslのインストール
以下の記事を参照ください。
linuxビルド
クローン
まずはビルドするソースなどをgitを通じて持ってきます。
「linux stable」とかで検索すると以下がヒットします。
こちらがlinuxの公式リポジトリです。stableとある通り、安定版を持ってきます。
このページの下部にgitコマンドが書いてありますので、それをwslで実行します。
git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
cd linux
ビルド
readmeやreadmeに載っているドキュメントを見てもビルドガイドは載っていませんでした。
そこで、いくつかの記事を参考にしながらいい感じの手順を探すことにしました。
1. ビルドツールのインストール
sudo apt install build-essential bc bison flex libelf-dev libssl-dev libncurses5-dev
まずビルドに必要なコンパイラやリンカなどをインストールします。
カーネル部分だけなら全てc言語で書かれている気がするので、gccだけで良い気がしますが色んなビルドツールが必要なようです。どこで何が使われてるのかは不明です。
2. ビルドの設定
ビルドの細かいオプション指定みたいなものをします。
make defconfig
make menuconfig
# kernel hacking→compile-time checks and compiler options→debug informationをDWARF version 4に設定
# processor type and features→randomize the address of kernel imageをオフにする
# Kernel hacking→ Compile-time checks and compiler options→Compile the kernel with debug infoをオンにする
# Processor type and features→EFI runtime service supportをオフにする
# Processor type and features→Build a relocatable kernelをオフにする
make menuconfigはビルドの設定を対話的に変更できるツールです。やっていることは.configというテキストの書き換えです。スペースやenterで値の変更ができます。
書き換えるconfigの項目については以下の記事をパクりました。
3.ビルド
今回は、デバッグに必要な部分をビルドします。
make -j$(nproc) bzImage
-jオプションは並列実行する数で、これが多いほど速くビルドが終わります。$(nproc)はlinuxが利用可能なCPUコア数です。
これが終わったとき、vmlinuxとarch/x86_64/boot/bzImageができていると思います。この2つをデバッグや実行に使います。
ディストリを用意する
さて、今まででビルドしたのはOSのカーネルのみです。OSとして使用するにはシェル(ディストリビューションのカーネル以外の部分)やブートローダーといったものが必要です。
シェルのビルドは今回はしないことにして、あらかじめビルドされたqcow2形式をダウンロードします。
ディストリビューションは今回はdebianを選びました。
上記ページ下部にbookwormとかいろいろなフォルダが並んでいると思います。これらはdebianのバージョン名です。今回はbookwormを選びます。
日付は多分ビルドした日付で、適当なのを選びます。すると、「debian-12-(クラウド名)-(アーキテクチャ名)...」という形式で命名されたファイルが出てきます。今回は「nocloud」「amd64」「qcow2形式」のものを選びます。
windows側でダウンロードしたので、エクスプローラーを介してwsl側に持っていきました。
qemuで実行
QEMUはOSを仮想マシン上で実行するためのソフトです。windows上でwslにより仮想マシンを動かし、その上にさらに仮想マシンを走らせることになります。
まずはwsl上でインストールします。
apt-get install qemu-system
次に、先ほどビルドしたカーネルと、ダウンロードしたディストリのイメージファイルを使ってqemuを起動します。
qemu-system-x86_64 -kernel arch/x86_64/boot/bzImage -drive file=(qcowファイルのパス),format=qcow2 -nographic -append "root=/dev/sda1 console=ttyS0"
qemuのアーキテクチャとbzImageのアーキテクチャはそろっていないとだめです。
root=~は、ブートローダー(多くの場合はgrab)が普段やってくれていることを直書きしたものになります。
ユーザー名とパスワードを要求されますが、debianのcloud imageの仕様で、ユーザー名をrootと入力しておけば大丈夫です。
参考:https://wiki.debian.org/Cloud#FAQ
これで動いたと思います。次回はデバッグをやります。
わかっていないこと
- gcc, make以外のツールはいつ、どこで使っている?
- debianのイメージ、クラウドとどうかかわりがあるのか
参考記事
再現した環境
- Windows 10 pro
- WSL バージョン: 2.6.1.0
- Ubuntu 24.04.1 LTS
- QEMU emulator version 8.2.2 (Debian 1:8.2.2+ds-0ubuntu1.10)
- Debian GNU/Linux 12 (bookworm)