דיונון: הפעלה מחדש ואיפוס

בדף הזה מוסבר איך להפעיל מחדש ולאפס מכשירים וירטואליים של 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 משתמשים בהטמעה מהירה שמאפסת באופן אוטומטי, שתלויה בהגנה על הדיסקים שמאחורי שכבות-על של qcow2 בדיסק. כברירת מחדל, ב-Cuttlefish מתייחסים לדיסקים המקוריים כאל דיסקים לקריאה בלבד, והם משתמשים בשכבות-על כדי לתעד את הכתיבה בדיסק.

עם זאת, יש חסרונות לשימוש בשכבות-על של 'העתקה על כתיבה'. חשוב לזכור ששינויים חיצוניים בדיסקים הבסיסיים משבשים את התאימות לשכבות-על קיימות וגורמים למצב דיסק לא עקבי. כשמערכת Cuttlefish מזהה שינויים לא תואמים, היא יוצרת מחדש את שכבות-העל בכוח.

לא מומלץ ליצור מחדש את שכבות-העל בכוח כשמפתחים תכונה שמחייבת לשמור חלק מהדיסק במצב מסוים של הפעלה בזמן שמחליפים חלק אחר של הדיסק. לדוגמה, התקנת אפליקציה עם הגדרות משתמש ספציפיות, ולאחר מכן החלפת הליבה שוב ושוב כדי לבדוק את האינטראקציה בין האפליקציה לבין גרסאות build שונות של ליבה. במקרה כזה, אולי כדאי להשבית את שכבות-העל.

איפוס מכשירים

בקטעים הבאים מתוארות דרכים לאפס מכשיר 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.

בהגדרה עם מספר דיירים (multi-tenant), הפקודה stop_cvd משביתה את כל קבוצת המכונות.

הפעלה מחדש של מכשירים

בקטעים הבאים מתוארות דרכים להפעלה מחדש של מכשיר בלי לאפס אותו למצב הדיסק הראשוני.

הפעלה מחדש נקייה

כדי לבצע הפעלה מחדש נקייה של המכשיר כשהמכשיר מגיב, מפעילים את:

adb reboot

adb reboot מעביר את המכשיר לתהליך הכיבוי המלא, מסנכרן שינויים לדיסק ומוודא שהתהליכים מושבתים. תהליכים של מארח דיונון לא מעורבים. יכול להיות שלא ניתן לבצע את התהליך הזה אם המכשיר נכנס למצב לא תקין ולא מגיב.

כדי להפעיל מחדש מכשיר Cuttlefish יחיד בתצורה עם כמה דיירים, צריך לציין את המספר הסידורי של מכשיר היעד כשמריצים את adb-reboot. אם לא צוין מכשיר יעד, הפקודה adb לא תפעיל מחדש אף מכשיר.

adb -s SERIAL reboot

הפעלה מחדש לא נקייה

כדי לבצע הפעלה מחדש לא נקייה כשהמכשיר לא מגיב, מפעילים:

restart_cvd

restart_cvd מבצעת כיבוי לא תקין על ידי כיבוי מיידי של מכשיר Cuttlefish. restart_cvd היא הפעולה המקבילה לניתוק וחיבור מחדש של הסוללה למכשיר פיזי. יכול להיות שכתיבה בדיסק לא תישמר אם היא הייתה באמצע ביצוע. restart_cvd ממתין עד שהמכשיר יופעל מחדש באופן מלא לפני שהוא יוצא.

בהגדרה מרובת דיירים (multi-tenant), הערך של 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