Cuttlefish: reinicio y restablecimiento

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 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

Desde este punto de partida, 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 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