Cuttlefish: Neustarten und zurücksetzen

Auf dieser Seite wird beschrieben, wie Sie virtuelle Cuttlefish-Geräte neu starten und zurücksetzen. Das Zurücksetzen eines Cuttlefish-Geräts auf den ursprünglichen Laufwerkstatus wird im Befehlszeilentool als Powerwash bezeichnet.

Wenn Sie automatisierte oder manuelle Workflows mit mehreren verschiedenen Verfahren ausführen, z. B. Testsuites, sorgt das Zurücksetzen des Cuttlefish-Geräts zwischen den Verfahren dafür, dass das Verhalten der einzelnen Verfahren unabhängig ist. Wenn der Laufwerkstatus nicht zurückgesetzt wird, kann ein Vorgang das Verhalten des folgenden Vorgangs beeinträchtigen.

Bei den auf dieser Seite beschriebenen Neustart- und Zurücksetzungsverfahren wird davon ausgegangen, dass Sie ein Cuttlefish-Gerät erstellt und einen Status auf dem Laufwerk festgelegt haben.

# 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

Von diesem Ausgangspunkt aus können Sie die folgenden Neustart- und Zurücksetzungsabläufe verwenden:

Implementierung des schnellen Zurücksetzens von Cuttlefish

Cuttlefish verwendet eine Implementierung für das schnelle Zurücksetzen, die vom Schutz der Laufwerke hinter qcow2-Laufwerk-Overlays abhängt. Standardmäßig behandelt Cuttlefish die ursprünglichen Laufwerke als schreibgeschützt und verwendet Overlays, um Laufwerkschreiben zu erfassen.

Die Verwendung von Copy-on-Write-Overlays hat jedoch Nachteile. Insbesondere externe Änderungen an den zugrunde liegenden Laufwerken beeinträchtigen die Kompatibilität mit vorhandenen Overlays und führen zu einem inkonsistenten Laufwerkstatus. Cuttlefish erstellt die Overlays dann zwangsweise neu, wenn inkompatible Änderungen erkannt werden.

Das Erzwingen des Neuaufbaus der Overlays ist nicht wünschenswert, wenn eine Funktion entwickelt wird, bei der ein Teil des Laufwerks in einem bestimmten initialisierten Zustand bleiben muss, während ein anderer Teil des Laufwerks ausgetauscht wird. Beispielsweise können Sie eine App mit einer bestimmten Nutzerkonfiguration installieren und dann wiederholt den Kernel austauschen, um die Interaktion zwischen der App und verschiedenen Kernel-Builds zu testen. In diesem Fall kann es sinnvoll sein, die Overlays zu deaktivieren.

Geräte zurücksetzen

In den folgenden Abschnitten wird beschrieben, wie Sie ein Cuttlefish-Gerät auf den ursprünglichen Laufwerksstatus zurücksetzen.

Ein Gerät zurücksetzen

Wenn Sie ein Cuttlefish-Gerät auf den ursprünglichen Laufwerkstatus zurücksetzen möchten, führen Sie Folgendes aus:

powerwash_cvd

powerwash_cvd schaltet die virtuelle Maschine aus, setzt alle Änderungen am Laufwerk der virtuellen Maschine zurück, startet die virtuelle Maschine neu und wartet, bis der Startvorgang abgeschlossen ist. Die Instanz behält die ursprünglichen Flags bei, die launch_cvd zugewiesen wurden.

In einer Multi-Tenant-Konfiguration startet powerwash_cvd eine einzelne Instanz aus der Instanzgruppe neu:

powerwash_cvd --instance_num=N

Alle Geräte zurücksetzen

Wenn Sie ein oder mehrere Geräte beenden und auf ihren ursprünglichen Laufwerkstatus zurücksetzen möchten, führen Sie Folgendes aus:

stop_cvd
launch_cvd --resume=false

stop_cvd führt einen nicht ordnungsgemäßen Herunterfahrvorgang aus und stoppt das Gerät.

Wenn Sie --resume=false zu launch_cvd hinzufügen, löscht Cuttlefish alle Dateien, die sich auf die zuvor ausgeführte Instanz beziehen, bevor der nächste Durchlauf gestartet wird. Sie können auch zusätzliche launch_cvd-Flags hinzufügen.

In einer mehrmandantenfähigen Konfiguration schaltet stop_cvd die gesamte Instanzgruppe aus.

Geräte neu starten

In den folgenden Abschnitten wird beschrieben, wie Sie ein Gerät neu starten, ohne es auf den ursprünglichen Laufwerkstatus zurückzusetzen.

Kompletter Neustart

Wenn das Gerät reagiert, führen Sie Folgendes aus, um es neu zu starten:

adb reboot

Mit adb reboot wird das Gerät vollständig heruntergefahren, Änderungen werden mit dem Laufwerk synchronisiert und Prozesse werden beendet. Cuttlefish-Hostprozesse sind nicht beteiligt. Diese Option ist möglicherweise nicht verfügbar, wenn das Gerät in einen fehlerhaften Zustand gewechselt ist und nicht mehr reagiert.

Wenn Sie ein einzelnes Cuttlefish-Gerät in einer Multi-Tenant-Konfiguration neu starten möchten, geben Sie beim Ausführen von adb-reboot die Seriennummer des Zielgeräts an. Wenn kein Zielgerät angegeben ist, startet adb kein Gerät neu.

