関連記事
概要
x86_64用にLinuxカーネルをビルド、BuildRootで構築したルートファイルシステムを用意する。
また、QEMUでこれらをバイナリを動かし、ルートファイルシステムがマウントできることを確認した。
はじめに
x86はIntelが開発したマイクロプロセッサの命令セットアーキテクチャであり、x86_64はx86を64ビットに拡張した命令セットアーキテクチャである。
x86はパーソナルコンピュータやサーバなど幅広く使われている。
一方、プロセッサエミュレータのQEMUは、ブートローダの再設定などせずにカーネルやramdiskを直接ロードすることができる。 そこで、プロセッサエミュレータでもあるQEMUを用いてx86_64用にビルドされたLinuxカーネルを動かす方法を解説する。
本記事では、以下の動作をする環境を目指す。
環境構成
起動対象のLinuxカーネルは、ホストOS(Ubuntu 18.04)上にインストールしたQEMUから動作させる。 また、今回はクロスコンパイラ環境をDockerで構築した。
ルートファイルシステムとして、Buildrootで生成したルートファイルシステムの非圧縮のcpio形式のアーカイブを利用する。
本記事は、下記の環境とソフトウェアバージョンに基づいて説明する。
環境 | パラメータ |
---|---|
ホスト環境 | x86_64 |
ホストOS | Ubuntu 20.04 |
Buildroot | buildroot-2020.02.8 |
QEMU | QEMU emulator version 4.2.1 |
linux | 5.7 |
Docker | version 19.03.13 |
Docker image | ubuntu:20.04 |
クロスコンパイラ環境の構築手順
ホスト環境にDockerをインストールする。 docs.docker.com
クロスコンパイラ環境を構築する。(作成が億劫な人は、著者自作Dockerfile(https://github.com/LeavaTail/kernel-build)を使用してほしい)
leava@ubuntu-bionic:~$ docker run --rm --name=kbuild -h "kbuild" -v /srv:/work -it ubuntu:20.04 /bin/bash
コンテナ環境下にカーネルのビルドに必要なパッケージをインストールする。(今回はUbuntuコンテナを利用する)
root@kbuild:/# apt install git bc bison flex libssl-dev make libncurses-dev libelf-dev file wget cpio unzip rsync build-essential
カーネルソースの取得
root@kbuild:/# cd /work root@kbuild:/work# git clone https://github.com/torvalds/linux.git root@kbuild:/work# cd linux root@kbuild:/work/linux# git checkout -b v5.7 refs/tags/v5.7
-
root@kbuild:/work/linux# export ARCH="x86"
-
root@kbuild:/work/linux# make x86_64_defconfig
カーネルをビルドする。
root@kbuild:/work/linux# make -j `getconf _NPROCESSORS_ONLN` bzImage
ルートファイルシステムの構築
Buildrootを用いてrootfsを構築する。
Buildrootをインターネットからダウンロード、ファイルを解凍する。
leava@ubuntu-bionic:~$ wget https://buildroot.org/downloads/buildroot-2020.02.8.tar.gz leava@ubuntu-bionic:~$ tar zxvf buildroot-2020.02.8.tar.gz && cd buildroot-2020.02.8
x86_64専用のデフォルトコンフィグ
qemu_x86_64_defconfig
を利用する。leava@ubuntu-bionic:~/buildroot-2020.02.8$ make qemu_x86_64_defconfig
Buildrootのビルド
leava@ubuntu-bionic:~/buildroot-2020.02.8$ make
ルートファイルシステムの確認
leava@ubuntu-bionic:~/buildroot-2020.02.8$ ls -l output/images/rootfs.ext4 lrwxrwxrwx 1 root root 11 Sep 8 15:45 output/images/rootfs.ext4 -> rootfs.ext2
カーネルの起動
-
leava@ubuntu-bionic:~$ sudo apt install qemu-system-x86
-
leava@ubuntu-bionic:~$ qemu-system-x86_64 \ -kernel /srv/linux/arch/x86/boot/bzImage \ -drive file=/srv/buildroot-2020.02.8/output/images/rootfs.ext2,if=ide,format=raw -nographic \ -append "root=/dev/sda console=ttyS0"
おわりに
本記事では、QEMUでx86_64用Linuxカーネルを起動させる手順を説明した。
Buildrootで構築した場合、自動でセットアップしてくれるため非常に使いやすく便利である。