本頁說明如何重新啟動及重設 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_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 引數,否則在第二個 launch_cvd 呼叫中,stop_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