Cuttlefish:多租户

Cuttlefish 多租户允许您的主机通过一次启动调用来启动多个虚拟客户设备。

这些多台 Cuttlefish 虚拟机可以共享部分主机磁盘资源,从而节省磁盘空间。每台虚拟机都会获得一个不同的磁盘覆盖层,覆盖 Android 分区(例如 superuserdataboot)。对客户磁盘的任何修改都将放在特定于客户的磁盘覆盖层中,从而为每台 Cuttlefish 虚拟机提供其磁盘分区的写时复制视图。随着每台虚拟设备向其磁盘视图写入更多数据,主机磁盘上的覆盖文件的大小也会增加,因为它们捕获了原始状态与其当前状态之间的差异。

可以重置覆盖文件,以将 Cuttlefish 磁盘恢复到其原始状态。此过程称为强力清空

实例编号

Cuttlefish 设备会在主机上创建和使用与其实例编号相关的资源。例如,对于实例编号为 1 的 Cuttlefish 设备,adb 连接通过端口 6520 上的 TCP 服务器套接字公开。当启动多个实例时,它会为第一个设备创建一个端口为 6520 的 TCP 服务器套接字,为第二个设备创建一个端口为 6521 的 TCP 服务器套接字,并为每个额外的设备递增端口号。

修改支持的最大实例数

主机端资源(例如 TAP 网络设备)必须为 Cuttlefish 虚拟机预先分配。cuttlefish-base Debian 软件包默认会为实例编号 110 配置资源。

可以通过修改 /etc/default/cuttlefish-host-resources 中的 num_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
    }
  ]
}

以下是包含两台设备(一部手机设备和一台可穿戴设备)的设置的示例配置文件

{
  "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"
      }
    }
  ]
}

下表介绍了示例配置(包含两台设备)中使用的元素

元素 类型 说明
实例 数组 JSON 对象数组,每个对象描述要启动的多租户设备组中的单个设备。
@import 字符串 指示设备类型并为设备配置设置默认值。支持的设备类型为 phonewearable
vm 对象 指定适用于特定于设备实例的 VM 环境的属性。
memory_mb 数字 要为特定 VM 分配的内存量(以兆字节为单位)。
setupwizard_mode 字符串 指定在首次运行设备时是否为用户运行设备设置向导。设置向导模式支持的选项包括 DISABLEDOPTIONALREQUIRED
cpus 数字 分配给 VM 的虚拟 CPU 数量。
disk 对象 指定与查找用于运行单个 VM 实例的文件系统工件相关的属性。
default_build 字符串 包含 Cuttlefish 虚拟设备映像的文件夹的本地文件系统路径。

如需查看与 cvd 一起分发的配置文件的更多示例,请参阅 Cuttlefish 代码树中的 cvd_test_configs 文件夹。

控制多租户实例

本部分介绍如何在多租户场景中创建和销毁设备。您可以使用以下选项启动多台 Cuttlefish 设备

  • 规范配置:使用 JSON 配置文件(描述要启动的实例列表)为每台设备启动自定义配置。
  • 单个客户映像:从单个客户映像启动多台设备。

从规范配置启动多个 VM

要使用描述多租户场景的规范配置创建多个 VM,请使用 --config_file= 标志前缀调用 cvd create 命令,如下所示

cvd create --config_file=CONFIG_FILE

以下是引用名为 /etc/phone.json 的规范配置文件的示例调用。

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

从单个客户映像启动多个 VM

要使用单个客户映像启动多台 Cuttlefish 设备,请使用 --num_instances=N 标志,其中 N 是要启动的设备数量。默认情况下,设备从实例编号 1 开始。

cvd create --num_instances=N

要更改起始实例编号,请执行以下操作之一

  • 添加 --base_instance_num=N 标志,其中 N 是第一个实例编号。

    cvd create --base_instance_num=N
    
  • 使用与 vsoc-NN 匹配的用户帐号启动 Cuttlefish,其中 NN 是两位数形式的基本实例编号。例如,要使用用户帐号 vsoc-01 启动 Cuttlefish,请运行

    cvd create --base_instance_num=1
    

如何停止设备

要停止上次 cvd create 调用启动的所有设备,请运行

cvd stop

要重启已停止的设备,请运行

cvd start

要从系统中完全移除设备,请运行

cvd remove