はじめに
対象読者
- ネストされた仮想化 ( Nested Virtualization ) 環境を、なるべく安価にクラウドで触りたい
- 具体例としては Android Studio でのエミュレータをクラウドで動かしたい
- 今回は GCP - GCE でおこなう
各ベンダーのコストと選定
- GCP ( Google Cloud Platform )
- GCE ( Google Compute Engine ) の N1 プランで月額最低 3,000 円程度からインスタンスを立てられる
- とはいえ Android エミュレータ動かすなら vCPU * 2 + メモリ 3.75 GB 環境くらいは必要になってくるので 5,000 円以上はかかる
- GCE ( Google Compute Engine ) の N1 プランで月額最低 3,000 円程度からインスタンスを立てられる
- Microsoft Azure
- fvs2 で月額最低 8,000 円程度から
- さくら
- 専有サーバで対応している。月額 20 万円ほど……
- DigitalOcean
- コスト的には一番安く月額最低 2,000 円程度からいけるらしい(未検証)
- ただし日本リージョンが存在していないため、遅延が大きいのがネックとなる
Nested Virtualization 対応のイメージ作成
自作インスタンスのイメージを用意する
インスタンスを用意しておく
- Nested Virtualization 対応させたい OS ( ここでは Ubuntu 20.04 ) のインスタンスを一つ作成します
- ここで指定したイメージ名は後で使います
- スペックも、以後使いたいものと同等にしておくと、後が楽です
- インスタンス作成後、ログインしてパッケージ更新など済ませておくと、これまた後が楽です
apt update
apt upgrade
インスタンスを停止
- 準備ができたら、管理画面でインスタンスを停止
Nested Virtualization 対応のイメージ作成
cloud shell でコマンド実行
- --project
- project_name のところに、自身の環境におけるプロジェクト名を指定
- images create
- create_image_name のところに、自身の作成したイメージ名を指定
- --source-disk
- source_image_name のところに、自身の作成したイメージ名を指定
- --source-disk-zone
- zone_name のところに、インスタンスを作成した時に自身で設定した zone を指定
gcloud compute --project=project_name images create create_image_name --source-disk=source_image_name --source-disk-zone=zone_name --licenses "https://www.googleapis.com/compute/v1/projects/vm-options/global/licenses/enable-vmx"
- 実行後、以下のように表示されたら成功です
Created [https://www.googleapis.com/compute/v1/projects/project_name/global/images/create_image_name].
NAME PROJECT FAMILY DEPRECATED STATUS
create_image_name project_name READY
イメージが作成されていることを確認
- 左メニューの「イメージ」を選ぶと、その中に create_image_name が存在していることが確認できます
- 「マシンイメージ」ではなく単なる「イメージ」の方です
インスタンス作成
- 「イメージ」の中にある create_image_name を選択して「インスタンス作成」実行
- 通常通りにインスタンス作成を進めていく
- リージョンは「イメージ」が置いてあるところと異なるリージョンでも、指定できます
- ブートディスクのところが create_image_name になっているはずです
対応したインスタンスへの接続と確認
接続
- ターミナル等から ssh 接続してください
確認
- 以下コマンドを打って vmx が flags 内にあれば OK です
cat /proc/cpuinfo
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid tsc_known_freq pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx smap xsaveopt arat md_clear arch_capabilities
おわりに
感想
- ここまで辿り着くのに時間かかった……! 日本語での情報少ないというか、まず公式ドキュメントが日本語だとよくわからなくて、まだ英語の方が理解しやすい
- GCE のインスタンス、やっぱりそこそこのスペック積まないと Android エミュレータはしっかり動いてくれないなあ……