---
title: 使能机密设备直通
description: "TEE侧机密虚拟机支持PCIe设备直通，包括网卡、磁盘、GPU卡等设备。本章节主要介绍如何使能IO设备直通机密虚拟机，实现IO性能大幅提升。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/251RC2/confidt/kunpengtee_16_0031.html
sourcePath: /source/zh/kunpengboostkithistory/251RC2/confidt/kunpengtee_16_0031.html
indexId: 7b373d234d2e53713e757c94f35c060d1a259e9444535d5a495e485c9d2008ac72
---
# 使能机密设备直通

TEE侧机密虚拟机支持PCIe设备直通，包括网卡、磁盘、GPU卡等设备。本章节主要介绍如何使能IO设备直通机密虚拟机，实现IO性能大幅提升。

#### 约束与限制

使能设备直通的约束限制

- 当前virtCCA设备直通不支持stage1 SMMU。
- 当前virtCCA设备直通功能暂不支持设备认证。

使能SR-IOV的约束限制

- 当VF仍被CVM占用时，若在REE侧销毁该VF后、但未销毁该CVM的时间段内，同一PF禁止重新创建相同BDF号的VF（因存在新创建的VF上有遗留的数据等安全风险）。因此仅当CVM完全销毁后，方可重新创建对应VF。
- 在virtCCA实现机密设备直通时，当单个VF被直通至机密虚拟机后，其所属物理设备的所有PF及VF将永久切换至安全态，且无法回退至非安全态。若此时未直通的VF在REE侧加载设备驱动，可能触发硬件或驱动异常等可靠性问题，严重时导致设备功能失效或系统崩溃。为避免上述风险，在直通VF至CVM前，必须执行以下操作：解绑该物理设备关联的所有VF驱动。通过卸载驱动，确保REE侧无法主动操作未直通的VF资源。


1. 使能virtCCA和SMMU安全态初始化。

  a. 打开grub.cfg文件。

```
vim /boot/efi/EFI/openEuler/grub.cfg
```


  b. 按“i”进入编辑模式，在HOST OS对应的位置添加如下参数。

```
virtcca_cvm_host=1 arm_smmu_v3.disable_ecmdq=1 vfio_pci.disable_idle_d3=1
```


  c. 按“Esc”键退出编辑模式，输入:wq!，按“Enter”键保存并退出文件。
