Cette page décrit comment redémarrer et réinitialiser les appareils virtuels Cuttlefish. La réinitialisation d’un périphérique Cuttlefish à son état de disque initial est appelée lavage sous pression dans l’outil de ligne de commande.
Lors de l'exécution de flux de travail automatisés ou manuels avec plusieurs procédures différentes, telles que des suites de tests, la réinitialisation du périphérique 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 périphérique 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
adb reboot
. - Si l'appareil ne répond pas, effectuez un redémarrage incorrect à l'aide
restart_cvd
. - Réinitialisez l'état de l'appareil à l'aide
powerwash_cvd
. - Arrêtez le périphérique et modifiez les arguments
launch_cvd
tout en conservant l'état du périphérique ou en effaçant de force l'état du périphérique .
Implémentation de la réinitialisation rapide de la seiche
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 disque.
Cependant, l'utilisation de superpositions de copie sur écriture présente des inconvénients. Notamment, les modifications externes apportées aux disques sous-jacents interrompent la compatibilité avec les superpositions existantes et provoquent un état de disque incohérent. Cuttlefish recrée de force les superpositions lorsqu'il détecte des changements incompatibles.
La recréation forcée des superpositions n'est pas souhaitable lors du développement d'une fonctionnalité qui nécessite de conserver une partie du disque dans un état initialisé particulier tout en remplaçant une partie différente du disque. Par exemple, installer une application avec une configuration utilisateur particulière, puis échanger à plusieurs reprises le noyau pour tester l'interaction entre l'application et différentes versions du noyau. Dans ce cas, cela vaut peut-être la peine de désactiver les superpositions .
Réinitialiser les appareils
Les sections suivantes décrivent les méthodes permettant de réinitialiser un périphérique Cuttlefish à son état de disque initial.
Réinitialiser un appareil
Pour réinitialiser un périphérique Cuttlefish à son état de disque initial, exécutez :
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 de son démarrage. L'instance conserve les indicateurs d'origine attribués à launch_cvd
.
Dans une configuration mutualisée , powerwash_cvd
redémarre une seule instance hors du groupe d'instances :
powerwash_cvd --instance_num=N
Réinitialiser tous les appareils
Pour arrêter et réinitialiser un ou plusieurs appareils à leur état de disque initial, exécutez :
stop_cvd
launch_cvd --resume=false
stop_cvd
effectue un arrêt incorrect et arrête le périphérique.
L'ajout --resume=false
à launch_cvd
oblige Cuttlefish à détruire tous les fichiers liés à l'instance précédemment exécutée avant de commencer l'exécution suivante. Vous pouvez ajouter en toute sécurité des indicateurs launch_cvd
supplémentaires.
Dans une configuration mutualisée , stop_cvd
arrête l'intégralité du groupe d'instances.
Redémarrer les appareils
Les sections suivantes décrivent les méthodes de redémarrage d'un périphérique sans réinitialiser le périphérique à son état de disque initial.
Redémarrage propre
Pour effectuer un redémarrage propre de l'appareil lorsque celui-ci répond, exécutez :
adb reboot
adb reboot
fait suivre à l'appareil la procédure d'arrêt complet, en synchronisant les modifications sur le disque et en s'assurant que les processus s'arrêtent. Les processus hôtes de la seiche ne sont pas impliqués. Cette procédure peut être indisponible si l'appareil est entré dans un mauvais état et ne répond plus.
Pour effectuer un redémarrage propre d'un seul appareil Cuttlefish dans une configuration multi-tenant , spécifiez le numéro de série de l'appareil cible lors de l'exécution adb-reboot
. Si aucun périphérique cible n'est spécifié, adb
ne redémarre aucun périphérique.
adb -s SERIAL reboot
Redémarrage impur
Pour effectuer un redémarrage incorrect lorsque l'appareil ne répond pas, exécutez :
restart_cvd
restart_cvd
effectue un arrêt incorrect en arrêtant instantanément le périphérique Cuttlefish. restart_cvd
équivaut à déconnecter et reconnecter la batterie à un périphérique physique. Les écritures sur disque pourraient ne pas persister si elles étaient en cours. restart_cvd
attend que le périphérique ait complètement redémarré avant de quitter.
Dans une configuration mutualisée , restart_cvd
redémarre une seule instance hors du groupe d'instances. Pour spécifier quelle instance de Cuttlefish redémarrer, utilisez l'indicateur instance_num
.
restart_cvd --instance_num=N
Si --instance_num
n'est pas utilisé, le numéro d'instance est par défaut 1
.
Redémarrez en utilisant différents indicateurs launch_cvd
Pour arrêter un ou plusieurs appareils et relancer avec différents indicateurs launch_cvd
, exécutez :
stop_cvd
launch_cvd NEW_FLAG
stop_cvd
effectue un arrêt impur similaire à restart_cvd
. Il laisse l'appareil dans un état dormant 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 les données en toute sécurité 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 disposition du disque incompatible avec l'implémentation de la copie sur écriture, launch_cvd
ignore les anciennes modifications du disque et réinitialise l'état du disque d'origine. Pour une liste complète des indicateurs, voir Indicateurs .
Exécuter sans superposition
Pour désactiver la prise en charge de la réinitialisation rapide, exécutez :
launch_cvd --use_overlay=false
--use_overlay=false
traite les fichiers du disque Cuttlefish en lecture-écriture et les modifications sont propagées dans ces fichiers.
Changer entre --use_overlay=false
et la valeur par défaut peut provoquer des erreurs de compatibilité. Pour forcer le nettoyage de l'état précédent du périphérique, exécutez :
stop_cvd
rm $HOME/cuttlefish $HOME/cuttlefish_runtime $HOME/cuttlefish_assembly
Cuttlefish ne peut pas naviguer en toute sécurité dans la transition entre les flux avec et sans superpositions, ce changement supprime donc tout l'état de gestion de Cuttlefish. Si des fichiers de disque externe sont modifiés et réutilisés ultérieurement avec des superpositions, les modifications antérieures sont considérées comme faisant partie de l'état de référence.
Drapeaux
Vous pouvez ajouter des arguments à l'aide de drapeaux lors du lancement d'un appareil Cuttlefish à l'aide launch_cvd
. Cependant, pour certains indicateurs ( indicateurs qui doivent rester les mêmes ), une perte de données peut survenir si les indicateurs sont modifiés entre les commandes launch_cvd
. Pour garantir 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 indicateurs 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 toutes les modifications du système de fichiers effectuées avant stop_cvd
sont perdues dans 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 en toute sécurité entre les invocations launch_cvd
. Les sections suivantes répertorient les indicateurs qui doivent rester les mêmes pour éviter la perte de données et les indicateurs qui peuvent être modifiés en toute sécurité sans perte de données. Pour plus de détails sur les indicateurs individuels, reportez-vous à la source ( flags.cc
, disk_flags.cc
) ou exécutez launch_cvd --help
.
Des drapeaux qui doivent rester les mêmes
Ces indicateurs doivent rester les mêmes d'une invocation launch_cvd
à la suivante pour éviter la perte de données :
-
--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
Des drapeaux qui peuvent changer
Ces indicateurs peuvent être modifiés en toute sécurité entre les invocations 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