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