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

Ab diesem Punkt können Sie die folgenden Abläufe zum Neustarten und Zurücksetzen verwenden:

Schnelles Zurücksetzen von Cuttlefish

Cuttlefish verwendet eine schnelle Zurücksetzung, die vom Schutz der Laufwerke hinter qcow2-Laufwerk-Overlays abhängt. Standardmäßig behandelt Cuttlefish Original-Festplatten als schreibgeschützt und verwendet Overlays, um Festplattenschreibvorgänge 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 eine Funktion entwickeln, bei der ein Teil der Festplatte in einem bestimmten initialisierten Zustand bleiben muss, während ein anderer Teil der Festplatte ausgetauscht wird. Sie können beispielsweise eine App mit einer bestimmten Nutzerkonfiguration installieren und dann den Kernel wiederholt austauschen, 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

Mit powerwash_cvd wird die VM heruntergefahren, alle Änderungen am VM-Laufwerk werden zurückgesetzt, die VM wird neu gestartet und es wird gewartet, bis sie vollständig hochgefahren ist. Die Instanz behält die ursprünglichen Flags bei, die für launch_cvd angegeben 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 Festplattenstatus 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 dem Laufwerk 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

restart_cvd führt ein nicht ordnungsgemäßes Herunterfahren durch, indem das Cuttlefish-Gerät sofort heruntergefahren wird. 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 Instanznummer standardmäßig 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

Führen Sie Folgendes aus, um die Unterstützung für das schnelle Zurücksetzen zu deaktivieren:

launch_cvd --use_overlay=false

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

Das Wechseln zwischen --use_overlay=false und dem Standardwert kann zu Kompatibilitätsfehlern führen. Führen Sie Folgendes aus, um den vorherigen Gerätezustand 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 externe Festplattendateien geändert und später zusammen mit Overlays wiederverwendet werden, gelten die früheren Änderungen als Teil des Ausgangszustands.

Flags

Sie können beim Starten eines Cuttlefish-Geräts mit launch_cvd Argumente mithilfe von 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 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 in KERNEL_PATH verwiesen wird, muss ebenfalls 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 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