Cuttlefish: arquitetura multi-tenancy

A possibilidade de ter vários locatários no Cuttlefish permite que sua máquina host inicie vários dispositivos virtuais convidados com uma única invocação de inicialização.

Essas várias máquinas virtuais do Cuttlefish podem compartilhar alguns recursos do disco do host, permitindo economizar espaço no disco. Cada máquina virtual recebe uma cobertura de sobreposição de disco distinta, que inclui as partições do Android (como super, userdata, boot). Qualquer modificação no disco do convidado é colocada em uma sobreposição de disco específica do convidado, permitindo que cada máquina virtual do Cuttlefish tenha uma visualização copy-on-write das partições do disco. À medida que cada dispositivo virtual grava mais dados na visualização do disco, os arquivos de sobreposição no disco do host aumentam de tamanho, porque capturam o delta entre o estado original e o atual.

Os arquivos de sobreposição podem ser redefinidos para retornar o disco do Cuttlefish ao estado original. Esse processo é conhecido como Powerwash:

Números de instância

Os dispositivos Cuttlefish criam e consomem recursos no host vinculado ao número da instância. Por exemplo, uma conexão adb é exposta por um soquete de servidor TCP na porta 6520 para o dispositivo Cuttlefish com número de instância 1. Quando várias instâncias são iniciadas, ele cria um soquete de servidor TCP na porta 6520 para o primeiro dispositivo, 6521 para o segundo dispositivo e aumenta o número da porta para cada dispositivo extra.

Modificar o número máximo de instâncias com suporte

Os recursos do host, como os dispositivos de rede TAP, precisam ser pré-alocados para máquinas virtuais do Cuttlefish. Por padrão, o pacote Debian cuttlefish-base (link em inglês) provisiona recursos para os números de instância de 1 a 10.

Isso pode ser mudado ao modificar num_cvd_accounts em /etc/default/cuttlefish-host-resources e reiniciar o serviço cuttlefish-host-resources executando o seguinte comando:

sudo systemctl restart cuttlefish-host-resources

Configurações canônicas

As configurações canônicas representam a configuração de dispositivos Cuttlefish no formato JSON. É possível criar arquivos JSON de configuração canônicos para descrever a configuração de vários dispositivos Cuttlefish em um ambiente multilocatário. diferente.

Confira a seguir a descrição do formato usado para arquivos JSON de configuração canônica Substitua os marcadores de posição pelas configurações do dispositivo.

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

Veja a seguir um exemplo de arquivo de configuração de uma configuração com dois dispositivos. um smartphone e um wearable:

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

Esta tabela descreve os elementos usados no exemplo de configuração com dois dispositivos:

Elemento Tipo Descrição
instances Array Matriz de objetos JSON, cada um descrevendo um único dispositivo na grupo de dispositivos multilocatário a ser iniciado.
@import String Indica o tipo de dispositivo e define valores padrão para ele configuração do Terraform. Os tipos de dispositivos compatíveis são phone e wearable.
vm Objeto Especifica as propriedades que se aplicam ao ambiente de VM específico à instância do dispositivo.
memory_mb Número A quantidade de memória a ser alocada para uma VM específica em megabytes.
setupwizard_mode String Especifica se o assistente de configuração do dispositivo será executado para o usuário primeiro em todos os dispositivos. As opções compatíveis para o modo do assistente de configuração são DISABLED, OPTIONAL e REQUIRED
cpus Número O número de CPUs virtuais alocadas para a VM.
disk Objeto Especifica as propriedades relevantes para localizar os artefatos do sistema de arquivos usados para executar uma única instância de VM.
default_build String Caminho do sistema de arquivos local para uma pasta que contém um dispositivo virtual Cuttlefish imagem.

Para mais exemplos de arquivos de configuração distribuídos com cvd, consulte a cvd_test_configs na árvore de código do Cuttlefish.

Controlar instâncias de vários locatários

Esta seção descreve como iniciar e parar dispositivos em um cenário multilocatário. É possível iniciar vários dispositivos Cuttlefish usando as seguintes opções:

  • Configuração canônica: inicialização personalizada configurações personalizadas para cada dispositivo usando um arquivo de configuração JSON que descreve a lista de instâncias a serem iniciadas.
  • Imagem de convidado único: lance várias dispositivos a partir de uma única imagem de visitante.

Iniciar várias VMs a partir da configuração canônica

Para iniciar várias VMs usando uma configuração canônica que descreve o multilocatário, invoque o comando cvd start com o --config_file= flag, da seguinte maneira:

cvd start --config_file=CONFIG_FILE

A seguir há um exemplo de invocação que faz referência a um arquivo de configuração canônico chamado /etc/phone.json:

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

Iniciar várias VMs a partir de uma única imagem de convidado

Para iniciar vários dispositivos Cuttlefish com uma única imagem de visitante, use o Sinalização --num_instances=N, em que N é o número de dispositivos até o lançamento. Por padrão, os dispositivos começam pelo número de instância 1.

cvd start --num_instances=N

Para mudar o número de instância inicial, siga um destes procedimentos:

  • Adicione a flag --base_instance_num=N, com N como o primeiro número de instância.

    cvd start --base_instance_num=N
    
  • Inicie o Cuttlefish com uma conta de usuário correspondente a vsoc-NN, em que NN é o número de instância base com dois dígitos. Por exemplo, para iniciar o Cuttlefish com uma conta de usuário vsoc-01, execute:

    cvd start --base_instance_num=1
    

Como parar dispositivos

Para interromper todos os dispositivos iniciados pela última invocação de cvd start, execute:

cvd stop