Cuttlefish: マルチテナンシー

Cuttlefish のマルチテナンシーを使用すると、ホストマシンで起動呼び出しを 1 回行うだけで複数の仮想ゲストデバイスを起動できます。

これらの複数の Cuttlefish 仮想マシンでホストのディスク リソースの一部を共有できるため、ディスク容量を節約できます。各仮想マシンには、Android パーティション(superuserdataboot など)を対象として含む個別のディスク オーバーレイが割り当てられます。ゲストディスクに変更がある場合、ゲスト固有のディスク オーバーレイ内で行われ、各 Cuttlefish 仮想マシンにそのディスク パーティションのコピーオンライト ビューが与えられます。各仮想デバイスのディスクビューに書き込むデータが多くなると、ホストディスク上のオーバーレイ ファイルのサイズが大きくなります。これは、これらのオーバーレイ ファイルが元の状態と現在の状態の間の差分をキャプチャしているためです。

オーバーレイ ファイルをリセットすると、Cuttlefish ディスクを元の状態に戻すことができます。このプロセスを「Powerwashと呼びます。

インスタンス番号

Cuttlefish デバイスは、インスタンス番号に関連付けられているホスト上でリソースを作成して使用します。たとえば adb 接続は、インスタンス番号が 1 の Cuttlefish デバイスのポート 6520 で、TCP サーバー ソケットを介して公開されます。複数のインスタンスが起動される場合、各デバイスのポートに TCP サーバー ソケットが作成されます。ポート番号は、最初のデバイスでは 6520、次のデバイスでは 6521 となり、以降の各デバイスのポート番号は 1 つずつ大きくなります。

サポートされるインスタンスの最大数を変更する

ホスト側のリソース(TAP ネットワーク デバイスなど)を Cuttlefish 仮想マシン用に事前に割り当てる必要があります。デフォルトでは、cuttlefish-base Debian パッケージにより、インスタンス番号 1 から 10 のリソースがプロビジョニングされます。

これを変更するには、/etc/default/cuttlefish-host-resourcesnum_cvd_accounts を変更し、次のコマンドを実行して cuttlefish-host-resources サービスを再起動します。

sudo systemctl restart cuttlefish-host-resources

正規設定

正規設定は Cuttlefish デバイスの設定を JSON 形式で表したものです。正規設定の JSON ファイルを作成して、マルチテナントのシナリオにおける複数の Cuttlefish デバイスの設定を記述できます。

正規設定の JSON ファイルで使用される形式を以下に示します(プレースホルダをデバイス設定で置き換えてください)。

{
  "common": {
    CONFIGURATIONS_APPLYING_TO_ALL_DEVICES
  },
  "instances": [
    {
      FIRST_DEVICE_CONFIGURATION
    },
    {
      NTH_DEVICE_CONFIGURATION
    }
  ]
}

2 つのデバイスのセットアップ(1 つのスマートフォン デバイスと 1 つのウェアラブル デバイス)の構成ファイルの例を以下に示します。

{
  "instances": [
    {
      "@import": "phone",
      "vm": {
        "memory_mb": 8192,
        "setupwizard_mode": "OPTIONAL",
        "cpus": 4
      },
      "disk": {
        "default_build": "/home/username/devices/cf_x86_64_phone-userdebug"
      }
    },
    {
      "@import": "wearable",
      "vm": {
        "memory_mb": 8192,
        "setupwizard_mode": "REQUIRED",
        "cpus": 4
      },
      "disk": {
        "default_build": "/home/username/devices/cf_gwear_x86-userdebug"
      }
    }
  ]
}

次の表では、2 つのデバイスの設定例で使用されている要素について説明します。

要素 タイプ 説明
instances 配列 JSON オブジェクトの配列で、各オブジェクトは、起動されるデバイスのマルチテナント グループ内の 1 つのデバイスを表しています。
@import 文字列 デバイスの種類を指定し、デバイス設定のデフォルト値を設定します。サポートされるデバイスの種類は phonewearable です。
vm オブジェクト デバイス インスタンスに固有の VM 環境に適用されるプロパティを指定します。
memory_mb 数値 特定の VM に割り当てられるメモリ容量(MB 単位)。
setupwizard_mode 文字列 デバイスの初回の実行時にユーザー向けにデバイス設定ウィザードを実行するかどうかを指定します。設定ウィザード モードでサポートされるオプションは、DISABLEDOPTIONALREQUIRED です。
cpus 数値 VM に割り当てられる仮想 CPU の数。
disk オブジェクト 1 つの VM インスタンスを実行するために使用されるファイル システム アーティファクトの検索に関連するプロパティを指定します。
default_build 文字列 Cuttlefish 仮想デバイス イメージを含むフォルダへのローカル ファイル システムのパス。

cvd で配布されている構成ファイルの例について詳しくは、Cuttlefish コードツリーの cvd_test_configs フォルダを参照してください。

マルチテナントのインスタンスを管理する

このセクションでは、マルチテナントのシナリオでデバイスを作成する方法と破棄する方法について説明します。以下の方法を使用して複数の Cuttlefish デバイスを起動できます。

  • 正規設定: 起動するインスタンスのリストを記述した JSON 構成ファイルを使用して、各デバイスのカスタマイズされた設定を起動します。
  • 1 つのゲストイメージ: 1 つのゲストイメージから複数のデバイスを起動します。

正規設定から複数の VM を起動する

マルチテナントのシナリオを記述した正規設定を使用して複数の VM を作成するには、次のように --config_file= フラグの接頭辞を指定して cvd create コマンドを呼び出します。

cvd create --config_file=CONFIG_FILE

/etc/phone.json という名前の正規設定ファイルを参照して呼び出す例を以下に示します。

cvd create --config_file=/etc/phone.json

1 つのゲストイメージから複数の VM を起動する

1 つのゲストイメージを使用して複数の Cuttlefish デバイスを起動するには、--num_instances=N フラグを使用します(N は、起動するデバイスの数)。デフォルトでは、インスタンス番号が 1 のデバイスから起動されます。

cvd create --num_instances=N

開始インスタンス番号を変更するには、次のいずれかを行います。

  • 開始インスタンス番号として N を指定した --base_instance_num=N フラグを追加します。

    cvd create --base_instance_num=N
    
  • ユーザー アカウントが vsoc-NN と一致する Cuttlefish を起動します(NN は、2 桁の形式のベース インスタンス番号)。たとえば、ユーザー アカウントが vsoc-01 の Cuttlefish を起動するには、次のコマンドを実行します。

    cvd create --base_instance_num=1
    

デバイスの停止方法

前回の cvd create 呼び出しで起動されたすべてのデバイスを停止するには、次のコマンドを実行します。

cvd stop

停止していたデバイスを再起動するには、次のコマンドを実行します

cvd start

システムからデバイスを完全に削除するには、次のコマンドを実行します。

cvd remove