QEMUを使って最新のLinuxカーネル(v4.0-rc7)を起動する


目的

今回はQEMUを用いて最新のLinuxカーネルを起動する際に必要となったことをまとめておこうと思います。
結構日本語の記事がなく、情報が分散しているな〜という印象だったので、まとめておこうと思いました。

ゴール

  • x86用にビルドしたLinuxカーネルをQEMUを用いて起動
  • ファイルシステムはbuildrootを使ってお手軽につくる

動作確認環境

ArchLinux環境下での動作を確認しました。

大まかな手順

  1. 必要なツール一式を準備
  2. カーネルのビルド
  3. ファイルシステムの作成
  4. 作成したカーネルイメージとファイルシステムを使ってQEMUで起動

って流れです!

必要なツール準備

必要なツールとして、Git, Buildroot, QEMUくらいを準備しましょう。(それに依存するのはパッケージ管理がごちゃごちゃやってくれるでしょう…)

Git

まぁこれは普通にパッケージ管理で入れちゃいましょう!僕のArch環境下だとsudo pacman -S gitで入りますがそれ以外の環境だと、
mac だったらbrew install gitとか、deb系だとsudo apt-get install gitとかで入れちゃいましょう!(多分あると思います)

Buildroot

Buildrootは組み込みLinux環境をお手軽に作ってくれるツール。
これでとりあえずQEMUでいろいろ起動できる環境は作れちゃいます。
とりあえずさっき入れたGitを使ってサクッと入れちゃいましょう!

まずここに書いてあるように、適当な場所でgit clone git://git.buildroot.git/buildrootしちゃえば多分問題なく入ります。

QEMU

これは多分ほぼすべてのディストリのリポジトリにあるんじゃないでしょうか…。
Archだとsudo pacman -S qemuで入ります。
他の環境だとapt-cache search したり、brew searchしちゃえば見つかると思います。

最新版カーネルのビルド

まず最新版のカーネルのソースを落としてきましょう。
今回はGithubにあるLinus氏のを使って見ようと思います。
適当な場所でgit clone https://github.com/torvalds/linux.gitで引っ張って来ちゃいましょう。
そしていよいよQEMU向けにビルドしていくわけですが、動かすのが目的なので最小構成の設定で…!と思いmake allnoconfigで設定ファイルの生成を試したのですが、その設定でビルドしたカーネルはちゃんと起動せず…。何が足りないのでしょうか…。

とりあえずはmake defconfigの設定でうまく行きました。設定ファイルが作られた後、makeすればつらつら〜っとビルドが始まるので気長に待ちましょう。
linux/arch/x86_64/boot/bzImageってのが目的のカーネルイメージです!

ファイルシステムの作成

次にファイルシステムを作成していきましょう!
cpioコマンドなんかで作っていってもいいんですがいかんせんめんどくさい…なのでbuildrootでサクサクっと作ったものを借りちゃいましょう。

buildrootのディレクトリにまずcdしてください。
ここで設定ファイルを作りたいのですが、いかんせん量が多い…どうしたらって感じですが実はQEMU用の設定があるのでそれを使っちゃいましょう。
make qemu_x86_64_defconfigをして、make

これで、buildrootフォルダの中のoutputの中にお目当てのものができているはずです。
buildroot/output/images/rootfs.ext2がお目当てのイメージです。

ちなみに一緒にbuildroot/output/images/bzImageというものがありますが、これはbuildroot側で作られたLinuxカーネルイメージです。
試しにこれらを使って起動してみましょう。
buildrootフォルダで
qemu-system-x86_64 -M pc -kernel output/images/bzImage -drive file=output/images/rootfs.ext2,if=ide -append "root=/dev/sda console=ttyS0" -nographic -curses
を実行すれば下のような感じでターミナル内でカーネルがブートするはずです…!!(今回はcursesを自分の好みで使っちゃってます)

ちなみにbuildrootでビルドされたカーネルはuname -rで見てみると3.19.0でした。

QEMU最新カーネルで起動

ではいよいよ最新カーネルを試してみましょう。(といってもさっきの指定するカーネルをビルドしたカーネルにするだけなんですけど。)

qemu-system-x86_64 -M pc -kernel ~/hoge/linux/arch/x86_64/boot/bzImage -drive file=~/hoge/buildroot/output/images/rootfs.ext2,if=ide -append "root=/dev/sda console=ttyS0" -nographic -curses(hogeは実際のパスに変換しちゃってください)

これでしたの図のような感じで起動するはず…!ログインなんかはID:root PW:なし でログインできるようになってます。

最新版カーネルで動いていることも確認できました!