ARM CPU用Debian QEMUイメージの作成

[最新のARM用Debianインストーラー](https://cdimage.debian.org/cdimage/daily-builds/daily/arch-latest/arm64/iso-cd/) を使ってQEMU用イメージを作成しようとしたら、インストーラーが途中でエラーで止まって続行不可能だった(2020年10月)ので、QEMU用イメージファイルを作成するシェルスクリプトを https://github.com/emojifreak/qemu-arm-image-builder に作りました。使い方を簡単に紹介します。

インテルPC上で作成する場合、Debian標準インストーラーよりも遥かに高速に作成します。その訳は完全なハードウェアエミュレーションではなく `qemu-user-static` によるユーザーモードエミュレーションを用いるからです。ホストOSは Ubuntu や Debian など Debian系Linuxを仮定します。[Devuan](https://www.devuan.org/) をインストールするスクリプトも同じ場所にあります。

# ダウンロードと設定

github にあるシェルスクリプトをウェブブラウザか `git clone https://github.com/emojifreak/qemu-arm-image-builder.git` で保存します。その内の

```shell:build-arm-debian-qemu-image.sh
#!/bin/sh

SUITE=buster # or bullseye sid
ARCH=arm64 # or armhf or armel
IMGFILE=/var/tmp/debian-${SUITE}-${ARCH}.img
LOOPDEV=`losetup -f`
GIGABYTES=10 # total size in GB
SWAPGB=1 # swap size in GB
ROOTFS=btrfs # or ext4
MMVARIANT=apt # or required, important, or standard
NETWORK=systemd-networkd # or ifupdown, network-manager, none
YOURHOSTNAME=arm-guest
KERNEL_CMDLINE='net.ifnames=0 consoleblank=0 rw'
GRUB_TIMEOUT=0
MIRROR=http://deb.debian.org/debian
INITUDEVPKG=systemd-sysv,udev # or sysvinit-core,udev
KEYRINGPKG=debian-archive-keyring

apt-get -q -y --no-install-recommends install binfmt-support qemu-user-static qemu-efi-arm qemu-efi-aarch64 mmdebstrap qemu-system-arm

. ./common-part.sh
```

の中の以下のシェル変数をカスタマイズします。

* `SUITE` はインストールするDebianのリリース名です。`buster` の他に `bullseye`, `sid` が有効です。リリース名が `buster` 以外のときには `python2.7` を削除しようとするのでもし `stretch` 以前の古いリリースをインストールしたい場合は `common-part.sh` 末尾で `python2.7-minimal`を削除している行をコメントアウトして下さい。
* `ARCH` はARM CPUの種類で64bitなら `arm64`、32bitなら`armhf`を選びます。
* `MMVARIANT` はインストールするパッケージの範囲で apt < required < important < standard の順に範囲が広がります。よくわからなければ `standard` を選ぶのが無難です。
* `NETWORK` はネットワーク設定に用いるDebianサービスです。後でデスクトップ環境をインストールするなら `network-manager` が無難でしょう。

`apt-get -q -y --no-install-recommends install binfmt-support qemu-user-static qemu-efi-arm qemu-efi-aarch64 mmdebstrap qemu-system-arm` の行はシェルスクリプトの実行に必要なパッケージをインストールしていますが、一度インストールしたらコメントアウトして問題ありません。

# シェルスクリプトの実行
`sudo sh build-arm-debian-qemu-image.sh` とするとQEMU用イメージファイルの作成が始まりますが、しばらくすると以下のようにロケールやタイムゾーンの設定が質問されます。

## ロケールの設定
以下の画面ではロケールを質問されています。例では `ja_JP.UTF-8` を選んでいます。
![スクリーンショット 2020-11-04 03-32-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259309/a33ff272-37fc-2298-71dd-c2daa18732d1.png)
次ににシステムの標準ロケールに `ja_JP.UTF-8` を選んでいます。
![スクリーンショット 2020-11-04 03-33-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259309/0276995c-7586-c877-064a-dc5a2e99fbe8.png)

## 時間帯の設定
次に時間帯を聞かれるので Asia → Tokyo と選びます。
![スクリーンショット 2020-11-04 03-33-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259309/32a9d5a6-4ed0-821b-9552-8399f0a27bd9.png)

## キーボードの選択
次にキーボード配列の選択を聞かれます。最初の項目はPC-105を選びます。
![スクリーンショット 2020-11-04 03-34-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259309/6109553b-af64-64a2-61de-12e97fee2e44.png)
次に英語ばかりしか選択肢が出ない以下の画面では Other を選びます。
![スクリーンショット 2020-11-04 03-34-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259309/d53b413b-7e1a-bbb8-bebf-70327974a8df.png)
その後は２回続けて Japanese を選びます。
![スクリーンショット 2020-11-04 03-35-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259309/b5fa3c66-de02-4f60-eb1a-ecfa381523d3.png)
![スクリーンショット 2020-11-04 03-35-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259309/10cf2020-224c-8587-0557-70ddecdb9862.png)
その後は好きなように選びます。

## rootパスワードの設定
次に以下の画面でrootパスワードを聞かれるので好きなように設定します。
![スクリーンショット 2020-11-04 03-35-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259309/a491eef9-d0c2-c50d-b857-3a3d9712e63b.png)
一般ユーザーは何も作成されないので、必要ならrootでログインした後に`adduser` などで作成します。

## 起動用コマンドのお知らせ
最後に作成したQEMUイメージを起動するために必要なコマンドの説明が表示されます。下記スクリーンショットのハイライトした部分です。これはホストCPUとゲストCPUの組み合わせで色々変わります。
![スクリーンショット 2020-11-04 03-37-37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259309/ff791c3a-19ea-9c3d-ca68-5c31963f8fc4.png)

## デスクトップ環境のインストール
もしデスクトップ環境が必要なら起動後にrootでログインして `apt-get install tasksel; tasksel` として以下の `tasksel` を起動し、好きなデスクトップ環境を選択します。
![スクリーンショット 2020-11-04 03-45-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259309/e6b2aa2d-ea2d-081c-3b3e-aaa70326eed0.png)


# `virt-manager` を用いた起動
スクリプト最後に通知されるコマンドで起動しても構いませんが、よりユーザーフレンドリーな `virt-manager` を用いる手順を紹介します。

## `virt-manager` のインストール
`apt-get --install-recommends install virt-manager` でインストールします。

## 対象ARM CPUの選択
作成したイメージファイルを `/var/lib/libvirt/images` に移動したあとに`virt-manager` を起動するとエミュレーションするCPUの選択画面になります。64bit ARMなら`aarch64`、32bit ARMなら `armv7l` を選択します。`armv7l`を選ぶ場合 https://github.com/virt-manager/virt-manager/issues/174 にあるパッチを手動であてる必要があるかも知れません。また「既存のディスクイメージをインポート」を選択します。

![スクリーンショット 2020-11-04 03-40-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259309/8fd70248-5835-af11-263c-4e604c19b7f9.png)

## イメージファイルの選択
次の画面では作成したイメージファイルを選択します。またOSを適切に選択します。そのあとはデフォルト選択肢を選べば普通に起動できます。

![スクリーンショット 2020-11-04 03-41-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259309/268c615e-cbf3-0271-2332-6820dd93a81a.png)