Seiche: redémarrer et réinitialiser

Cette page explique comment redémarrer et réinitialiser les appareils virtuels Cuttlefish. La réinitialisation de l'état initial du disque d'un appareil Cuttlefish est appelée nettoyage dans l'outil de ligne de commande.

Lorsque vous exécutez des workflows automatisés ou manuels avec plusieurs procédures différentes, telles que des suites de tests, réinitialiser l'appareil Cuttlefish entre les procédures garantit que le comportement de chaque procédure est indépendant. Si l'état du disque n'est pas réinitialisé, une procédure peut affecter le comportement de la procédure suivante.

Les procédures de redémarrage et de réinitialisation décrites sur cette page supposent que vous avez créé un appareil Cuttlefish et que vous avez défini un état sur le disque.

# Launch a device
launch_cvd
# Make some modifications to the device
adb shell touch /storage/self/primary/Documents/hello
# Check the device state
adb shell ls /storage/self/primary/Documents

À partir de ce point de départ, vous pouvez utiliser les procédures de redémarrage et de réinitialisation suivantes:

Implémentation de la réinitialisation rapide de Cuttlefish

Cuttlefish utilise une implémentation de réinitialisation rapide qui dépend de la protection des disques derrière les superpositions de disque qcow2. Par défaut, Cuttlefish traite les disques d'origine en lecture seule et utilise des superpositions pour capturer les écritures sur disque.

Toutefois, l'utilisation de superpositions de type "copie sur écriture" présente des inconvénients. En particulier, les modifications externes apportées aux disques sous-jacents rompent la compatibilité avec les superpositions existantes et entraînent un état de disque incohérent. Settlefish recrée de force les superpositions lorsqu'il détecte des modifications incompatibles.

Il est déconseillé de recréer de force les superpositions lorsque vous développez une fonctionnalité qui nécessite de conserver une partie du disque dans un état d'initialisation particulier tout en remplaçant une autre partie du disque. Par exemple, vous pouvez installer une application avec une configuration utilisateur particulière, puis changer de noyau à plusieurs reprises pour tester l'interaction entre l'application et les différentes versions du noyau. Dans ce cas, il peut être judicieux de désactiver les superpositions.

Réinitialiser les appareils

Les sections suivantes décrivent comment rétablir l'état initial du disque d'un appareil Cuttlefish.

Réinitialiser un appareil

Pour réinitialiser un appareil Cuttlefish sur son état de disque initial, exécutez la commande suivante:

powerwash_cvd

powerwash_cvd arrête la machine virtuelle, réinitialise toutes les modifications apportées au disque de la machine virtuelle, redémarre la machine virtuelle et attend la fin du démarrage. L'instance conserve les indicateurs d'origine attribués à launch_cvd.

Dans une configuration multi-tenant, powerwash_cvd redémarre une seule instance du groupe d'instances :

powerwash_cvd --instance_num=N

Réinitialiser tous les appareils

Pour arrêter un ou plusieurs appareils et réinitialiser leur état de disque initial, exécutez la commande suivante :

stop_cvd
launch_cvd --resume=false

stop_cvd effectue un arrêt incorrect et arrête l'appareil.

L'ajout de --resume=false à launch_cvd oblige Cuttlefish à détruire tous les fichiers liés à l'instance en cours d'exécution avant de lancer l'exécution suivante. Vous pouvez ajouter des options launch_cvd supplémentaires sans risque.

Dans une configuration mutualisée, stop_cvd arrête l'ensemble du groupe d'instances.

Redémarrer les appareils

Les sections suivantes décrivent comment redémarrer un appareil sans rétablir son état de disque initial.

Redémarrage propre

Pour redémarrer l'appareil de manière propre lorsqu'il est réactif, exécutez la commande suivante :

adb reboot

adb reboot fait suivre la procédure d'arrêt complet de l'appareil, en synchronisant les modifications sur le disque et en s'assurant que les processus s'arrêtent. Les processus hôtes seiches ne sont pas impliqués. Cette procédure peut être indisponible si l'état de l'appareil est incorrect et ne répond plus.

