Cuttlefish: 멀티 테넌시

Cuttlefish 멀티 테넌시를 사용하면 한 번의 실행 호출로 호스트 머신에서 여러 개의 가상 게스트 기기를 시작할 수 있습니다.

이러한 여러 개의 Cuttlefish 가상 머신은 호스트 디스크 리소스의 일부를 공유할 수 있으므로 디스크 공간 절약이 가능합니다. 각 가상 머신에는 Android 파티션을 포괄하는 고유한 디스크 오버레이가 제공됩니다(예: super, userdata, boot). 게스트 디스크의 모든 수정사항은 게스트별 디스크 오버레이에 있으며 각 Cuttlefish 가상 머신에 디스크 파티션의 COW(기록 중 복사) 뷰를 제공합니다. 각 가상 기기에서 디스크 뷰에 더 많은 데이터를 쓰면 호스트 디스크의 오버레이 파일에서 원래 상태와 현재 상태의 차이를 캡처하므로 오버레이 파일 크기가 커집니다.

오버레이 파일을 재설정하여 Cuttlefish 디스크를 원래 상태로 되돌릴 수 있습니다. 이 프로세스를 파워워시라고 합니다.

인스턴스 번호

Cuttlefish 기기는 인스턴스 번호에 연결된 호스트에서 리소스를 생성하고 사용합니다. 예를 들어, adb 연결은 인스턴스 번호가 1인 Cuttlefish 기기의 경우 6520 포트에서 TCP 서버 소켓을 통해 노출됩니다. 여러 인스턴스가 실행되면 첫 번째 기기는 6520 포트, 두 번째 기기는 6521 포트에 TCP 서버 소켓을 만들고 기기가 추가될 때마다 포트 번호를 증분합니다.

지원되는 최대 인스턴스 수 수정

TAP 네트워크 기기와 같은 호스트 측 리소스는 Cuttlefish 가상 머신에 사전 할당되어야 합니다. 기본적으로 cuttlefish-base Debian 패키지는 인스턴스 번호 1~10에 리소스를 프로비저닝합니다.

이는 /etc/default/cuttlefish-host-resourcesnum_cvd_accounts를 수정하고 다음 명령어로 cuttlefish-host-resources 서비스를 다시 시작하여 변경할 수 있습니다.

sudo systemctl restart cuttlefish-host-resources

표준 구성

표준 구성은 Cuttlefish 기기의 구성을 JSON 형식으로 나타냅니다. 표준 구성 JSON 파일을 만들어 멀티 테넌트 시나리오에서 여러 Cuttlefish 기기의 구성을 설명할 수 있습니다.

다음은 표준 구성 JSON 파일에 사용된 형식을 설명합니다(자리표시자를 기기 구성으로 대체).

{
  "common": {
    CONFIGURATIONS_APPLYING_TO_ALL_DEVICES
  },
  "instances": [
    {
      FIRST_DEVICE_CONFIGURATION
    },
    {
      NTH_DEVICE_CONFIGURATION
    }
  ]
}

다음은 두 기기(휴대전화 기기와 웨어러블 기기)의 설정 구성 파일을 보여주는 예입니다.

{
  "instances": [
    {
      "@import": "phone",
      "vm": {
        "memory_mb": 8192,
        "setupwizard_mode": "OPTIONAL",
        "cpus": 4
      },
      "disk": {
        "default_build": "/home/username/devices/cf_x86_64_phone-userdebug"
      }
    },
    {
      "@import": "wearable",
      "vm": {
        "memory_mb": 8192,
        "setupwizard_mode": "REQUIRED",
        "cpus": 4
      },
      "disk": {
        "default_build": "/home/username/devices/cf_gwear_x86-userdebug"
      }
    }
  ]
}

다음 표는 두 기기의 구성 예에 사용된 요소를 설명합니다.

요소 유형 설명
instances 배열 JSON 객체의 배열입니다. 각각 실행할 멀티 테넌트 기기 그룹의 단일 기기를 설명합니다.
@import 문자열 기기 유형을 나타내고 기기 구성의 기본값을 설정합니다. 지원되는 기기 유형은 phone, wearable입니다.
vm 객체 기기 인스턴스와 관련된 VM 환경에 적용되는 속성을 지정합니다.
memory_mb 숫자 특정 VM에 할당할 메모리 양(MB)입니다.
setupwizard_mode 문자열 처음 기기를 실행할 때 사용자를 위해 기기 설정 마법사를 실행할지 지정합니다. 지원되는 설정 마법사 모드 옵션은 DISABLED, OPTIONAL, REQUIRED입니다.
cpus 숫자 VM에 할당된 가상 CPU 수입니다.
disk 객체 단일 VM 인스턴스를 실행하는 데 사용되는 파일 시스템 아티팩트를 찾는 것과 관련된 속성을 지정합니다.
default_build 문자열 Cuttlefish 가상 기기 이미지가 포함된 폴더의 로컬 파일 시스템 경로입니다.

cvd로 배포된 구성 파일에 관한 더 많은 예는 Cuttlefish 코드 트리의 cvd_test_configs 폴더를 참고하세요.

멀티 테넌트 인스턴스 제어

이 섹션에서는 멀티 테넌트 시나리오에서 기기를 시작하고 중지하는 방법을 설명합니다. 다음 옵션을 사용하여 여러 Cuttlefish 기기를 실행할 수 있습니다.

  • 표준 구성: 실행할 인스턴스 목록을 설명하는 JSON 구성 파일을 사용하여 맞춤설정된 각 기기 구성을 실행합니다.
  • 단일 게스트 이미지: 단일 게스트 이미지에서 여러 기기를 실행합니다.

표준 구성에서 여러 VM 시작

멀티 테넌트 시나리오를 설명하는 표준 구성을 사용하여 여러 VM을 시작하려면 다음과 같이 --config_file= 플래그 접두사와 함께 cvd start 명령어를 호출합니다.

cvd start --config_file=CONFIG_FILE

다음은 /etc/phone.json이라는 표준 구성 파일을 참조하는 호출을 보여주는 예입니다.

cvd start --config_file=/etc/phone.json

단일 게스트 이미지에서 여러 VM 시작

단일 게스트 이미지를 사용하여 여러 Cuttlefish 기기를 시작하려면 --num_instances=N 플래그를 사용하세요. 여기서 N은 시작할 기기의 수입니다. 기본적으로 기기의 인스턴스 번호는 1부터 시작합니다.

cvd start --num_instances=N

시작하는 인스턴스 번호를 변경하려면 다음 중 한 가지 방법을 사용합니다.

  • --base_instance_num=N 플래그를 추가합니다(N은 첫 번째 인스턴스 번호).

    cvd start --base_instance_num=N
    
  • vsoc-NN과 일치하는 사용자 계정으로 Cuttlefish를 시작합니다. 여기서 NN은 두 자리 형식의 기본 인스턴스 번호입니다. 예를 들어, vsoc-01이라는 사용자 계정으로 Cuttlefish를 시작하려면 다음을 실행합니다.

    cvd start --base_instance_num=1
    

기기 중지 방법

마지막 cvd start 호출로 시작된 모든 기기를 중지하려면 다음을 실행합니다.

cvd stop