בדף הזה מוסבר איך להפעיל מחדש ולאפס מכשירים וירטואליים של Cuttlefish. איפוס של מכשיר Cuttlefish למצב הדיסק הראשוני שלו נקרא powerwashing בכלי שורת הפקודה.
כשמריצים תהליכי עבודה אוטומטיים או ידניים עם כמה פרוצדורות שונות, כמו חבילות מקרים לבדיקה, איפוס מכשיר Cuttlefish בין הפרוצדורות מבטיח שההתנהגות של כל פרוצדורה תהיה עצמאית. אם מצב הדיסק לא מאופס, הליך אחד יכול להשפיע על ההתנהגות של ההליך הבא.
ההנחות בהליכי ההפעלה מחדש והאיפוס שמתוארים בדף הזה הן שיצרתם מכשיר Cuttlefish והגדרתם מצב מסוים בדיסק.
# Launch a devicelaunch_cvd# Make some modifications to the deviceadb shell touch /storage/self/primary/Documents/hello# Check the device stateadb shell ls /storage/self/primary/Documents
מנקודת ההתחלה הזו, אפשר להשתמש בתהליכי ההפעלה מחדש והאיפוס הבאים:
- אם המכשיר מגיב, מבצעים הפעלה מחדש נקייה באמצעות
adb reboot. - אם המכשיר לא מגיב, מבצעים הפעלה מחדש לא נקייה באמצעות
restart_cvd. - מאפסים את מצב המכשיר באמצעות
powerwash_cvd. - להפסיק את המכשיר ולשנות את הארגומנטים של
launch_cvdתוך שמירה על מצב המכשיר או ניקוי בכוח של מצב המכשיר.
הטמעה של איפוס מהיר ב-Cuttlefish
ב-Cuttlefish נעשה שימוש בהטמעה של איפוס מהיר, שתלויה בהגנה על הדיסקים שמאחורי שכבות-על של דיסקים מסוג qcow2. כברירת מחדל, Cuttlefish מתייחס לדיסקים המקוריים כאל דיסקים לקריאה בלבד, ומשתמש בשכבות-על כדי לתעד כתיבה לדיסק.
עם זאת, יש חסרונות לשימוש בשכבות-על של העתקה בזמן כתיבה. חשוב לציין ששינויים חיצוניים בדיסקים הבסיסיים פוגעים בתאימות עם שכבות-העל הקיימות, וגורמים למצב לא עקבי של הדיסק. מערכת Cuttlefish יוצרת מחדש את שכבות-העל באופן מאולץ כשהיא מזהה שינויים לא תואמים.
לא מומלץ ליצור מחדש את שכבות-העל באופן מאולץ כשמפתחים תכונה שדורשת לשמור חלק מהדיסק במצב מאותחל מסוים, תוך כדי החלפה של חלק אחר בדיסק. לדוגמה, התקנת אפליקציה עם הגדרת משתמש מסוימת ואז החלפה חוזרת של הליבה כדי לבדוק את האינטראקציה בין האפליקציה לבין גרסאות build שונות של הליבה. במקרה כזה, כדאי להשבית את שכבות-העל.
איפוס מכשירים
בקטעים הבאים מוסבר איך לאפס מכשיר Cuttlefish למצב הדיסק הראשוני שלו.
איפוס של מכשיר אחד
כדי לאפס מכשיר Cuttlefish אחד למצב הדיסק הראשוני שלו, מריצים את הפקודה:
powerwash_cvdהפקודה powerwash_cvd מכבה את המכונה הווירטואלית, מאפסת את כל השינויים שבוצעו בדיסק של המכונה הווירטואלית, מפעילה מחדש את המכונה הווירטואלית וממתינה עד שהיא תסיים את תהליך ההפעלה. המופע שומר על הדגלים המקוריים שניתנו ל-launch_cvd.
בהגדרה מרובת דיירים,
powerwash_cvd מפעיל מחדש מופע יחיד מתוך קבוצת המופעים:
powerwash_cvd --instance_num=Nאיפוס כל המכשירים
כדי לעצור ולאפס מכשיר אחד או יותר למצב הדיסק ההתחלתי שלהם, מריצים את הפקודה:
stop_cvdlaunch_cvd --resume=false
stop_cvd מבצע כיבוי לא תקין ועוצר את המכשיר.
הוספת --resume=false ל-launch_cvd גורמת ל-Cuttlefish להשמיד את כל הקבצים שקשורים למכונה שפעלה קודם לפני תחילת ההפעלה הבאה. אפשר להוסיף עוד סימונים של launch_cvd.
בהגדרה מרובת דיירים,הפקודה ß
stop_cvd משביתה את כל קבוצת המופעים.
הפעלה מחדש של מכשירים
בקטעים הבאים מוסבר איך להפעיל מחדש מכשיר בלי לאפס אותו למצב הדיסק הראשוני שלו.
הפעלה מחדש של המכשיר
כדי להפעיל מחדש את המכשיר כשהוא מגיב, מריצים את הפקודה:
adb rebootadb reboot מעביר את המכשיר את כל תהליך ההשבתה, מסנכרן את השינויים בדיסק ומוודא שהתהליכים מושבתים. תהליכי המארח של Cuttlefish לא מעורבים. יכול להיות שההליך הזה לא יהיה זמין אם המכשיר נכנס למצב לא תקין ולא מגיב.
כדי להפעיל מחדש מכשיר Cuttlefish אחד בהגדרת ריבוי דיירים, מציינים את המספר הסידורי של מכשיר היעד כשמריצים את adb-reboot. אם לא צוין מכשיר יעד, adb לא מפעיל מחדש אף מכשיר.
adb -s SERIAL rebootהפעלה מחדש לא תקינה
כדי לבצע הפעלה מחדש לא נקייה כשהמכשיר לא מגיב, מריצים את הפקודה:
restart_cvdrestart_cvd מבצע כיבוי לא תקין על ידי כיבוי מיידי של מכשיר Cuttlefish. הפקודה restart_cvd מקבילה לניתוק הסוללה ממכשיר פיזי וחיבור שלה מחדש. יכול להיות שכתיבות בדיסק לא יישמרו אם הן היו בתהליך. הפקודה restart_cvd ממתינה עד שהמכשיר יופעל מחדש באופן מלא לפני היציאה.
בהגדרה של ריבוי דיירים, הפקודה restart_cvd מפעילה מחדש מכונה אחת מתוך קבוצת המכונות. כדי לציין איזו מכונת Cuttlefish להפעיל מחדש, משתמשים בדגל instance_num.
restart_cvd --instance_num=Nאם לא משתמשים ב---instance_num, מספר המכונה שמוגדר כברירת מחדל הוא 1.
הפעלה מחדש באמצעות דגלים שונים של launch_cvd
כדי לעצור מכשיר אחד או יותר ולהפעיל מחדש עם דגלים שונים של launch_cvd, מריצים את הפקודה:
stop_cvdlaunch_cvd NEW_FLAG
stop_cvd מבצע כיבוי לא נקי בדומה ל-restart_cvd. היא משאירה את המכשיר במצב רדום, שאפשר להפעיל אותו שוב מאוחר יותר באמצעות פקודת launch_cvd אחרת. כמו ב-restart_cvd, יכול להיות שפעולות הכתיבה בדיסק לא יישמרו אם הן לא מסונכרנות באופן מלא עם הדיסק. כדי לשמור נתונים בדיסק באופן בטוח, קודם צריך להריץ את הפקודה adb reboot.
adb rebootstop_cvdlaunch_cvd NEW_FLAG
אם שינויים בדגלים של launch_cvd מאלצים שינוי בפריסת הדיסק שלא תואם להטמעה של העתקה בזמן כתיבה, launch_cvd מתעלם מהשינויים הישנים בדיסק ומאפס למצב המקורי של הדיסק. לרשימה המלאה של הדגלים
הפעלה בלי שכבת-על
כדי לבטל את ההסכמה לתמיכה באיפוס מהיר, מריצים את הפקודה:
launch_cvd --use_overlay=false--use_overlay=false מתייחס לקובצי הדיסק של Cuttlefish כקריאה-כתיבה, והשינויים מופצים לקבצים האלה.
מעבר בין --use_overlay=false לבין ברירת המחדל עלול לגרום לשגיאות תאימות. כדי לנקות את המצב הקודם של המכשיר, מריצים את הפקודה:
stop_cvdrm $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--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