Cuttlefish: 再起動とリセット

このページでは、Cuttlefish 仮想デバイスの再起動とリセットの方法について説明します。Cuttlefish デバイスを初期ディスク状態にリセットするには、コマンドライン ツールで powerwashing と指定します。

テストスイートなど、複数のさまざまなプロシージャからなる自動化または手動のワークフローを実行する場合は、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 は元のディスクを読み取り専用として扱い、オーバーレイを使用してディスク書き込みを取得します。

ただし、書き込み時コピーのオーバーレイの使用にはデメリットがあります。特に、元のディスクに対する外部変更により既存のオーバーレイとの互換性が損なわれ、ディスクの状態が整合しなくなります。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_cvdstop_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.ccdisk_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