WindowsでQEMUとqemu-rpi-kernelを使いRaspberry Pi OSを実行する方法

【目次】

  1. この資料の対象とエミュレーション方式の前提
  2. QEMU Binaries for Windowsのインストール
  3. QEMU用エミュレーションカーネルとデバイスツリーの入手
  4. Raspberry Pi OSイメージのダウンロード
  5. Raspberry Pi OSの起動
  6. WindowsからのSSHリモートアクセス
  7. トラブルシューティング
  8. セキュリティに関する注意事項
  9. 応用的な使用方法

この資料の対象とエミュレーション方式の前提

本ガイドは、Windowsパソコン上でQEMU(Quick Emulator、異なるCPUアーキテクチャをソフトウェアで再現するオープンソースのエミュレータ)を使い、Raspberry Pi OS(旧称Raspbian、Debianベースのlinuxシステム)を動かす手順を解説する。Raspberry Pi実機を用意せずに、ARM向けアプリケーションの開発・テストやlinuxの学習に活用できる。

Raspberry Pi OSはARM(Advanced RISC Machine)プロセッサ上で動作する。一般的なWindowsパソコンのx86/x64系プロセッサとは命令セットが異なるため、QEMUでプロセッサのエミュレーションを行う。

本ガイドが採用するのは、versatilepb方式(QEMU向けに調整されたカーネルとデバイスツリーを使い、QEMUの「versatilepb」マシンとしてRaspberry Pi OSを起動する方式)である。この方式には次の制約がある。CPUはarm1176(Raspberry Pi 1相当)に固定され、割り当てメモリは256MBが上限となる。そのため標準のデスクトップ版ではなく、コマンドライン操作中心のLite版イメージを用いる(デスクトップ版はこの構成では実用的に動作しないため)。

前提条件:Windowsパソコンが使用可能であり、インターネット接続が確保されていること。

QEMU Binaries for Windowsのインストール

  1. QEMU Binaries for Windowsの公式ページにアクセスする。

    https://qemu.weilnetz.de/w64/

  2. 最新版のインストーラー(qemu-w64-setup-<バージョン>.exe)をダウンロードする。
    QEMUダウンロードページ
  3. ダウンロードしたインストーラーを実行する。
  4. インストールウィザードが起動したら「Next」をクリックして進める。
    インストールウィザード開始画面
  5. ライセンス条項を確認し、同意する場合は次へ進む。
    ライセンス条項画面
  6. コンポーネントの選択画面では、既定のまま「Next」をクリックする。
    コンポーネント選択画面
  7. インストール先フォルダも既定のまま「Install」をクリックする。
    インストール先選択画面
  8. インストールが進行する。
    インストール進行画面
  9. インストール完了を確認する。既定のインストール先はC:\Program Files\qemuである。
    インストール完了画面

QEMU用エミュレーションカーネルとデバイスツリーの入手

QEMUのversatilepb方式でRaspberry Pi OSを動かすには、QEMU向けに調整されたカーネルファイルと、デバイスツリーブロブ(.dtb、ハードウェア構成情報をカーネルに伝えるファイル)が必要である。標準のRaspberry Pi OSカーネルはこの方式では起動しない。

  1. GitHubのdhruvvyas90/qemu-rpi-kernelリポジトリにアクセスする。

    https://github.com/dhruvvyas90/qemu-rpi-kernel

  2. このリポジトリでは、Buster/Stretch対応のkernel-qemu-5.4.51-buster(またはkernel-qemu-4.19.50-buster)が最も新しいカーネルである。本ガイドではこのBuster対応カーネルを使う。最初にカーネルファイルをダウンロードする。
    カーネルファイル一覧
  3. ファイルページで「Download」をクリックしてダウンロードを開始する。
    カーネルファイルダウンロード画面
  4. ダウンロードしたファイルは、作業用ディレクトリに保存する。以降の手順でも同じディレクトリを使用する。
    ファイル保存先の選択
  5. リポジトリのトップページに戻る。
  6. 次に、デバイスツリーブロブをダウンロードする。Buster対応カーネルにはversatile-pb-buster.dtbを使う(5.4.51カーネルを使う場合はリポジトリの指示に従い対応する.dtbを選ぶ)。
    versatile-pb-buster.dtbファイル
  7. 同様に「Download」をクリックしてダウンロードする。
    dtbダウンロード画面
  8. このファイルは、先ほどのカーネルファイルと同じディレクトリに保存する。
    ファイル保存完了

Raspberry Pi OSイメージのダウンロード

  1. versatilepb方式は省メモリのため、デスクトップ版ではなくLite版(コマンドライン中心)のイメージを使う。Buster世代のRaspberry Pi OS Lite(armhf)を入手する。
  2. イメージの.zipファイルを選択する。
    イメージ一覧
  3. ダウンロードが完了するまで待機する。
    ダウンロード中の画面
  4. ダウンロードした.zipファイルを展開し、.imgファイルを取り出す。

    Windowsでの圧縮ファイル展開には7-Zipが便利である。インストール手順 »

    zipファイル展開画面
  5. 展開した.imgファイルは、先ほどのカーネルファイルと同じディレクトリに配置する。
    ファイル配置完了

