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 プロセッサ上で動作する。

一般的な Ubuntu マシンには x86_64 アーキテクチャのプロセッサが搭載されているため、ARM 向けの Raspbian を動作させるには QEMU(プロセッサエミュレータ)によるプロセッサのエミュレーションが必要となる。

注意事項

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

Ubuntu で QEMU のインストール

  1. パッケージの更新
    sudo apt update
    sudo apt -yV upgrade
    
  2. QEMU のインストール
    sudo apt update
    sudo apt -y install qemu qemu-kvm qemu-system-arm
    
    QEMU インストール時の端末画面

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

qemu-rpi-kernel のダウンロード

QEMU で Raspbian を起動するには、QEMU 用にビルドされたカーネルイメージと、ハードウェア構成を記述したデバイスツリーファイル(.dtb)が必要である。これらを 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. 続いて、デバイスツリーファイル versatile-pb.dtb をダウンロードする。リポジトリのトップページに戻り、versatile-pb.dtb を選択する。
    versatile-pb.dtb ファイルの選択画面
  6. ページが変わったら、Download をクリックする。
    dtb ファイルのダウンロードボタン
  7. ダウンロードしたファイルは、カーネルファイルと同じディレクトリに保存する
    dtb ファイルのダウンロード完了画面

Raspbian のダウンロード

qemu-rpi-kernel は特定バージョンの Raspbian に対応している。リポジトリの README に記載された対応バージョンを確認し、該当するイメージをダウンロードする。

  1. qemu-rpi-kernel のリポジトリ(https://github.com/dhruvvyas90/qemu-rpi-kernel)で、対応する Raspbian のバージョンを確認する。
  2. Raspbian イメージの配布サイトを開く。ここでは国内ミラーサイトを使用する。

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

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

Raspbian システムの起動

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

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

    -M versatilepbエミュレートするマシンタイプ(ARM Versatile/PB ボード)
    -cpu arm1176エミュレートする CPU(Raspberry Pi 1 と同等)
    -m 256メモリサイズ(MB)。versatile ボードの上限は 256MB
    -hdaディスクイメージファイルの指定
    -net nic -net user,hostfwd=...ネットワーク設定。ホストのポート 5022 をゲストのポート 22 に転送
    -dtbデバイスツリーファイルの指定
    -kernelカーネルイメージの指定
    -appendカーネル起動パラメータ
    -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 コマンドでパスワードを変更すること。