Settlefish: architecture mutualisée

L'architecture mutualisée de Cuttlefish permet à votre machine hôte de lancer plusieurs appareils invités virtuels avec un seul appel de lancement.

Ces multiples machines virtuelles Cuttlefish peuvent partager certaines des ressources disque de l'hôte, ce qui vous permet de conserver de l'espace disque. Chaque machine virtuelle obtient une superposition de disque distincte couvrant les partitions Android (par exemple, super, userdata, boot). Toute modification apportée au disque invité est placée dans une superposition de disque spécifique à l'invité, donnant à chaque machine virtuelle Cuttlefish une vue de copie sur écriture de ses partitions de disque. À mesure que chaque appareil virtuel écrit plus de données sur 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é nettoyage à haute pression.

Numéros d'instance

Les appareils Cuttlefish créent et consomment des ressources sur l'hôte associées à leur numéro d'instance. Par exemple, une connexion adb est exposée via un socket de serveur TCP sur le 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éé sur le 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éalloqué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 ce comportement, 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 Settlefish au format JSON. Vous pouvez créer des fichiers JSON de configuration canonique pour décrire la configuration de plusieurs appareils Cuttlefish dans un scénario mutualisé.

Vous trouverez ci-dessous le format utilisé pour les fichiers JSON de configuration canonique (remplacez les espaces réservés par les configurations d'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 appareil connecté :

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

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

Element Type Description
instances Tableau Tableau d'objets JSON, chacun décrivant un seul appareil du groupe multi-tenant d'appareils à 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 d'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 pertinentes pour localiser les artefacts de système de fichiers utilisés pour exécuter une instance de VM unique.
default_build Chaîne Chemin d'accès au système de fichiers local vers un dossier contenant une image d'appareil virtuel Cuttlefish.

Pour en savoir plus sur les exemples de fichiers de configuration distribués avec cvd, consultez le dossier cvd_test_configs dans l'arborescence de code de Cuttlefish.

Contrôler les instances mutualisées

Cette section explique comment créer et détruire des appareils dans un scénario mutualisé. 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 d'invité unique: lancez plusieurs appareils à partir d'une seule image d'invité.

Démarrer plusieurs VM à partir de la configuration canonique

Pour créer plusieurs VM à l'aide d'une configuration canonique qui décrit le scénario multi-tenant, 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 à partir du numéro d'instance 1.

cvd create --num_instances=N

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

  • Ajoutez l'option --base_instance_num=N avec N comme numéro de première 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 à 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 :

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