Pour effectuer un redémarrage propre d'un seul appareil Cuttlefish dans une configuration mutualisée, spécifiez le numéro de série de l'appareil cible lors de l'exécution de adb-reboot. Si aucun appareil cible n'est spécifié, adb ne redémarre aucun appareil.

adb -s SERIAL reboot

Redémarrage incorrect

Pour effectuer un redémarrage non propre lorsque l'appareil ne répond pas, exécutez la commande suivante :

restart_cvd

restart_cvd effectue un arrêt non propre en éteignant instantanément l'appareil Cuttlefish. restart_cvd équivaut à débrancher et reconnecter la batterie à un appareil physique. Les écritures sur disque peuvent ne pas persister si elles étaient en cours. restart_cvd attend que l'appareil ait complètement redémarré avant de s'arrêter.

Dans une configuration multi-tenant, restart_cvd redémarre une seule instance du groupe d'instances. Pour spécifier l'instance Cuttlefish à redémarrer, utilisez l'option instance_num.

restart_cvd --instance_num=N

Si --instance_num n'est pas utilisé, le numéro d'instance est défini par défaut sur 1.

Redémarrer avec d'autres indicateurs launch_cvd

Pour arrêter un ou plusieurs appareils et les relancer avec d'autres indicateurs launch_cvd, exécutez la commande suivante:

stop_cvd
launch_cvd NEW_FLAG

stop_cvd effectue un arrêt non propre semblable à restart_cvd. L'appareil reste inactif et peut être redémarré ultérieurement à l'aide d'une autre commande launch_cvd. Comme avec restart_cvd, les écritures sur disque peuvent ne pas persister si elles ne sont pas entièrement synchronisées avec le disque. Pour enregistrer des données sur le disque de manière sécurisée, exécutez d'abord adb reboot.

adb reboot
stop_cvd
launch_cvd NEW_FLAG

Si les modifications apportées aux indicateurs launch_cvd forcent une modification de la disposition du disque qui n'est pas compatible avec l'implémentation de la copie en écriture, launch_cvd ignore les anciennes modifications du disque et rétablit l'état d'origine du disque. Pour obtenir la liste complète des options, consultez la section Options.

Exécuter sans superposition

Pour désactiver la prise en charge du rétablissement rapide, exécutez la commande suivante :

launch_cvd --use_overlay=false

--use_overlay=false traite les fichiers de disque Cuttlefish en mode lecture-écriture, et les modifications sont propagées dans ces fichiers.

Le fait de passer de --use_overlay=false à la valeur par défaut peut entraîner des erreurs de compatibilité. Pour forcer le nettoyage de l'état précédent de l'appareil, exécutez la commande suivante:

stop_cvd
rm $HOME/cuttlefish $HOME/cuttlefish_runtime $HOME/cuttlefish_assembly

Cuttlefish ne peut pas gérer de manière sécurisée la transition entre les flux avec et sans superpositions. Cette modification supprime donc tout l'état de gestion de Cuttlefish. Si des fichiers de disque externe sont modifiés et réutilisés plus tard avec des superpositions, les modifications précédentes sont considérées comme faisant partie de l'état de référence.

Drapeaux

Vous pouvez ajouter des arguments à l'aide d'indicateurs lors du lancement d'un appareil Cuttlefish à l'aide de launch_cvd. Toutefois, pour certains indicateurs (indicateurs qui doivent rester identiques), une perte de données peut se produire si les indicateurs sont modifiés entre les commandes launch_cvd. Pour éviter toute perte de données lors de l'exécution d'une séquence de commandes incluant launch_cvd, stop_cvd, puis à nouveau launch_cvd, utilisez les mêmes options pour chaque commande launch_cvd. Par exemple, si la première option launch_cvd inclut l'argument --kernel_path=KERNEL_PATH, le deuxième appel launch_cvd doit également inclure le même argument --kernel_path=KERNEL_PATH, sinon toutes les modifications du système de fichiers apportées avant stop_cvd seront perdues lors du deuxième appel launch_cvd. Le fichier référencé par KERNEL_PATH doit également avoir le même contenu.

