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