Cuttlefish:多租户

借助 Cuttlefish 多租户功能,您的宿主机可以通过一次启动调用启动多个虚拟客户机设备。

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

叠加层文件可以重置,以将 Cuttlefish 磁盘恢复为其原始状态。此过程称为 Powerwashing

实例号

Cuttlefish 设备会在与其“实例号”相关联的主机上创建并消耗资源。例如,对于实例号为 1 的 Cuttlefish 设备,其 adb 连接会通过位于端口 6520 的 TCP 服务器端套接字进行公开。当启动多个实例时,它会在端口 6520 处为第一个设备创建 TCP 服务器端套接字,为第二个设备创建 6521,并递增每个其他设备的端口号。

修改受支持实例的数量上限

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

如需进行更改,请在 /etc/default/cuttlefish-host-resources 中修改 num_cvd_accounts,并通过执行以下命令来重启 cuttlefish-host-resources 服务:

sudo systemctl restart cuttlefish-host-resources

规范配置

规范配置以 JSON 格式表示 Cuttlefish 设备的配置。您可以创建规范配置 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"
      }
    }
  ]
}

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

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

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

控制多租户实例

本部分介绍了如何在多租户场景中启动和停止设备。您可以使用以下选项启动多个 Cuttlefish 设备:

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

通过规范配置启动多个虚拟机

如需使用描述多租户场景的规范配置启动多个虚拟机,请使用 --config_file= 标志前缀调用 cvd start 命令,如下所示:

cvd start --config_file=CONFIG_FILE

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

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

通过单个客户机映像启动多个虚拟机

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

cvd start --num_instances=N

如需更改起始实例号,请执行以下某项操作:

  • 添加 --base_instance_num=N 标志,并将 N 作为第一个实例号。

    cvd start --base_instance_num=N
    
  • 使用与 vsoc-NN 匹配的用户账号启动 Cuttlefish,其中 NN 为两位数形式的基础实例号。例如,如需使用用户账号 vsoc-01 启动 Cuttlefish,请运行以下命令:

    cvd start --base_instance_num=1
    

如何停止设备

如需停止上次 cvd start 调用启动的所有设备,请运行以下命令:

cvd stop