Trang này mô tả cách khởi động lại và đặt lại thiết bị ảo Cuttlefish. Việc đặt lại thiết bị Cuttlefish về trạng thái ban đầu của đĩa được gọi là powerwashing trong công cụ dòng lệnh.
Khi chạy quy trình công việc tự động hoặc thủ công với nhiều quy trình khác nhau, chẳng hạn như bộ kiểm thử, việc đặt lại thiết bị Cuttlefish giữa các quy trình sẽ đảm bảo rằng hành vi của mỗi quy trình là độc lập. Nếu trạng thái đĩa không được đặt lại, một quy trình có thể ảnh hưởng đến hành vi của quy trình tiếp theo.
Quy trình khởi động lại và đặt lại được mô tả trên trang này giả định rằng bạn đã tạo một thiết bị Cuttlefish và đã đặt một số trạng thái trên đĩa.
# 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
Từ điểm bắt đầu này, bạn có thể sử dụng các quy trình khởi động lại và đặt lại sau đây:
- Nếu thiết bị phản hồi, hãy thực hiện thao tác khởi động lại sạch bằng
adb reboot. - Nếu thiết bị không phản hồi, hãy thực hiện thao tác khởi động lại không sạch bằng
restart_cvd. - Đặt lại trạng thái thiết bị bằng
powerwash_cvd. - Dừng thiết bị và thay đổi các đối số
launch_cvdtrong khi vẫn giữ trạng thái thiết bị hoặc buộc xoá trạng thái thiết bị.
Triển khai tính năng đặt lại nhanh Cuttlefish
Cuttlefish sử dụng một cách triển khai tính năng đặt lại nhanh, phụ thuộc vào việc bảo vệ các đĩa phía sau lớp phủ đĩa qcow2. Theo mặc định, Cuttlefish coi các đĩa gốc là chỉ đọc và sử dụng lớp phủ để ghi lại các thao tác ghi đĩa.
Tuy nhiên, việc sử dụng lớp phủ sao chép khi ghi có những nhược điểm. Đáng chú ý là các thay đổi bên ngoài đối với các đĩa cơ bản sẽ phá vỡ khả năng tương thích với các lớp phủ hiện có và gây ra trạng thái đĩa không nhất quán. Cuttlefish buộc phải tạo lại các lớp phủ khi phát hiện thấy các thay đổi không tương thích.
Việc buộc tạo lại các lớp phủ là không mong muốn khi phát triển một tính năng yêu cầu giữ một phần của đĩa ở trạng thái khởi tạo cụ thể trong khi hoán đổi một phần khác của đĩa. Ví dụ: cài đặt một ứng dụng có cấu hình người dùng cụ thể, sau đó liên tục hoán đổi nhân để kiểm thử sự tương tác giữa ứng dụng và các bản dựng nhân khác nhau. Trong trường hợp này, bạn nên tắt các lớp phủ.
Đặt lại thiết bị
Các phần sau đây mô tả cách đặt lại thiết bị Cuttlefish về trạng thái ban đầu của đĩa.
Đặt lại một thiết bị
Để đặt lại một thiết bị Cuttlefish về trạng thái ban đầu của đĩa, hãy chạy:
powerwash_cvdpowerwash_cvd sẽ tắt máy ảo, đặt lại mọi thay đổi được thực hiện đối với đĩa máy ảo, khởi động lại máy ảo và đợi cho đến khi quá trình khởi động hoàn tất. Phiên bản này sẽ giữ lại các cờ ban đầu được cung cấp cho launch_cvd.
Trong cấu hình nhiều đối tượng thuê,
powerwash_cvd sẽ khởi động lại một phiên bản duy nhất trong nhóm phiên bản:
powerwash_cvd --instance_num=NĐặt lại tất cả thiết bị
Để dừng và đặt lại một hoặc nhiều thiết bị về trạng thái ban đầu của đĩa, hãy chạy:
stop_cvdlaunch_cvd --resume=false
stop_cvd thực hiện thao tác tắt không sạch và dừng thiết bị.
Việc thêm --resume=false vào launch_cvd sẽ khiến Cuttlefish huỷ tất cả các tệp liên quan đến phiên bản đang chạy trước đó trước khi bắt đầu lần chạy tiếp theo. Bạn có thể thêm bất kỳ cờ launch_cvd bổ sung nào.
Trong cấu hình nhiều đối tượng thuê,stop_cvd sẽ tắt toàn bộ nhóm phiên bản.
Khởi động lại thiết bị
Các phần sau đây mô tả cách khởi động lại thiết bị mà không cần đặt lại thiết bị về trạng thái ban đầu của đĩa.
Khởi động lại sạch
Để khởi động lại sạch thiết bị khi thiết bị phản hồi, hãy chạy:
adb rebootadb reboot sẽ đưa thiết bị trải qua toàn bộ quy trình tắt, đồng bộ hoá các thay đổi với đĩa và đảm bảo các quy trình tắt. Các quy trình máy chủ Cuttlefish không liên quan. Quy trình này có thể không dùng được nếu thiết bị đã chuyển sang trạng thái không tốt và không phản hồi.
Để khởi động lại sạch một thiết bị Cuttlefish trong cấu hình
nhiều đối tượng thuê, hãy chỉ định
số sê-ri
của thiết bị mục tiêu khi chạy adb-reboot. Nếu không có thiết bị mục tiêu nào được chỉ định, adb sẽ không khởi động lại bất kỳ thiết bị nào.
adb -s SERIAL rebootKhởi động lại không sạch
Để thực hiện thao tác khởi động lại không sạch khi thiết bị không phản hồi, hãy chạy:
restart_cvdrestart_cvd thực hiện thao tác tắt không sạch bằng cách tắt ngay thiết bị Cuttlefish. restart_cvd tương đương với việc ngắt kết nối và kết nối lại pin với thiết bị thực. Các thao tác ghi đĩa có thể không tồn tại nếu đang diễn ra. restart_cvd sẽ đợi cho đến khi thiết bị khởi động lại hoàn toàn trước khi thoát.
Trong cấu hình nhiều đối tượng thuê,
restart_cvd sẽ khởi động lại một phiên bản duy nhất trong nhóm phiên bản. Để chỉ định phiên bản Cuttlefish cần khởi động lại, hãy sử dụng cờ instance_num.
restart_cvd --instance_num=NNếu không sử dụng --instance_num, số phiên bản sẽ mặc định là 1.
Khởi động lại bằng các cờ launch_cvd khác
Để dừng một hoặc nhiều thiết bị và khởi chạy lại bằng các cờ launch_cvd khác, hãy chạy:
stop_cvdlaunch_cvd NEW_FLAG
stop_cvd thực hiện thao tác tắt không sạch tương tự như restart_cvd. Thao tác này sẽ để thiết bị ở trạng thái không hoạt động mà sau này có thể khởi động lại bằng lệnh launch_cvd khác. Tương tự như restart_cvd, các thao tác ghi đĩa có thể không tồn tại nếu chưa được đồng bộ hoá hoàn toàn với đĩa. Để lưu dữ liệu vào đĩa một cách an toàn, trước tiên hãy chạy adb reboot.
adb rebootstop_cvdlaunch_cvd NEW_FLAG
Nếu các thay đổi đối với cờ launch_cvd buộc thay đổi bố cục đĩa không tương thích với cách triển khai sao chép khi ghi, launch_cvd sẽ bỏ qua các sửa đổi đĩa cũ và đặt lại về trạng thái đĩa ban đầu. Để xem danh sách đầy đủ các cờ, hãy xem phần Cờ.
Chạy mà không có lớp phủ
Để chọn không dùng tính năng hỗ trợ đặt lại nhanh, hãy chạy:
launch_cvd --use_overlay=false--use_overlay=false coi các tệp đĩa Cuttlefish là đọc-ghi và các thay đổi được truyền vào các tệp đó.
Việc thay đổi giữa --use_overlay=false và giá trị mặc định có thể gây ra lỗi tương thích. Để buộc dọn dẹp trạng thái thiết bị trước đó, hãy chạy:
stop_cvdrm $HOME/cuttlefish $HOME/cuttlefish_runtime $HOME/cuttlefish_assembly
Cuttlefish không thể chuyển đổi an toàn giữa các luồng có và không có lớp phủ, vì vậy, thay đổi này sẽ xoá tất cả trạng thái quản lý Cuttlefish. Nếu các tệp đĩa bên ngoài được sửa đổi và được dùng lại sau này cùng với các lớp phủ, thì các sửa đổi trước đó sẽ được coi là một phần của trạng thái cơ sở.
Cờ
Bạn có thể thêm đối số bằng cách sử dụng cờ khi chạy thiết bị Cuttlefish bằng launch_cvd. Tuy nhiên, đối với một số cờ
(Cờ phải giữ nguyên), dữ liệu có thể bị mất nếu cờ bị
thay đổi giữa các lệnh launch_cvd. Để đảm bảo không xảy ra tình trạng mất dữ liệu khi chạy một chuỗi lệnh bao gồm launch_cvd, stop_cvd, sau đó là launch_cvd một lần nữa, hãy sử dụng cùng một cờ cho mọi lệnh launch_cvd. Ví dụ: nếu cờ launch_cvd đầu tiên bao gồm đối số
--kernel_path=KERNEL_PATH, thì lệnh gọi launch_cvd thứ hai
cũng phải bao gồm đối số --kernel_path=KERNEL_PATH
tương tự hoặc mọi thay đổi đối với hệ thống tệp được thực hiện trước stop_cvd sẽ bị mất trong lệnh gọi launch_cvd thứ hai. Tệp được tham chiếu bởi KERNEL_PATH cũng phải có cùng nội dung.
Bạn có thể thay đổi một số cờ một cách an toàn giữa các lệnh gọi launch_cvd. Các phần sau đây liệt kê các cờ phải giữ nguyên để tránh mất dữ liệu và các cờ có thể thay đổi một cách an toàn mà không làm mất dữ liệu. Để biết thông tin chi tiết về từng cờ,
hãy tham khảo nguồn (
flags.cc
, disk_flags.cc
) hoặc chạy launch_cvd --help.
Cờ phải giữ nguyên
Các cờ này phải giữ nguyên từ lệnh gọi launch_cvd này sang lệnh gọi tiếp theo để
tránh mất dữ liệu:
--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
Cờ có thể thay đổi
Bạn có thể thay đổi các cờ này một cách an toàn giữa các lệnh gọi launch_cvd mà không làm mất dữ liệu:
--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--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