En esta página, se describe cómo reiniciar y restablecer dispositivos virtuales Cuttlefish. El restablecimiento de un dispositivo Cuttlefish al estado inicial del disco se conoce como powerwash en la herramienta de línea de comandos.
Cuando ejecutas flujos de trabajo automatizados o manuales con varios procedimientos diferentes, como paquetes de pruebas, el restablecimiento del dispositivo Cuttlefish entre procedimientos garantiza que el comportamiento de cada procedimiento sea independiente. Si el estado del disco no se restablece, un procedimiento puede afectar el comportamiento del siguiente.
En los procedimientos de reinicio y restablecimiento que se describen en esta página, se asume que creaste un dispositivo Cuttlefish y que estableciste algún estado en el disco.
# 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
Desde este punto de partida, puedes usar los siguientes flujos de reinicio y restablecimiento:
- Si el dispositivo responde, realiza un reinicio limpio mediante
adb reboot
. - Si el dispositivo no responde, realiza un reinicio no limpio con
restart_cvd
. - Restablece el estado del dispositivo con
powerwash_cvd
. - Detén el dispositivo y cambia los argumentos
launch_cvd
mientras mantienes el estado del dispositivo o borras su estado de manera forzosa.
Implementación del restablecimiento rápido de Cuttlefish
Cuttlefish usa una implementación de restablecimiento rápido que depende de la protección de los discos detrás de las superposiciones de discos qcow2. De forma predeterminada, Cuttlefish trata los discos originales como de solo lectura y usa superposiciones para capturar escrituras de discos.
Sin embargo, usar superposiciones de copia en escritura presenta algunos inconvenientes. En particular, los cambios externos en los discos subyacentes interrumpen la compatibilidad con las superposiciones existentes y provocan un estado incoherente del disco. Cuttlefish recrea a la fuerza las superposiciones cuando detecta cambios incompatibles.
No es recomendable volver a crear las superposiciones de manera forzada cuando se desarrolla una función que requiere mantener la parte del disco en un estado inicializado en particular mientras se intercambia una parte diferente del disco. Por ejemplo, instalar una app con una configuración de usuario particular y, luego, intercambiar el kernel varias veces para probar la interacción entre la app y diferentes compilaciones de kernel. En este caso, tal vez quieras inhabilitar las superposiciones.
Cómo restablecer dispositivos
En las siguientes secciones, se describen las formas de restablecer un dispositivo Cuttlefish a su estado inicial de disco.
Restablece un dispositivo
Para restablecer un dispositivo Cuttlefish a su estado inicial de disco, ejecuta lo siguiente:
powerwash_cvd
powerwash_cvd
apaga la máquina virtual, restablece los cambios realizados en el disco de máquina virtual, reinicia la máquina virtual y espera hasta que termine de iniciarse. La instancia conserva las marcas originales proporcionadas a launch_cvd
.
En una configuración de varios usuarios, powerwash_cvd
reinicia una sola instancia fuera del grupo de instancias:
powerwash_cvd --instance_num=N
Restablece todos los dispositivos
Para detener y restablecer uno o más dispositivos a sus estados iniciales de disco, ejecuta lo siguiente:
stop_cvd
launch_cvd --resume=false
stop_cvd
realiza un apagado no limpio y detiene el dispositivo.
Agregar --resume=false
a launch_cvd
hace que Cuttlefish destruya todos los archivos relacionados con la instancia en ejecución anterior antes de comenzar la próxima ejecución. Es seguro agregar cualquier marca launch_cvd
adicional.
En una configuración de varios usuarios, stop_cvd
apaga todo el grupo de instancias.
Cómo reiniciar dispositivos
En las siguientes secciones, se describen formas de reiniciar un dispositivo sin restablecerlo a su estado inicial de disco.
Reinicio limpio
Para realizar un reinicio limpio, cuando el dispositivo responda, ejecuta lo siguiente:
adb reboot
adb reboot
pasa el dispositivo a través del procedimiento de apagado completo, sincroniza los cambios con el disco y se asegura de que los procesos se apaguen. Los procesos de host de Cuttlefish no están involucrados. Es posible que este procedimiento no esté disponible si el dispositivo entró en un estado incorrecto y deja de responder.
Para reiniciar un solo dispositivo Cuttlefish en una configuración de instancias múltiples, especifica el número de serie del dispositivo de destino cuando se ejecuta adb-reboot
. Si no se especifica un dispositivo de destino, adb
no reinicia ningún dispositivo.
adb -s SERIAL reboot
Reinicio no limpio
Para reiniciar el dispositivo de forma incorrecta cuando no responde, ejecuta lo siguiente:
restart_cvd
restart_cvd
realiza un apagado poco claro porque apaga de inmediato el dispositivo Cuttlefish. restart_cvd
es el equivalente de desconectar y volver a conectar la batería a un dispositivo físico. Es posible que las operaciones de escritura en el disco no se conserven si estaban en curso. restart_cvd
espera hasta que el dispositivo se haya reiniciado por completo antes de salir.
En una configuración de varios usuarios, restart_cvd
reinicia una sola instancia fuera del grupo de instancias. Para especificar qué instancia de Cuttlefish reiniciar, usa la marca instance_num
.
restart_cvd --instance_num=N
Si no se usa --instance_num
, el número de instancia predeterminado es 1
.
Reinicia con diferentes marcas de launch_cvd
Para detener uno o más dispositivos y reiniciar con diferentes marcas launch_cvd
, ejecuta lo siguiente:
stop_cvd
launch_cvd NEW_FLAG
stop_cvd
realiza un apagado sucio similar a restart_cvd
. Deja el dispositivo en estado inactivo que se puede volver a iniciar más tarde con un comando launch_cvd
diferente. Al igual que con restart_cvd
, es posible que las operaciones de escritura del disco no se conserven si no están completamente sincronizadas con el disco. Para guardar datos de forma segura en el disco, primero ejecuta adb reboot
.
adb reboot
stop_cvd
launch_cvd NEW_FLAG
Si los cambios en las marcas launch_cvd
obligan a cambiar el diseño del disco que es incompatible con la implementación de copia en escritura, launch_cvd
ignora las modificaciones anteriores del disco y se restablece al estado original del disco. Para obtener una lista completa de las marcas, consulta Marcas.
Cómo ejecutar sin superposición
Para inhabilitar la función de restablecimiento rápido, ejecuta lo siguiente:
launch_cvd --use_overlay=false
--use_overlay=false
trata a los archivos de disco de Cuttlefish como lectura y escritura, y los cambios se propagan a esos archivos.
Cambiar entre --use_overlay=false
y el valor predeterminado puede causar errores de compatibilidad. Para limpiar el estado del dispositivo de manera forzosa, ejecuta lo siguiente:
stop_cvd
rm $HOME/cuttlefish $HOME/cuttlefish_runtime $HOME/cuttlefish_assembly
Cuttlefish no puede navegar de manera segura entre la transición entre los flujos y sin las superposiciones. Por lo tanto, este cambio borra todo el estado de administración de Cuttlefish. Si se modifican los archivos de disco externo y se reutilizan más tarde junto con las superposiciones, las modificaciones anteriores se consideran parte del estado del modelo de referencia.
Marcas
Puedes agregar argumentos mediante marcas cuando inicies un dispositivo Cuttlefish con launch_cvd
. Sin embargo, para ciertas marcas (que deben mantenerse iguales), puede haber pérdida de datos si se cambian entre comandos launch_cvd
. Para garantizar que no se pierdan datos cuando se ejecute una secuencia de comandos que incluya launch_cvd
, stop_cvd
y, luego, launch_cvd
nuevamente, usa las mismas marcas para cada comando launch_cvd
. Por ejemplo, si la primera marca launch_cvd
incluye el argumento --kernel_path=KERNEL_PATH
, la segunda invocación launch_cvd
también debe incluir el mismo argumento --kernel_path=KERNEL_PATH
. De lo contrario, cualquier cambio que se realice en el sistema de archivos antes de stop_cvd
se perderá en la segunda invocación de launch_cvd
. El archivo al que hace referencia KERNEL_PATH
también debe tener el mismo contenido.
Es seguro cambiar algunas marcas entre invocaciones de launch_cvd
. En las siguientes secciones, se enumeran las marcas que deben mantenerse iguales para evitar la pérdida de datos y las marcas que se pueden cambiar de forma segura sin perder datos. Para obtener detalles sobre las marcas individuales, consulta la fuente (flags.cc
, disk_flags.cc
) o ejecuta launch_cvd --help
.
Marcas que deben mantenerse iguales
Estas marcas deben mantenerse iguales desde una invocación de launch_cvd
hasta la siguiente para evitar la pérdida de datos:
--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
Marcas que pueden cambiar
Estas marcas se pueden cambiar de forma segura entre invocaciones de launch_cvd
sin causar pérdida de datos:
--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