GCEでNestedVirtualization対応のUbuntuインスタンスを立てる


はじめに

対象読者

  • ネストされた仮想化 ( 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 円以上はかかる
  • 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 エミュレータはしっかり動いてくれないなあ……

参考