Cuttlefish: restart i reset

Na tej stronie dowiesz się, jak ponownie uruchamiać i resetować urządzenia wirtualne Cuttlefish. Resetowanie urządzenia Cuttlefish do początkowego stanu dysku jest w narzędziu wiersza poleceń nazywane powerwash.

Podczas wykonywania zautomatyzowanych lub ręcznych procesów z wieloma różnymi procedurami, takimi jak pakiety testów, resetowanie urządzenia Cuttlefish między procedurami zapewnia, że zachowanie każdej procedury jest niezależne. Jeśli stan dysku nie zostanie zresetowany, jedna procedura może wpłynąć na zachowanie następnej.

Procedury ponownego uruchamiania i resetowania opisane na tej stronie zakładają, że masz już utworzone urządzenie Cuttlefish i ustawiony na dysku pewien stan.

# 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

Od tego punktu wyjścia możesz użyć tych procesów ponownego uruchamiania i resetowania:

  • Jeśli urządzenie odpowiada, wykonaj czyste ponowne uruchomienie za pomocą adb reboot.
  • Jeśli urządzenie nie odpowiada, wykonaj nieczyste ponowne uruchomienie za pomocą restart_cvd.
  • Zresetuj stan urządzenia za pomocą polecenia powerwash_cvd.
  • Zatrzymaj urządzenie i zmień argumenty launch_cvd, zachowując stan urządzenia lub wymuszając jego wyczyszczenie .

Szybkie resetowanie Cuttlefish

Cuttlefish używa szybkiego resetowania, które zależy od ochrony dysków za pomocą nakładek qcow2. Domyślnie Cuttlefish traktuje oryginalne dyski jako tylko do odczytu i używa nakładek do przechwytywania zapisów na dysku.

Korzystanie z nakładek typu copy-on-write ma jednak wady. Przede wszystkim zewnętrzne zmiany na dyskach bazowych powodują utratę zgodności z dotychczasowymi nakładkami i niespójny stan dysku. Gdy Cuttlefish wykryje niezgodne zmiany, wymusi ponowne utworzenie nakładek.

Wymuszone ponowne utworzenie nakładek jest niepożądane podczas tworzenia funkcji, która wymaga zachowania części dysku w określonym stanie początkowym, a jednocześnie zamiany innej części dysku. Na przykład podczas instalowania aplikacji z określoną konfiguracją użytkownika, a następnie wielokrotnego zamieniania jądra w celu przetestowania interakcji między aplikacją a różnymi kompilacjami jądra. W takim przypadku, warto wyłączyć nakładki.

Resetowanie urządzeń

W sekcjach poniżej opisujemy, jak zresetować urządzenie Cuttlefish do początkowego stanu dysku.

Resetowanie jednego urządzenia

Aby zresetować jedno urządzenie Cuttlefish do początkowego stanu dysku, uruchom to polecenie:

powerwash_cvd

powerwash_cvd wyłącza maszynę wirtualną, resetuje wszelkie zmiany wprowadzone na dysku maszyny wirtualnej, ponownie uruchamia maszynę wirtualną i czeka, aż zakończy się jej uruchamianie. Instancja zachowuje oryginalne flagi przekazane do launch_cvd.

W konfiguracji wielodostępowej, powerwash_cvd ponownie uruchamia jedną instancję z grupy instancji:

powerwash_cvd --instance_num=N

Resetowanie wszystkich urządzeń

Aby zatrzymać i zresetować co najmniej 1 urządzenie do początkowego stanu dysku, uruchom to polecenie:

stop_cvd
launch_cvd --resume=false

stop_cvd wykonuje nieczyste wyłączenie i zatrzymuje urządzenie.

Dodanie --resume=false do launch_cvd powoduje, że Cuttlefish niszczy wszystkie pliki związane z poprzednio uruchomioną instancją przed rozpoczęciem następnego uruchomienia. Możesz bezpiecznie dodać dowolne dodatkowe launch_cvd flagi.

W konfiguracji wielodostępowej stop_cvd wyłącza całą grupę instancji.

Ponowne uruchamianie urządzeń

W sekcjach poniżej opisujemy, jak ponownie uruchomić urządzenie bez resetowania go do początkowego stanu dysku.

Czyste ponowne uruchomienie

Aby wykonać czyste ponowne uruchomienie urządzenia, gdy urządzenie odpowiada, uruchom to polecenie:

adb reboot

adb reboot przeprowadza urządzenie przez pełną procedurę wyłączania, synchronizując zmiany na dysku i upewniając się, że procesy zostały zamknięte. Procesy hosta Cuttlefish nie są zaangażowane. Ta procedura może być niedostępna, jeśli urządzenie przeszło w nieprawidłowy stan i przestało odpowiadać.

Aby wykonać czyste ponowne uruchomienie jednego urządzenia Cuttlefish w konfiguracji wielodostępowej, podczas uruchamiania adb-reboot określ numer seryjny urządzenia docelowego. Jeśli nie określono urządzenia docelowego, adb nie uruchomi ponownie żadnego urządzenia.

