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 डिस्क ओवरले के पीछे मौजूद डिस्क को सुरक्षित रखने पर निर्भर करती है. डिफ़ॉल्ट रूप से, 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 डिवाइस को बंद कर देता है और उसे रोक देता है.

launch_cvd में --resume=false जोड़ने से, 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 इंस्टेंस ग्रुप में से किसी एक इंस्टेंस को रीस्टार्ट करता है. instance_num फ़्लैग का इस्तेमाल करके, यह तय करें कि किस Cuttlefish इंस्टेंस को रीस्टार्ट करना है.

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 मैनेजमेंट की सभी स्थितियां मिट जाती हैं. अगर बाहरी डिस्क की फ़ाइलों में बदलाव किया जाता है और बाद में उन्हें ओवरले के साथ फिर से इस्तेमाल किया जाता है, तो पहले किए गए बदलावों को बेसलाइन स्टेट का हिस्सा माना जाता है.

झंडे

launch_cvd का इस्तेमाल करके Cuttlefish डिवाइस लॉन्च करते समय, फ़्लैग का इस्तेमाल करके आर्ग्युमेंट जोड़े जा सकते हैं. हालांकि, कुछ फ़्लैग (ऐसे फ़्लैग जो एक जैसे होने चाहिए) के लिए, 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