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 快速重設實作

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 管理狀態。 如果外部磁碟檔案經過修改,隨後又與疊加層一起重複使用,系統會將先前的修改視為基準狀態的一部分。

旗幟

您可以在啟動 Cuttlefish 裝置時,使用 launch_cvd 標記新增引數。不過,對於某些旗標 (必須保持不變的旗標),如果在 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