本頁說明如何重新啟動及重設 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