Cuttlefish: Khởi động lại và đặt lại

Trang này mô tả cách khởi động lại và đặt lại các thiết bị ảo Cuttlefish. Việc đặt lại thiết bị Cuttlefish về trạng thái đĩa ban đầu được gọi là powerwashing trong công cụ dòng lệnh.

Khi chạy quy trình 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 sau.

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 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

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:

Triển khai tính năng đặt lại nhanh trên Cuttlefish

Cuttlefish sử dụng một quy trình triển khai đặt lại nhanh, phụ thuộc vào việc bảo vệ các đĩa đằng 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ũng có những hạn chế. Đặc biệt, những thay đổi bên ngoài đối với các đĩa cơ bản sẽ làm mất 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 tạo lại các lớp phủ khi phát hiện thấy những thay đổi không tương thích.

Việc buộc tạo lại lớp phủ là không nên khi phát triển một tính năng yêu cầu giữ một phần của đĩa ở một 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 thay thế hạt nhân để kiểm thử hoạt động tương tác giữa ứng dụng và các bản dựng hạt nhân khác nhau. Trong trường hợp này, bạn nên tắt lớp phủ.

Đặt lại thiết bị

Các phần sau đây mô tả những cách để đặt lại thiết bị Cuttlefish về trạng thái đĩa ban đầu.

Đặt lại một thiết bị

Để đặt lại một thiết bị Cuttlefish về trạng thái đĩa ban đầu, hãy chạy:

powerwash_cvd

powerwash_cvd 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 giữ nguyên 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 đĩa ban đầu, hãy chạy:

stop_cvd
launch_cvd --resume=false

stop_cvd thực hiện quy trình tắt không đúng cách và dừng thiết bị.

Việc thêm --resume=false vào launch_cvd 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 nào khác một cách an toàn.

Trong cấu hình nhiều người 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ả những 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 thiết bị khi thiết bị phản hồi, hãy chạy:

adb reboot

adb reboot sẽ đưa thiết bị qua toàn bộ quy trình tắt, đồng bộ hoá các thay đổi vào ổ đĩa và đảm bảo các quy trình tắt. Không liên quan đến các quy trình lưu trữ Cuttlefish. Quy trình này có thể không hoạt động 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 hoàn toàn một thiết bị Cuttlefish trong cấu hình nhiều người 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ị đích 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 reboot

Khởi động lại không đúng cách

Để thực hiện thao tác khởi động lại không đúng cách khi thiết bị không phản hồi, hãy chạy:

restart_cvd

restart_cvd thực hiện quy trình tắt không đúng cá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 rồi kết nối lại pin với một thiết bị thực tế. Các thao tác ghi vào ổ đĩa có thể không duy trì được 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 rồi mới 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 dùng cờ instance_num.

restart_cvd --instance_num=N

Nếu bạn không 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 với các cờ launch_cvd khác, hãy chạy:

stop_cvd
launch_cvd NEW_FLAG

stop_cvd thực hiện quy trình tắt không đúng cách tương tự như restart_cvd. Lệnh này sẽ đưa thiết bị vào trạng thái không hoạt động và có thể khởi động lại sau bằng một lệnh launch_cvd khác. Tương tự như restart_cvd, các thao tác ghi vào ổ đĩa có thể không duy trì được 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, hãy chạy adb reboot trước.

adb reboot
stop_cvd
launch_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 việc triển khai sao chép khi ghi, thì launch_cvd sẽ bỏ qua các nội dung 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 sử dụng tính năng hỗ trợ đặt lại nhanh, hãy chạy lệnh:

launch_cvd --use_overlay=false

--use_overlay=false coi các tệp đĩa Cuttlefish là có quyền đọc-ghi và các thay đổi sẽ được truyền vào các tệp đó.

Việc thay đổi giữa --use_overlay=false và chế độ 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_cvd
rm $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 trên ổ đĩa ngoài được sửa đổi và sau đó được dùng lại cùng với lớp phủ, thì các nội dung 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 các đối số bằng cách sử dụng cờ khi khởi chạy thiết bị Cuttlefish bằng launch_cvd. Tuy nhiên, đối với một số cờ (Các cờ phải giữ nguyên), tình trạng mất dữ liệu có thể xảy ra nếu các cờ bị thay đổi giữa các lệnh launch_cvd. Để đảm bảo không bị mất dữ liệu khi chạy một chuỗi lệnh bao gồm launch_cvd, stop_cvd rồi lại launch_cvd, hãy 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ự, nếu không, 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 mà KERNEL_PATH tham chiếu đến cũng phải có nội dung tương tự.

Bạn có thể thay đổi một số cờ giữa các lệnh gọi launch_cvd. Các phần sau đây liệt kê những cờ phải giữ nguyên để tránh mất dữ liệu và những 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ác cờ phải giữ nguyên

Các cờ này phải giữ nguyên từ mộ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 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 gây 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
  • --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