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

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

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

הליכי ההפעלה מחדש והאיפוס שמתוארים בדף הזה מניחים יצר מכשיר 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

מנקודת ההתחלה הזו, תוכלו להשתמש בתהליכי ההפעלה והאיפוס הבאים:

הטמעת איפוס מהיר של דיונון

הדיונון משתמש ביישום איפוס מהיר התלוי בהגנה את הדיסקים שמאחורי שכבות-על בדיסק ב-qcow2. על ידי כברירת מחדל, ב-Cuttlefish מתייחסים לדיסקים המקוריים כאל דיסקים לקריאה בלבד ומשתמשים בהם בשכבות-על כדי תיעוד וכתיבה של הדיסק.

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

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

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

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

איפוס של מכשיר אחד

כדי לאפס מכשיר Cuttlefish אחד למצב הדיסק הראשוני שלו, מריצים את:

powerwash_cvd

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

בהגדרה מרובת דיירים (multi-tenant), הפונקציה 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 מעביר את המכשיר לתהליך הכיבוי המלא, מסתנכרן שינויים בדיסק ולוודא שהתהליכים נסגרים. מארח דיונון בתהליכים שונים. ייתכן שתהליך זה לא יהיה זמין אם המכשיר נכנס למצב לא תקין וכבר לא מגיב.

כדי לבצע הפעלה מחדש נקייה של מכשיר דיונון אחד multi-tenant configuration, מספר סידורי של מכשיר היעד במהלך הרצה של adb-reboot. אם לא הוגדר מכשיר יעד צוין, adb לא מפעיל מחדש אף מכשיר.

adb -s SERIAL reboot

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

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

restart_cvd

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

בהגדרה מרובת דיירים (multi-tenant), הפונקציה 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 מתייחס לקובצי הדיסק של Cuttlefish כקריאה-כתיבה, וגם השינויים מופצים בקבצים האלה.

שינוי בין --use_overlay=false לברירת המחדל יכול לגרום לתאימות שגיאות. כדי לנקות בכוח את מצב המכשיר הקודם, מריצים את:

stop_cvd
rm $HOME/cuttlefish $HOME/cuttlefish_runtime $HOME/cuttlefish_assembly

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

דגלים

אפשר להוסיף ארגומנטים באמצעות דגלים כשמפעילים מכשיר דיונון באמצעות 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