启动与卸载云手机实例

启动云手机实例路径下应存在kbox_config.cfg配置文件。容器会使用该文件中的配置,因此使用时应确保kbox_config.cfg配置文件中的配置正确。若启动路径下无该配置文件,则云手机将禁止启动。

通过修改中如表1所示的map中对应路数的值来选择该路容器使用的GPU、CPU以及数据卷存放路径,灵活配置云手机使用的资源,使性能达到最优。

表1 kbox_config.cfg配置文件中容器使用的GPU、CPU以及数据卷存放路径配置说明

参数名称

参数说明

配置说明

  • KBOX_GPU_MAP(硬件配置一)
  • KBOX_VA_GPU_MAP(硬件配置二、三)

通过修改map中对应路数的值来选择该路容器使用的GPU。

  • KBOX_GPU_MAP列表里的第一个代表编号为1的Kbox云手机,分配的GPU节点是/dev/dri/renderD128,根据硬件配置方案一,renderD128节点属于NUMA0,因此鲲鹏920 7260处理器NUMA0对应的KBOX_CPUSET_MAP里配置的CPU核心取值范围应为0~31。
  • KBOX_VA_GPU_MAP列表里的第一个代表编号为1的Kbox云手机,分配的GPU节点是/dev/dri/renderD128,根据硬件配置方案二、三,renderD128~135属于NUMA0,因此对于鲲鹏920 7260处理器NUMA0对应的KBOX_CPUSET_MAP里配置的CPU核心取值范围应为0~31。鲲鹏920 7280Z处理器NUMA0对应的KBOX_CPUSET_MAP里配置的CPU核心取值范围应为0~79。

KBOX_CPUSET_MAP

通过修改map中对应路数的值来选择该路容器使用的CPU。

KBOX_MOUNT_MAP

通过修改map中对应路数的值来选择该路容器使用的数据卷存放路径。

-

为确保Kbox云手机的稳定运行与最佳性能,请保障每个容器所绑定的CPU物理核和GPU渲染节点同属于一个CPU片。