Certains indicateurs peuvent être basculés sans risque entre les appels launch_cvd. Les sections suivantes répertorient les indicateurs qui doivent rester identiques pour éviter toute perte de données et les indicateurs qui peuvent être modifiés sans risque. Pour en savoir plus sur les indicateurs individuels, consultez la source (flags.cc, disk_flags.cc) ou exécutez launch_cvd --help.

Indicateurs qui doivent rester identiques

Pour éviter toute perte de données, ces indicateurs doivent rester les mêmes d'une invocation launch_cvd à l'autre :

  • --data_policy
  • --blank_data_image_mb
  • --kernel_path
  • --initramfs_path
  • --vm_manager
  • --enable_minimal_mode
  • --bootloader
  • --protected_vm
  • --userdata_format
  • --use_overlay
  • --system_image_dir
  • --boot_image
  • --init_boot_image
  • --data_image
  • --super_image
  • --misc_image
  • --misc_info_txt
  • --metadata_image
  • --vendor_boot_image
  • --vbmeta_image
  • --vbmeta_system_image
  • --linux_kernel_path
  • --linux_initramfs_path
  • --linux_root_image
  • --fuchsia_zedboot_path
  • --fuchsia_multiboot_bin_path
  • --fuchsia_root_image
  • --custom_partition_path
  • --blank_metadata_image_mb

Indicateurs pouvant être modifiés

Ces indicateurs peuvent être modifiés en toute sécurité entre les appels launch_cvd sans entraîner de perte de données :

  • --displays_textproto
  • --displays_binproto
  • --cpus
  • --gdb_port
  • --display0
  • --display1
  • --display2
  • --display3
  • --x_res
  • --y_res
  • --dpi
  • --refresh_rate_hz
  • --extra_kernel_cmdline
  • --extra_bootconfig_args
  • --guest_enforce_security
  • --memory_mb
  • --serial_number
  • --use_random_serial
  • --gpu_mode
  • --hwcomposer
  • --gpu_capture_binary
  • --enable_gpu_udmabuf
  • --enable_gpu_angle
  • --use_allocd
  • --pause_in_bootloader
  • --enable_host_bluetooth
  • --rootcanal_instance_num
  • --rootcanal_args
  • --netsim
  • --netsim_bt
  • --bluetooth_controller_properties_file
  • --bluetooth_commands_file
  • --enable_sandbox
  • --seccomp_policy_dir
  • --start_webrtc
  • --webrtc_assets_dir
  • --webrtc_certs_dir
  • --start_webrtc_sig_server
  • --webrtc_sig_server_addr
  • --webrtc_sig_server_port
  • --tcp_port_range
  • --udp_port_range
  • --webrtc_sig_server_path
  • --webrtc_sig_server_secure
  • --verify_sig_server_certificate
  • --webrtc_device_id
  • --uuid
  • --daemon
  • --setupwizard_mode
  • --enable_bootanimation
  • --qemu_binary_dir
  • --crosvm_binary
  • --gem5_binary_dir
  • --gem5_checkpoint_dir
  • --gem5_debug_file
  • --gem5_debug_flags
  • --restart_subprocesses
  • --enable_vehicle_hal_grpc_server
  • --boot_slot
  • --num_instances
  • --report_anonymous_usage_stats
  • --ril_dns
  • --kgdb
  • --start_gnss_proxy
  • --gnss_file_path
  • --fixed_location_file_path
  • --enable_modem_simulator
  • --modem_simulator_sim_type
  • --console
  • --enable_kernel_log
  • --vhost_net
  • --vhost_user_mac80211_hwim
  • --wmediumd_config
  • --ap_rootfs_image
  • --ap_kernel_image
  • --record_screen
  • --smt
  • --vsock_guest_cid
  • --secure_hals
  • --use_sdcard
  • --enable_audio
  • --camera_server_port
  • --modem_simulator_count
  • --blank_sdcard_image_mb
  • --adb_mode