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