本頁介紹如何重新啟動和重置 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