Ideal Reality

興味の赴くままに

QEMUにaarch64版のAlpine Linuxをインストールする

Alpine Linuxのサイトに仮想マシン用のインストーラーが公開されてるけど、aarch64(ARM 64bit)ではどうやって起動させるの?って話。

Contents
スポンサーリンク

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ファームウェアをビルドする

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の使える環境なら-cpuhostに変えて--enable-kvmをつけると速くなります。

kernel、initrdを直接指定する

ちょーっと待った、なんでqemuからlinux起動するのにわざわざブートローダー使わなきゃいけないの?って人は、isoイメージからvmlinuz-virtinitramfs-virtを取り出して直接起動しましょう。

vmlinuz-virtinitramfs-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

この時生成されたvmlinuzinitramfsがqemu起動時に必要なので、用意したshareディレクトリを使ってホストOS側にコピーしましょう。

mkdir share
mount /dev/vdc1 share/
cp /mnt/boot/vmlinuz-virt share/
cp /mnt/boot/initramfs-virt share/

ちなみに、このVVFATを使ったファイル共有が安定しないので、コピーしたときにちゃんとホストOS上でファイルを確認したほうがいい。コピーしてから実際にホストOSでファイルが見えるまで時間がかかる印象です。

vmlinuzinitramfsが取り出せればインストール作業は完了なので、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は強いですね。

スポンサーリンク

コメント

投稿されたコメントはありません

名前

メールアドレス(任意)

コメント

関連する投稿

IntelとApple SiliconのMacbook Airを比較してみた

Raspberry PiでKVMを動かす

Raspberry PiにAlpine Linuxをsysモードでインストールする