Cuttlefish: riavvio e reimpostazione

Questa pagina descrive come riavviare e reimpostare i dispositivi virtuali Cuttlefish. La reimpostazione di un dispositivo Cuttlefish al suo stato iniziale del disco viene definita powerwash nello strumento della riga di comando.

Quando esegui flussi di lavoro automatici o manuali con più procedure diverse, ad esempio suite di test, la reimpostazione del dispositivo Cuttlefish tra le procedure garantisce che il comportamento di ogni procedura sia indipendente. Se lo stato del disco non viene reimpostato, una procedura può influire sul comportamento della procedura successiva.

Le procedure di riavvio e reimpostazione descritte in questa pagina presuppongono che tu abbia creato un dispositivo Cuttlefish e impostato uno stato sul 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

Da questo punto di partenza, puoi utilizzare i seguenti flussi di riavvio e reimpostazione:

Implementazione della reimpostazione rapida di Cuttlefish

Cuttlefish utilizza un'implementazione di reimpostazione rapida che dipende dalla protezione dei dischi dietro gli overlay dei dischi qcow2. Per impostazione predefinita, Cuttlefish tratta i dischi originali come di sola lettura e utilizza gli overlay per acquisire le scritture su disco.

Tuttavia, l'utilizzo di overlay copy-on-write presenta degli svantaggi. In particolare, le modifiche esterne ai dischi sottostanti interrompono la compatibilità con gli overlay esistenti e causano uno stato del disco incoerente. Cuttlefish ricrea forzatamente gli overlay quando rileva modifiche incompatibili.

La ricreazione forzata degli overlay non è consigliabile quando sviluppi una funzionalità che richiede di mantenere una parte del disco in uno stato inizializzato specifico mentre sostituisci un'altra parte del disco. Ad esempio, installare un'app con una configurazione utente specifica e poi sostituire ripetutamente il kernel per testare l'interazione tra l'app e le diverse build del kernel. In questo caso, potrebbe valere la pena disattivare gli overlay.

Reimpostare i dispositivi

Le seguenti sezioni descrivono i modi per reimpostare un dispositivo Cuttlefish al suo stato iniziale del disco.

Reimpostare un dispositivo

Per reimpostare un dispositivo Cuttlefish al suo stato iniziale del disco, esegui:

powerwash_cvd

powerwash_cvd arresta la macchina virtuale, reimposta le modifiche apportate al disco della macchina virtuale, riavvia la macchina virtuale e attende il completamento dell'avvio. L'istanza conserva i flag originali forniti a launch_cvd.

In una configurazione multi-tenant, powerwash_cvd riavvia una singola istanza del gruppo di istanze:

powerwash_cvd --instance_num=N

Reimpostare tutti i dispositivi

Per arrestare e reimpostare uno o più dispositivi ai loro stati iniziali del disco, esegui:

stop_cvd
launch_cvd --resume=false

stop_cvd esegue un arresto non pulito e arresta il dispositivo.

L'aggiunta di --resume=false a launch_cvd fa sì che Cuttlefish elimini tutti i file correlati all'istanza in esecuzione precedente prima di avviare l'esecuzione successiva. Puoi aggiungere in sicurezza altri launch_cvd flag.

In una configurazione multi-tenant,stop_cvd arresta l'intero gruppo di istanze.

Riavviare i dispositivi

Le seguenti sezioni descrivono i modi per riavviare un dispositivo senza reimpostarlo al suo stato iniziale del disco.

Riavvio pulito

Per eseguire un riavvio pulito del dispositivo quando risponde, esegui:

adb reboot

adb reboot esegue la procedura di arresto completa del dispositivo, sincronizzando le modifiche sul disco e assicurandosi che i processi vengano arrestati. I processi host di Cuttlefish non sono coinvolti. Questa procedura potrebbe non essere disponibile se il dispositivo è entrato in uno stato errato e non risponde.

Per eseguire un riavvio pulito di un singolo dispositivo Cuttlefish in una configurazione multi-tenant, specifica il numero di serie del dispositivo di destinazione quando esegui adb-reboot. Se non viene specificato alcun dispositivo di destinazione, adb non riavvia alcun dispositivo.

