Sepien: Neu starten 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 Powerwashing bezeichnet.

Wenn Sie automatisierte oder manuelle Workflows mit mehreren verschiedenen Verfahren ausführen, z. B. Testsuiten, 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 ein Vorgang das Verhalten des folgenden Vorgangs beeinträchtigen.

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 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 Punkt aus können Sie die folgenden Abläufe zum Neustarten und Zurücksetzen verwenden:

Cuttlefish-Implementierung für schnelles Zurücksetzen

Cuttlefish verwendet eine schnell zurückgesetzte Implementierung, die darauf angewiesen ist, die Laufwerke hinter qcow2-Laufwerk-Overlays zu schützen. Cuttlefish behandelt die ursprünglichen Laufwerke standardmäßig 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. Beachten Sie, dass externe Änderungen an den zugrunde liegenden Laufwerken die Kompatibilität mit vorhandenen Overlays beeinträchtigen und einen inkonsistenten Laufwerkstatus verursachen. Wenn inkompatible Änderungen erkannt werden, erzwingt der Tintenfisch die Neuerstellung der Overlays.

Die erzwungene Neuerstellung der Overlays ist bei der Entwicklung einer Funktion nicht wünschenswert, bei der ein Teil des Laufwerks in einem bestimmten initialisierten Zustand gehalten werden 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 Laufwerkstatus zurücksetzen.

Ein Gerät zurücksetzen

Führen Sie folgenden Befehl aus, um ein Cuttlefish-Gerät auf den ursprünglichen Laufwerkstatus zurückzusetzen:

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 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, zerstört Cuttlefish alle Dateien, die sich auf die zuvor ausgeführte Instanz beziehen, bevor die nächste Ausführung 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 werden Möglichkeiten beschrieben, ein Gerät neu zu starten, ohne es auf den ursprünglichen Laufwerkstatus zurückzusetzen.

Sauberer 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. Die Hostprozesse von Tintenfischen 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 einen sauberen Neustart eines einzelnen Cuttlefish-Geräts in einer mehrmandantenfähigen Konfiguration ausführen möchten, geben Sie die Seriennummer des Zielgeräts an, wenn Sie adb-reboot ausführen. Wenn kein Zielgerät angegeben ist, startet adb kein Gerät neu.

adb -s SERIAL reboot

Nicht bereinigter Neustart

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

restart_cvd

restart_cvd fährt das Cuttlefish-Gerät nicht ordnungsgemäß herunter, indem es sofort heruntergefahren wird. restart_cvd entspricht dem Trennen und erneuten Verbinden des Akkus mit einem physischen Gerät. Laufwerkschreibvorgänge bleiben möglicherweise nicht bestehen, wenn sie gerade ausgeführt werden. restart_cvd wartet, bis das Gerät wieder vollständig gestartet wurde, bevor es beendet wird.

In einer Konfiguration mit mehreren Mietern startet restart_cvd eine einzelne Instanz aus der Instanzgruppe neu. Mit dem Flag instance_num können Sie angeben, 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

Führen Sie folgenden Befehl aus, um ein oder mehrere Geräte anzuhalten und mit unterschiedlichen launch_cvd-Flags neu zu starten:

stop_cvd
launch_cvd NEW_FLAG

stop_cvd führt ein nicht ordnungsgemäßes Herunterfahren aus, ähnlich wie restart_cvd. Das Gerät befindet sich dabei im Ruhezustand, das später mit einem anderen launch_cvd-Befehl neu gestartet werden kann. Wie bei restart_cvd bleiben Laufwerkschreiben möglicherweise nicht erhalten, wenn sie nicht vollständig mit dem Laufwerk synchronisiert werden. Führen Sie zuerst adb reboot aus, um Daten sicher auf dem Laufwerk zu speichern.

adb reboot
stop_cvd
launch_cvd NEW_FLAG

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

Ohne Overlay ausführen

Führen Sie folgenden Befehl 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 die Änderungen werden in diese Dateien übernommen.

Das Wechseln zwischen --use_overlay=false und dem Standard kann zu Kompatibilitätsfehlern führen. Führen Sie folgenden Befehl aus, um die Bereinigung des vorherigen Gerätestatus zu erzwingen:

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

Tintenfische können den Übergang zwischen den Datenflüssen mit und ohne Overlays nicht sicher verwenden. Daher wird durch diese Änderung der gesamte Verwaltungsstatus der Sepien gelöscht. Wenn Dateien von externen Laufwerken geändert und später zusammen mit Overlays wiederverwendet werden, werden die früheren Änderungen als Teil des Referenzstatus 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 beispielsweise das erste launch_cvd-Flag das Argument --kernel_path=KERNEL_PATH enthält, muss der zweite launch_cvd-Aufruf ebenfalls dasselbe --kernel_path=KERNEL_PATH-Argument enthalten. Andernfalls gehen alle Dateisystemänderungen, die vor stop_cvd vorgenommen wurden, im 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 gleich 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 sicher geändert werden, ohne Datenverlust zu verursachen:

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