2. BIOS使能SMMU。

  a. 请参见《    TaiShan 服务器 BIOS 参数参考（鲲鹏920处理器）(https://support.huawei.com/enterprise/zh/doc/EDOC1100088653/a77cbc34)
》中“进入BIOS界面”的相关内容，进入BIOS界面。
  b. 依次进入“Advanced > MISC Config > Support Smmu”。
  c. 将“Support Smmu”设置为“Enabled”，按“F10”保存退出。
3. 编译GUEST OS。

  a. 获取源码。
    虚拟机内参考此处(https://gitee.com/openeuler/virtCCA_sdk/blob/master/kata-v3.15.0/doc/kata机密容器.md)安装编译依赖以及获取Guest OS源码。

  b. 生成默认配置。

    1. 进入“kernel”目录并修改deconfig。

```
cd /usr/src/linux-6.6.0-98.0.0.103.oe2403sp2.aarch64/
vim arch/arm64/configs/openeuler_defconfig
```


      内核版本号取决于用户kernel-source的安装版本，因此这里的Kernel目录应参考用户实际安装的版本所在目录。

    2. 确保编译选项修改为如下形式。

```
CONFIG_NET_9P=y
CONFIG_NET_9P_VIRTIO=y
CONFIG_VIRTIO_BLK=y
CONFIG_SCSI_VIRTIO=y
CONFIG_VIRTIO_NET=y
CONFIG_VIRTIO=y
CONFIG_VIRTIO_PCI_LIB=y
CONFIG_VIRTIO_PCI=y
CONFIG_EXT4_FS=y
# CONFIG_DEBUG_INFO_BTF is not set
CONFIG_SOFTLOCKUP_DETECTOR=y
CONFIG_LOCKUP_DETECTOR=y
CONFIG_PREEMPT_NONE=y
```


    3. 修改Kconfig。

      1. 修改“/block/Kconfig”文件。

        a. 打开“drivers/block/Kconfig”文件。

```
vim drivers/block/Kconfig
```


        b. 按“i”进入编辑模式，修改tristate“Virtio block driver”为如下。

```
bool "Virtio block driver"
```


        c. 按“Esc”键退出编辑模式，输入:wq!，按“Enter”键保存并退出文件。
      2. 修改“drivers/net/Kconfig”文件。

        a. 打开“drivers/net/Kconfig”文件。

```
vim drivers/net/Kconfig
```


        b. 按“i”进入编辑模式，修改tristate“Virtio network driver”为如下。

```
bool "Virtio network driver"
```


        c. 按“Esc”键退出编辑模式，输入:wq!，按“Enter”键保存并退出文件。
      3. 修改“drivers/virtio/Kconfig”文件。

        a. 打开“drivers/virtio/Kconfig”文件。

```
vim drivers/virtio/Kconfig
```


        b. 按“i”进入编辑模式，将config VIRTIO_PCI_LIB下的“tristate”改为“bool”。
        c. 修改tristate“PCI driver for virtio devices”为如下。

```
bool "PCI driver for virtio devices"
```


        d. 按“Esc”键退出编辑模式，输入:wq!，按“Enter”键保存退出文件。
    4. 生成.config配置文件。

```
make openeuler_defconfig
```


  c. 加入NVMe盘和网卡驱动相关的配置。开启BLK_DEV_NVME、NVME_CORE、VXLAN、MLXFW、IOMMUFD、VFIO、MLX5_VFIO_PCI和MLX5_CORE等编译选项。

    1. 执行以下命令打开menuconfig。

```
make menuconfig
```


    2. 在menuconfig界面输入"/"跳转至搜索界面，在搜索界面输入要开启的编译选项后按Enter键进行搜索。
    3. 搜索完成后，输入1打开依赖选项（此案例中的依赖选项为NVME_CORE）。
    4. 按“space”键将NVME_CORE的模式由"M"设置为"*"。设置完成后便开启了NVME_CORE。
    5. 按两次“Esc”键退出至上一级。
    6. 打开依赖选项后开启了BLK_DEV_NVME。
    7. 打开所有的编译选项，保存设置后，使用如下命令编译。编译完成后重启虚拟机生效。

```
export LOCALVERSION="-$(uname -r | cut -d- -f2-)"
make include/config/kernel.release
make -j$(nproc)
make modules_install
make install
sync
```


4. 使能SR-IOV。
目前支持的设备：Huawei ES3000 V6 NVMe（使用NVMe驱动），Hi1823网卡（使用hinic3驱动），Mellanox网卡（使用MLX5驱动）。

  a. 创建VF。

    - NVMe驱动。

```
echo ${VF_NUM} > /sys/class/nvme/nvme0/device/sriov_numvfs
# 分配资源
nvme virt-mgmt -c ${CTRL_ID} -a 7 /dev/nvme0
nvme virt-mgmt -c ${CTRL_ID} -r 0 -a 8 -n 8 /dev/nvme0
nvme virt-mgmt -c ${CTRL_ID} -a 9 /dev/nvme0
# 查找可用namespace
nvme list-ns -a /dev/nvme0
# 创建namespace（如果无可用namespace）
nvme create-ns /dev/nvme0 --nsze ${NS_SIZE} --ncap ${NS_SIZE} --flbas 0x0 --dps 0 --nmic 0
# 将namespace attach到VF对应的CTRL_ID
nvme attach-ns -n ${NSID} -c ${CTRL_ID} /dev/nvme0
```


      CTRL_ID为VF对应的控制器ID，第一个VF的控制器为0x2，以此类推。 NSID为namespace的ID，每个VF都需要分配一个独占的namespace。

    - Hi1823网卡和Mellanox网卡。

```
echo ${VF_NUM} > /sys/class/net/eth0/device/sriov_numvfs
```


  b. 销毁VF。

    - NVMe。

```
echo 0 > /sys/class/nvme/nvme0/device/sriov_numvfs
```


    - Hi1823网卡和Mellanox网卡。

```
echo 0 > /sys/class/net/eth0/device/sriov_numvfs
```


5. 执行如下命令查询直通设备的domain和BDF号。

```
lspci -tv
```


  该案例中domain为0000，BDF为17:00.0。

6. 在xml文件中添加直通设备信息，将“hostdev”的内容拷贝至“dev”内，在“source”内填入设备对应的domain和BDF号。

```
<devices>
<hostdev mode='subsystem' type='pci' managed='yes'>
<driver name='vfio'/>
<source>
<address domain='0x0000' bus='0x17' slot='0x00' function='0x0'/>
</source>
</hostdev>
</devices>
```


7. 在虚拟机中执行如下命令查询直通设备信息。

```
lspci -tv
```
