これまで Windows10 上で様々な仮想マシンを動かしてきました。とはいえゲスト OS は Ubuntu や debian 等の x86 環境の Linux ばかりで、もっと別の OS を動かしてみたいと思っていました。
CPU が異なる環境を動かすのは流石にハードルが高いので、先ずは同じ CPU で動作する別OS(といってもベースは Linux ですが) の Android x86 を Virtualbox、Hyper-V、qemu で動作させてみました。また、仮想環境のAndroid x86 がどの程度実用的なのかも試してみました。
Android x86 とは
スマートフォンで OS として使われている Android の x86 版です。
iPhone 以外のスマホは殆どが Andoroid OS で動作しています(昔は色々あったのですが…歴史(IT media))。Android スマホの CPU は ARM ですが、それを Windows PC でよく使用されている Intel や AMD の CPU で動作するようにしたものが Android x86 になります。
Windows よりも要求する能力が少ないので、型落ちの PC で動作させるには chromebook と並んで良い選択かと思います。64bit 版と 32bit 版がありますが、よっぽど古い PC じゃなければ 64bit 版で大丈夫でしょう。
要求仕様
Download File List - Android-x86 - OSDN
此方に System Requirements として記載がありました。
Operating System: Android
X86 platforms
CPU: Intel/AMD (ABI requirements: https://developer.android.com/ndk/guides/abis#x86)
GPU: Most Intel/AMD/Nvidia chips
Memory: 2GB+
Free disk space: 4GB+
Memory 2GB以上、Disk 4GB以上、なので要求仕様はかなり低めです。Ver.9.0 で試しに 1 core で起動させたら正常に起動しなかったので、2 コアは必要だと思います。
Android x86 の install
2018年9月と少し古いですが @IT の記事が分かり易いです。
atmarkit.itmedia.co.jp
こちらの2ページ目、「パーティションなどを自分で設定してインストールする」の方法で install しました。
@IT の記事は実機と VMware ですが、Virtualbox、Hyper-V、qemu それぞれで install してみます。
android x86 の install image には、Ver.8.1-r6 と Ver.9.0-r2 がありますが、今回は Ver.9.0-r2 の方を使用します。
kernel は 4.19.110 のようです。install 時の画面については、ググると沢山出てきますので、以下では要点のみ記載します。
Android install 共通
UEFI で install する場合
BIOS(第1世代) でも UEFI(第2世代) のどちらでも install 出来ます。UEFI で install する場合には、installer で GPT を選択、仮想 HDD の先頭に 128 MB の領域を EFI System (type ef00) で作成し、残りを Linux (type 8300) で確保します。その後、sda2 の partition に install します。仮想 HDD 全体を ext4 で確保してしまうと起動できません。installer は自動で partition 分けはやってくれないようです。
他にも UEFI 特有の難しさがあるので、最初は BIOS で install してみるのが良いかと思います。UEFI の起動画面を以下に示します。
画面がブラックアウトしたら
Screen Saver が動作しているようです。実機なら電源ボタンを押しますが、仮想マシンでは shutdown の操作をすると復帰します。
- Virtualbox : menu の入力 -> キーボード -> 送信 Ctrl + Alt + Del (Host + Del) を押します。Host key が 右 Alt なら 右Alt + Del です。Windows10 のリモートデスクトップで接続している場合には Ctrl + Alt + End になります。
画面ロックの PIN は設定しない
仮想マシンで使う場合には PIN は設定しない方が操作しやすいです。もし設定した場合には、マウス左ボタンで上方向にドラッグ (ボタンを押したまま上に動かす) して、左ボタンを離さずに PIN を入力して Enter で確定させます。
Virtualbox 編
64 bit 版を install しました。
- 仮想マシンの作成の条件 : VBoxVGA を選択したいので、Linux を選択しない方が良いです。
- タイプ : Other
- バージョン : Other/Unknown (64-bit)
- CPU 4 core、Memory 8GB
- ディスプレイ ビデオメモリーを増やした方が反応が良いです。
- Audio
- ネットワークはアダプタ1を NAT で有効化する。Network は Virtwifi になる。
上記の条件で Network と Audio と Video が使える状態で起動出来ました。ビデオメモリを増やしておけば反応はまあまあです。他の Linux で Gnome や KDE を使った場合と比較してしまうと反応は良くありませんが許容範囲です。CPU の負荷は結構高めです。CPU 2 core、Memory 2GB でも動作しますが、反応は鈍くなります。Audio も使えましたが音ズレが大きく実用的とは言えませんでした。
Virtualbox のリモートディスプレイを有効にしてからヘッドレス起動して、Windows10 の「リモートデスクトップ接続」で接続してみると非常に軽快に動作しました。ポインティングデバイスを PS/2 マウスから USB タブレットにすると、マウスカーソルがホスト側の位置に追従するようになります。Audio は音ズレが更に大きくなり使えるレベルではありません。
Hyper-V 編
64 bit 版を install しました。
- network は Default Switch に接続
- CPU は4 core、Memory 8GB
- セキュアブート無効
- チェックポイント無効
上記の条件で Network と Video が使える状態で起動出来ましたが、Audio は使用できませんでした。仮想マシンの設定にも Audio に関するものはありませんし、Hyper-V は基本的に server 用途で使う事を想定しているのでしょう。
Virtualbox と比較すればかなり軽いです。起動直後の高負荷の状態を過ぎれば、殆ど違和感なく操作できます。なんとなくですが画面表示に hyperv_fb を使用している為のような気がします。
qemu 編
qemu に android x86 を install するのは非常に苦労しました。Video Memory を盛らないと正常に install できません。
- whpx 無効 (有効では起動できませんでした)
- Virtio あり、CPU 4 core、Memory 8GB に設定
- 64 bit 版では起動できませんでしたので 32 bit 版を使用 (原因は分からず)
- spice 使用 (qemu 標準の画面では再起動する)
- qxl の memory 増量 (次項で説明)
qemu qxl の VRAM 設定
qxl の Video 設定を変更する事が重要です。Video Memory を増やさないと反応が非常に悪くなります。日本語の設定例が殆どありません。以下は英語の説明です。
Re: [Qemu-devel] [PATCH 08/10] qxl: add vgamem_size_mb and vgamem_size
一部を引用します。
The qxl device has two large memory regions:
Region #1 is called "ram" and is mapped to PCI bar 0. This is again
splitted into three parts: The framebuffer at the start, the command
rings at the end, and storage area for spice rendering commands and
image data inbetween.Region #2 is called "vram". This is storage for images, called
"surfaces" in spice. Surfaces can be both source and target for spice
rendering operations. X11 can store offscreen pixmaps there for
example. Once qxl gets 3D support surfaces can also be used for textures.Now for the properties:
vgamem_mb
specifies the size of the framebuffer portion of the "ram" region, in
megabytes. Must be big enougth to hold the maximum display
resolution you want to use. Replaces the fixed VGA_RAM_SIZE define.
Default is 8 or 16 MB depending on machine type with all patches of
this series applied (see last patch).ram_size_mb
specifies the total size of the "ram" region, in megabytes. Defaults
to 64 MB. Must be larger than vgamem_mb obviously.vram_size_mb
specifies the total size of the "vram" region, in megabytes.
Defaults to 64 MB.vram64_size_mb
if this one is present and larger than vram_size_mb qxl will get an
additional 64bit pci bar. Both 32bit and 64bit vram pci bars are
backed by the "vram" memory region, the 32bit bar is an alias mapping
for the first part of the 64bit pci bar. This can be used to give
guests *lots* of vram without exhausting 32bit pci address space.
Obviously only useful for 64bit guests. Requires cutting edge
seabios to get the 64bit bar actually mapped above 4G.
超意訳:
qxlデバイスには2つの大きなメモリ領域があります。
領域1は「RAM」と呼ばれ、PCI BAR (Base Address Register) 0に map されます。更に3つに分割されています。frame buffer が最初にあり、command ring が最後に、中間に SPICE の rendering command と image data の記憶領域があります。
領域2は「vram」と呼ばれます。SPICE の Surface と呼ばれる画像の記憶領域です。
surface は SPICE のレンダリングの source にも target にも両方になることができます。
例えば X11 は非表示の pixmap をそこに保存できます
qxlが3Dを使用する際には、テクスチャに surface を使用することもできます。プロパティ:
vgamem_mb
「RAM」領域の frame buffer 部分の size を MB で指定します。使用したい最大の display 解像度よりも大きな大きさを指定する必要があります。VGA_RAM_SIZE の固定値を置き換えます。default は 8 か 16 MBで、すべてのパッチが適用された後のマシンタイプに依存します最後のパッチを参照)。ram_size_mb
「RAM」領域の合計サイズを MB で指定します。default は 64 MB です。vgamem_mb より大きい値を指定する必要があります。vram_size_mb
「vram」領域の合計サイズを MB で指定します。default は64MBです。vram64_size_mb
これが指定され、且つ vram_size_mb より大きい場合、qxlは追加の64 bit PCI BAR を追加で設定します。 32 bit と 64 bit の両方の VRAM PCI BAR は「vram」メモリ領域の後に置かれ、32 bit PCI BAR は 64 bit PCI BAR の前半に重ねて mapping されます。これにより、32 bit PCI の address space を超えた大量の VRAM を仮想マシンに与える事ができます。この事は 64 bit 仮想マシンにのみ有効です。実際に seabios は 64 bit PCI BAR を 4GB より上(の memory 空間)にマッピングします。
まとめると、
- vgamem_mb : default 16 (MB)
- ram_size_mb : default 64 (MB) で vgamem_mb より大きい値を指定
- vram_size_mb : default 64 (MB)
- vram64_size_mb : 有効にする場合は vram_size_mb よりも大きい値を指定 (64 bit guest のみ有効)
default では不足しているので、vgamem_mb=128、ram_size_mb=256、vram_size_mb=512 に設定しました。これで表示に関する誤動作は出なくなりました。(それでも反応は遅いです)
install 及び起動 script
Windows Hypervisor Platform を使えないので起動に非常に時間を要しますし(Ryzen 7 3800x で2分程度)、CPU 負荷も高め、反応も3種類の中で一番「モッサリ」していました。
BIOS版 :
PowerShell : HDD 作成
PS> & 'C:\Program Files\qemu\qemu-img.exe' create ` -f qcow2 'C:\VirtualHDD\qemu_Android9.qcow2' 32G
PowerShell : install は負荷が軽いので 2 core & 4GB memory で十分です。
PS> & 'C:\Program Files\qemu\qemu-system-x86_64.exe' ` -m 4G -smp 2 ` -drive file='C:\VirtualHDD\qemu_Android9.qcow2',if=virtio ` -net nic,model=virtio -net user,hostfwd=tcp::5900-:5900 ` -vga qxl -spice port=5900,disable-ticketing=on ` -machine vmport=off ` -cdrom 'E:\ISO\android-x86-9.0-r2.iso' -boot once=d -no-reboot
PowerShell : 起動 (特に初回) は負荷が重いので 8 core & 8GB memory にしています。2回目以降なら少し減らしても大丈夫です。qxl の VRAM は多めにしています(こんなに要らないかも)。
PS> & 'C:\Program Files\qemu\qemu-system-x86_64.exe' ` -m 8G -smp 8 ` -drive file='C:\VirtualHDD\qemu_Android9.qcow2',if=virtio ` -net nic,model=virtio -net user,hostfwd=tcp::5900-:5900 ` -vga none -device qxl-vga,ram_size_mb=256,vram_size_mb=512,vgamem_mb=128 ` -spice port=5900,disable-ticketing=on ` -machine vmport=off
UEFI版 :
PowerShell : HDD 作成
PS> & 'C:\Program Files\qemu\qemu-img.exe' create ` -f qcow2 'C:\VirtualHDD\qemu_Android9_UEFI.qcow2' 32G
PowerShell : install
PS> & 'C:\Program Files\qemu\qemu-system-x86_64.exe' ` -m 4G -smp 2 ` -drive if=pflash,format=raw,readonly=on,file='E:\VirtualHDD\OVMF_CODE.fd' ` -drive if=pflash,format=raw,file='E:\VirtualHDD\OVMF_VARS_Android9.fd' ` -drive file='C:\VirtualHDD\qemu_Android9_UEFI.qcow2',if=virtio ` -net nic,model=virtio -net user,hostfwd=tcp::5900-:5900 ` -vga qxl -spice port=5900,disable-ticketing=on ` -machine vmport=off ` -cdrom 'E:\ISO\android-x86-9.0-r2.iso' -boot once=d -no-reboot
PowerShell : 起動
PS> & 'C:\Program Files\qemu\qemu-system-x86_64.exe' ` -m 8G -smp 8 ` -drive if=pflash,format=raw,readonly=on,file='E:\VirtualHDD\OVMF_CODE.fd' ` -drive if=pflash,format=raw,file='E:\VirtualHDD\OVMF_VARS_Android9.fd' ` -drive file='C:\VirtualHDD\qemu_Android9_UEFI.qcow2',if=virtio ` -net nic,model=virtio -net user,hostfwd=tcp::5900-:5900 ` -vga none -device qxl-vga,ram_size_mb=256,vram_size_mb=512,vgamem_mb=128 ` -spice port=5900,disable-ticketing=on ` -machine vmport=off
System UI isn't responding 等、反応がないという message が頻繁に出ますが、重いだけなので Wait を選択します。
-device AC98
を追加すれば音も出力されました。ただし反応は悪いです。
Android x86 9.0 の使い方
10年以上 Android から離れていますので、使い方を忘れています。Windows や Gnome (Linux) とは勝手が違いますので、迷った所を列記します。
画面下のアイコン
- 左向き三角が前に戻る
- 中央の丸が Home 画面に戻る
- 右側の四角が動作しているアプリ一覧
アプリ一覧は左右にドラッグするとスクロールできて(マウスホイールも効く)、右端に「すべてクリア」があります。
電源の落とし方
Home 画面で前記の「画面がブラックアウトしたら」に記載した内容を実行すると、右側に「電源を切る」ボタンが表示されますので、これを押すと shutdown します。
安全に再起動する方法
フリーズしかかったり動作が変になったり、画面が乱れてどうしようもない時には、仮想端末に切り替えて再起動してみてください。
- Alt + F1 で仮想端末に切替
# reboot
これでダメならリセット。
アプリ一覧を表示する
画面下部から上方向にマウス左ボタンでドラッグすると出現します。これが出来ないと、設定アプリ等が使えません。
日本語入力/直接入力の切り替え
ググると Windows キー + Space で切り替えられると書いてあり、確かに設定アプリのシステム -> 言語と入力 -> 物理キーボード -> キーボードショートカットヘルパーの画面には、「入力方法の切り替え」として虫眼鏡マーク(Windowsキー) + SPACE と記載されていますが、幾度試しても切り替えできません。
しょうがないので、物理キーボードの中にある「仮想キーボードの表示」を ON にして仮想キーボードを表示させて、Gboard の右下のアイコンを押す事でで直接入力と日本語入力を切り替えています。
iOS に Bluetooth keyboard を接続したときには Ctrl + Space で切り替えられていたので便利だったのですがしょうがないです。
スリープに入る時間を延ばす
設定アプリ -> ディスプレイの中にあります。通常は10分に設定されていましたので、最大の30分に設定しました。
kernel の dmesg を確認したい
Alt + F1 で terminal が su で表示されるので
# dmesg | less
とすれば確認できます。
Alt + F7 で元の画面に戻ります。
画面サイズの変更方法
以前は kernel option に vga=ask
を入れて…という方法だったらしく、ググってもそのような方法が殆どですが、実際やってみると反映されない事がありました。改めて各仮想マシン毎に調べてみました。
Android x86 の Debug mode は less と vi が使えて TAB 補完も効きますが、file を編集するのは少々手間がかかります。使える状態まで setting した 仮想マシンの Linux があれば、そちらに HDD を接続して編集する方が便利です。
Virtualbox
BIOS で起動した場合は kernel option に vga=ask
を追記して一覧を表示させて、32 bit color の解像度を選択すれば OK です。
例えば 800x600x32
であれば、vga=ask
の後の video mode
には u
、あるいは343
を入力します。再起動しても有効にする場合には、Android x86 を Debug mode で起動した後で grub の menu.lst を編集し、vga=nnn
を追記します。nnn
には上の表の Mode
の16進数の数値を10進数に変更した値を入れます。例えば 800x600x32 の 0x343
であれば vga=835
です。
# mount -o remount,rw /mnt # cd /mnt/grub # vi menu.lst # diff -u menu.lst.orig menu.lst --- menu.lst.orig 2022-01-16 18:23:40.931469867 +0900 +++ menu.lst 2022-01-17 02:42:18.867573135 +0900 @@ -4,7 +4,7 @@ root (hd0,0) title Android-x86 9.0-r2 - kernel /android-9.0-r2/kernel quiet root=/dev/ram0 SRC=/android-9.0-r2 + kernel /android-9.0-r2/kernel vga=835 quiet root=/dev/ram0 SRC=/android-9.0-r2 initrd /android-9.0-r2/initrd.img title Android-x86 9.0-r2 (Debug mode)
UEFI で起動した場合の解像度設定は VBoxManage
command で変更します。仮想マシンが停止状態で設定します。
Chapter 3. Configuring Virtual Machines
PowerShell : 800x600x32 に変更する場合
# 確認 -> 値が設定されていない PS> & 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' ` getextradata vbAndroid9_UEFI ` VBoxInternal2/EfiGraphicsResolution No value set! # 値を設定 PS> & 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' ` setextradata vbAndroid9_UEFI ` VBoxInternal2/EfiGraphicsResolution 800x600 # 確認 PS> & 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' ` getextradata vbAndroid9_UEFI ` VBoxInternal2/EfiGraphicsResolution Value: 800x600
空白を設定すると No value に戻ります。
UEFI で起動すると初期の解像度が決まります。その後 Android x86 では efifb という frame buffer が有効になり、video=efifb:width:800,height:600
と指定すれば表示領域が一時的に変わるのですが、GUI が立ち上がった後に再び全画面を使用するようになり画面表示が崩れます。従って上記の方法で UEFI 起動直後の解像度を変更する必要があります。
Hyper-V
BIOS で起動した場合には、kernel option
に video=hyperv_fb:NNNxMMM
を追加すれば反映されます(Virtualbox と基本的に同じやり方です)。800x600 にする場合を以下に示します。Android x86 の Debug mode で編集します。
# mount -o remount,rw /mnt # cd /mnt/grub # vi menu.lst # diff -u menu.lst.orig menu.lst --- menu.lst.orig 2022-01-16 19:42:28.685454563 +0900 +++ menu.lst 2022-01-16 19:42:54.692488994 +0900 @@ -4,7 +4,7 @@ root (hd0,0) title Android-x86 9.0-r2 - kernel /android-9.0-r2/kernel quiet root=/dev/ram0 SRC=/android-9.0-r2 + kernel /android-9.0-r2/kernel video=hyperv_fb:800x600 quiet root=/dev/ram0 SRC=/android-9.0-r2 initrd /android-9.0-r2/initrd.img title Android-x86 9.0-r2 (Debug mode)
UEFI で起動した場合には、Linux kernel 起動時 に frame buffer として使われている efifb
から hyperv_fb
に切り替わります。よって最初から video=efifb:off
として hyperv_fb
の設定を記載しておけば OK です。書き換えるのは ESP 領域にある efi/boot/android.cfg
です。entry を追加している add_entry
を探して quiet が設定されている行に追記します。800x600 に設定する場合を以下に示します。Android x86 の Debug mode で編集します。
# mount /dev/sda1 /hd # cd /hd/efi/boot # vi android.cfg # diff -u android.cfg.orig android.cfg --- android.cfg.orig 2022-01-15 20:44:08.000000000 +0900 +++ android.cfg 2022-01-16 20:03:40.000000000 +0900 @@ -83,7 +83,7 @@ export android bootefi grub kdir live src # Create main menu -add_entry "$live" quiet +add_entry "$live" video=efifb:off video=hyperv_fb:800x600 add_entry "$debug_mode" DEBUG=2 if [ -s ($android)$kdir/install.img ]; then add_entry "Installation" INSTALL=1 # cd / # umount /hd
Virtualbox の時と異なり、Hyper-V の場合は frame buffer を切り替えると実際の解像度も変わります。なので表示が崩れる事はありませんでした。BIOS でも UEFI でも hyperv_fb
が使われている事からも、Hyper-V の速さの秘密は hyperv_fb にあるのかもしれませんね。
qemu + SPICE :
BIOS で起動した場合は、Virtualbox と同様に kernel option に vga=ask
を追記して一覧を表示させて、32 bit color の解像度を選択すれば OK です。ただ、解像度の選択肢が Virtualbox よりも多く、スクロールしてしまうので全てを見る事ができません。とりあえず、32 bit color の選択肢は表示されているので何とかなると思います。
UEFI で起動した場合は、UEFI の設定から変更できます。
- OVMF Platform Configuration を選択
- 使用したい解像度を選択
- Commit Changes and Exit を選択
- 最初の画面まで戻って Reset を選択
これで再起動した後には選択した解像度が反映されます。grub2 の画面では一時的に解像度が元に戻りますが、Android x86 が起動すると再び選択した解像度に戻ります。frame buffer の efifb に設定が継続して反映されるようです。
まとめ
Android x86 を各マシンで動作させた使用感をまとめます。ただし、調整不足の箇所があるかもしれない事は了承ください。
- 各仮想マシンで、BIOS でも UEFI でもどちらでも install できました。ただし、UEFI で install する場合には、disk の先頭に 128MB の ESP 領域を手動で確保する必要がありました。
- 動作の軽さ : Hyper-V >> Virtualbox > qemu + SPICE です。Hyper-V が圧倒的に軽いです。特に拘りが無く試しに使ってみるなら Hyper-V で動作させた方が良いです。ただし音は出ません。とはいえ、Virtualbox も qemu も音に関しては実用には程遠い状態と感じます。(単なる調整不足かもしれませんが)
- Virtualbox も qemu +SPICE も、Video Memory を増やさないと速度が極端に落ちます。特に qemu +SPICE の場合には、install にも苦労する程です。
- 一旦起動してしまえば、Virtualbox もそこそこ軽く動作します。特に Windows10 のリモートデスクトップ接続をすれば、更に軽くなります。ただし Audio は更に悪くなります。
- qemu + SPICE は、私にとっては実は本命だったのですが、whpx 有効では起動できなかった為、Windows Hypervisor Platform が使用できずに速度が極端に低下する結果となりました。qemu は Windows10 ではなく Linux ホストで kvm で使用するべきなのでしょうか。
今回は install から初期設定、いくつかアプリを入れて動作を試しただけですので、もう少し調整してみたいと考えています。どこまでできるか分かりませんが備忘録として記録しておきます。
- qemu の速度向上 : whpx が本当に使えないか確認したいです。virtio-vga が使えるでしょうか (SDL ではグラフィック画面に切り替わらず断念)。恐らく Android x86 は mesa を使っているので、OpenGL が使えるともう少し早くなりそうな気がします。
- Virtualbox 最適化 : headless でリモートデスクトップ接続ではそこそこ快適でしたので、後は音だけです。別の hardware を使うとどうなるか確認したいと考えています。
- Hyper-V で音は出ないか : Audio 設定はありませんが、vnc やリモートデスクトップで接続した場合に音が出るか確認したいです。Android vnc server を入れて Windows10 の vnc client で接続はできて、mouse の反応はあるのですが、画面が表示できませんでした。理由を調べて、本当に音が出るのか確認したいです。
- どのようなアプリまで使えるか。Amazon Music と Amazon Photos は使えましたが、Amazon Prime Video は起動できませんでした。何となく root 環境の為かと思いますが対処できるのでしょうか。
- スマホ画面のような縦長にする方法を探してみます。
始めは簡単な気持ちでスタートしましたが、だいぶ長文になってしまいました。今回の記事で時間を要したハマりポイントは
です。それでも、各仮想マシンへの理解が深まったと感じています。
一先ずここまでで区切りをつけて、別の記事で各種調整や確認を実施します。