توضّح هذه الصفحة كيفية إعادة تشغيل الأجهزة الافتراضية في Cuttlefish وإعادة ضبطها. يُشار إلى إعادة ضبط جهاز Cuttlefish على حالة القرص الأولية باسم المحو الكامل في أداة سطر الأوامر.
عند تنفيذ سير عمل مبرمَج أو يدوي باستخدام إجراءات متعددة مختلفة، مثل مجموعات الاختبار، تضمن إعادة ضبط جهاز Cuttlefish بين الإجراءات أنّ سلوك كل إجراء مستقل. إذا لم يتم إعادة ضبط حالة القرص، يمكن أن يؤثر إجراء واحد في سلوك الإجراء التالي.
تفترض إجراءات إعادة التشغيل وإعادة الضبط الموضّحة في هذه الصفحة أنّك أنشأت جهاز Cuttlefish وضبطت بعض الحالات على القرص.
# 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
من هذه النقطة، يمكنك استخدام عمليتَي إعادة التشغيل وإعادة الضبط التاليتَين:
- إذا كان الجهاز يستجيب، يمكنك إعادة تشغيله باستخدام
adb reboot
. - إذا لم يستجِب الجهاز، يمكنك إعادة تشغيله بدون حفظ البيانات باستخدام
restart_cvd
. - أعِد ضبط حالة الجهاز باستخدام
powerwash_cvd
. - أوقِف الجهاز وغيِّر مَعلمات
launch_cvd
مع الاحتفاظ بحالة الجهاز أو محو حالة الجهاز بشكلٍ قسري.
تنفيذ ميزة إعادة الضبط السريع في Cuttlefish
يستخدم Cuttlefish عملية إعادة ضبط سريعة تعتمد على حماية القرصَين من خلال تداخلات قرص qcow2. بشكلٍ default، يتعامل 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 واحد في
إعدادات متعددة للمستأجرين، حدِّد
الرقم التسلسلي
للجهاز المستهدَف عند تشغيل 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
--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