adb -s SERIAL reboot

Nieczyste ponowne uruchomienie

Aby wykonać nieczyste ponowne uruchomienie, gdy urządzenie nie odpowiada, uruchom to polecenie:

restart_cvd

restart_cvd wykonuje nieczyste wyłączenie, natychmiast wyłączając urządzenie Cuttlefish. restart_cvd odpowiada odłączeniu i ponownemu podłączeniu baterii do urządzenia fizycznego. Zapisy na dysku mogą nie zostać zachowane, jeśli były w trakcie. restart_cvd czeka, aż urządzenie w pełni się uruchomi, zanim zakończy działanie.

W konfiguracji wielodostępowej, restart_cvd ponownie uruchamia jedną instancję z grupy instancji. Aby określić, którą instancję Cuttlefish należy ponownie uruchomić, użyj flagi instance_num.

restart_cvd --instance_num=N

Jeśli nie użyjesz --instance_num, numer instancji domyślnie będzie wynosić 1.

Ponowne uruchamianie za pomocą różnych flag launch_cvd

Aby zatrzymać co najmniej 1 urządzenie i ponownie uruchomić je z innymi flagami launch_cvd, uruchom to polecenie:

stop_cvd
launch_cvd NEW_FLAG

stop_cvd wykonuje nieczyste wyłączenie podobne do restart_cvd. Pozostawia urządzenie w stanie uśpienia, który można później ponownie uruchomić za pomocą innego polecenia launch_cvd. Podobnie jak w przypadku restart_cvd, zapisy na dysku mogą nie zostać zachowane, jeśli nie zostaną w pełni zsynchronizowane z dyskiem. Aby bezpiecznie zapisać dane na dysku, najpierw uruchom adb reboot.

adb reboot
stop_cvd
launch_cvd NEW_FLAG

Jeśli zmiany we flagach launch_cvd wymuszą zmianę układu dysku, która jest niezgodna z implementacją copy-on-write, launch_cvd zignoruje stare modyfikacje dysku i zresetuje go do pierwotnego stanu. Pełną listę flag znajdziesz w sekcji Flagi.

Uruchamianie bez nakładki

Aby zrezygnować z obsługi szybkiego resetowania, uruchom to polecenie:

launch_cvd --use_overlay=false

--use_overlay=false traktuje pliki dysku Cuttlefish jako pliki do odczytu i zapisu, a zmiany są propagowane do tych plików.

Przełączanie między --use_overlay=false a wartością domyślną może powodować błędy zgodności. Aby wymusić wyczyszczenie poprzedniego stanu urządzenia, uruchom to polecenie:

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

Cuttlefish nie może bezpiecznie przejść między procesami z nakładkami i bez nich, dlatego ta zmiana usuwa cały stan zarządzania Cuttlefish. Jeśli zewnętrzne pliki dysku zostaną zmodyfikowane i ponownie użyte razem z nakładkami, wcześniejsze modyfikacje zostaną uznane za część stanu bazowego.

Flagi

Podczas uruchamiania urządzenia Cuttlefish za pomocą launch_cvd możesz dodawać argumenty za pomocą flag. W przypadku niektórych flag (Flagi, które muszą pozostać bez zmian) utrata danych może nastąpić, jeśli flagi zostaną zmienione między launch_cvd poleceniami. Aby uniknąć utraty danych podczas wykonywania sekwencji poleceń, które obejmują launch_cvd, stop_cvd i ponownie launch_cvd, używaj tych samych flag w każdym poleceniu launch_cvd. Jeśli na przykład pierwsza flaga launch_cvd zawiera argument --kernel_path=KERNEL_PATH, drugie wywołanie launch_cvd musi również zawierać ten sam argument --kernel_path=KERNEL_PATH . W przeciwnym razie wszelkie zmiany w systemie plików wprowadzone przed stop_cvd zostaną utracone w drugim wywołaniu launch_cvd. Plik, do którego odwołuje się KERNEL_PATH, musi mieć też taką samą zawartość.

Niektóre flagi można bezpiecznie zmieniać między wywołaniami launch_cvd. W sekcjach poniżej znajdziesz listę flag, które muszą pozostać bez zmian, aby uniknąć utraty danych, oraz flag, które można bezpiecznie zmieniać bez utraty danych. Szczegółowe informacje o poszczególnych flagach, znajdziesz w kodzie źródłowym ( flags.cc , disk_flags.cc ) lub uruchamiając launch_cvd --help.

Flagi, które muszą pozostać bez zmian

Aby uniknąć utraty danych, te flagi muszą pozostać bez zmian między kolejnymi wywołaniami launch_cvd:

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

Flagi, które można zmieniać

Te flagi można bezpiecznie zmieniać między wywołaniami launch_cvd bez utraty danych:

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