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の実行ファイルです。
次に、スタティックリンクされたユーザーモードqemuをchrootの中の/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を一カ所修正する必要がありました。(実はこれをやっていてビルドの問題に気がついたのです。)
リンク
以前armでやったのと同じことを今回はaarch64でやっただけです。
KMC Staff Blog:QEMUのもうひとつの使い方: ユーザーモードエミュレーションとbinfmtとchrootの組み合わせ
KMC Staff Blog:CELFテクニカルジャンボリーでQEMUの話をしました
ユーザーモードqemu+chrootの環境改善 - 組み込みの人。