Raspberry pi 4とArchlinux 64bitとKVMとqemuでWindows10 WOAを動かす

#初めに

Ubuntu, Raspberry pi OSに続いて、ArchlinuxもRaspberry pi4の64bit対応版が正式リリースされました。ArchlinuxはDIY OSであり、軽量にすることができ、また64bit版はKVMに標準対応しているため、ホストOSとして使ってみるのも良いと思います。今回は、ArchlinxをホストOSとして、ゲストOSにWindows10 WOAを動かしてみました。Raspberry pi 4も8GB RAM版が出るようになり、仮想環境なども面白いかと思います。

#参考サイト

- [Raspberry Pi 4 でHDDをrootにしてarch Linuxでサーバにしてみる（前編）](https://qiita.com/yoshiki9636/items/18be2fbec96e213ab0f6)
- [Pinebookpro virtualization](https://astr0baby.wordpress.com/2020/01/12/pinebookpro-virtualization/)

#必要なもの

- Raspberry Pi 4  4GB以上
- 32GB SDカード
- Linux PC  SDカードが書き込めるもの　raspberry pi + SDカードリーダでも可
- Windows PC ( windowsインストールISOファイル作成に使用）
- VNC viewer 上記windows PCにインストールが便利

#インストラクション
今回は、32GBのSDカードにArchlinuxをインストールし、そのうえでKVMサポートのqemuを動かし、ゲストOSのubuntuをインストーラからインストールいたします。

※2020/9/5追記
ArchlinuxをSSD/HDDでUSB bootしたい場合は、以下を参考にしてください。
[Archlinux 64bit Raspberry pi 4でUSB bootするまで(MBRディスクのみ)](https://qiita.com/yoshiki9636/items/f1290930f848b1ab2bb0)

###Arch linuxのインストール
他のRaspberry pi向けディストリビューションと違い、インストーラがありません。OSイメージのtarballを展開してインストールし
ます。まずは、SDカードのパーティションを作ります。ここでは、linux PCを使用します。

まずはArchlinux rpi aarch64のtarballを取得します。

```
$ wget http://sg.mirror.archlinuxarm.org/os/ArchLinuxARM-rpi-aarch64-latest.tar.gz
```

linux PCにSDカードを認識させると、デバイスが割り当てられます。ここでは、/dev/sdbに割り当てられたとします。まずは、/dev/sdbに以下のパーティションを作成します。パーティションの作成方法は[こちら](https://qiita.com/yoshiki9636/items/18be2fbec96e213ab0f6)を参考にしてください。ここからはスーパーユーザで実行します。

```
# fdisk /dev/sdb
```

次に作成したパーティションをフォーマットします。

```
# mkfs.vfat /dev/sdb1
# mkfs.ext4 /dev/sdb2
```

/mntにマウントします。

```
# mount /dev/sdb2 /mnt
# cd /mnt
# mkdir boot
# mount /dev/sdb1 boot
```

tarballを/mntに展開します。bsdtarの展開時にpオプションを必ずつけてください。

```
# cd <tarballをダウンロードしたディレクトリ>
# bsdtar xpf ArchLinuxARM-rpi-aarch64-latest.tar.gz -C /mnt
```

展開が終わったら、fstabをいじります。

```
# cd /mnt/etc
# vi fstab
```

```:fstab(before)
# Static information about the filesystems.
# See fstab(5) for details.

# <file system> <dir> <type> <options> <dump> <pass>
/dev/mmcblk0p1  /boot   vfat    defaults        0       0
```

```:fstab(after)
# Static information about the filesystems.
# See fstab(5) for details.

# <file system> <dir> <type> <options> <dump> <pass>
/dev/mmcblk1p1  /boot   vfat    defaults        0       0
/dev/mmcblk1p2  /       ext4    defaults        0       0
```

特に注意すべきは、デバイス名がmmcblk0ではなくmmcblk1に変えることです。
アンマウントします。

```
# cd /
# umount /mnt/boot /mnt
```

これでSDカードの準備ができました。取り出してRaspberry Pi 4にさします。

###Windows10 WOAのインストールISOの取得

一旦Raspberry Pi 4は置いておいて、Windows10 WOAのインストールISOを作成します。
ここからはしばらくWindows PCを使用します。まずWindows PCで以下のページにアクセスします。
[UUP dump](https://uupdump.ml/)

ここは、これまでのwindows10のバージョンの保管庫のようなところです。案内に従って自分の目的に合うバージョンを選択してください。2020/8/24現在でLatest,ARM64,Japaneseを選択して、出てくるDownload methodの選択肢でDownload and convert to ISOを選択してください。zipファイルがダウンロードされるので、空き容量の多い場所に作業フォルダを作成してzipファイルを展開してください。展開した中のuup_download_windows.cmdファイルを実行します。PowerShellを開いて、作業フォルダに移動し、以下のように実行します。

```
> .\uup_download_windows.cmd
```
実行に１時間ほどかかります。終了すると、同じフォルダにISOファイルができています。あとは、あとでRaspberry Pi 4にscpなどで転送すればWindows PCでの作業は終了します。

###Raspberry Pi 4の環境設定
やっとRaspberry Pi 4の設定に入ります。作成したSDカードをRaspberry Pi 4に装着して電源を入れると、Archlinuxが立ち上がり、ログインプロンプトが出ます。
login: alarm
passwd: alarm
でログインしてください。
しばらくはルートの作業になるので、ルートになってください。まだsudoもありません。

```
$ su -
```
ルートのパスワードはrootになっています。
まずはpacmanイネーブルです。

```
# pacman-key --init
# pacman-key --populate archlinuxarm
# pacman-key --refresh-keys
```
最後のコマンドはエラーになる場合もありますが、大丈夫なようです。
システムをアップデートします。

```
# pacman -Syu
```
ロケール等設定します。

```
# vi /etc/locale.gen
```
ja_JP.UTF-8 UTF-8
の行の#を取り除き、有効化します。

```
# locale-gen
# vi /etc/locale.conf
```

LANG=ja_JP.UTF-8
に変更します。

```
# localectl set-locale LANG=ja_JP.UTF-8
```
タイムゾーンの設定をします。

```
# timedatectl set-timezone Asia/Tokyo
# timedatectl status
```
確認します。
ローカルタイムに設定します。

```
# timedatectl set-local-rtc true
```

次に作業ユーザを追加します。ここではpiにします。

```
# useradd -m -s /bin/bash pi
# passwd pi
```

sudoをインストールします。

```
# pacman -S sudo
# visudo
```

%wheel ALL=(ALL) ALL
の行をコメント#を外す
wheelグループに追加

```
# usermod -aG wheel pi
```

これで基本設定は終了です。ログアウトしてpiで入り直します。

ここからはpiのユーザで作業をします。
まずKVMが立ち上がっていることを確認します。

```
$ dmesg | egrep -i kvm
[    2.923459] kvm [1]: IPA Size Limit: 44bits
[    2.924778] kvm [1]: vgic interrupt IRQ1
[    2.925005] kvm [1]: Hyp mode initialized successfully
```
wgetとqemuをインストールします。

```
$ sudo pacman -S qemu wget
```
確認をします。

```
$ qemu-system-aarch64 --version
QEMU emulator version 5.1.0
Copyright (c) 2003-2020 Fabrice Bellard and the QEMU Project developers
```
ここからはworkディレクトリで作業をします。

```
$ mkdir work
$ cd work
```

まずはWindows PCで作成したWindowsインストールISOファイルを転送してきて、win10.isoというファイル名でworkに入れます。
次にefiとディスクドライバのファイルをダウンロードします。

```
$ wget http://45.76.81.249/Pinebook64/pinebook-pro/QEMU_EFI.img
$ wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.173-2/virtio-win-0.1.173.iso
```
次にインストール先のディスクイメージを作成します。

```
$ qemu-img create -f qcow2 disk.img 20G
```

最後にインストールスクリプトを作成します。

```:install.sh
#!/bin/bash
export QEMU_AUDIO_DRV=pa

qemu-system-aarch64 \
-cpu host \
-enable-kvm \
-M virt-2.12 \
-smp 2 \
-m 2G \
-bios QEMU_EFI.img \
-device ramfb \
-device ich9-usb-ehci1 \
-device usb-kbd \
-device usb-mouse \
-device usb-storage,drive=windows \
-drive if=none,id=windows,media=cdrom,file=win10.iso \
-device usb-storage,drive=drivers \
-drive if=none,id=drivers,media=cdrom,file=virtio-win-0.1.173.iso \
-device virtio-blk,drive=system -vnc :1 \
-drive if=none,id=system,format=qcow2,file=disk.img
```

実行してください。

```
$ chmod +x install.sh
$ ./install.sh
```

起動したらすぐ、VNC viewerｗ起動し、
\<Raspberry Pi 4アドレス>:1
にアクセスしてください。BIOS画面が立ち上がっているはずです。
すぐに何かキーを押すとインストールが開始します。
あとは、Windows10のインストールに従っていけばよいのですが、インストール場所の指定の時にインストール先が無いので、面食らいます。その場合は、

ドライバの読み込み→参照→ドライブD:ARM64\w10→次へ

でディスクが見えるようになり、ディスクを選択して、新規(E)を押すとディスクパーティションが切られて、インストール先ができます。

以上、なかなか長い道のりですが、一度試してみてください。思ったよりサクサク動いて、KVMの威力が分かります。