Cuttlefish: restart i reset

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

Podczas uruchamiania automatycznych lub ręcznych przepływów pracy z wieloma różnymi procedurami, takimi jak zestawy testów, zresetowanie urządzenia Cuttlefish między procedurami zapewnia niezależność działania każdej z nich. Jeśli stan dysku nie zostanie zresetowany, jedna procedura może wpłynąć na działanie następnej.

Procedury ponownego uruchamiania i resetowania opisane na tej stronie zakładają, że masz 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

W tym miejscu możesz skorzystać z tych procesów ponownego uruchamiania i resetowania:

Implementacja szybkiego resetowania Cuttlefish

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

Korzystanie z nakładek typu copy-on-write ma jednak wady. W szczególności zewnętrzne zmiany na dyskach bazowych powodują utratę zgodności z istniejącymi nakładkami i niespójny stan dysku. Cuttlefish wymusza ponowne utworzenie nakładek, gdy wykryje niezgodne zmiany.

Wymuszone ponowne tworzenie nakładek jest niepożądane podczas opracowywania funkcji, która wymaga utrzymania części dysku w określonym stanie zainicjowania przy jednoczesnej wymianie innej części dysku. Może to być na przykład instalowanie aplikacji z określoną konfiguracją użytkownika, a następnie wielokrotne zamienianie 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 kolejnych sekcjach opisujemy sposoby przywracania urządzenia Cuttlefish do początkowego 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, ponownie uruchamia maszynę wirtualną i czeka, aż zakończy się jej uruchamianie. Instancja zachowuje oryginalne flagi przekazane do launch_cvd.

W konfiguracji z wieloma najemcami: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 nieprawidłowe wyłączenie i zatrzymuje urządzenie.

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

W konfiguracji wielodostępnejß stop_cvd zamyka całą grupę instancji.

Uruchom urządzenie ponownie

W kolejnych sekcjach opisujemy sposoby ponownego uruchamiania urządzenia bez przywracania go do początkowego stanu dysku.

Czysty restart

Aby wykonać czyste ponowne uruchomienie urządzenia, gdy odpowiada ono na polecenia, wpisz:

adb reboot

adb reboot przeprowadza pełną procedurę zamykania urządzenia, synchronizując zmiany na dysku i dbając o to, aby procesy zostały zamknięte. Procesy hosta Cuttlefish nie są zaangażowane. Ta procedura może być niedostępna, jeśli urządzenie jest w złym stanie i przestało reagować.

Aby przeprowadzić czysty restart pojedynczego urządzenia Cuttlefish w konfiguracji wielodostępowej, podczas uruchamiania adb-reboot podaj numer seryjny urządzenia docelowego. Jeśli nie określono urządzenia docelowego, adb nie uruchamia ponownie żadnego urządzenia.

adb -s SERIAL reboot

Nieprawidłowe ponowne uruchomienie

Aby wykonać nieprawidłowe ponowne uruchomienie, gdy urządzenie nie odpowiada, wpisz:

restart_cvd

restart_cvd wykonuje nieprawidłowe zamknięcie, 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ę w pełni uruchomi, zanim zakończy działanie.

W konfiguracji z wieloma najemcamirestart_cvd ponowne uruchomienie pojedynczej instancji z grupy instancji. Aby określić, którą instancję Cuttlefish chcesz 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.

Uruchom ponownie, używając innych flag launch_cvd

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

stop_cvd
launch_cvd NEW_FLAG

stop_cvd wykonuje nieprawidłowe wyłączenie podobne do restart_cvd. Urządzenie przechodzi w stan uśpienia, z którego można je później wybudzić 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 flag launch_cvd wymuszą zmianę układu dysku, która jest niezgodna z implementacją kopiowania przy zapisie, launch_cvd zignoruje stare modyfikacje dysku i przywróci pierwotny stan dysku. Pełną listę flag znajdziesz w sekcji Flagi.

Uruchom 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 domyślnym 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 przechodzić między przepływami z nakładkami i bez nich, więc ta zmiana usuwa cały stan zarządzania Cuttlefish. Jeśli pliki na dysku zewnętrznym zostaną zmodyfikowane i później ponownie użyte razem z nakładkami, wcześniejsze modyfikacje będą traktowane jako część stanu bazowego.

Flagi

Podczas uruchamiania urządzenia Cuttlefish za pomocą polecenia launch_cvd możesz dodawać argumenty za pomocą flag. W przypadku niektórych flag (flag, które muszą pozostać takie same) utrata danych może jednak nastąpić, jeśli flagi zostaną zmienione między poleceniami launch_cvd. Aby uniknąć utraty danych podczas wykonywania sekwencji poleceń, które zawierają launch_cvd, stop_cvd, a potem ponownie launch_cvd, używaj tych samych flag w każdym poleceniu launch_cvd. Jeśli na przykład pierwszy tag 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ę element KERNEL_PATH, musi zawierać tę samą treść.

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 zmienić bez utraty danych. Szczegółowe informacje o poszczególnych flagach znajdziesz w źródle (flags.cc, disk_flags.cc) lub uruchom polecenie launch_cvd --help.

Flagi, które muszą pozostać bez zmian

Aby uniknąć utraty danych, te flagi muszą pozostać takie same od jednego wywołania funkcji launch_cvd do następnego:

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

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