Raspberry Pi用バイナリをQEMUエミュレータで動かす方法(ユーザーモードエミュレーション)


Mathematicaが無料になって以来、Raspberry Piを触る機会が増えました。Raspberry Piの良さは、各種センサーを比較的容易に使えることにあり、そういうことをしないなら、Raspberry Piはあまりいいハードウェアではありません。メモリはたった512MBしかなく、CPUは32ビットのARM、そのクロックは700MHzと低速です。

実験のために、Raspberry Pi用のバイナリを動かしたいことがあるのですが、この性能の低さに憂鬱になります。インテル入ってるのPCは、Raspberry Piよりはるかに高性能なので、Raspberry Pi用のバイナリをRaspberry Pi上ではなくPC上で動かせればいいのですが、CPUが違うので、Raspberry Pi、つまりARM用のバイナリを、インテルのCPUでそのまま動かすことはできません。

そこで、QEMUでエミュレートすることを考えます。QEMUのエミュレーションには、システム全体をエミュレートする方法と、ユーザーモードだけをエミュレートする方法があります。

以前紹介した方法(Windowsの場合Ubuntuの場合)は、システム全体をエミュレートする方法です。比較的高性能なPCなら、システム全体をエミュレートしても、実機と同程度の性能を発揮できます(メモリが256MBという問題がありましたが)。

ここではユーザーモードをエミュレートする方法を紹介します。この方法には、システム全体をエミュレートするよりも軽く、使えるメモリも多い(ホストに十分なメモリがあれば)というメリットがあります。

Ubuntuで試します。

まず、Raspbianのイメージをダウンロードします。2013-12-24以降がいいでしょう。

wget http://downloads.raspberrypi.org/raspbian/images/raspbian-2014-01-09/2014-01-07-wheezy-raspbian.zip

fdisk -l 2014-01-07-wheezy-raspbian.img」などとして、2番目のパーティションの始点を調べます(2014-01-07-wheezy-raspbian.imgの場合は122880です)。これに512をかけた結果(62914560)を後で使います。

qemu-user-staticをインストールし、作業用ディレクトリを作ります(この作業は1回だけやればいいです)。

sudo apt-get install qemu-user-static
mkdir rootfs

イメージをマウントします。

sudo mount -o offset=62914560 2014-01-07-wheezy-raspbian.img rootfs

エミュレーション環境を整えます(この作業は1回だけやればいいです)。

sudo cp /usr/bin/qemu-arm-static rootfs/usr/bin/
sudo sed -i 's/^/#/' rootfs/etc/ld.so.preload

エミュレーションを開始します。

sudo QEMU_CPU=arm1176 chroot rootfs

qemu-arm-staticがデフォルトでエミュレートするアーキテクチャはARMV7lですが、Raspberry PiはARMV6l(CPUはARM1176)なので、環境変数をそのように設定しています(arm1176の代わりにarm11mpcoreとすればマルチコアになります)。事前に「xhost local:localhost」とすればXの画面も持ってこられます。

後はご自由に。

Mathematica 10への期待(とその後)


昨年ついに無料になったMathematicaですが、思ったほど盛り上がってはいないようです。盛る上がらない原因の一つに、性能の悪さがあるのは間違いないでしょう。特にGUIはかなり重く、Manipulateなどでインタラクティブに遊ぶのは無理です。(無料のMathematicaが動くのは、700MHzのCPU、最大でも512MBしか主記憶のないRaspberry Pi上。)

実際にベンチマークを取ってみると、Windows上のMathematica 9.01(CPUはCore i7 4700MQ、主記憶は16GB)で10秒で終わるMathematicaMark9が、Raspberry Pi上では約3300秒かかりました(800MHzにオーバークロックして約3000秒)。Core i7で動かすエミュレータ上でもおそらく同じ程度でしょう。

しかし不思議なことに、Raspberry Pi上のMathematicaのほうが早く解ける問題があります。

たとえば、A^2 + B^2 == 1かつP^2 + Q^2 == 1という条件で、以下のsの最小値を単純にMinValueで「解析的に」求めようとすると、上述のWindowsマシンではなんと約20000秒かかるのに対して、Raspberry Piでは約2200秒で終わります。追記:Raspberry Pi 2では約800秒です。

