Cuttlefish: перезапуск и сброс

На этой странице рассказывается, как перезапустить и сбросить виртуальные устройства Cuttlefish. Сброс устройства Cuttlefish до исходного состояния диска называется powerwashing в инструменте командной строки.

При запуске автоматизированных или ручных рабочих процессов с несколькими различными процедурами, такими как наборы тестов, сброс устройства Cuttlefish между процедурами гарантирует, что поведение каждой процедуры будет независимым. Если этого не сделать, одна процедура может повлиять на поведение следующей.

Процедуры перезапуска и сброса, описанные на этой странице, предполагают, что вы создали устройство Cuttlefish и задали некоторое состояние на диске.

# 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

После этого вы можете выполнить следующие действия:

Реализация быстрого сброса Cuttlefish

В Cuttlefish используется быстрая перезагрузка, которая зависит от защиты дисков за оверлеями дисков qcow2. По умолчанию Cuttlefish обрабатывает исходные диски как доступные только для чтения и использует оверлеи для записи на диск.

Однако у использования наложений с копированием при записи есть недостатки. В частности, внешние изменения базовых дисков нарушают совместимость с существующими оверлеями и приводят к несогласованному состоянию диска. Cuttlefish принудительно воссоздает оверлеи, когда обнаруживает несовместимые изменения.

Принудительное повторное создание оверлеев нежелательно при разработке функции, которая требует сохранения части диска в определенном инициализированном состоянии при замене другой части диска. Например, можно установить приложение с определенной конфигурацией пользователя, а затем многократно заменять ядро, чтобы проверить взаимодействие приложения с разными сборками ядра. В этом случае, возможно, стоит отключить оверлеи.

Как сбросить настройки устройств

В следующих разделах описаны способы сброса устройства Cuttlefish до исходного состояния диска.

Как сбросить настройки одного устройства

Чтобы сбросить одно устройство Cuttlefish до исходного состояния диска, выполните следующую команду:

powerwash_cvd

powerwash_cvd выключает виртуальную машину, сбрасывает все изменения, внесенные в диск виртуальной машины, перезапускает виртуальную машину и ждет, пока она не загрузится. Экземпляр сохраняет исходные флаги, заданные для launch_cvd.

В многопользовательской конфигурации команда powerwash_cvd перезапускает один экземпляр из группы экземпляров:

powerwash_cvd --instance_num=N

Сбросить настройки всех устройств

Чтобы остановить и сбросить одно или несколько устройств до исходного состояния диска, выполните следующую команду:

stop_cvd
launch_cvd --resume=false

stop_cvd выполняет некорректное завершение работы и останавливает устройство.

Добавление --resume=false в launch_cvd приводит к тому, что Cuttlefish удаляет все файлы, связанные с предыдущим запущенным экземпляром, перед запуском следующего. Вы можете добавлять любые дополнительные флаги launch_cvd.

В конфигурации с несколькими клиентамиß stop_cvd завершает работу всей группы экземпляров.

Перезагрузите устройства

В следующих разделах описаны способы перезапуска устройства без сброса его диска до исходного состояния.

Чистый перезапуск

Чтобы выполнить чистую перезагрузку устройства, когда оно реагирует на команды, выполните следующие действия:

adb reboot

adb reboot выполняет полную процедуру выключения устройства, синхронизируя изменения на диске и обеспечивая завершение процессов. Процессы хоста Cuttlefish не используются. Эта процедура может быть недоступна, если устройство перешло в неисправное состояние и перестало отвечать на запросы.

Чтобы выполнить чистую перезагрузку одного устройства Cuttlefish в конфигурации с несколькими клиентами, укажите серийный номер целевого устройства при запуске adb-reboot. Если целевое устройство не указано, adb не перезапускает ни одно устройство.

adb -s SERIAL reboot

Некорректный перезапуск

Чтобы выполнить некорректный перезапуск, когда устройство не отвечает, выполните следующую команду:

