---
title: 启动与卸载云手机实例
description: "启动云手机实例路径下应存在kbox_config.cfg配置文件。容器会使用该文件中的配置，因此使用时应确保kbox_config.cfg配置文件中的配置正确。若启动路径下无该配置文件，则云手机将禁止启动。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/252RC1/armnative/kunpengcpskbox_20_0157.html
sourcePath: /source/zh/kunpengboostkithistory/252RC1/armnative/kunpengcpskbox_20_0157.html
indexId: 0bbe6366c8db84d122e5a09d23b3f12e52deba240cb98b10710d34f8e099706578
---
# 启动与卸载云手机实例

启动云手机实例路径下应存在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处理器rNUMA0对应的KBOX\_CPUSET\_MAP里配置的CPU核心取值范围应为0~31。鲲鹏920 7280Z处理器NUMA0对应的KBOX\_CPUSET\_MAP里配置的CPU核心取值范围应为0~79。 |
| KBOX\_CPUSET\_MAP | 通过修改map中对应路数的值来选择该路容器使用的CPU。 | 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处理器rNUMA0对应的KBOX\_CPUSET\_MAP里配置的CPU核心取值范围应为0~31。鲲鹏920 7280Z处理器NUMA0对应的KBOX\_CPUSET\_MAP里配置的CPU核心取值范围应为0~79。 |
| KBOX\_MOUNT\_MAP | 通过修改map中对应路数的值来选择该路容器使用的数据卷存放路径。 | 无 |


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


Kbox云手机容器支持根据客户需求，定制系统属性，覆盖系统属性。如需使用定制属性，需要在启动路径下生成“local.prop”文件，文件内记录定制的系统属性，容器启动后的初始化过程会读取该文件内的属性并覆盖写入。修改方法请参见《Kbox云手机容器 例行维护(https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/252RC1/armnative/kunpengcpskbox_32_0044.html)》文档的“支持Android系统属性可定制”章节。

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

  a. 设置“deploy_scripts”目录下的kbox_config.cfg文件，将“ENABLE_HARD_DECODE”设置为“1”。
    若启动时为软件解码（以下简称“软解”）方式，即设置ENABLE_HARD_DECODE=0，重启时能切换为硬解方式，即设置ENABLE_HARD_DECODE=1。

  b. （硬件配置方案一）同时若使用硬件配置方案一时需参考以下步骤设置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 48F6rKr1 /dev/nvme1n1 Q2A325A11DC082-0454B QuadraT2A 1 8.59 TB / 8.59 TB 4 KiB + 0 B 48F6rKr1

    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脚本启动容器。
```
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 stop、docker 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}