Raspberry Pi OSの起動

  1. Windowsコマンドプロンプトを起動し、準備したファイルのディレクトリに移動する。dirコマンドで必要なファイル(カーネル、.dtb、.img)が揃っていることを確認する。ファイル名は実際にダウンロードしたものに合わせる。
    dirコマンド実行結果
  2. 以下のQEMU起動コマンドを実行する。CPUをソフトウェアでエミュレートするため、動作は実機より遅い。
    "C:\Program Files\qemu\qemu-system-arm.exe" -M versatilepb -cpu arm1176 -m 256 -kernel kernel-qemu-5.4.51-buster -dtb versatile-pb-buster.dtb -drive "file=raspios-buster-lite.img,if=none,index=0,media=disk,format=raw,id=disk0" -device "virtio-blk-pci,drive=disk0,disable-modern=on,disable-legacy=off" -net "user,hostfwd=tcp::10022-:22" -append "root=/dev/vda2 panic=1 rw" -no-reboot
    

    主要なパラメータの説明:

    • -M versatilepb:エミュレートするマシンタイプ
    • -cpu arm1176:エミュレートするCPUタイプ
    • -m 256:割り当てメモリ容量(MB、この方式では上限)
    • -kernel:使用するカーネルファイルの指定
    • -dtb:デバイスツリーブロブの指定
    • -drive / -device:イメージをvirtioディスク(/dev/vda)として接続する指定
    • -net "user,hostfwd=tcp::10022-:22":ホストのポート10022をゲストのポート22に転送(SSH接続用)
    QEMU起動コマンド実行
  3. セキュリティ警告が表示された場合は、「アクセスを許可する」を選択する。
    セキュリティ警告画面
  4. 起動が完了すると、コンソールにログインプロンプトが表示される。既定のユーザー名はpi、パスワードはraspberryである(Buster世代の既定値)。
  5. システムを終了するときは、ログイン後にsudo shutdown -h nowを実行する。

WindowsからのSSHリモートアクセス

この節では、Raspberry Pi OS側でSSHサーバーを有効化し、Windows側からSSH接続する。SSHを使うと、Windowsの端末から直接Raspberry Pi OSを操作でき、コマンドの貼り付けやファイル転送が容易になる。

  1. QEMUのコンソールでpiユーザーとしてログインする。
  2. 以下のコマンドを実行し、SSHサーバーを起動してIPアドレスを確認する。
    • sudo service ssh start:SSHサーバーの起動
    • ip addr:ネットワーク設定の確認
    sudo service ssh start
    ip addr
    
    SSHサーバー起動とネットワーク確認
  3. Windowsのコマンドプロンプトで「netstat -an」を実行し、ポート10022がLISTEN状態であることを確認する。見つからない場合は、システムの起動またはSSHサーバーの起動に問題がある。
    netstat -an
    
    netstat実行結果
  4. コマンドプロンプトを管理者権限で起動し、以下のコマンドでファイアウォールを設定する。ポート10022/TCPの通信を許可する。
    netsh advfirewall firewall add rule name="raspbian" dir=in protocol=tcp localport=10022 action=allow
    
    ファイアウォール設定コマンド
  5. Windows用SSHクライアントであるMobaXTermを起動する。
    MobaXTerm起動画面

    MobaXTermが未インストールの場合は、公式サイトからMobaXTerm Home Edition(インストーラー版)をダウンロードする。

    https://mobaxterm.mobatek.net/

    MobaXTermダウンロードページ

    インストール手順はこちらのガイドを参照すること。

  6. MobaXTermで「Start local terminal」を選択する。
    Start local terminal選択
  7. 以下のSSH接続コマンドを実行する。
    ssh -X -p 10022 pi@localhost
    

    -XオプションはX11フォワーディングを有効にする(リモート側で実行したGUIアプリケーションの画面を、ローカルのWindowsに転送して表示する機能)。

    パスワードはraspberryである。入力時に画面へ文字が表示されないのは正常な動作である。

    SSH接続コマンド実行

    接続確認のメッセージが表示されたら「Yes」を選択する。

    SSH接続確認メッセージ

    MobaXTermのGUIからも接続が可能である。

    MobaXTerm GUI接続画面
  8. 接続を終了するときは「exit」を実行する。正常に終了すると、MobaXTermのローカル端末に戻る。これでWindowsからのリモートアクセス環境の構築は完了である。

トラブルシューティング

よくある問題と対処:

セキュリティに関する注意事項

開発環境として使う際の推奨事項:

応用的な使用方法

本環境の活用例:

注意:本ガイドは基本的な環境構築手順を示したものである。実運用にあたっては、セキュリティとパフォーマンスを十分に検討すること。

謝辞:本ガイド作成にあたり、以下の情報源を参考にした。