adb -s SERIAL reboot

Riavvio non pulito

Per eseguire un riavvio non pulito quando il dispositivo non risponde, esegui:

restart_cvd

restart_cvd esegue un arresto non pulito arrestando immediatamente il dispositivo Cuttlefish. restart_cvd è l'equivalente di scollegare e ricollegare la batteria a un dispositivo fisico. Le scritture su disco potrebbero non essere persistenti se erano in corso. restart_cvd attende che il dispositivo si sia riavviato completamente prima di uscire.

In una configurazione multi-tenant, restart_cvd riavvia una singola istanza del gruppo di istanze. Per specificare l'istanza Cuttlefish da riavviare, utilizza il flag instance_num.

restart_cvd --instance_num=N

Se non viene utilizzato --instance_num, il numero dell'istanza è 1 per impostazione predefinita.

Riavviare utilizzando flag launch_cvd diversi

Per arrestare uno o più dispositivi e riavviarli con flag launch_cvd diversi, esegui:

stop_cvd
launch_cvd NEW_FLAG

stop_cvd esegue un arresto non pulito simile a restart_cvd. Lascia il dispositivo in uno stato inattivo che può essere riavviato in un secondo momento con un comando launch_cvd diverso. Come per restart_cvd, le scritture su disco potrebbero non essere persistenti se non sono completamente sincronizzate con il disco. Per salvare i dati in modo sicuro sul disco, esegui prima adb reboot.

adb reboot
stop_cvd
launch_cvd NEW_FLAG

Se le modifiche ai flag launch_cvd forzano una modifica al layout del disco incompatibile con l'implementazione copy-on-write, launch_cvd ignora le modifiche precedenti al disco e ripristina lo stato originale del disco. Per un elenco completo dei flag, consulta Flag.

Eseguire senza overlay

Per disattivare il supporto per la reimpostazione rapida, esegui:

launch_cvd --use_overlay=false

--use_overlay=false tratta i file del disco Cuttlefish come di lettura/scrittura e le modifiche vengono propagate in questi file.

Il passaggio tra --use_overlay=false e il valore predefinito può causare errori di compatibilità. Per pulire forzatamente lo stato precedente del dispositivo, esegui:

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

Cuttlefish non può gestire in sicurezza la transizione tra i flussi con e senza overlay, quindi questa modifica elimina tutto lo stato di gestione di Cuttlefish. Se i file del disco esterni vengono modificati e riutilizzati in un secondo momento insieme agli overlay, le modifiche precedenti vengono considerate parte dello stato di base.

Bandiere

Puoi aggiungere argomenti utilizzando i flag quando avvii un dispositivo Cuttlefish utilizzando launch_cvd. Tuttavia, per alcuni flag (Flag che devono rimanere invariati), la perdita di dati può verificarsi se i flag vengono modificati tra i comandi launch_cvd. Per evitare la perdita di dati quando esegui una sequenza di comandi che include launch_cvd, stop_cvd e poi di nuovo launch_cvd, utilizza gli stessi flag per ogni comando launch_cvd. Ad esempio, se il primo launch_cvd flag include l'argomento --kernel_path=KERNEL_PATH, anche la seconda chiamata launch_cvd deve includere lo stesso argomento --kernel_path=KERNEL_PATH oppure le modifiche al file system apportate prima di stop_cvd vengono perse nella seconda chiamata launch_cvd. Anche il file a cui fa riferimento KERNEL_PATH deve avere gli stessi contenuti.

Alcuni flag possono essere modificati in sicurezza tra le chiamate launch_cvd. Le seguenti sezioni elencano i flag che devono rimanere invariati per evitare la perdita di dati e i flag che possono essere modificati in sicurezza senza perdita di dati. Per informazioni dettagliate sui singoli flag, consulta l'origine ( flags.cc , disk_flags.cc ) o esegui launch_cvd --help.

Flag che devono rimanere invariati

Questi flag devono rimanere invariati da una chiamata launch_cvd all'altra per evitare la perdita di dati:

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

Flag che possono essere modificati

Questi flag possono essere modificati in sicurezza tra le chiamate launch_cvd senza causare perdita di dati:

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