Cuttlefish: Función multiusuario

La función multiusuario de Cuttlefish permite que tu máquina anfitrión inicie varios dispositivos virtuales de invitado con una sola invocación de inicio.

Estas máquinas virtuales de Cuttlefish pueden compartir algunos de los recursos del disco host, lo que te permite ahorrar espacio. Cada máquina virtual obtiene una superposición de disco distinta que cubre las particiones de Android (como super, userdata y boot). Cualquier modificación que se haga en el disco de invitado se ubica en una superposición de disco específica de invitado, lo que le da a cada máquina virtual de Cuttlefish una vista de copia en escritura de las particiones del disco. A medida que cada dispositivo virtual escribe más datos en su vista del disco, aumenta el tamaño de los archivos superpuestos en el disco de host, dado que capturan el delta entre el estado original y el actual.

Los archivos superpuestos se pueden restablecer para que el disco de Cuttlefish vuelva a su estado original. Este proceso se conoce como Powerwash.

Números de instancia

Los dispositivos Cuttlefish crean y utilizan recursos en el host vinculado a su número de instancia. Por ejemplo, una conexión adb se expone a través de un socket del servidor del TCP en el puerto 6520 para el dispositivo Cuttlefish que tiene el número de instancia 1. Cuando se inician varias instancias, se crea un socket del servidor del TCP en el puerto 6520 para el primer dispositivo, 6521 para el segundo y, para cada dispositivo adicional, se aumenta el número de puerto.

Modificar la cantidad máxima de instancias compatibles

Los recursos del host, como los dispositivos de la red TAP, se deben asignar con antelación para las máquinas virtuales Cuttlefish. De forma predeterminada, el paquete cuttlefish-base de Debian aprovisiona recursos para los números de instancia entre 1 y 10.

Esto se puede cambiar si modificas num_cvd_accounts en /etc/default/cuttlefish-host-resources y reinicias el servicio cuttlefish-host-resources mediante el siguiente comando:

sudo systemctl restart cuttlefish-host-resources

Configuraciones canónicas

Las configuraciones canónicas representan la configuración de dispositivos Cuttlefish en formato JSON. Puedes crear archivos JSON de configuración canónica para describir la configuración de varios dispositivos Cuttlefish en una situación de varios inquilinos.

A continuación, se describe el formato que se usa para los archivos JSON de configuración canónicos (reemplaza los marcadores de posición por las configuraciones del dispositivo).

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

El siguiente es un ejemplo de archivo de configuración de una configuración con dos dispositivos, un teléfono y un 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"
      }
    }
  ]
}

En esta tabla, se describen los elementos usados en la configuración de ejemplo con dos dispositivos:

Elemento Tipo Descripción
instances Arreglo Es un array de objetos JSON, cada uno de los cuales describe un solo dispositivo en el grupo de dispositivos multiusuario que se lanzará.
@import String Indica el tipo de dispositivo y establece valores predeterminados para su configuración. Los tipos de dispositivos compatibles son phone y wearable.
vm Objeto Especifica las propiedades que se aplican al entorno de la VM específico de la instancia del dispositivo.
memory_mb Número Es la cantidad de memoria que se asignará a una VM específica, en megabytes.
setupwizard_mode String Especifica si se ejecuta el asistente de configuración del dispositivo para el usuario en la primera ejecución del dispositivo. Las opciones admitidas para el modo de asistente de configuración son DISABLED, OPTIONAL y REQUIRED.
cpus Número La cantidad de CPU virtuales asignadas a la VM.
disk Objeto Especifica las propiedades relevantes para ubicar los artefactos del sistema de archivos que se usan en la ejecución de una sola instancia de VM.
default_build String Ruta del sistema de archivos local a una carpeta que contiene una imagen de dispositivo virtual Cuttlefish.

Para obtener más ejemplos de archivos de configuración distribuidos con cvd, consulta la carpeta cvd_test_configs en el árbol de código de Cuttlefish.

Cómo controlar instancias de multiusuario

En esta sección, se describe cómo crear y destruir dispositivos en una situación multiusuario. Puedes iniciar varios dispositivos Cuttlefish con las siguientes opciones:

  • Configuración canónica: Inicia configuraciones personalizadas para cada dispositivo con un archivo de configuración JSON que describe la lista de instancias que se iniciarán.
  • Una sola imagen de invitado: Inicia varios dispositivos desde una sola imagen de invitado.

Inicia varias VMs desde la configuración canónica

Para crear varias VMs con una configuración canónica que describa la situación de varios inquilinos, invoca el comando cvd create con el prefijo de marca --config_file= de la siguiente manera:

cvd create --config_file=CONFIG_FILE

El siguiente es un ejemplo de invocación que hace referencia a un archivo de configuración canónico llamado /etc/phone.json.

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

Inicia varias VMs a partir de una sola imagen de invitado

Para iniciar varios dispositivos de Cuttlefish con una sola imagen de invitado, usa la marca --num_instances=N, donde N es la cantidad de dispositivos que se iniciarán. De forma predeterminada, los dispositivos se inician desde el número de instancia 1.

cvd create --num_instances=N

Para cambiar ese número de inicio, realiza una de las siguientes acciones:

  • Agrega la marca --base_instance_num=N, con N como primer número de instancia.

    cvd create --base_instance_num=N
    
  • Inicia Cuttlefish con una cuenta de usuario que coincida con vsoc-NN (NN es el número de instancia base en formato de dos dígitos). Por ejemplo, para iniciar Cuttlefish con la cuenta de usuario vsoc-01, ejecuta lo siguiente:

    cvd create --base_instance_num=1
    

Cómo detener dispositivos

Para detener todos los dispositivos que se iniciaron con la última invocación de cvd create, ejecuta lo siguiente:

cvd stop

Para reiniciar dispositivos que se detuvieron, ejecuta lo siguiente:

cvd start

Para quitar un dispositivo por completo del sistema, ejecuta lo siguiente:

cvd remove