Cuttlefish: Reinicio y restablecimiento

En esta página, se describe cómo reiniciar y restablecer dispositivos virtuales Cuttlefish. El proceso de restablecer un dispositivo Cuttlefish a su estado de disco inicial se conoce como usar o aplicar Powerwash en la herramienta de línea de comandos.

Cuando ejecutas flujos de trabajo manuales o automatizados con varios procedimientos diferentes, como los paquetes de pruebas, restablecer el dispositivo Cuttlefish entre cada procedimiento garantiza que el comportamiento de cada uno sea independiente. Si no se restablece el estado del disco, un procedimiento podría afectar el comportamiento del siguiente.

El procedimiento de reinicio y restablecimiento que se describe en esta página considera que se creó un dispositivo Cuttlefish y que se configuró algún estado en el disco.

# 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

A partir de este punto, puedes usar los siguientes flujos de reinicio y restablecimiento:

Implementación del restablecimiento rápido de Cuttlefish

Cuttlefish usa una implementación de restablecimiento rápido que depende de proteger los discos con superposiciones de disco qcow2. De forma predeterminada, Cuttlefish trata los discos originales como de solo lectura y usa superposiciones para capturar escrituras del disco.

Pero existen desventajas de usar las superposiciones de copiado al escribir. Principalmente, los cambios externos al disco base rompen la compatibilidad con las superposiciones existentes y generan un estado de disco incoherente. Cuttlefish recrea de manera forzosa las superposiciones cuando detecta cambios incompatibles.

Esta recreación forzosa de las superposiciones no es ideal cuando se desarrolla una función que requiere mantener parte del disco en un estado de inicialización particular mientras cambia a otra parte del disco. Por ejemplo, instalar una app con una configuración de usuario particular y, luego, cambiar varias veces el kernel para probar la interacción entre la app y las diferentes compilaciones de kernel. En este caso, puede servir inhabilitar las superposiciones.

Cómo restablecer dispositivos

En la siguiente sección, se describen maneras en las que se puede restablecer un dispositivo Cuttlefish a su estado de disco inicial.

Restablece un dispositivo

Para restablecer un dispositivo Cuttlefish a su estado de disco inicial, ejecuta lo siguiente:

powerwash_cvd

powerwash_cvd apaga la máquina virtual, restablece los cambios que se hicieron al disco de la máquina virtual, la restablece y espera hasta que termine de iniciar. La instancia mantiene las marcas originales que se dieron a launch_cvd.

En una configuración de varios usuarios, powerwash_cvd reinicia una única instancia 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 de disco originales, ejecuta lo siguiente:

stop_cvd
launch_cvd --resume=false

stop_cvd realiza un apagado sucio y detiene el dispositivo.

Si agregas --resume=false a launch_cvd, Cuttlefish destruye todos los archivos relacionados con la instancia ejecutada anteriormente antes de comenzar con la siguiente ejecución. Es una forma segura de agregar marcas de launch_cvd adicionales.

En una configuración de varios usuarios, stop_cvd apaga toda la instancia de grupo.

Cómo reiniciar dispositivos

En la siguiente sección, se describen maneras en las que se puede reiniciar un dispositivo sin restablecerlo a su estado de disco inicial.

Reinicio limpio

Para realizar un reinicio limpio del dispositivo cuando responde, ejecuta lo siguiente:

adb reboot

adb reboot lleva al dispositivo a un procedimiento de apagado completo y sincroniza los cambios con el disco, lo que garantiza el apagado del proceso. Los procesos del host de Cuttlefish no están involucrados. Este procedimiento puede no estar disponible si el dispositivo entra en un estado de error y deja de responder.

Para realizar un reinicio limpio de un dispositivo Cuttlefish único en una configuración de varios usuarios, 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 ninguno.

adb -s SERIAL reboot

Reinicio no limpio

Para realizar un reinicio sucio cuando el dispositivo no responde, ejecuta lo siguiente:

restart_cvd

restart_cvd realiza un apagado sucio al detener instantáneamente el dispositivo Cuttlefish. restart_cvd es el equivalente a desconectar y volver a conectar la batería en un dispositivo físico. Las escrituras en el disco podrían no persistir si estaban en progreso. restart_cvd espera a que el dispositivo termine de volver a iniciar antes de salir.

En una configuración de varios usuarios, restart_cvd reinicia una única instancia 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 se establece de forma predeterminada en 1.

Reinicio con diferentes marcas de launch_cvd

Para detener uno o más dispositivos, y reiniciarlos 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 un estado inactivo que puede volver a iniciarse con un comando launch_cvd diferente. Al igual que con restart_cvd, las escrituras en el disco podrían no persistir si no se sincronizan completamente con el disco. Para guardar los datos en el disco de forma segura, primero ejecuta adb reboot.

adb reboot
stop_cvd
launch_cvd NEW_FLAG

Si los cambios a las marcas launch_cvd fuerzan un cambio en el diseño del disco que es incompatible con la implementación del copiado al escribir, launch_cvd ignora las modificaciones anteriores del disco y restablece su estado original. Para una lista de todas las marcas, consulta Marcas.

Cómo ejecutar sin superposición

Para rechazar la asistencia de restablecimiento rápido, ejecuta lo siguiente:

launch_cvd --use_overlay=false

--use_overlay=false trata los archivos del disco de Cuttlefish como lectura y escritura, y los cambios se propagan a esos archivos.

Cambiar entre --use_overlay=false y la configuración predeterminada puede generar errores de compatibilidad. Para limpiar el estado anterior del dispositivo de manera forzosa, ejecuta lo siguiente:

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

Cuttlefish no puede navegar de forma segura la transición entre los flujos con y sin superposiciones, por lo que este cambio borra todo el estado de administración de Cuttlefish. Si se modifican los archivos del disco externo y se vuelven a usar más tarde junto con las superposiciones, las modificaciones anteriores se consideran como parte del estado base.

Marcas

Puedes agregar argumentos con marcas cuando ejecutas un dispositivo Cuttlefish con launch_cvd. De todas formas, para algunas marcas (Marcas que deben mantenerse iguales), pueden perderse datos si se cambian las marcas entre comandos launch_cvd. Para asegurarte de que no se pierdan datos al ejecutar una secuencia de comandos que incluya launch_cvd, stop_cvd, y luego launch_cvd de nuevo, usa la misma marca para cada comando launch_cvd. Por ejemplo, si la primera marca launch_cvd incluye el argumento --kernel_path=KERNEL_PATH, la segunda invocación de launch_cvd debe incluir el mismo argumento --kernel_path=KERNEL_PATH. De otra forma, cualquier cambio al sistema de archivos que se haya hecho antes de stop_cvd se pierde en la segunda invocación de launch_cvd. El archivo al que KERNEL_PATH hace referencia también debe tener el mismo contenido.

Algunas marcas no se ven afectadas por los cambios 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 permanecer iguales de una invocación launch_cvd a 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 pueden cambiar entre invocaciones launch_cvd sin generar 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