Каракатица: перезагрузка и сброс

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

При запуске автоматизированных или ручных рабочих процессов с несколькими различными процедурами, например наборами тестов, сброс настроек устройства 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 использует реализацию быстрого сброса, которая зависит от защиты дисков за наложением дисков qcow2 . По умолчанию 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 в мультитенантной конфигурации , укажите серийный номер целевого устройства при запуске adb-reboot . Если целевое устройство не указано, adb не перезапускает ни одно устройство.

adb -s SERIAL reboot

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

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

restart_cvd

restart_cvd выполняет некорректное завершение работы, мгновенно отключая устройство Каракатицы. 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 обрабатывает дисковые файлы Каракатиц как для чтения и записи, и изменения распространяются на эти файлы.

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

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

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

Флаги

Вы можете добавлять аргументы, используя флаги, при запуске устройства 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
  • --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