ساقه ماهی: راه اندازی مجدد و تنظیم مجدد

این صفحه نحوه راه‌اندازی مجدد و تنظیم مجدد دستگاه‌های مجازی 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

راه‌اندازی مجدد کثیف

برای انجام یک ری‌استارت ناخواسته (cleaned restart) در زمانی که دستگاه پاسخگو نیست، دستور زیر را اجرا کنید:

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 تغییرات قدیمی دیسک را نادیده می‌گیرد و به حالت اولیه دیسک بازنشانی می‌کند. برای فهرست کامل پرچم‌ها، به Flags مراجعه کنید.

بدون پوشش اجرا کنید

برای انصراف از پشتیبانی از تنظیم مجدد سریع، دستور زیر را اجرا کنید:

launch_cvd --use_overlay=false

--use_overlay=false فایل‌های دیسک Cuttlefish را به صورت خواندنی-نوشتنی در نظر می‌گیرد و تغییرات در آن فایل‌ها اعمال می‌شوند.

تغییر بین --use_overlay=false و پیش‌فرض می‌تواند باعث خطاهای سازگاری شود. برای پاک کردن اجباری وضعیت قبلی دستگاه، دستور زیر را اجرا کنید:

stop_cvd
rm $HOME/cuttlefish $HOME/cuttlefish_runtime $HOME/cuttlefish_assembly

Cuttlefish نمی‌تواند با خیال راحت بین جریان‌های با و بدون overlayها حرکت کند، بنابراین این تغییر تمام حالت مدیریت Cuttlefish را حذف می‌کند. اگر فایل‌های دیسک خارجی اصلاح شوند و بعداً همراه با overlayها دوباره استفاده شوند، تغییرات قبلی به عنوان بخشی از حالت پایه در نظر گرفته می‌شوند.

پرچم‌ها

می‌توانید هنگام راه‌اندازی دستگاه Cuttlefish با استفاده از launch_cvd ، آرگومان‌هایی را با استفاده از flagها اضافه کنید. با این حال، برای برخی flagها ( flags که باید ثابت بمانند )، در صورت تغییر flagها بین دستورات launch_cvd ، ممکن است داده‌ها از بین بروند. برای اطمینان از عدم از دست رفتن داده‌ها هنگام اجرای توالی دستوراتی که شامل launch_cvd ، stop_cvd و سپس دوباره launch_cvd هستند، برای هر دستور launch_cvd از flagهای یکسان استفاده کنید. به عنوان مثال، اگر اولین flag 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