本页面介绍了如何重启和重置 Cuttlefish 虚拟设备。在命令行工具中,将 Cuttlefish 设备重置为其初始磁盘状态称为“powerwashing”(强力清除)。
在运行包含多个不同程序(例如测试套件)的自动化或手动工作流时,在程序之间重置 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 会强制重新创建覆盖层。
在开发需要将磁盘的某一部分保持在特定初始化状态,同时换出磁盘的不同部分的功能时,强制重新创建覆盖层是不可取的。例如,安装具有特定用户配置的应用,然后重复换出内核以测试应用与不同内核版本之间的交互。在这种情况下,禁用覆盖层可能值得考虑。
重置设备
以下部分介绍了将 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 管理状态。如果外部磁盘文件被修改并在以后与覆盖层一起重用,则较早的修改被视为基线状态的一部分。
标志
在使用 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