حبَّار: إعادة التشغيل وإعادة الضبط

توضّح هذه الصفحة كيفية إعادة تشغيل الأجهزة الافتراضية في 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 بشكل تلقائي مع الأقراص الأصلية كقرص للقراءة فقط ويستخدم التراكبات لتسجيل عمليات الكتابة على القرص.

ومع ذلك، هناك عيوب في استخدام تراكبات النسخ عند الكتابة. ومن الجدير بالذكر أنّه عند إجراء تغييرات خارجية على الأقراص الأساسية، تصبح غير متوافقة مع التراكبات الحالية، ما يؤدي إلى عدم اتساق حالة القرص. يعيد الحبار إنشاء التراكبات عندما يكتشف تغييرات غير متوافقة.

إن إعادة إنشاء التراكبات غير مرغوب فيها عند تطوير ميزة تتطلب الاحتفاظ بجزء من القرص في حالة تهيئة معينة مع تبديل جزء آخر من القرص. على سبيل المثال، تثبيت تطبيق بتكوين مستخدم معين ثم تبديل النواة بشكل متكرر لاختبار التفاعل بين التطبيق وإصدارات النواة المختلفة. في هذه الحالة، قد يكون من المفيد إيقاف التراكبات.

إعادة ضبط الأجهزة

تصف الأقسام التالية طرقًا لإعادة ضبط جهاز حبَّار على حالته الأولية للقرص.

إعادة ضبط جهاز واحد

لإعادة ضبط جهاز حبَّار على حالة القرص الأولية، قم بتشغيل:

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 بطريقة غير نظيفة من خلال إيقاف تشغيل جهاز الحبار على الفور. يعادل إجراء restart_cvd فصل البطارية عن الجهاز المادي وإعادة توصيلها به. قد لا تستمر عمليات الكتابة على القرص إذا كانت قيد التقدم. ينتظر restart_cvd حتى يتم تشغيل الجهاز مجددًا بالكامل قبل الخروج.

في إعداد المستأجرين المتعدّدين، يُعيد restart_cvd تشغيل مثيل واحد من مجموعة المثيلات. لتحديد مثيل حبَّار الذي تريد إعادة تشغيله، استخدِم العلامة 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 مع ملفات قرص حبَّار كقراءة وكتابة، ويتم نشر التغييرات في تلك الملفات.

قد يؤدي التبديل بين --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