ปลาหมึก: รีสตาร์ทและรีเซ็ต

หน้านี้อธิบายวิธีการรีสตาร์ทและรีเซ็ตอุปกรณ์เสมือน 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 ใช้การรีเซ็ตอย่างรวดเร็วซึ่งขึ้นอยู่กับการปกป้องดิสก์ที่อยู่ด้านหลัง ดิสก์โอเวอร์เลย์ qcow2 ตามค่าเริ่มต้น 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 เครื่องเดียวใน การกำหนดค่าแบบหลายผู้เช่า ให้ระบุ หมายเลขซีเรียล ของอุปกรณ์เป้าหมายเมื่อเรียกใช้ 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 โดยใช้ launch_cvd อย่างไรก็ตาม สำหรับแฟล็กบางตัว ( แฟล็กที่ต้องคงเดิม ) ข้อมูลสูญหายอาจเกิดขึ้นได้หากแฟล็กถูกเปลี่ยนระหว่างคำสั่ง 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