s = 1/24 (3 Sqrt[3] Abs[A P] + Sqrt[3] Abs[A P + 2 Sqrt[2] Q] + 
     Abs[Sqrt[3] A P - 3 Sqrt[2] B P - Sqrt[6] Q] + 
     Abs[Sqrt[3] A P + 3 Sqrt[2] B P - Sqrt[6] Q]);

MinValue[{s, And[A^2 + B^2 == 1, P^2 + Q^2 == 1]}, {A, B, P, Q}]

(これは比較のために作った問題ではなく、実際に私が遭遇した問題です。実は、単純にMinValueを使うというのが間違っているのですが、本来Mathematicaはそういうことを気にせず使うソフトウェアのはずです。)

Raspberry Piの方が速い原因は、Windows版Mathematicaのバージョンが9.01なのに対して、Raspberry Pi版Mathematicaのバージョンが10であり、バージョン9.01と10の間で、このあたりのアルゴリズムが改良されたためだと思われます。

非力なRaspberry Piでの話なので、比較的速いCPUがあれば、エミュレートされたRaspberry Piでも同程度の時間でできるでしょうし(Windowsの場合Ubuntuの場合)、ユーザーモードエミュレーションならこの半分くらいの時間でできるでしょう(ライセンス違反なので想像しているだけです)。

というわけで、Windows版Mathematica 10のリリースを待っています。

追記:Windows版Mathematica 10がリリースされたので試したところ54秒でした(CPUはCore i7 4700MQ、主記憶は16GB)。Raspberry Piは約2200秒なので、遅すぎです

Ubuntu上のエミュレータ(QEMU)で動作するRaspbian


システム全体をエミュレートする必要がない場合は、ユーザーモードエミュレーションのほうがいいでしょう。

Raspberry PiのためのディストリビューションであるRaspbianを、Windows上のQEMUで動かす方法を以前紹介しました。

Raspberry PiのためのディストリビューションであるRaspbianを、Ubuntu上のQEMUで動かす方法が、HOWTO: Virtual Raspbian on Qemu in Ubuntu Linux 12.10で紹介されています。

記事では2013-02-09-wheezy-raspbian.imgを使っていますが、2013-09-25-wheezy-raspbian.imgや2014-01-07-wheezy-raspbian.imgでも動作しました(ディスクの拡張のためにWindowsの場合にもやったような面倒な作業も)。「file ~/qemu_vms/2013-02-09-wheezy-raspbian.img」は「file -k ~/qemu_vms/2013-02-09-wheezy-raspbian.img」でしょうか。

起動はこんな感じ。(localhost:10022でSSHに、localhost:15901でVNCに接続できるようにしています。)

qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1" -hda 2013-09-25-wheezy-raspbian.img -redir tcp:10022::22 -redir tcp:15901::5901

GUIはRaspberry Pi側でVNC Serverを起動し、ホスト側で「vncviewer localhost::15901」とすれば(startxよりこっちが好き)。

SSHでのログインは「ssh -p 10022 pi@localhost」で行えます。下の画像のように、Raspbianを起動したシェルでそのままログインできるのですが、SSHを使えるようにしておけば、scpも使えるので便利かもしれません。

4822234800背景の理解などには日経Linux『誰でもできる! Raspberry Piで楽しもう』(日経BP社, 2013)が役立ちました。

ついに無料になったMathematica


追記:デスクトップのすべての機能が使えるわけではありませんが,クラウド版も無料で使えます。https://lab.open.wolframcloud.com/app/新規ノードブック

Raspberry Piという特定のプラットフォーム上でのことですが、ついにMathematicaが無料になりました。

The Wolfram Language and Mathematica on Raspberry Pi, for free

かつてNeXTにバンドルされたこともあったらしいのですが、Mathematicaの価格は、それを無視できるほど高いNeXTの価格に含まれていたと考えるのが妥当で、無料になったのは実質的には初めてです。(Mathematicaについてよく知らない人はWikipediaへ、入門はMathematicaラーニングセンターから)

B00CBWMXVERaspberry Piは、Amazonでも4000円程度で買えますが、今回の発表でその価格が変わったということもありませんから、Mathematicaは無料ということでいいでしょう。ちなみに、x86やx64のWindowsやMac OS、Linux上で動くMathematicaは、通常版が約40万円、アカデミック版が約20万円(プレミアサービスの更新料が約5万円/年)、ホーム版が約5万円、学生版が約2万円です(参考)。

追記:性能が向上したRaspberry Pi 3がお勧めです。

