# ARM 版 Windows 10 や Ubuntu for ARM64 を Apple Silicon な Mac で動かす ARM 版 Windows 10 や Ubuntu を Apple Silicon な Mac で動かす簡単な方法です。 > メモ: 2021年2月8日現時点での方法で、今後まだ改善されていくと思います。 ## ARM 版 Windows 10 を動かす 1. Xcode を App Store で、あるいは Command Line Tools を Apple Silicon な Mac にインストール ``` xcode-select --install ``` 2. ARM64 対応の Homebrew で QEMU の依存ライブラリをインストール **すでに x86_64 の Homebrew が `/usr/local` にインストールされている場合は削除するなどしてください。** **x86_64 の Homebrew では QEMU がビルドできません** https://brew.sh/ ``` /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" brew install ninja pkgconfig glib pixman ``` 3. QEMU のソースコードをとってくる ``` git clone https://git.qemu.org/git/qemu.git ``` 4. ローカルブランチを作って、@[_AlexGraf](https://twitter.com/_AlexGraf)氏がつくった Hypervisor.framework のパッチをあてる ``` cd qemu git checkout d0dddab40e -b wip/hvf curl 'https://patchwork.kernel.org/series/418581/mbox/'|git am --3way ``` 5. QEMU をビルドする ``` mkdir build cd build ../configure --target-list=aarch64-softmmu --enable-cocoa make -j ``` 6. QEMU 用の EDK II OVMF EFI イメージをダウンロードする。 このイメージは `stable202011` タグに、`QemuRamfb.c` に追加の解像度を足したものです。 https://gist.github.com/niw/4f1f9bb572f40d406866f23b3127919b/raw/f546faea68f4149c06cca88fa67ace07a3758268/QEMU_EFI-cb438b9-edk2-stable202011-with-extra-resolutions.tar.gz さらに解像度を追加するなど、ソースコードからビルドする場合は以下を参照のこと。 7. pflash イメージを作って、画面サイズなどを設定する不揮発なストレージを準備する `QEMU_EFI-....tar.gz` をダウンロードしたディレクトリで以下を実行。 ``` cd ~/Downloads tar xzvf QEMU_EFI-*.tar.gz dd if=/dev/zero of=pflash0.img bs=1m count=64 dd if=/dev/zero of=pflash1.img bs=1m count=64 dd if=QEMU_EFI.fd of=pflash0.img conv=notrunc dd if=QEMU_VARS.fd of=pflash1.img conv=notrunc ``` - このステップは省略可能。その場合は次のステップで `-drive ...,if=pflash,...` のかわりに `-bios ~/Downloads/QEMU_EFI.fd` を指定すること。ただし、EFI での変更が保存されなくなります。 8. Windows 10 on ARM Insider Preview をダウンロードする https://www.microsoft.com/en-us/software-download/windowsinsiderpreviewARM64 9. VHDX から qcow2 に変換する VHDX のままだとかなりの頻度でイメージが壊れる印象があるので qcow2 に変換しておく。 ``` qemu-img convert -p -O qcow2 ~/Downloads/Windows10_InsiderPreview_Client_ARM64_en-us_21286.VHDX ~/Downloads/Windows10.qcow2 ``` 10. Windows 10 を起動する ``` ./qemu-system-aarch64 \ -monitor stdio \ -M virt,highmem=off \ -accel hvf \ -cpu cortex-a72 \ -smp 4 \ -m 4096 \ -drive file=~/Downloads/pflash0.img,format=raw,if=pflash,readonly=on \ -drive file=~/Downloads/pflash1.img,format=raw,if=pflash \ -device ramfb \ -device qemu-xhci \ -device usb-kbd \ -device usb-tablet \ -device intel-hda \ -device hda-duplex \ -nic user,model=virtio \ -drive file=~/Downloads/Windows10.qcow2,format=qcow2,if=none,id=boot,cache=writethrough \ -device nvme,drive=boot,serial=boot ``` - イメージへのパスなどは適宜修正してください。 - TianoCore のロゴが出ている時に `ESC` を押して、`Device Manager`、`OVMF Platform Configuration`、`Change Preferred Resolution for Next Boot` と進めて解像度を変更できます。 - 解像度を追加するには、下記の「EDK II の OVMF EFI イメージをビルドする」に従って `OvmfPkg/QemuRamfbDxe/QemuRamfb.c` を変更し、新しい `QEMU_EFI.fd` を作ってください。 - `-device usb-mouse` より `-device usb-tablet` を使うことでマウスカーソルがロックされなくなり使いやすくなります。 - `-device intel-hda -device hda-duplex` でオーディオが使えるようになります。 - `-nic user,model=virtio` がネットワークインターフェイスです。有効にするには以下を参照してください。 ## インターネットに接続する VirtIO NIC は標準では有効にならないので、デバイスドライバを入れる必要がある。 1. VirtIO デバイスドライバの ISO を [Fedora Project](https://docs.fedoraproject.org/en-US/quick-docs/creating-windows-virtual-machines-using-virtio-drivers/index.html#virtio-win-direct-downloads) からダウンロード。 https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.190-1/virtio-win-0.1.190.iso 2. デバイスドライバの ISO をマウント `qemu-system-aarch64` のオプションに以下を追加する。 ``` -drive file=~/Downloads/virtio-win-0.1.190.iso,media=cdrom,if=none,id=drivers \ -device usb-storage,drive=drivers ``` イメージへのパスなどは適宜修正してください。 3. デバイスドライバの署名検証を無効にする Windows を起動して Windows スタートボタン を右クリック、Command Prompt (Admin) を選択。 bcdedit を使ってテスト署名されたデバイスドライバを有効にする。 ``` bcdedit.exe -set TESTSIGNING ON ``` このあと Windows を再起動すること。 詳細は[こちら](https://docs.microsoft.com/en-us/windows-hardware/drivers/install/the-testsigning-boot-configuration-option)を参照のこと。 4. デバイスドライバのインストール Windows が再度起動したら Windows スタートボタン を右クリック、Device Manager を選択。 Device Manager のウィンドウで、View メニューの Devices by Connection を選択。 デバイスのツリーから、`ACPU ARM64-based PC`、`Microsoft ACPI-Compliant System`、`PCI Express Root Complex` と選択してその中にある `Unknown device` を探す。 (`Unknown device` はデバイスのツリーに沢山あるけれど、`PCI Express Root Complex`の下にあるのが、VirtIO NIC。) 該当の `Unknown device` を右クリックして、Update Drivers を選択、Browse my computer for drivers を選んで、`D:\NetKVM\w10\ARM64` を指定。 Next をクリックして `Red Hat VertIO Ethernet Adapter` をインストール。 ## ディスクイメージをを縮小する ディスクイメージである `Windows10.qcow2` ファイルは Windows Update などをすると容量まで大きくなる可能性があり、たとえファイルを削除してもディスクイメージのサイズは減りません。 そのため、ディスクサイズが大きくなりすぎた場合などは使用していない領域を開放する必要があります。 1. Windows 10に付属の Defragment and Optimize Drives で、`C:` ドライブを Optimize する。 2. [SDelete](https://docs.microsoft.com/en-us/sysinternals/downloads/sdelete) をダウンロードする。`SDelete64a -z C:` を Administrator Command Prompt で実行し、使用していない領域をゼロで埋める。 このコマンドの実行はしばらくかかります。この時、ディスクイメージがとても大きくなるので Mac の空き容量に注意。 3. Windows を終了して、以下のコマンドを Mac で実行する。 このコマンドの実行はしばらくかかります。また縮小したディスクイメージは別に作られるので Mac の空き容量に注意。 ``` qemu-img convert -O qcow2 ~/Downloads/Windows10.qcow2 ~/Downloads/Windows10_compacted.qcow2 ``` 4. `Windows10.qcow2` を縮小した `Windows10_compacted.qcow2` で置き換え。 ## Ubuntu Server for ARM64 を動かす ARM 版 Windows 10 を動かす手順に従って QEMU を準備して、Ubuntu Server for ARM64 をダウンロードしてインストールします。 1. 上記の手順 1 から 7 までに従って QEMU を準備する。 2. 空のディスクイメージを作成する。 ``` ./qemu-img create -f qcow2 ~/Downloads/ubuntu.qcow2 40G ``` 3. Ubuntu Server for ARM64 をダウンロードする。 https://ubuntu.com/download/server/arm 4. Ubuntu Server for ARM をインストールする。 ``` ./qemu-system-aarch64 \ -monitor stdio \ -M virt,highmem=off \ -accel hvf \ -cpu cortex-a72 \ -smp 4 \ -m 4096 \ -drive file=~/Downloads/pflash0.img,format=raw,if=pflash,readonly=on \ -drive file=~/Downloads/pflash1.img,format=raw,if=pflash \ -device virtio-gpu-pci \ -display default,show-cursor=on \ -device qemu-xhci \ -device usb-kbd \ -device usb-tablet \ -device intel-hda \ -device hda-duplex \ -drive file=~/Downloads/ubuntu.qcow2,if=virtio,cache=writethrough \ -cdrom ~/Downloads/ubuntu-20.04.1-live-server-arm64.iso ``` - 指示に従ってインストールしたあとは `-cdrom` は不要です。 ## EDK II の OVMF EFI イメージをビルドする 上記の手順に従って Ubuntu Server for ARM64 を動かします。 1. EDK II のソースコードを取ってくる。 ``` git clone --depth 1 --branch edk2-stable202011 https://github.com/tianocore/edk2.git cd edk2 git submodule update --init --recursive ``` Hypervisor.framework パッチの制限で xHCI を無効にする必要があれば `/ArmVirtPkg/ArmVirtQemu.dsc` と `/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc` にある `MdeModulePkg/Bus/Pci/XhciDxe/XhciDxe.inf` の行をコメントアウト。たぶん現状は問題ない。 2. ビルドする ``` sudo apt install iasl python3 python3-distutils uuid-dev make g++ source edksetup.sh make -C BaseTools build -a AARCH64 -t GCC5 -p ArmVirtPkg/ArmVirtQemu.dsc ``` `Build/ArmVirtQemu-AARCH64/DEBUG_GCC5/FV` に `QEMU_EFI.fd` と `QEMU_VARS.fd` ができるはず。 - これらのファイルを簡単に macOS ホストに取り出すには macOS でリモートアクセスを有効にして `scp` で `10.0.2.2` にコピー。 - x86_64 の環境でビルドする場合は以下のツールチェーンでクロスコンパイル。 ``` sudo apt install gcc-aarch64-linux-gnu env GCC5_AARCH64_PREFIX=aarch64-linux-gnu- build -a AARCH64 -t GCC5 -p ArmVirtPkg/ArmVirtQemu.dsc ```