Ubuntu で Raspbian システムを起動(QEMU、qemu-rpi-kernel を使用)

【概要】Ubuntu 環境で QEMU エミュレータを使用し、ARM プロセッサ向けの Raspbian システムを起動する手順を解説する。QEMU のインストール、カーネルイメージのダウンロード、Raspbian イメージの準備、システム起動、SSH によるリモート接続までの一連の作業を説明する。

【目次】

  1. Ubuntu で QEMU のインストール
  2. qemu-rpi-kernel(カーネルとデバイスツリー)のダウンロード
  3. Raspbian イメージのダウンロード
  4. Raspbian システムの起動
  5. Ubuntu から Raspbian システムへの SSH 接続

この手順を行う目的

Raspberry Pi の実機を用意せずに、Ubuntu マシン上で Raspbian 環境を構築できる。これにより、Raspbian 向けアプリケーションの開発やテスト、ARM 環境での動作確認が可能となる。

Raspbian は、Debian をベースとした Linux ディストリビューションであり、ARM プロセッサ上で動作する(2020 年以降、公式の後継 OS は Raspberry Pi OS と呼ばれるが、本手順で使う buster 系列のイメージは引き続き Raspbian の名称で配布されている)。

一般的な Ubuntu マシンには x86_64 アーキテクチャのプロセッサが搭載されているため、ARM 向けの Raspbian を動作させるには QEMU によるプロセッサのエミュレーション(ある CPU 上で別の種類の CPU の命令を模擬実行すること)が必要となる。

注意事項

謝辞:本手順は以下のプロジェクトを利用している。

Ubuntu で QEMU のインストール

  1. パッケージの一覧を更新し、インストール済みパッケージを更新する。
    sudo apt update
    sudo apt -yV upgrade
    
  2. ARM システムのエミュレーションに必要な QEMU をインストールする。
    sudo apt update
    sudo apt -y install qemu-system-arm
    
    QEMU インストール時の端末画面

    「続行しますか? [Y/n]」と表示された場合は、y キーを押してから Enter キーを押す。

qemu-rpi-kernel(カーネルとデバイスツリー)のダウンロード

QEMU で Raspbian を起動するには、QEMU 用にビルドされたカーネルイメージと、ハードウェア構成を記述したデバイスツリーファイル(.dtb。エミュレートするボードの構成を OS に伝えるためのファイル)が必要である。これらを GitHub からダウンロードする。

  1. GitHub の qemu-rpi-kernel リポジトリを開く。

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

  2. buster 系列のカーネルファイル(kernel-qemu-x.x.xx-buster)を選択する。
    buster 系列カーネルの選択画面
  3. ページが変わったら、Download をクリックする。
    カーネルファイルのダウンロードボタン
  4. ダウンロードしたファイルは、作業用ディレクトリに保存する。
    カーネルファイルのダウンロード完了画面
  5. 続いて、buster 用のデバイスツリーファイル versatile-pb-buster.dtb をダウンロードする。リポジトリのトップページに戻り、versatile-pb-buster.dtb を選択する(buster のイメージには buster 用の .dtb を使う。versatile-pb.dtb は stretch 用なので使わない)。
    versatile-pb-buster.dtb ファイルの選択画面
  6. ページが変わったら、Download をクリックする。
    dtb ファイルのダウンロードボタン
  7. ダウンロードしたファイルは、カーネルファイルと同じディレクトリに保存する
    dtb ファイルのダウンロード完了画面

Raspbian イメージのダウンロード

本手順では buster 用のカーネルとデバイスツリーを使うため、buster の Raspbian イメージをダウンロードする。

  1. Raspbian イメージの配布サイトを開く。ここでは国内ミラーサイトを使用する。

    http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images

  2. buster のディレクトリを開き、.zip ファイルをダウンロードする。
    Raspbian イメージファイルの選択画面
  3. ダウンロードが完了するまで待機する。
    Raspbian イメージのダウンロード進行画面
  4. ダウンロードした .zip ファイルを展開する。展開すると .img ファイルが生成される。
    unzip 2019-09-26-raspbian-buster.zip
    
    zip ファイル展開後の端末画面
  5. .img ファイルを、カーネルファイルおよび versatile-pb-buster.dtb と同じディレクトリに配置する
    必要なファイルを配置したディレクトリの内容

Raspbian システムの起動

  1. 端末を開き、ファイルを配置したディレクトリに移動する。
  2. ls コマンドで、必要なファイル(カーネル、versatile-pb-buster.dtb、.img)が存在することを確認する。
    ls コマンドでファイル一覧を表示した端末画面
  3. 端末で以下のコマンドを実行し、QEMU を起動する。
    qemu-system-arm -M versatilepb \
    -cpu arm1176 \
    -m 256 \
    -hda 2019-09-26-raspbian-buster.img \
    -net user,hostfwd=tcp::5022-:22 \
    -dtb versatile-pb-buster.dtb \
    -kernel kernel-qemu-4.19.50-buster \
    -append "root=/dev/sda2 panic=1" \
    -no-reboot
    
    QEMU 起動コマンド実行後の画面

    コマンドオプションの説明

    -M versatilepbエミュレートするマシンタイプ(ARM Versatile/PB ボード)
    -cpu arm1176エミュレートする CPU(Raspberry Pi 1 と同等)
    -m 256メモリサイズ(MB)。versatilepb ボードの上限は 256MB
    -hdaディスクイメージファイル(.img)の指定
    -net user,hostfwd=...ネットワーク設定。ホストのポート 5022 をゲストのポート 22 に転送
    -dtbデバイスツリーファイルの指定
    -kernelカーネルイメージの指定
    -appendカーネル起動パラメータ。root=/dev/sda2 はルートファイルシステムの位置を示す
    -no-rebootゲストが再起動を要求した場合に QEMU を終了
  4. Raspbian システムの終了は、画面左上のメニューから shutdown を選択する。

参考:Raspbian で利用可能な開発環境

Ubuntu から Raspbian システムへの SSH 接続

本セクションでは、Raspbian システム上で SSH サーバを起動し、Ubuntu から SSH 接続を行う手順を説明する。SSH 接続により、Ubuntu の端末から Raspbian をコマンドラインで操作できる。

  1. Raspbian システムのメニューで Terminal を選択し、端末を開く。
  2. 端末で以下のコマンドを実行し、SSH サーバを起動する。
    sudo service ssh start
    
  3. Ubuntu の端末から、以下のコマンドで Raspbian システムに SSH 接続する。
    ssh -X -p 5022 pi@localhost
    

    オプションの説明

    -XX11 転送を有効化(GUI アプリケーションを Ubuntu 側で表示可能)
    -p 5022接続先ポート番号(QEMU 起動時に設定したポート)

    デフォルトのユーザ名は pi、パスワードは raspberry である。

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

    初回接続時に確認メッセージが表示された場合は「yes」と入力する。

  4. 接続を終了するには、exit コマンドを実行する。

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

デフォルトのパスワード「raspberry」は広く知られている。外部ネットワークに接続する環境で使用する場合は、passwd コマンドでパスワードを変更すること。