Mathematica(の一部)が無料になるという話を最初に聞いたのは2005年のこと。Mathematicaで何か作っても、その価格のせいで使える人がほとんどいないという空しい状況が改善されると期待したものです(当時のブログ記事)。それから8年、何の音沙汰も無かったので、無料化の話はなかったものとして、Mathematicaが高くて買えない人でもその機能をある程度使えるようにする方法(Universal Mathematica Manipulator)を考えたりしていました。

というわけで、首を長くして待っていました。

インストールはとても簡単です。

sudo apt-get update && sudo apt-get install wolfram-engine

GUIで試すときはEducation→Mathematicaを使います。(下はVNCで接続した様子)

CUIで試すときはコマンドwolframを使います。(下はSSHで接続した様子)

MathematicaのバージョンがPC版の9.0.1から10.0.0に上がっていますが、直っていないバグがあるようですね(NMinimizeAgglomerateFindClustersTable)。

動作がすごく重いのですが、QEMU上のRaspbian(WindowsあるいはUbuntu)やユーザーモードエミュレーション(ホストが速ければ実機より速いと思われる)で動かすのはライセンス違反なんですね。

Windows上のエミュレータ(QEMU)で動作するRaspbian


システム全体をエミュレートする必要がない場合は、ユーザーモードエミュレーションのほうがいいでしょう。

B00CBWMXVERaspberry Piのためのディストリビューション、Raspbianは、QEMU上でも動作します。この記事では、Windows上のQEMU上でRaspbianを動かす方法を紹介します。

いろいろ面倒なので、最終的に動かすのはWindows上のQEMUだとしても、ディスクイメージを作り直す作業(下の手順2)はUbuntuでやったほうがよさそうです。

(1)
Windows上で試すにはちょっと工夫が必要なのですが、Raspberry Pi emulation for Windowsなら、展開してrun.batをダブルクリックするだけで動くようになっているので、今回はこれを使います。(参考:Raspberry Pi:QEmuで仮想環境

(2)
これはとばしてもかまいませんが、その場合は(3)のraspbian.img2012-07-15-wheezy-raspbian.imgのままにしてください。

ディスクイメージ2012-07-15-wheezy-raspbian.imgの空き容量が不十分なので、VirtualBoxで作った4GBの仮想ディスクに、Ubuntuで「sudo dd if=2012-07-15-wheezy-raspbian.img of=/dev/sdb」として書き込み、gpartedでパーティションを拡大、「sudo dd if=/dev/sdb of=raspbian.img」として作り直します(空き領域に新パーティションを作ってそれを削除してから拡張するとうまくいくとか)。もっとよい方法があるのでしょうが、「qemu-img.exe resize 2012-07-15-wheezy-raspbian.img +2G」とraspi-configのexpand=rootfsではうまくいきませんでした。

(3)
qemu/run.batの内容を以下のように修正します。「-m 256」はメモリを256MBにするオプション(これより大きくしても無効)、「-redir tcp:10022::22」と「-redir tcp:15901::5901」はSSHサーバとVNCサーバにアクセスしやすくするためのオプションです(参考:Raspberry Pi:QEMUとの通信)。

qemu-system-arm.exe -M versatilepb -cpu arm1176 -hda raspbian.img -kernel kernel-qemu -m 256 -append "root=/dev/sda2" -redir tcp:10022::22 -redir tcp:15901::5901

(4)
run.batをダブルクリックして、Raspbianを起動させます。Raspbianの設定ツールであるraspi-configが起動するので、「ssh」でSSHサーバを有効にし、「change_pass」でパスワードを簡単なものに変えて、タブ→Finishで終わらせます。(初期設定ではユーザpi、パスワードはraspberry)。

(5)
メモリが少ないのですが(256MB)、増やす方法がわからないので、とりあえず、スワップ領域を512MBに増やします(参考:Raspberry Pi のswap領域変更)。

(6)
パッケージリストを更新し、VNCサーバをインストールします。(startxよりこっちが好きです。)

sudo apt-get update && sudo apt-get install tightvncserver

(7)
vncserver -geometry 1200x800」としてVNCサーバを起動させます(解像度の指定はオプショナルです)。

(8)
WindowsにTightVNC(クライアントのみ)をインストール・起動し、「localhost:15901」にアクセスして、GUIを利用できるようにします。

(9)
GUIがいらないときは、localhost:10022にSSHでログインするといいでしょう。