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 devicelaunch_cvd
# Make some modifications to the deviceadb shell touch /storage/self/primary/Documents/hello
# Check the device stateadb shell ls /storage/self/primary/Documents
À partir de ce point de départ, vous pouvez utiliser les flux de redémarrage et de réinitialisation suivants:
- Si l'appareil répond, effectuez un redémarrage propre à l'aide de
adb reboot
. - Si l'appareil ne répond pas, effectuez un redémarrage non propre à l'aide de
restart_cvd
. - Réinitialisez l'état de l'appareil à l'aide de
powerwash_cvd
. - Arrêtez l'appareil et modifiez les arguments
launch_cvd
tout en conservant l'état de l'appareil ou en effaçant l'état de l'appareil de manière forcée.
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 disques qcow2. Par défaut, Cuttlefish traite les disques d'origine en lecture seule et utilise des superpositions pour capturer les écritures sur le 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. Cuttlefish recrée de force les superpositions lorsqu'il détecte des modifications incompatibles.
La recréation forcée des superpositions n'est pas souhaitable 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, en installant une application avec une configuration utilisateur particulière, puis en remplaçant plusieurs fois le kernel pour tester l'interaction entre l'application et les différents builds du kernel. Dans ce cas, il peut être utile 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établir l'état d'un appareil Cuttlefish sur son disque d'origine, 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 qu'elle ait terminé son 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 non propre et arrête l'appareil.
L'ajout de --resume=false
à launch_cvd
permet à Cuttlefish de détruire tous les fichiers liés à l'instance précédemment exécutée avant de démarrer l'exécution suivante. Vous pouvez ajouter des options launch_cvd
supplémentaires sans risque.
Dans une configuration multi-tenant, 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
effectue la procédure de mise hors service complète de l'appareil, synchronise les modifications apportées au disque et s'assure que les processus sont arrêtés. Les processus hôtes de Cuttlefish ne sont pas impliqués. Cette procédure peut ne pas être disponible si l'appareil est dans un état incorrect et ne répond plus.
Pour redémarrer un seul appareil Cuttlefish dans une configuration multi-tenant, spécifiez le numéro de série de l'appareil cible lorsque vous exécutez 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:
restart_cvd
restart_cvd
effectue un arrêt non propre en éteignant instantanément l'appareil Cuttlefish. restart_cvd
équivaut à déconnecter 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 à l'aide de différents indicateurs launch_cvd
Pour arrêter un ou plusieurs appareils et les relancer avec différents 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 dans un état de veille qui peut être redémarré ultérieurement avec 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 de manière sécurisée sur le disque, 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 mise en page du disque incompatible avec l'implémentation de la copie sur écriture, launch_cvd
ignore les anciennes modifications de 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éinitialisation 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.
Passer de --use_overlay=false
à la valeur par défaut peut entraîner des erreurs de compatibilité. Pour nettoyer de force l'état précédent de l'appareil, exécutez:
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 externes 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 lorsque vous lancez 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 vous assurer qu'aucune perte de données ne se produit 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 le premier indicateur launch_cvd
inclut l'argument --kernel_path=KERNEL_PATH
, la deuxième invocation launch_cvd
doit également inclure le même argument --kernel_path=KERNEL_PATH
, sinon les modifications apportées au système de fichiers avant stop_cvd
sont perdues lors de la deuxième invocation launch_cvd
. Le fichier référencé par KERNEL_PATH
doit également avoir le même contenu.
Certains indicateurs peuvent être modifié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
.
Options 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
Options pouvant être modifiées
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