このページでは、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 は、互換性のない変更を検出すると、オーバーレイを強制的に再作成します。
オーバーレイの強制的な再作成は、ディスクの一部については特定の初期化状態に保ち、他の部分についてはスワップアウトする必要がある機能を開発している場合は望ましくありません。たとえば、特定のユーザー設定でアプリをインストールしてから、カーネルを繰り返しスワップアウトし、アプリと各種カーネルビルドとのやり取りをテストする場合は、オーバーレイを無効にすることをおすすめします。
デバイスをリセットする
以下のセクションでは、Cuttlefish デバイスを初期ディスク状態にリセットする方法について説明します。
1 つのデバイスをリセットする
1 つの Cuttlefish デバイスを初期ディスク状態にリセットするには、次のコマンドを実行します。
powerwash_cvd
powerwash_cvd
: 仮想マシンをシャットダウンし、仮想マシンのディスクに加えられた変更をすべてリセットして、起動が終了するまで待機します。このインスタンスは、launch_cvd
に指定された元のフラグを保持します。
マルチテナント構成で powerwash_cvd
を指定すると、インスタンス グループのうちの 1 つのインスタンスが再起動します。
powerwash_cvd --instance_num=N
すべてのデバイスをリセットする
1 つ以上のデバイスを停止して初期ディスク状態にリセットするには、次のコマンドを実行します。
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
を指定すると、インスタンス グループのうちの 1 つのインスタンスが再起動します。再起動する Cuttlefish インスタンスを指定するには、instance_num
フラグを使用します。
restart_cvd --instance_num=N
--instance_num
を使用しなかった場合、インスタンス番号はデフォルトで 1
に設定されます。
各種 launch_cvd フラグを使って再起動する
1 つ以上のデバイスを停止し、各種の 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 の管理状態はすべて削除されます。外部ディスク ファイルが変更され、後でオーバーレイとともに再使用された場合、以前の変更はベースライン状態の一部と見なされます。
フラグ
launch_cvd
を使用して Cuttlefish デバイスを再起動する場合は、フラグを使って引数を追加できます。ただし、特定のフラグ(同じにしておく必要があるフラグ)では、フラグが launch_cvd
コマンド間で変更されると、データが失われる可能性があります。launch_cvd
、stop_cvd
、再び launch_cvd
を指定するコマンド シーケンスを実行する場合にデータが失われないようにするには、すべての launch_cvd
コマンドで同じフラグを使用します。たとえば、1 つ目の launch_cvd
フラグに --kernel_path=KERNEL_PATH
引数が含まれている場合は、2 つ目の launch_cvd
呼び出しでも同じ --kernel_path=KERNEL_PATH
引数を含める必要があります。そうしないと、stop_cvd
の前に加えたファイル システムの変更はすべて、2 つ目の 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