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 Laufwerkszustand wird im Befehlszeilentool als Powerwash bezeichnet.

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

Bei den auf dieser Seite beschriebenen Verfahren zum Neustarten und Zurücksetzen wird davon ausgegangen, dass Sie ein Cuttlefish-Gerät erstellt und einen bestimmten Zustand 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ücksetzvorgänge verwenden:

Schnelle Zurücksetzung von Cuttlefish implementieren

Cuttlefish verwendet eine schnelle Zurücksetzung, die vom Schutz der Laufwerke hinter qcow2-Laufwerk-Overlaysabhängt. Standardmäßig behandelt Cuttlefish ursprüngliche Laufwerke als Lesezugriff und verwendet Overlays, um Laufwerkschreibvorgänge zu erfassen.

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

Das erzwungene Neuerstellen der Overlays ist unerwünscht, wenn Sie eine Funktion entwickeln, bei der ein Teil des Laufwerks in einem bestimmten initialisierten Zustand bleiben muss, während ein anderer Teil des Laufwerks ausgetauscht wird. Beispiel: Installieren einer App mit einer bestimmten Nutzerkonfiguration und anschließendes wiederholtes Austauschen des Kernels, 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 werden verschiedene Möglichkeiten beschrieben, ein Cuttlefish-Gerät auf den ursprünglichen Laufwerkszustand zurückzusetzen.

Ein Gerät zurücksetzen

So setzen Sie ein Cuttlefish-Gerät auf den ursprünglichen Laufwerkszustand zurück:

powerwash_cvd

powerwash_cvd fährt die virtuelle Maschine herunter, 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 an launch_cvd übergeben wurden.

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

powerwash_cvd --instance_num=N

Alle Geräte zurücksetzen

So beenden Sie ein oder mehrere Geräte und setzen sie auf den ursprünglichen Laufwerkszustand zurück:

stop_cvd
launch_cvd --resume=false

stop_cvd führt ein unsauberes Herunterfahren durch und beendet das Gerät.

Wenn Sie launch_cvd --resume=false hinzufügen, werden in Cuttlefish alle Dateien im Zusammenhang mit der zuvor ausgeführten Instanz gelöscht, bevor die nächste Ausführung gestartet wird. Sie können beliebig viele zusätzliche launch_cvd Flags hinzufügen.

In einer Multi-Tenant-Konfiguration,stop_cvd fährt die gesamte Instanzgruppe herunter.

Geräte neu starten

In den folgenden Abschnitten werden verschiedene Möglichkeiten beschrieben, ein Gerät neu zu starten, ohne es auf den ursprünglichen Laufwerkszustand zurückzusetzen.

Sauberer Neustart

So führen Sie einen sauberen Neustart des Geräts durch, wenn es reagiert:

adb reboot

adb reboot führt das Gerät durch den vollständigen Herunterfahrvorgang, synchronisiert Änderungen mit dem Laufwerk und sorgt dafür, dass Prozesse beendet werden. Cuttlefish-Hostprozesse sind nicht beteiligt. Dieses Verfahren ist möglicherweise nicht verfügbar, wenn das Gerät in einen fehlerhaften Zustand versetzt wurde und nicht mehr reagiert.

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

adb -s SERIAL reboot

Unsauberer Neustart

So führen Sie einen unsauberen Neustart durch, wenn das Gerät nicht reagiert:

restart_cvd

restart_cvd führt ein unsauberes Herunterfahren durch, indem das Cuttlefish-Gerät sofort heruntergefahren wird. restart_cvd entspricht dem Trennen und Wiederanschließen der Batterie an ein physisches Gerät. Laufwerkschreibvorgänge werden möglicherweise nicht beibehalten, wenn sie noch nicht abgeschlossen sind. restart_cvd wartet, bis das Gerät vollständig neu gestartet wurde, bevor es beendet wird.

In einer Multi-Tenant-Konfiguration, restart_cvd startet 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, ist die Instanznummer standardmäßig 1.

Neustart mit anderen launch_cvd-Flags

So beenden Sie ein oder mehrere Geräte und starten sie mit anderen launch_cvd-Flags neu:

stop_cvd
launch_cvd NEW_FLAG

stop_cvd führt ein unsauberes Herunterfahren ähnlich wie restart_cvd durch. Das Gerät wird in einen inaktiven Zustand versetzt, der später mit einem anderen launch_cvd-Befehl wieder gestartet werden kann. Wie bei restart_cvd werden Laufwerkschreibvorgänge möglicherweise nicht beibehalten, wenn sie nicht vollständig mit dem Laufwerk synchronisiert wurden. 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 am Laufwerkslayout erzwingen, die mit der Copy-on-Write-Implementierung inkompatibel ist, ignoriert launch_cvd die alten Laufwerksänderungen und setzt den ursprünglichen Laufwerkszustand wieder her. Eine vollständige Liste der Flags finden Sie unter Flags.

Ohne Overlay ausführen

So deaktivieren Sie die Unterstützung für die schnelle Zurücksetzung:

launch_cvd --use_overlay=false

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

Wenn Sie zwischen --use_overlay=false und dem Standardwert wechseln, können Kompatibilitätsfehler auftreten. So erzwingen Sie das Bereinigen des vorherigen Gerätezustands:

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

Cuttlefish kann den Übergang zwischen den Abläufen mit und ohne Overlays nicht sicher verarbeiten. Daher werden bei dieser Änderung alle Cuttlefish-Verwaltungszustände gelöscht. Wenn externe Laufwerksdateien geändert und später zusammen mit Overlays wiederverwendet werden, werden die früheren Änderungen als Teil des Ausgangszustands betrachtet.

Flags

Sie können beim Starten eines Cuttlefish-Geräts mit launch_cvd Argumente mit Flags hinzufügen. Bei bestimmten Flags (Flags, die gleich bleiben müssen) kann es jedoch zu Datenverlusten kommen, wenn Flags zwischen launch_cvd Befehlen geändert werden. Damit es bei der Ausführung einer Befehlsfolge, die launch_cvd, stop_cvd und dann noch einmal launch_cvd enthält, nicht zu Datenverlusten kommt, 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 der zweite launch_cvd Aufruf auch dasselbe --kernel_path=KERNEL_PATH Argument enthalten. Andernfalls gehen alle Dateisystemänderungen, die vor stop_cvd vorgenommen wurden, beim zweiten launch_cvd Aufruf verloren. Die von KERNEL_PATH referenzierte Datei muss auch denselben Inhalt haben.

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

Flags, die gleich bleiben müssen

Diese Flags müssen von einem launch_cvd-Aufruf zum nächsten 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 geändert werden können

Diese Flags können zwischen launch_cvd-Aufrufen sicher geändert werden, ohne dass Daten verloren gehen:

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