本页介绍了如何重启和重置 Cuttlefish 虚拟设备。在命令行工具中,将 Cuttlefish 设备重置为其初始磁盘状态称为“执行 Powerwash 操作”。
在运行具有多个不同过程(如测试套件)的自动化或手动工作流时,在过程之间重置 Cuttlefish 设备可确保每个过程的行为是独立的。如果未重置磁盘状态,则一个过程可能会影响后续过程的行为。
本页面介绍的重启和重置过程假定您已创建 Cuttlefish 设备并在磁盘上设置了某种状态。
# Launch a devicelaunch_cvd# Make some modifications to the deviceadb shell touch /storage/self/primary/Documents/hello# Check the device stateadb shell ls /storage/self/primary/Documents
从此开始,您可以使用以下重启和重置流程:
- 如果设备有响应,请使用
adb reboot执行正常重启。 - 如果设备没有响应,请使用
restart_cvd执行异常重启。 - 使用
powerwash_cvd重置设备状态。 - 停止设备并更改
launch_cvd参数,同时保持设备状态或强制清除设备状态。
Cuttlefish 快速重置实现
Cuttlefish 使用快速重置实现,该实现通过 qcow2 磁盘叠加层来保护磁盘。默认情况下,Cuttlefish 将原始磁盘视为只读,并使用叠加层捕获磁盘写入内容。
不过,使用写时复制叠加层存在缺点。值得注意的是,对底层磁盘的外部更改会破坏与现有叠加层的兼容性,并导致磁盘状态不一致。当 Cuttlefish 检测到不兼容的更改时,会强制重新创建叠加层。
如果开发需要将部分磁盘保持在特定的初始化状态而同时换出磁盘另一部分的功能,则强制重新创建叠加层是不可取的。例如,安装具有特定用户配置的应用,然后反复换出内核以测试应用与其他内核 build 之间的互动。在这种情况下,不妨停用叠加层。
重置设备
以下部分介绍了如何将 Cuttlefish 设备重置为其初始磁盘状态。
重置一台设备
如需将一台 Cuttlefish 设备重置为其初始磁盘状态,请运行以下命令:
powerwash_cvdpowerwash_cvd 会关闭虚拟机、重置对虚拟机磁盘所做的任何更改、重启虚拟机,并等待虚拟机完成启动。实例会保留提供给 launch_cvd 的原始标志。
在多租户配置中,powerwash_cvd 会从实例组中重启单个实例:
powerwash_cvd --instance_num=N重置所有设备
如需停止一台或多台设备并将其重置为初始磁盘状态,请运行以下命令:
stop_cvdlaunch_cvd --resume=false
stop_cvd 会执行异常的关闭操作,并停止设备。
将 --resume=false 添加到 launch_cvd 会使 Cuttlefish 在开始下一次运行之前销毁与先前运行的实例相关的所有文件。您可以放心地添加任何其他 launch_cvd 标志。
在多租户配置中,stop_cvd 会关闭整个实例组。
重启设备
以下部分介绍了如何在不将设备重置为初始磁盘状态的情况下重启设备。
正常重启
如需在设备响应时正常重启设备,请运行以下命令:
adb rebootadb reboot 会使设备完成完整关闭过程,将更改同步到磁盘并确保进程关闭。不涉及 Cuttlefish 主机进程。如果设备进入不良状态且无响应,则此过程可能不可用。
如需在多租户配置中正常重启单个 Cuttlefish 设备,请在运行 adb-reboot 时指定目标设备的序列号。如果未指定目标设备,adb 不会重启任何设备。
adb -s SERIAL reboot异常重启
如需在设备无响应时执行异常重启,请运行以下命令:
restart_cvdrestart_cvd 通过立即关闭 Cuttlefish 设备来执行异常关闭。restart_cvd 相当于将电池断开连接并重新连接到实体设备。如果磁盘写入正在进行,则可能不会保留写入内容。restart_cvd 会等到设备完全启动后再退出。
在多租户配置中,restart_cvd 会从实例组中重启单个实例。如需指定要重启的 Cuttlefish 实例,请使用 instance_num 标志。
restart_cvd --instance_num=N如果未使用 --instance_num,则实例编号默认为 1。
使用不同的 launch_cvd 标志重启
如需停止一台或多台设备并使用不同的 launch_cvd 标志重新启动,请运行以下命令:
stop_cvdlaunch_cvd NEW_FLAG
stop_cvd 会执行异常关闭,类似于 restart_cvd。它会使设备处于休眠状态,稍后可通过其他 launch_cvd 命令再次启动。与 restart_cvd 一样,如果磁盘写入内容未完全同步到磁盘,则写入内容可能不会保留。如需将数据安全地保存到磁盘,请先运行 adb reboot。
adb rebootstop_cvdlaunch_cvd NEW_FLAG
如果对 launch_cvd 标志的更改会强制更改与写入时复制实现不兼容的磁盘布局,launch_cvd 会忽略旧磁盘修改并重置为原始磁盘状态。如需查看完整的标志列表,请参阅标志。
运行不带叠加层
如需停用快速重置支持功能,请运行以下命令:
launch_cvd --use_overlay=false--use_overlay=false 会将 Cuttlefish 磁盘文件视为读写操作,并且更改会传播到这些文件。
在 --use_overlay=false 和默认值之间切换可能会导致兼容性错误。如需强制清理之前的设备状态,请运行以下命令:
stop_cvdrm $HOME/cuttlefish $HOME/cuttlefish_runtime $HOME/cuttlefish_assembly
Cuttlefish 无法安全地在有叠加层和无叠加层的工作流之间导航,因此这项更改会删除所有 Cuttlefish 管理状态。如果外部磁盘文件被修改后又与叠加层一起重复使用,则之前的修改将被视为基准状态的一部分。
标志
使用 launch_cvd 启动 Cuttlefish 设备时,您可以使用标志添加参数。但是,对于某些标志(必须保持不变的标志),如果在 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