Cuttlefish: restart i reset

Ta strona opisuje, jak ponownie uruchomić i zresetować urządzenia wirtualne Cuttlefish. W narzędziu wiersza poleceń resetowanie urządzenia Cuttlefish do początkowego stanu dysku jest nazywane czyszczeniem.

Podczas uruchamiania ścieżek pracy automatycznych lub ręcznych z wieloma różnymi procedurami, takimi jak zestawy testów, zresetowanie urządzenia Cuttlefish między procedurami zapewnia, że zachowanie każdej procedury jest niezależne. Jeśli stan dysku nie jest zresetowany, jedna procedura może wpływać na działanie kolejnej procedury.

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

# 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

Po wykonaniu tych czynności możesz użyć tych ścieżek ponownego uruchamiania i resetowania:

Szybkie resetowanie w Cuttlefish

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

Korzystanie z przesłonek kopiowania podczas zapisu ma jednak pewne wady. W szczególności zmiany zewnętrzne w podstawowych dyskach powodują utratę zgodności z dotychczasowymi nakładkami i niespójny stan dysku. Cuttlefish przymusowo odtwarza nakładki, gdy wykryje niezgodne zmiany.

Przymusowe ponowne tworzenie nakładek jest niepożądane podczas tworzenia funkcji, która wymaga utrzymywania części dysku w określonym zainicjowanym stanie podczas zastępowania innej części dysku. Możesz na przykład zainstalować aplikację z określoną konfiguracją użytkownika, a potem wielokrotnie zmieniać jądro, aby przetestować interakcję między aplikacją a różnymi wersjami jądra. W takim przypadku warto wyłączyć nakładki.

Resetowanie urządzeń

W następnych sekcjach opisano sposoby przywracania urządzenia Cuttlefish do pierwotnego stanu dysku.

Resetowanie jednego urządzenia

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

powerwash_cvd

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

W konfiguracji dla wielu dzierżawców: powerwash_cvd powoduje ponowne uruchomienie pojedynczej instancji z grupy instancji:

powerwash_cvd --instance_num=N

Zresetuj wszystkie urządzenia

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

stop_cvd
launch_cvd --resume=false

stop_cvd wykonuje nieprawidłowe wyłączenie i zatrzymuje urządzenie.

Dodanie parametru --resume=false do parametru launch_cvd spowoduje, że przed rozpoczęciem kolejnego uruchomienia narzędzie Cuttlefish usunie wszystkie pliki powiązane z wcześniej uruchomioną instancją. Możesz dodać dodatkowe launch_cvdflagi.

W konfiguracji wielodzierżawczej polecenie stop_cvd wyłącza całą grupę instancji.

Uruchom urządzenie ponownie

W następnych sekcjach opisano sposoby ponownego uruchamiania urządzenia bez przywracania go do pierwotnego stanu dysku.

Czyste ponowne uruchomienie

Aby wyczyścić i ponownie uruchomić urządzenie, gdy jest ono gotowe do działania, uruchom:

adb reboot

adb reboot przeprowadza pełną procedurę zamykania urządzenia, synchronizując zmiany na dysku i upewniając się, że procesy zostały zamknięte. Procesy hosta Cuttlefish nie są uwzględniane. Ta procedura może być niedostępna, jeśli urządzenie przeszło w zły stan i przestało reagować na polecenia.

Aby wyczyścić i ponownie uruchomić pojedyncze urządzenie Cuttlefish w konfiguracji wielodostępnej, podaj numer seryjny urządzenia docelowego podczas uruchamiania adb-reboot. Jeśli nie zostanie określone żadne urządzenie docelowe, adb nie uruchomi żadnego urządzenia.

adb -s SERIAL reboot

Nieprawidłowy restart

Aby wykonać nieczyste ponowne uruchomienie, gdy urządzenie nie reaguje, uruchom:

restart_cvd

restart_cvd wykonuje nieprawidłowe wyłączenie, natychmiast wyłączając urządzenie Cuttlefish. restart_cvd jest odpowiednikiem odłączenia i ponownego podłączenia baterii do urządzenia fizycznego. Zapisy na dysku mogą nie zostać zachowane, jeśli były w trakcie. restart_cvd czeka, aż urządzenie ponownie się uruchomi, a potem zamyka się.

W konfiguracji dla wielu dzierżawcówrestart_cvd powoduje ponowne uruchomienie pojedynczej instancji z grupy instancji. Aby określić, którą instancję Cuttlefish ma zostać ponownie uruchomiona, użyj flagi instance_num.

restart_cvd --instance_num=N

Jeśli nie użyjesz parametru --instance_num, numer instancji zostanie domyślnie ustawiony na 1.

Uruchom ponownie, używając innych flag launch_cvd

Aby zatrzymać co najmniej 1 urządzenie i uruchomić je ponownie z różnymi flagami launch_cvd, uruchom:

stop_cvd
launch_cvd NEW_FLAG

stop_cvd wykonuje nieprawidłowe wyłączenie podobne do restart_cvd. Pozostawia urządzenie w stanie uśpienia, z którego można je 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 są 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 w flagach launch_cvd wymuszą zmianę układu dysku, która jest niezgodna z implementacją kopiowania na zapis, launch_cvd zignoruje stare modyfikacje dysku i przywróci go do pierwotnego stanu. Pełną listę flag znajdziesz w sekcji Flagi.

Uruchom bez nakładki

Aby zrezygnować z szybkiego resetowania, uruchom:

launch_cvd --use_overlay=false

--use_overlay=false traktuje pliki dyskowe Cuttlefish jako do odczytu i zapisu, a zmiany są rozpowszechniane w tych plikach.

Przełączanie się 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:

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

Cuttlefish nie może bezpiecznie przejść przez przejście między przepływami z i bez nakładek, więc ta zmiana powoduje usunięcie całego stanu zarządzania Cuttlefish. Jeśli pliki dysku zewnętrznego zostaną zmodyfikowane i ponownie użyte później razem z nakładkami, wcześniejsze modyfikacje zostaną uznane za część stanu bazowego.

Flagi

Podczas uruchamiania urządzenia Cuttlefish za pomocą polecenia launch_cvd możesz dodawać argumenty za pomocą flag. Jednak w przypadku niektórych flag (flag, które muszą pozostać takie same) może dojść do utraty danych, jeśli flagi zostaną zmienione między poleceniami launch_cvd. Aby mieć pewność, że podczas wykonywania sekwencji poleceń, które obejmują launch_cvd, stop_cvd, a następnie ponownie launch_cvd, nie dojdzie do utraty danych, użyj tych samych flag dla każdego polecenia launch_cvd. Jeśli np. pierwszy parametr launch_cvd zawiera argument --kernel_path=KERNEL_PATH, wywołanie drugiego parametru launch_cvd musi również zawierać ten sam argument --kernel_path=KERNEL_PATH, w przeciwnym razie wszelkie zmiany w systemie plików wprowadzone przed wywołaniem parametru stop_cvd zostaną utracone w przypadku drugiego wywołania parametru launch_cvd. Plik, do którego odwołuje się element KERNEL_PATH, musi mieć też taką samą zawartość.

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

Flagi, które muszą pozostać bez zmian

Aby uniknąć utraty danych, te flagi muszą pozostać takie same w kolejnych wywołaniach funkcji 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 mogą się zmienić

Te flagi można bezpiecznie zmieniać między wywołaniami funkcji launch_cvd bez ryzyka 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
  • --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