adb -s SERIAL reboot

Unvollständiger Neustart

Wenn das Gerät nicht reagiert, führen Sie einen Neustart ohne vorheriges Herunterfahren aus:

restart_cvd

restart_cvd führt ein nicht ordnungsgemäßes Herunterfahren durch, indem das Cuttlefish-Gerät sofort heruntergefahren wird. restart_cvd entspricht dem Trennen und erneuten Verbinden des Akkus mit einem physischen Gerät. Laufwerkschreiben werden möglicherweise nicht beibehalten, wenn sie noch nicht abgeschlossen waren. restart_cvd wartet, bis das Gerät vollständig neu gestartet wurde, bevor es beendet wird.

In einer Konfiguration mit mehreren Mietern startet restart_cvd eine einzelne Instanz aus der Instanzgruppe neu. Verwenden Sie das Flag instance_num, um anzugeben, welche Cuttlefish-Instanz neu gestartet werden soll.

restart_cvd --instance_num=N

Wenn --instance_num nicht verwendet wird, wird standardmäßig 1 als Instanznummer verwendet.

Neustart mit anderen launch_cvd-Flags

Wenn Sie ein oder mehrere Geräte beenden und mit anderen launch_cvd-Flags neu starten möchten, führen Sie Folgendes aus:

stop_cvd
launch_cvd NEW_FLAG

stop_cvd führt ein nicht ordnungsgemäßes Herunterfahren aus, ähnlich wie restart_cvd. Das Gerät bleibt in einem Ruhezustand, der später mit einem anderen launch_cvd-Befehl wieder gestartet werden kann. Wie bei restart_cvd bleiben Schreibvorgänge auf dem Laufwerk möglicherweise nicht erhalten, wenn sie nicht vollständig mit dem Laufwerk synchronisiert werden. Wenn Sie Daten sicher auf dem Laufwerk speichern möchten, führen Sie zuerst adb reboot aus.

adb reboot
stop_cvd
launch_cvd NEW_FLAG

Wenn Änderungen an launch_cvd-Flags eine Änderung des Laufwerklayouts erzwingen, die nicht mit der Copy-on-Write-Implementierung kompatibel ist, ignoriert launch_cvd die alten Laufwerkänderungen und setzt den ursprünglichen Laufwerkstatus zurück. Eine vollständige Liste der Flags finden Sie unter Flags.

Ohne Overlay ausführen

So deaktivieren Sie die Unterstützung für die Schnellwiederherstellung:

launch_cvd --use_overlay=false

--use_overlay=false behandelt die Cuttlefish-Dateien als Lese-/Schreibdateien und Änderungen werden in diese Dateien übernommen.

Das Wechseln zwischen --use_overlay=false und dem Standard kann zu Kompatibilitätsfehlern führen. Wenn Sie den vorherigen Gerätestatus erzwingen möchten, führen Sie Folgendes aus:

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

Cuttlefish kann den Übergang zwischen den Flüssen mit und ohne Overlays nicht sicher steuern. Daher wird durch diese Änderung der gesamte Cuttlefish-Verwaltungsstatus gelöscht. Wenn externe Laufwerkdateien geändert und später zusammen mit Overlays wiederverwendet werden, werden die früheren Änderungen als Teil des Basiszustands betrachtet.

Flaggen

Sie können Argumente mithilfe von Flags hinzufügen, wenn Sie ein Cuttlefish-Gerät mit launch_cvd starten. Bei bestimmten Flags (Flags, die unverändert bleiben müssen) können jedoch Daten verloren gehen, wenn die Flags zwischen launch_cvd-Befehlen geändert werden. Damit beim Ausführen einer Befehlssequenz, die launch_cvd, stop_cvd und dann noch einmal launch_cvd enthält, keine Daten verloren gehen, verwenden Sie für jeden launch_cvd-Befehl dieselben Flags. Wenn das erste launch_cvd-Flag beispielsweise das Argument --kernel_path=KERNEL_PATH enthält, muss die zweite launch_cvd-Aufruf auch dasselbe --kernel_path=KERNEL_PATH-Argument enthalten. Andernfalls gehen alle Dateisystemänderungen, die vor stop_cvd vorgenommen wurden, bei der zweiten launch_cvd-Aufruf verloren. Die Datei, auf die KERNEL_PATH verweist, muss ebenfalls denselben Inhalt haben.

Einige Flags können zwischen launch_cvd-Aufrufen sicher geändert werden. In den folgenden Abschnitten werden die Flags aufgeführt, die unverändert bleiben müssen, um Datenverluste zu vermeiden, und die Flags, die ohne Datenverlust geändert werden können. Weitere Informationen zu einzelnen Flags finden Sie in der Quelle (flags.cc, disk_flags.cc) oder Sie führen launch_cvd --help aus.

Flags, die unverändert bleiben müssen

Diese Flags müssen bei jeder launch_cvd-Aufrufssequenz gleich bleiben, um Datenverluste zu vermeiden:

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

Flags, die sich ändern können

Diese Flags können zwischen launch_cvd-Aufrufen ohne Datenverlust geändert werden:

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