QEMUにaarch64版のAlpine Linuxをインストールする
Alpine Linuxのサイトに仮想マシン用のインストーラーが公開されてるけど、aarch64(ARM 64bit)ではどうやって起動させるの?って話。
UEFIを使う
Alpine Linuxのサイトからダウンロードできるのはisoイメージです。
これをどうやってqemu-syste-aarch64
でブートするかなんですが、この中にUEFI版のgrubが入っているので、QEMU用のUEFIファームウェアを用意してやれば簡単に動きます。
UEFIファームウェアの入手
aarch64版のUEFIファームウェアはLinuxディストリビューションによってはパッケージマネージャーから簡単に入手できます。(例: Ubuntuだとaptでqemu-efi-aarch64
をインストールすれば/usr/share/qemu-efi-aarch64/QEMU_EFI.fd
にファームウェアがインストールされる)
それ以外の場合は特に公式のビルド済みイメージがあるわけではないので、自前でビルドするのがいいでしょう。
QEMUはUEFI用のファームウェアを持っていないので、UEFI環境でのブートをしたかったら別途用意しなきゃいけないのですが、Intel用のファームウェアはLinuxのパッケージマネージャーのレポジト...
インストール
まずは以下のコマンドでインストール先のHDDイメージを作成します。
qemu-img create -f qcow2 storage.qcow2 16G
あとは、このstorage.qcow2
と、用意したUEFIファームウェアQEMU_EFI.fd
と、Alpine Linuxのインストーラー(今回はalpine-virt-3.13.1-aarch64.iso
)を同じディレクトリにまとめたら、以下のコマンドでQEMUを起動します。
qemu-system-aarch64 \
-M virt -cpu cortex-a57 \
-m 1G \
-bios QEMU_EFI.fd \
-cdrom alpine-virt-3.13.1-aarch64.iso \
-drive if=none,file=storage.qcow2,id=hd0 -device virtio-blk-device,drive=hd0 \
-nographic
あとは起動したらroot
でログインして、setup-alpine
を実行してインストールするだけなのですが、途中でインストール先を求められるので以下のように用意したストレージを選択してください。
Available disks are:
vda (17.2 GB 0x554d4551 )
Which disk(s) would you like to use? (or '?' for help or 'none') [none] vda
The following disk is selected:
vda (17.2 GB 0x554d4551 )
How would you like to use it? ('sys', 'data', 'lvm' or '?' for help) [?] sys
WARNING: The following disk(s) will be erased:
vda (17.2 GB 0x554d4551 )
WARNING: Erase the above disk(s) and continue? (y/n) [n] y
Partition id "vfat" is not supported!
Creating file systems...
mkfs.fat 4.1 (2017-01-24)
Installing system on /dev/vda3:
Installing for arm64-efi platform.
Installation finished. No error reported.
Installation is complete. Please reboot.
と出てきたらインストール成功。poweroff
コマンドで一旦仮想マシンを落としてください。
起動
インストール済みのイメージからは以下のコマンドで起動できます。
qemu-system-aarch64 \
-M virt -cpu cortex-a57 \
-m 1G \
-bios QEMU_EFI.fd \
-drive if=none,file=storage.qcow2,id=hd0 -device virtio-blk-device,drive=hd0 \
-nographic
インストール時のコマンドから-cdrom
を抜いただけです。
これで起動するので、あとはお好みでどうぞ。ちなみにRaspberry Pi 4などKVMの使える環境なら-cpu
をhost
に変えて--enable-kvm
をつけると速くなります。
kernel、initrdを直接指定する
ちょーっと待った、なんでqemuからlinux起動するのにわざわざブートローダー使わなきゃいけないの?って人は、isoイメージからvmlinuz-virt
とinitramfs-virt
を取り出して直接起動しましょう。
vmlinuz-virt
とinitramfs-virt
の入手
isoイメージをマウントして直接コピーしてください。isoイメージ直下のboot
ディレクトリに2つともあります。
僕はmacOS上で試していたので、Dockerを使いました。
docker create -it --name alpine_install --privileged alpine
docker cp alpine-virt-3.13.1-aarch64.iso alpine_install:/
docker start alpine_install
docker attach alpine_install
mount alpine-virt-3.13.1-aarch64.iso mnt
cp /mnt/boot/initramfs-virt /
cp /mnt/boot/vmlinuz-virt /
exit
docker cp alpine_install:/initramfs-virt .
docker cp alpine_install:/vmlinuz-virt .
docker rm alpine_install
インストール
インストールが完了した時カーネルとinitramfs
を抜き出さなきゃいけないので、ホストOSと共有するディレクトリを作成します。
mkdir share
そして、以下のコマンドで起動します。
qemu-system-aarch64 \
-M virt -cpu cortex-a57 \
-m 1G \
-kernel vmlinuz-virt \
-initrd initramfs-virt \
-cdrom alpine-virt-3.13.1-aarch64.iso \
-drive if=none,file=storage.qcow2,id=hd0 -device virtio-blk-device,drive=hd0 \
-drive file=fat:rw:share \
-append "console=ttyAMA0 modules=loop,squashfs,cdrom,isofs,ext4" \
-nographic
起動したらsetup-alpine
を実行するのですが、ブートローダーを使ってないためストレージへのインストールに失敗します。そのため、インストール先を求められたらnone
にしてください。
Available disks are:
vda (17.2 GB 0x554d4551 )
Which disk(s) would you like to use? (or '?' for help or 'none') [none]
Enter where to store configs ('floppy', 'usb', 'vdb' or 'none') [vdb] none
Enter apk cache directory (or '?' or 'none') [/var/cache/apk] none
setup-alpine
が終わったら、まずはインストール先のext4
ファイルシステムを用意します。
apk add e2fsprogs
mkfs.ext4 /dev/vda
mount /dev/vda /mnt
そして、setup-disk
を実行するのですが、ブートローダーが指定されてないとエラーになります。ブートローダーは使わないのでいらないのですが、怒られるので適当にgrub
でも指定してからsetup-disk
を実行します。
export BOOTLOADER=grub
export USE_EFI=1
setup-disk -m sys /mnt
もちろんgrub
は使ってないのでエラーが出ますが、用意したストレージにファイルがコピーされてinitramfs
が生成されていればOK。
Installing system on /dev/vda:
/sbin/setup-disk: line 294: grub-install: not found
install: can't stat '/mnt/boot/efi/EFI/alpine/grubaa64.efi': No such file or directory
100% ████████████████████████████████████████████==> initramfs: creating /boot/initramfs-virt
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-virt
Found initrd image: /boot/initramfs-virt
done
You might need fix the MBR to be able to boot
この時生成されたvmlinuz
とinitramfs
がqemu起動時に必要なので、用意したshare
ディレクトリを使ってホストOS側にコピーしましょう。
mkdir share
mount /dev/vdc1 share/
cp /mnt/boot/vmlinuz-virt share/
cp /mnt/boot/initramfs-virt share/
ちなみに、このVVFATを使ったファイル共有が安定しないので、コピーしたときにちゃんとホストOS上でファイルを確認したほうがいい。コピーしてから実際にホストOSでファイルが見えるまで時間がかかる印象です。
vmlinuz
とinitramfs
が取り出せればインストール作業は完了なので、poweroff
で終了してください。
起動
qemu-system-aarch64 \
-M virt -cpu cortex-a57 \
-m 1G \
-kernel share/vmlinuz-virt \
-initrd share/initramfs-virt \
-drive if=none,file=storage.qcow2,id=hd0 -device virtio-blk-device,drive=hd0 \
-append "console=ttyAMA0 modules=ext4 root=/dev/vda" \
-nographic
これで起動できます。
やっぱり、カーネルとinitramfsさえメモリに展開してあればなんとかなるLinuxは強いですね。
コメント