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

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

Bei den auf dieser Seite beschriebenen Verfahren zum Neustarten und Zurücksetzen wird davon ausgegangen, dass Sie ein Cuttlefish-Gerät erstellt und einen Zustand auf der Festplatte 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 Schnellzurücksetzens in Cuttlefish

Cuttlefish verwendet eine schnelle Reset-Implementierung, die vom Schutz der Laufwerke hinter qcow2-Laufwerk-Overlays abhängt. Standardmäßig behandelt Cuttlefish Original-Laufwerke als schreibgeschützt und verwendet Overlays, um Schreibvorgänge auf dem Laufwerk zu erfassen.

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

Das erzwungene Neuerstellen der Overlays ist unerwünscht, wenn Sie ein Feature entwickeln, bei dem ein Teil der Festplatte in einem bestimmten initialisierten Zustand bleiben muss, während ein anderer Teil der Festplatte ausgetauscht wird. Beispielsweise kann eine App mit einer bestimmten Nutzerkonfiguration installiert und dann der Kernel wiederholt ausgetauscht werden, um die Interaktion zwischen der App und verschiedenen Kernel-Builds zu testen. In diesem Fall kann es sich lohnen, die Overlays zu deaktivieren.

Geräte zurücksetzen

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

Ein Gerät zurücksetzen

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

powerwash_cvd

powerwash_cvd fährt die VM herunter, setzt alle Änderungen an der VM-Festplatte zurück, startet die VM neu und wartet, bis sie hochgefahren ist. Die Instanz behält die ursprünglichen Flags bei, die an launch_cvd übergeben 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

So beenden Sie den Vorgang und setzen ein oder mehrere Geräte auf ihren ursprünglichen Laufwerkstatus zurück:

stop_cvd
launch_cvd --resume=false

Mit stop_cvd wird das Gerät nicht ordnungsgemäß heruntergefahren und angehalten.

Wenn Sie --resume=false zu launch_cvd hinzufügen, werden alle Dateien, die mit der zuvor ausgeführten Instanz zusammenhängen, von Cuttlefish gelöscht, bevor der nächste Lauf gestartet wird. Sie können problemlos zusätzliche launch_cvd-Flags hinzufügen.

In einer Konfiguration mit mehreren Mandanten wird durch stop_cvd die gesamte Instanzgruppe heruntergefahren.

Geräte neu starten

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

Sauberer Neustart

Wenn das Gerät reagiert, führen Sie folgenden Befehl aus, um einen sauberen Neustart des Geräts durchzuführen:

adb reboot

adb reboot führt das Gerät durch den vollständigen Herunterfahrvorgang, synchronisiert Änderungen auf der Festplatte und sorgt dafür, dass Prozesse beendet werden. Cuttlefish-Hostprozesse sind nicht beteiligt. Dieses Verfahren ist möglicherweise nicht verfügbar, wenn sich das Gerät in einem fehlerhaften Zustand befindet und nicht mehr reagiert.

Wenn Sie ein einzelnes Cuttlefish-Gerät in einer Konfiguration mit mehreren Mandanten 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

Unsauberer Neustart

Wenn das Gerät nicht reagiert, führen Sie den folgenden Befehl aus, um einen unsauberen Neustart durchzuführen:

restart_cvd

Mit restart_cvd wird das Cuttlefish-Gerät sofort heruntergefahren. restart_cvd entspricht dem Trennen und Wiederverbinden des Akkus mit einem physischen Gerät. Laufwerkschreibvorgänge, die gerade ausgeführt wurden, werden möglicherweise nicht beibehalten. restart_cvd wartet, bis das Gerät vollständig neu gestartet wurde, bevor es beendet wird.

In einer Multi-Tenant-Konfiguration 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, ist die Standardeinstellung für die Instanznummer 1.

Mit anderen launch_cvd-Flags neu starten

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 Ruhezustand versetzt, der später mit einem anderen launch_cvd-Befehl wieder aktiviert werden kann. Wie bei restart_cvd werden Festplattenschreibvorgänge möglicherweise nicht beibehalten, wenn sie nicht vollständig mit der Festplatte synchronisiert werden. Führen Sie zuerst adb reboot aus, um Daten sicher auf der Festplatte zu speichern.

adb reboot
stop_cvd
launch_cvd NEW_FLAG

Wenn Änderungen an launch_cvd-Flags eine Änderung am Festplattenlayout erzwingen, die mit der Copy-on-Write-Implementierung inkompatibel ist, ignoriert launch_cvd die alten Festplattenänderungen und setzt den ursprünglichen Festplattenstatus zurück. Eine vollständige Liste der Flags finden Sie unter Flags.

Ohne Overlay ausführen

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

launch_cvd --use_overlay=false

--use_overlay=false behandelt die Cuttlefish-Festplattendateien als Lese-/Schreibzugriff und Änderungen werden in diese Dateien übertragen.

Das Wechseln zwischen --use_overlay=false und dem Standard kann zu Kompatibilitätsfehlern führen. Führen Sie Folgendes aus, um den vorherigen Gerätestatus zu bereinigen:

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 bewältigen. Daher werden durch diese Änderung alle Cuttlefish-Verwaltungsstatus gelöscht. Wenn Dateien auf externen Festplatten geändert und später zusammen mit Overlays wiederverwendet werden, gelten die früheren Änderungen als Teil des Ausgangszustands.

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 gleich bleiben müssen) kann es jedoch zu Datenverlusten kommen, wenn Flags zwischen launch_cvd-Befehlen geändert werden. Damit bei der Ausführung einer Befehlsfolge, 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 auch der zweite launch_cvd-Aufruf 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 Datei, auf die von KERNEL_PATH verwiesen wird, muss denselben Inhalt haben.

Einige Flags können zwischen launch_cvd-Aufrufen geändert werden. In den folgenden Abschnitten werden die Flags aufgeführt, die gleich bleiben müssen, um Datenverlust zu vermeiden, und die Flags, die ohne Datenverlust geändert werden können. Weitere Informationen zu den 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 Datenverlust 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