【ゼロからのOS自作入門】WSL2でQEMUが起動しなかった時の解決法


注意

本記事は自作OS書籍であるゼロからのOS自作入門をやるにあたって「おま環」を解決する為の内容です。

その為、記事の内容的には自己責任の領域になっています。

基本的に書籍内容に関してはサポートページを参照した方がいいです。

環境

私の環境は以下になります。

  • Surface pro 7
  • windows10 home
  • WSL2
  • Ubuntu 20.04 LTS

本題

WSL2でQEMUが起動してくれませんでした。

具体的にはハローワールドのサンプルコードを書籍の通り実行しようとすると以下を含む数行のエラーが出てきました。

(qemu) gtk initialization failed

原因&解決方法

WSL2でのGUI設定、つまりWSL2とVcXsrvの設定がそもそも出来ておらずQEMUも起動しないという流れでした。

解決方法としては、WSL2とVcXsrvの設定をやり直します。

具体的にはVcXsrv設定の確認として使われるXeyesが起動して目が表示される。この状態を目指します。

下準備

VcXsrvのアンインストール&再インストール

出来る限り初期状態からセットアップをした方が成功しやすいので、まずVcXsrvをアンスト&再インストールします。

もし、後述するスタートアップにconfig.xlanuchを置いている方はそれも削除しといてください。

私は更にUbuntuも初期状態に近かったので再インストールしました。ただ人によっては既に開発環境を整えているという方もいると思います。Ubuntuは個々人の責任でやるのか判断してください。

セットアップ手順

基本的には、既存のWSLでVcXsrvのセットアップ記事と変わらない内容になります。

書籍の読者の方は、付録のページの内容に以下の内容が更に加わるという感じで見ていってください。

VcXsrvの設定

  1. Extra settingsの一番下にあるAdditional parameters for VcXsrvに以下を入力してください
-ac

2.Finish configurationSave configurationを押してファイルを生成。生成されたファイルをエクスプローラーのアドレスバーまたはWindowsキー + Rキーを押して表示される画面にshell:startupと入力して表示されたスタートアップフォルダに移して保存してください。
この設定をしておくと、パソコン起動時にVcXsrvが自動で起動してくれるので楽です。

3.ファイヤーウォールの設定が表示されなかった場合は、コントロールパネルシステムとセキュリティWindowsファイヤーウォールによるアプリケーションの許可からVcXsrv windows xserverのプライベートとパブリック両方にチェックが入っているか確認してください。

WSLの設定

ここからは書籍には記載されていない内容です。上記設定のみでは自分の場合は起動できなかったのでここがメインです。

  1. 以下の内容を~/.bashrcの最後に加えてます。
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0.0

これでWSLとlocalhostの接続ができるようになります。この設定の詳細は詳しくはこちらを見てください。

2.設定を反映させます。

source ~/.bashrc

設定としてはこれで終わりです。後はXeyesをインストールして実行します。

xeyes

これで目が表示された場合はVcXsrvの設定は成功しました。

この状態で、書籍にもあるハローワールドをQEMUで実行するコマンドを叩いてください。少し待つと起動が成功します。

再ログイン時に設定が反映されない

Ubuntuに再ログインした時に、何故か.bashrcの内容が反映されない。source ~/.bashrcを入力すれば治るが面倒くさいという方がいるかもしれません。
この症状の方は、ターミナル上のシェルが真っ白になっているという症状も起きているかもしれません。
原因としては.bash_profileがあることで.bashrcが読み込まれなくなっているようです。

対策としてはこちらの記事にある通り、中身を映してから.bash_profileの削除を行ってください。

参考文献

WSL2におけるVcXsrvの設定
WSL上にXサーバをインストールしてGUIを実現する(VcXsrv編)
VcXsrv(Xサーバー)をWindowsにインストールしLinuxのGUIをリモート操作する設定方法
WSLのデフォルトシェルが真っ白になった話(.bashrcと.bash_profile)