自作OSをCUIで動かしたい時に使うQemuのnographicオプションについてまとめます。
今回動かすバイナリは、30日OSの1日目で作成する、何もしないブートイメージです。
30日OSの書籍と異なる点として、30日OSを執筆された方の自作ツールではなく、汎用アセンブラのNASMを利用しています。
バイナリについては本記事では触れませんので、よければこちらをご覧いただければと思います。
QemuをCUIで動かす
結論から書きますが、以下のコマンドでブートイメージをQemuのCUI実行することができました。
qemu-system-x86_64 -drive file=boot.img,format=raw -nographic
おそらくこれがQemuのCUIでバイナリを実行する際のミニマムなオプションかと思います。
それぞれのオプションの意味は以下のとおりです。
-drive: ファイルをドライブイメージとして使用するためのオプション 必須の引数として、[file=file]をとる [file=file][,if=type][,bus=n][,unit=m][,media=d][,index=i] [,cache=writethrough|writeback|none|directsync|unsafe][,format=f] [,snapshot=on|off][,rerror=ignore|stop|report] [,werror=ignore|stop|report|enospc][,id=name][,aio=threads|native] [,readonly=on|off][,copy-on-read=on|off] [,discard=ignore|unmap][,detect-zeroes=on|off|unmap] [[,bps=b]|[[,bps_rd=r][,bps_wr=w]]] [[,iops=i]|[[,iops_rd=r][,iops_wr=w]]] [[,bps_max=bm]|[[,bps_rd_max=rm][,bps_wr_max=wm]]] [[,iops_max=im]|[[,iops_rd_max=irm][,iops_wr_max=iwm]]] [[,iops_size=is]] [[,group=g]] -nographic: GUIを無効にして、シリアルI/Oをコンソールにリダイレクトする
上記のとおり、-driveオプションは、NASMで作成したブートイメージ(boot.img)をドライブイメージに指定するためのオプションです。
fileとformatは、この-driveオプションの引数になります。
-drive file=boot.img,format=raw
-driveオプションに必須の引数は[file=file]のみですが、今回はformat=rawの指定も入れています。
format=rawの指定がなくとも、CUIでQemuを起動することはできますが、次のような警告が出力されます。
WARNING:
Image format was not specified for '/haribote/boot.img' and probing guessed raw.
Automatically detecting the format is dangerous for raw images, write operations on block 0 will be .
Specify the 'raw' format explicitly to remove the restrictions.
次に、-nographicオプションですが、これがCUIでQemuを起動するためのオプションです。
ヘルプに記載のとおり、シリアルI/O(デバイス間で通信されるデータ)をコンソールにリダイレクトしてくれます。
これを実行すると、画像のように、コンソール上でboot.imgが起動します。

QemuのCUI停止する
QemuのCUIが起動できたら、元のコンソールに戻ります。
コンソールに戻るには、次のコマンドを「連続して」入力します。
Ctrl + A
X
「Ctrl + A」を押したら、キーを離して「X」を入力してください。
これでQemuが停止します。
まとめ
CUIで起動テストできると、作業がちょっとスムーズになった気がします。
WSL上のDockerでそのまま動作確認ができるのがうれしい。
ちなみに上記の動作確認は以下のDockerイメージ上で行いました。
参考までに。
FROM python:3.8 ENV PYTHONUNBUFFERED 1 ENV TZ=Asia/Tokyo RUN mkdir -p /haribote ENV HOME=/haribote WORKDIR $HOME RUN useradd ubuntu RUN dpkg --add-architecture i386 RUN apt update && apt upgrade -y # デバッグ、開発用のツール RUN apt install vim unzip zip gdb ltrace strace -y # コンパイル用のツール RUN apt install mtools nasm build-essential g++ make -y # Qemu RUN apt install qemu qemu-system-x86 qemu-utils qemu-system-arm -y