Linux Kernel をBuildしてqemuで動かす

1.はじめに

コンパクトなKernel を Build して qemu で動かすことを目標にします。

下記のサイトに記載の内容を実施してみた結果です。

minimalなlinuxを作りたい、と思ったんだ

 

利用した環境は以下の通りです。

・ホストOS:Windows 10 Pro

・Linux 環境:WSL(Ubuntu 18.04.3 LTS)

・Build する Linux の Kernelのバージョン:linux-5.3.12

・QEMU emulator version 2.11.1(Debian 1:2.11+dfsg-1ubuntu7.20)

 

2.環境の準備

Kernel のBuildに必要な環境は整っている前提です。

 

・qemuをインストール

 $ sudo apt-get install qemu

 

・その他

 $ sudo apt-get install libncursesw5-dev

 $ sudo apt-get install ncurses-doc

 $ sudo apt-get install bison

 $ sudo apt-get install dctrl-tools

 $ sudo apt-get install flex

 $ sudo apt install libelf-dev

 $ sudo apt install libssl-dev

 $ sudo apt install libcurl4-openssl-dev

 $ sudo apt install libssl-dev

 $ sudo apt install openssl

 

その他、必要な環境は下記を参考にする。

https://mongonta.com/f258-howto-build-linux-kernel/

 

3.Kernelのビルドと実行

(1)ソースの取得

ソースを配置するディレクトリを作成し、ソースをダウンロードする。

$ mkdir linux53

$ cd linux53

$ wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.3.12.tar.xz

$ xzcat linux-5.3.12.tar.xz | tar xfv -

 

(2)Kernelをビルドとqemuでの実行

下記のサイトを参考にしました。

Linux を(わりと)シンプルな構成でビルドして Qemu で起動する

 

 

記事では4系のカーネルですが、今回は5系で実施しました。

Kernelのコンフィグは、ほぼ、リンクの記事の通りです。

正しく動作すると下記のようになりました。

------------------------------------------------------------------------------

省略

random: get_random_bytes called from 0xffffffff8102df5f with crng_init=0

sched_clock: Marking stable (404304716, 86088419)->(493789505, -3396370)

input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input0

Freeing unused kernel image memory: 480K

Write protecting the kernel read-only data: 8192k

Freeing unused kernel image memory: 2036K

Freeing unused kernel image memory: 1828K

Run /init as init process

-----------HELLO------------

Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000000

Kernel Offset: disabled

---[ end Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000000 ]---

------------------------------------------------------------------------------

 

(3)周辺のツールを含めた環境を作る

以下の記事の「BusyBoxでユーザーランドを作る」から先を進める。

ビルドしたLinuxカーネルをブートできる最低限の環境を用意する(with Busybox & qemu)

 

BusyBoxのビルドは下記のサイトを参考にしました。

busyboxをスタティックバイナリ化する

 

qemuで実行する際に、下記のコマンドとする。

$ qemu-system-x86_64 -kernel ./bzImage -initrd ./rootfs.img -append "console=ttyS0 rdinit=/bin/sh" -nographic

 

起動すると下記のようになりました。

------------------------------------------------------------------------------

random: get_random_bytes called from 0xffffffff8102df5f with crng_init=0

sched_clock: Marking stable (416703671, 81781460)->(499244844, -759713)

input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input0

Freeing unused kernel image memory: 480K

Write protecting the kernel read-only data: 8192k

Freeing unused kernel image memory: 2036K

Freeing unused kernel image memory: 1828K

Run /bin/sh as init process

/bin/sh: can't access tty; job control turned off

/ # input: ImExPS/2 Generic Explorer Mouse as /devices/platform/i8042/serio1/input/input2

clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x33e494b9d3a, max_idle_ns: 440795255743 ns

clocksource: Switched to clocksource tsc

 

/ #

/ # ls

bin      dev      linuxrc  root     sbin     usrrandom: fast init done

------------------------------------------------------------------------------

 

写真素材のピクスタ