本页介绍如何重新启动和重置 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 使用快速重置实现,该实现依赖于保护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