restart_cvd

restart_cvd выполняет некорректное завершение работы, мгновенно выключая устройство Cuttlefish. restart_cvd – это то же самое, что отключить и снова подключить батарею к физическому устройству. Записи на диск, которые выполнялись в момент сбоя, могут не сохраниться. restart_cvd дожидается полной загрузки устройства, прежде чем завершить работу.

В конфигурации с несколькими клиентами restart_cvd перезапускает один экземпляр из группы экземпляров. Чтобы указать, какой экземпляр Cuttlefish нужно перезапустить, используйте флаг instance_num.

restart_cvd --instance_num=N

Если параметр --instance_num не используется, по умолчанию применяется номер экземпляра 1.

Перезапустите, используя другие флаги launch_cvd.

Чтобы остановить одно или несколько устройств и перезапустить их с другими флагами launch_cvd, выполните следующую команду:

stop_cvd
launch_cvd NEW_FLAG

stop_cvd выполняет некорректное завершение работы, аналогичное restart_cvd. Устройство переходит в спящий режим, из которого его можно вывести с помощью другой команды launch_cvd. Как и в случае с restart_cvd, данные, записанные на диск, могут не сохраниться, если они не были полностью синхронизированы с диском. Чтобы безопасно сохранить данные на диск, сначала запустите adb reboot.

adb reboot
stop_cvd
launch_cvd NEW_FLAG

Если изменения флагов launch_cvd приводят к изменению макета диска, несовместимому с реализацией копирования при записи, launch_cvd игнорирует старые изменения диска и возвращается к исходному состоянию диска. Полный список флагов приведен в разделе Флаги.

Запуск без оверлея

Чтобы отключить поддержку быстрого сброса, выполните следующую команду:

launch_cvd --use_overlay=false

--use_overlay=false обрабатывает файлы диска Cuttlefish как доступные для чтения и записи, и изменения распространяются на эти файлы.

Переключение между --use_overlay=false и значением по умолчанию может привести к ошибкам совместимости. Чтобы принудительно очистить состояние предыдущего устройства, выполните следующие действия:

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

Поскольку Cuttlefish не может безопасно переходить между потоками с наложениями и без них, это изменение удаляет все данные управления Cuttlefish. Если файлы на внешнем диске были изменены и используются повторно вместе с наложениями, предыдущие изменения считаются частью базового состояния.

Флаги

При запуске устройства Cuttlefish с помощью launch_cvd можно добавить аргументы, используя флаги. Однако для некоторых флагов (флагов, которые должны оставаться неизменными) при изменении флагов между командами launch_cvd может произойти потеря данных. Чтобы избежать потери данных при выполнении последовательности команд, включающей launch_cvd, stop_cvd и снова launch_cvd, используйте одни и те же флаги для каждой команды launch_cvd. Например, если первый флаг launch_cvd содержит аргумент --kernel_path=KERNEL_PATH, то второй вызов launch_cvd также должен содержать тот же аргумент --kernel_path=KERNEL_PATH, иначе все изменения файловой системы, внесенные до stop_cvd, будут потеряны во втором вызове launch_cvd. Файл, на который ссылается KERNEL_PATH, также должен иметь такое же содержимое.

Некоторые параметры можно безопасно менять между вызовами launch_cvd. В разделах ниже перечислены параметры, которые должны оставаться неизменными, чтобы избежать потери данных, и параметры, которые можно безопасно изменить без потери данных. Подробную информацию об отдельных параметрах можно найти в исходном коде (flags.cc, disk_flags.cc) или получить с помощью команды launch_cvd --help.

Параметры, которые должны оставаться неизменными

Чтобы избежать потери данных, эти флаги должны оставаться неизменными от одного вызова 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

Флаги, которые можно изменить

Эти флаги можно безопасно менять между вызовами launch_cvd, не опасаясь потери данных:

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