Cuttlefish: إعادة التشغيل وإعادة الضبط

توضّح هذه الصفحة كيفية إعادة تشغيل الأجهزة الافتراضية في Cuttlefish وإعادة ضبطها. يُشار إلى إعادة ضبط جهاز Cuttlefish على حالة القرص الأولية باسم المحو الكامل في أداة سطر الأوامر.

عند تنفيذ سير عمل مبرمَج أو يدوي باستخدام إجراءات متعددة مختلفة، مثل مجموعات الاختبار، تضمن إعادة ضبط جهاز 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. بشكلٍ 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