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ść zachowania każdej procedury. 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 zainstalowanie aplikacji z określoną konfiguracją użytkownika, a następnie wielokrotne zastępowanie jądra, aby przetestować interakcję 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

Resetuj wszystkie urządzenia

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 wcześniej uruchomioną instancją przed rozpoczęciem kolejnego uruchomienia. Możesz bezpiecznie dodać dowolne dodatkowe launch_cvdflagi.

W konfiguracji z wieloma najemcamiß stop_cvd wyłącza 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 nie reaguje na polecenia.

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 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 realizacji. restart_cvd czeka, aż urządzenie ponownie się włączy, 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 będzie domyślnie 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 będą później ponownie używane razem z nakładkami, wcześniejsze modyfikacje będą traktowane jako część stanu podstawowego.

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 znacznik 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ć te same treści.

Niektóre flagi można bezpiecznie zmieniać między wywołaniami launch_cvd. W sekcjach poniżej znajdziesz listę flag, które muszą pozostać niezmienione, 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 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