qemuでLinaroのaarch64のルートファイルシステムを動かす

LinaroのダウンロードサイトからOpenEmbeddedベースのaarch64用のルートファイルシステムを入手できます。これをqemuユーザーモードエミュレーションを使って動かしてみます。

$ wget http://releases.linaro.org/14.04/openembedded/aarch64/linaro-image-minimal-genericarmv8-20140417-667.rootfs.tar.gz
$ mkdir armv8root
$ sudo tar xf linaro-image-minimal-genericarmv8-20140417-667.rootfs.tar.gz -C armv8root/

この中に/bin/bashがあることを確認します。

$ file armv8root/bin/bash
armv8root/bin/bash: ELF 64-bit LSB  executable, ARM aarch64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.7.0, BuildID[sha1]=945059cdfc55e01fc629fb888551e5efcf61a5d5, stripped

確かにこのbashはaarch64の実行ファイルです。
次に、スタティックリンクされたユーザーモードqemuchrootの中の/usr/binにコピーします。

$ sudo cp /usr/bin/qemu-aarch64-static armv8root/usr/bin/

これで準備完了。chrootしてこのbashを起動してみましょう。

$ uname -m
x86_64
$ sudo chroot armv8root /bin/bash
# uname -m
aarch64
# ls
bin    boot   dev    etc    home   lib    media  mnt    proc   run    sbin   sys    tmp    usr    var
# 

あっさり動きました。uname -mの結果がx86_64からaarch64に変わりました。

環境改善

psコマンドなどを使えるようにするために以下のようにmountします。

# mount -t proc proc /proc
# mount -t sysfs sysfs /sys
# mount -t devtmpfs udev /dev
# mount -t devpts devpts /dev/pts

ネットワークの名前の解決ができるように/etc/resolv.confを以下のように編集します。

# cat /etc/resolv.conf 
nameserver 8.8.8.8

これで、擬似的にaarch64のマシンの中にログインしているような雰囲気になります。

セルフビルド環境

linaro-image-minimal-genericarmv8-20140417-667.rootfs.tar.gzの代わりにlinaro-image-leg-java-genericarmv8-20140417-667.rootfs.tar.gz を使うとその中にgccなどの開発ツールも入っています。
そこでruby-2.1.1のソースアーカイブを持ってきて、configureしてmakeしたら、かなり時間はかかりましたが、aarch64のrubyができました。その程度にはaarch64のqemuは安定して動いています。
ただし、昨日の記事のようにreadline.cを一カ所修正する必要がありました。(実はこれをやっていてビルドの問題に気がついたのです。)