Cuttlefish: architecture mutualisée

La multitenance Cuttlefish permet à votre machine hôte de lancer plusieurs appareils virtuels invités avec une seule invocation de lancement.

Ces multiples machines virtuelles Cuttlefish peuvent partager certaines ressources de disque hôte, ce qui vous permet d'économiser de l'espace disque. Chaque machine virtuelle reçoit un recouvrement de disque distinct couvrant les partitions Android (telles que super, userdata, boot). Toute modification apportée au disque invité est placée dans un recouvrement de disque spécifique à l'invité, ce qui donne à chaque machine virtuelle Cuttlefish une vue en copie sur écriture de ses partitions de disque. À mesure que chaque appareil virtuel écrit davantage de données dans sa vue du disque, la taille des fichiers de superposition sur le disque hôte augmente, car ils capturent le delta entre l'état d'origine et leur état actuel.

Les fichiers de superposition peuvent être réinitialisés pour rétablir l'état d'origine du disque Cuttlefish. Ce processus est appelé réinitialisation.

Numéros d'instance

Les appareils Cuttlefish créent et consomment des ressources sur l'hôte associé à leur numéro d'instance. Par exemple, une connexion adb est exposée via un socket de serveur TCP au port 6520 pour l'appareil Cuttlefish avec le numéro d'instance 1. Lorsque plusieurs instances sont lancées, un socket de serveur TCP est créé au port 6520 pour le premier appareil, 6521 pour le deuxième appareil, et le numéro de port est incrémenté pour chaque appareil supplémentaire.

Modifier le nombre maximal d'instances compatibles

Les ressources côté hôte, telles que les périphériques réseau TAP, doivent être préallouées pour les machines virtuelles Cuttlefish. Par défaut, le package Debian cuttlefish-base provisionne des ressources pour les numéros d'instance 1 à 10.

Pour modifier cette valeur, modifiez num_cvd_accounts dans /etc/default/cuttlefish-host-resources et redémarrez le service cuttlefish-host-resources en exécutant la commande suivante :

sudo systemctl restart cuttlefish-host-resources

Configurations canoniques

Les configurations canoniques représentent la configuration des appareils Cuttlefish au format JSON. Vous pouvez créer des fichiers JSON de configuration canoniques pour décrire la configuration de plusieurs appareils Cuttlefish dans un scénario multitenant.

La section suivante décrit le format utilisé pour les fichiers JSON de configuration canonique (remplacez les espaces réservés par les configurations de l'appareil).

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

Voici un exemple de fichier de configuration d'une configuration avec deux appareils, un téléphone et un wearable :

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

Ce tableau décrit les éléments utilisés dans l'exemple de configuration avec deux appareils :

Element Saisie Description
instances Tableau Tableau d'objets JSON, chacun décrivant un seul appareil dans le groupe d'appareils multilocataires à lancer.
@import Chaîne Indique le type d'appareil et définit les valeurs par défaut pour la configuration de l'appareil. Les types d'appareils compatibles sont phone et wearable.
vm Objet Spécifie les propriétés qui s'appliquent à l'environnement de VM spécifique à l'instance de l'appareil.
memory_mb Nombre Quantité de mémoire à allouer à une VM spécifique, en mégaoctets.
setupwizard_mode Chaîne Indique si l'assistant de configuration de l'appareil est exécuté pour l'utilisateur lors de la première exécution de l'appareil. Les options compatibles pour le mode Assistant de configuration sont DISABLED, OPTIONAL et REQUIRED.
cpus Nombre Nombre de processeurs virtuels alloués à la VM.
disk Objet Spécifie les propriétés permettant de localiser les artefacts du système de fichiers utilisés pour exécuter une seule instance de VM.
default_build Chaîne Chemin d'accès au système de fichiers local vers un dossier contenant une image de périphérique virtuel Cuttlefish.

Pour obtenir d'autres exemples de fichiers de configuration distribués avec cvd, consultez le dossier cvd_test_configs dans l'arborescence du code Cuttlefish.

Contrôler les instances mutualisées

Cette section explique comment créer et supprimer des appareils dans un scénario multitenant. Vous pouvez lancer plusieurs appareils Cuttlefish à l'aide des options suivantes :

  • Configuration canonique : lancez des configurations personnalisées pour chaque appareil à l'aide d'un fichier de configuration JSON décrivant la liste des instances à lancer.
  • Image invitée unique : lancez plusieurs appareils à partir d'une seule image invitée.

Démarrer plusieurs VM à partir d'une configuration canonique

Pour créer plusieurs VM à l'aide d'une configuration canonique décrivant le scénario multitenant, appelez la commande cvd create avec le préfixe d'option --config_file= comme suit :

cvd create --config_file=CONFIG_FILE

Voici un exemple d'appel faisant référence à un fichier de configuration canonique nommé /etc/phone.json.

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

Démarrer plusieurs VM à partir d'une seule image invitée

Pour lancer plusieurs appareils Cuttlefish à l'aide d'une seule image invitée, utilisez l'indicateur --num_instances=N, où N correspond au nombre d'appareils à lancer. Par défaut, les appareils commencent par le numéro d'instance 1.

cvd create --num_instances=N

Pour modifier le numéro de l'instance de départ, effectuez l'une des opérations suivantes :

  • Ajoutez l'indicateur --base_instance_num=N avec N comme premier numéro d'instance.

    cvd create --base_instance_num=N
    
  • Lancez Cuttlefish avec un compte utilisateur correspondant à vsoc-NN, où NN est le numéro d'instance de base au format à deux chiffres. Par exemple, pour lancer Cuttlefish avec un compte utilisateur vsoc-01, exécutez la commande suivante :

    cvd create --base_instance_num=1
    

Arrêter des appareils

Pour arrêter tous les appareils lancés par la dernière invocation cvd create, exécutez la commande suivante :

cvd stop

Pour redémarrer les appareils qui ont été arrêtés, exécutez la commande suivante :

cvd start

Pour supprimer complètement un appareil du système, exécutez la commande suivante :

cvd remove