Kbox云手机容器支持根据客户需求,定制系统属性,覆盖系统属性。如需使用定制属性,需要在启动路径下生成“local.prop”文件,文件内记录定制的系统属性,容器启动后的初始化过程会读取该文件内的属性并覆盖写入。修改方法请参见Kbox云手机容器 例行维护文档的“支持Android系统属性可定制”章节。

  1. 解压Kbox-AOSP11.zip,将Kbox-AOSP11文件夹中的deploy_scripts目录上传至服务器的“~/dependency”目录。
  2. (可选)使能硬件解码(以下简称“硬解”)。

    1. 设置“deploy_scripts”目录下的kbox_config.cfg文件,将“ENABLE_HARD_DECODE”设置为“1”

      若启动时为软件解码(以下简称“软解”)方式,即设置ENABLE_HARD_DECODE=0,重启时能切换为硬解方式,即设置ENABLE_HARD_DECODE=1。

    2. (硬件配置方案一)同时若使用硬件配置方案一时需参考以下步骤设置NETINT卡节点。
      1. 执行如下命令查看编解码卡芯片对应节点号。
        1
        nvme list
        

        回显示例如下,请以实际为准。加粗部分为NETINT编码卡Quadra芯片NVMe节点,一张编码卡包含2颗芯片。

        1
        2
        3
        4
        Node          SN                   Model            Namespace Usage                    Format           FW Rev
        ------------- -------------------- ---------------- --------- ------------------------ ---------------- --------
        /dev/nvme0n1  Q2A325A11DC082-0454A QuadraT2A        1         8.59  TB /   8.59  TB    4 KiB +  0 B     4866rKr1
        /dev/nvme1n1  Q2A325A11DC082-0454B QuadraT2A        1         8.59  TB /   8.59  TB    4 KiB +  0 B     4866rKr1
        
      2. 查看nvme节点与pcie bus号对应关系。
        {index}2.b.i回显信息所示的NVMe节点编号。例如/dev/nvme0n1,该节点{index}即为0。
        1
        find /sys/devices/ -name nvme{index}
        

        回显如下,其中0000:05:00.0为该设备对应的busID:

        1
        2
        /sys/devices/pci0000:00/0000:00:0e.0/0000:05:00.0/nvme/nvme0
        /sys/devices/virtual/nvme-subsystem/nvme-subsys0/nvme0
        
      3. 通过bus号找到该节点与NUMA从属关系。
        {busID}为上一步骤获取的bus号。以nvme0设备的回显为例,{busID}即为0000:05:00.0。
        1
        lspci -vvvs {busID} | grep NUMA
        

        回显如下。

        1
        NUMA node: 0
        
      4. 根据编码卡NVMe设备节点对应的NUMA修改kbox_config.cfg文件中NETINT的值。

        鲲鹏920 7260服务器:从属于0、1号NUMA的NVMe节点写在NETINT0字段中,从属于2、3号NUMA的NVMe节点写在NETINT1字段中。

        字段中每个设备需添加两个节点。例如2号NVMe设备,需添加“/dev/nvme2”、“/dev/nvme2n1”两个节点。

        # NETINT编码卡设备节点
        NETINT0="/dev/nvme0,/dev/nvme0n1,/dev/nvme1,/dev/nvme1n1"
        NETINT1="/dev/nvme2,/dev/nvme2n1,/dev/nvme3,/dev/nvme3n1"
        • 若第一次启动容器时NETINT的值为空,禁止设置ENABLE_HARD_DECODE=1,且禁止重启时设置ENABLE_HARD_DECODE=1,否则播放视频会有短暂黑屏的现象。
        • 若需使能NETINT编码卡硬解,需要在kbox_config.cfg中设置ENABLE_HARD_DECODE=1。
        • 针对一张Quadra T2A编码卡环境,请参考以下配置方式,根据实际情况配置设备节点信息。
          # NETINT编码卡设备节点
          NETINT0="/dev/nvme0,/dev/nvme0n1,/dev/nvme1,/dev/nvme1n1"
          NETINT1="/dev/nvme0,/dev/nvme0n1,/dev/nvme1,/dev/nvme1n1"

  3. 通过android_kbox.sh脚本启动容器。

    1
    2
    3
    cd ~/dependency/deploy_scripts
    chmod +x android_kbox.sh
    ./android_kbox.sh start {镜像名称:tag}  ${index1}  ${index2}  
    

    Kbox基础云手机的默认配置信息如表2所示。

    表2 Kbox基础云手机的默认配置信息

    配置项

    Kbox基础云手机

    场景

    移动办公/托管

    vCPUs

    2

    绑核策略

    2容器/2核

    内存

    6GB

    系统存储

    16GB

    分辨率

    720*1280

    启动脚本使用示例:

    • 启动一个编号为1的实例。
      1
      ./android_kbox.sh start kbox:origin  1
      
    • 启动编号为1~5的五个实例。
      1
      ./android_kbox.sh start kbox:origin  1 5
      

      Kbox云手机容器启动时,一般情况下会自动打开Kbox内核动态开关,以使能必要的Linux Kernel功能。

      可以通过以下指令查询Kbox内核动态开关状态。

      1
      cat /sys/kernel/kbox/kbox_enable
      

      回显为1,表示Kbox内核动态开关为打开状态;回显为0,表示开关为关闭状态。

      若查询发现Kbox内核动态开关为关闭状态,请通过以下指令手动打开该开关。

      1
      echo 1 > /sys/kernel/kbox/kbox_enable
      

  4. 执行如下命令确认Kbox容器是否启动成功,其中“${index}”为启动实例的编号。

    1
    docker exec -it kbox_${index} getprop | grep boot_completed
    

    若回显信息中的sys.boot_completed显示为“1”,则启动成功。

  5. 停止并删除Kbox容器的方法。

    由于Kbox方案默认挂载数据卷,默认的docker stopdocker rm命令不能彻底清理容器数据,需要使用脚本彻底清理主机侧文件。

    使用android_kbox.sh脚本,停止并删除正在运行的Kbox容器。

    • 停止并删除编号为${index}的容器。
      1
      ./android_kbox.sh delete ${index}
      
    • 停止并删除编号为${index1}~${index2}的所有容器。
      1
      ./android_kbox.sh delete ${index1} ${index2}
      

  6. 重启Kbox容器的方法。

    由于Kbox方案默认挂载数据卷,在重启容器时,无法使用默认的docker restart命令进行重启,需要使用脚本执行容器的重启操作。

    使用android_kbox.sh脚本重启Kbox容器。

    • 重启编号为${index}的容器。
      1
      ./android_kbox.sh restart ${index}
      
    • 重启编号为${index1}~${index2}的所有容器。
      1
      ./android_kbox.sh restart ${index1} ${index2}