QEMUで雑に作るArch Linux ARMビルド環境

QEMU で起動するのが楽な Alpine Linux で aarch64 な Linux 環境を作り、 その中でブートストラップした Arch Linux ARM に chroot して使ってやろうというもの。

Alpine も Arhc も小さいのでビルドしようとするものによるが、tmpfs だけで戦える可能性が十分ある。 bazel と mozc のビルドをやったが、16 GB メモリのマシンで tmpfs しか使わずに作業が終わった (ビルド後にいらなくなった一時ファイルを消したりはしたが)。

準備

  • aarch64 の仮想マシンの実行には qemu-arch-extra が必要なので事前に入れておく。
  • Alpine のイメージを公式サイトから落としておく。 多分どれでもいいが、今回は standard を使った。
  • UEFI を使うため、edk2-armvirt を入れる。

QEMU のイメージの準備

サイズとかは適当に。後で拡張したりできるので大袈裟に気にすることはない (ちょっとめんどくさいが)。

$ qemu-img create -f qcow2 alpine.qcow2 8G

インストール

ダウンロードした Alpine のイメージを CD-ROM として使って QEMU を起動する。

$ qemu-system-aarch64 \
      -m 1G -nic user -M virt -cpu cortex-a57 -smp $(nproc) \
      -bios /usr/share/edk2-armvirt/aarch64/QEMU_EFI.fd \
      -nographic \
      -cdrom alpine-standard-3.15.3-aarch64.iso \
      -hda alpine.qcow2

-smp でコア数を指定しないと、遅いエミュレーションで 1 コアで頑張るみたいなことになってしまうので注意が必要。

エミュレートする CPU は、今回は適当に Cortex-A57 にしたが、ちゃんと調べて 実際に使うマシンに載っているものと近いものを選んだ方が良いとは思う。

起動したら setup-alpine コマンドでインストールしていく。 終わったら poweroff

2 回目の起動

CD-ROM のオプションなしで立ち上げる。インストールしたイメージが使われていればとりあえず成功。

$ qemu-system-aarch64 \
      -m 1G -nic user -M virt -cpu cortex-a57 -smp $(nproc) \
      -bios /usr/share/edk2-armvirt/aarch64/QEMU_EFI.fd \
      -nographic \
      -hda alpine.qcow2

使いたいパッケージがあればここで apk で入れてもいい。

Arch Linux 環境の構築

Arch Linux ARM の rootfs の tarball を落としてくる。 AArch64 Multi-platform のものにしておけば無難だと思う。

chroot 用のディレクトリを作る。ここでは chroot という微妙な名前のものにした。

$ mkdir chroot

chroot 用のディレクトリの中に必要なディレクトリをマウントしていく。

$ mount -t proc proc ./chroot/proc
$ mount -t sysfs sys ./chroot/sys
$ mount -o bind /dev ./chroot/dev
$ mount -o bind /dev/pts ./chroot/dev/pts

なんでも /dev/pts をバインドマウントしておかないと pacman が動かないんだとか。試してないけど。

で、いざ chroot。

$ chroot ./chroot bash

そのまま pacman -Syu しようとしたらデバイスの空き容量のチェックに失敗してこけてしまったので、 現場猫案件だがチェックを無効化してなんとかする。

$ sed -i 's/^CheckSpace$/#CheckSpace/' /etc/pacman.conf

いろいろ設定

$ pacman-key --init
$ pacman-key --populate archlinuxarm
$ pacman -Syu

root で作業するといろいろアレになりがちなので適当なユーザで作業できるようにしていく。 デフォルトで alarm というユーザがいるのでこいつをいい感じにする。 作業用のユーザが root になれるように sudo を入れる。

$ pacman -S sudo
$ usermod -aG wheel alarm
$ passwd alarm

alarm ユーザに切り替える。

$ su - alarm

おしまい。

base-devel すら入っていないのでここからいろいろ入れていく必要あり。

参考にしたサイト