Cuttlefish: 다시 시작 및 재설정

이 페이지에서는 Cuttlefish 가상 기기를 다시 시작하고 재설정하는 방법을 설명합니다. 명령줄 도구에서 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 빠른 재설정 구현

Cuttlefish는 qcow2 디스크 오버레이로 생성된 디스크를 보호하는 방식으로 작동하는 빠른 재설정 구현을 사용합니다. 기본적으로 Cuttlefish는 원본 디스크를 읽기 전용으로 취급하고 오버레이를 사용하여 디스크 쓰기를 캡처합니다.

그러나 COW(Copy-On-Write) 오버레이 사용에는 몇 가지 단점이 있습니다. 특히 기본 디스크의 외부 변경사항으로 인해 기존 오버레이와의 호환성이 손상되고 디스크 상태가 일관되게 유지되지 않습니다. Cuttlefish는 호환되지 않는 변경사항을 감지하면 오버레이를 강제로 다시 만듭니다.

디스크의 다른 부분을 교체하는 동안 디스크의 일부를 초기화된 특정 상태로 유지해야 하는 기능을 개발하는 경우 오버레이를 강제로 다시 만들지 않는 것이 좋습니다. 예로 특정 사용자 구성으로 앱을 설치한 후 커널을 반복적으로 교체하여 앱과 다른 커널 빌드 간의 상호작용을 테스트하는 경우를 들 수 있습니다. 이때는 오버레이를 사용 중지하는 것이 좋습니다.

기기 재설정

다음 섹션에서는 Cuttlefish 기기를 초기 디스크 상태로 재설정하는 방법을 설명합니다.

기기 1대 재설정

Cuttlefish 기기 1대를 초기 디스크 상태로 재설정하려면 다음을 실행합니다.

powerwash_cvd

powerwash_cvd는 가상 머신을 종료하고 가상 머신 디스크의 변경사항을 재설정하고 가상 머신을 다시 시작한 후 부팅이 완료될 때까지 기다립니다. 이 인스턴스는 launch_cvd에 지정된 원래 플래그를 유지합니다.

멀티 테넌트 구성에서 powerwash_cvd는 인스턴스 그룹에 있는 인스턴스 하나를 다시 시작합니다.

powerwash_cvd --instance_num=N

모든 기기 재설정

하나 이상의 기기를 중지하고 초기 디스크 상태로 재설정하려면 다음을 실행합니다.

stop_cvd
launch_cvd --resume=false

stop_cvd는 언클린 종료를 실행하여 기기를 중지합니다.

launch_cvd--resume=false를 추가하면 Cuttlefish는 다음 실행을 시작하기 전에 이전에 실행 중인 인스턴스와 관련된 모든 파일을 삭제합니다. launch_cvd 플래그를 추가해도 됩니다.

멀티 테넌트 구성에서 stop_cvd는 전체 인스턴스 그룹을 종료합니다.

기기 다시 시작

다음 섹션에서는 기기를 초기 디스크 상태로 재설정하지 않고 기기를 다시 시작하는 방법을 설명합니다.

클린 재시작

기기가 응답하는 상태에서 클린 재시작을 진행하려면 다음을 실행합니다.

adb reboot

adb reboot는 디스크에 변경사항을 동기화하고 절차가 종료되는지 확인하며 기기의 전체 종료 절차를 실행합니다. Cuttlefish 호스트 프로세스는 이에 관여하지 않습니다. 기기가 잘못된 상태에 진입하여 응답하지 않으면 이 절차를 사용하지 못할 수 있습니다.

멀티 테넌트 구성에서 1대의 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 플래그를 사용하여 다시 시작

1대 이상의 기기를 중지하고 다른 launch_cvd 플래그로 다시 실행하려면 다음을 실행합니다.

stop_cvd
launch_cvd NEW_FLAG

stop_cvdrestart_cvd와 유사하게 언클린 종료를 실행합니다. 기기가 휴면 상태로 전환되며 나중에 다른 launch_cvd 명령어를 사용하여 다시 시작할 수 있습니다. restart_cvd와 마찬가지로 디스크에 완전히 동기화되지 않으면 디스크 쓰기가 유지되지 않을 수 있습니다. 데이터를 디스크에 안전하게 저장하려면 먼저 adb reboot를 실행하세요.

adb reboot
stop_cvd
launch_cvd NEW_FLAG

launch_cvd 플래그 변경 시 COW(Copy-On-Write) 구현과 호환되지 않는 디스크 레이아웃 변경사항이 강제로 적용되면 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 관리 상태를 삭제합니다. 외부 디스크 파일이 수정되고 나중에 오버레이와 함께 재사용되는 경우 이전 수정사항은 기준 상태의 일부로 간주됩니다.

플래그

launch_cvd를 사용하여 Cuttlefish 기기를 실행할 때 플래그를 사용하여 인수를 추가할 수 있습니다. 그러나 특정 플래그(동일하게 유지되어야 하는 플래그)의 경우 launch_cvd 명령어 간에 플래그를 변경하면 데이터가 손실될 수 있습니다. launch_cvd, stop_cvd, launch_cvd를 차례로 포함하는 명령어 시퀀스를 실행할 때 데이터 손실이 발생하지 않도록 모든 launch_cvd 명령어에 동일한 플래그를 사용하세요. 예를 들어 첫 번째 launch_cvd 플래그에 --kernel_path=KERNEL_PATH 인수가 포함되면 두 번째 launch_cvd 호출에도 동일한 --kernel_path=KERNEL_PATH 인수가 포함되어야 합니다. 그렇지 않으면 두 번째 launch_cvd 호출에서 stop_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