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 使用快速重置实现,该实现依赖于保护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_cvdstop_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.ccdisk_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