---
title: OpenStack机密虚拟机白名单特性
description: "本章节主要说明OpenStack支持机密虚拟机的白名单特性相关使用说明以及黑名单特性。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/252RC2/confidt/kunpengtee_16_0061.html
sourcePath: /source/zh/kunpengboostkithistory/252RC2/confidt/kunpengtee_16_0061.html
indexId: 875bf45eced687e5d240129c5e5311a8b4d54b1016b5bc34768b051ea608bd9972
---
# OpenStack机密虚拟机白名单特性

本章节主要说明OpenStack支持机密虚拟机的白名单特性相关使用说明以及黑名单特性。

OpenStack使能机密虚拟机显式支持以下特性。

- 机密虚拟机创建、启动、强制关闭和删除
- 配置机密虚拟机vCPU绑核和NUMA拓扑
- 虚拟机信息查询
- 虚拟机事件上报
- 管理虚拟磁盘和光驱
- 虚拟串口
- 虚拟网卡
- 虚拟机冷迁移和撤离

OpenStack使能机密虚拟机禁用以下特性。

- 虚拟机挂起/恢复
- 虚拟机休眠/唤醒
- 虚拟机重启
- 虚拟机热迁移
- 虚拟机快照
- 设置虚拟时间、设置rtc时钟补偿速度
- 虚拟机安全启动
- vCPU热插拔、内存热插拔
- 内存复用、内存Qos、CPU Qos

OpenStack暂不支持vCPU热插拔、内存热插拔、内存QoS特性，无需屏蔽。


#### 机密虚拟机创建、启动、强制关闭和删除

1. 创建机密虚拟机对应的flavor。

```
openstack flavor create
cca-flavor
--vcpus
--ram
8192
--disk
\
--property trait:HW_CPU_AARCH64_HISI_VIRTCCA=required \
--property sw:qemu_cmdline="tmm-guest,id=tmm0,num-pmu-counters=1" \
--property hw:mem_secure=true
```


  可通过添加特性“--property sw:swiotlb='${swiotlb_mb}'”来指示机密虚拟机swiotlb的大小，该设置仅用于指示OpenStack该机密虚拟机所占用的非安全内存资源，不影响机密虚拟机实际占用的非安全内存大小。要求${swiotlb_mb}值大于0且与64M对齐。若未添加该参数，则默认占用128M。 openstack flavor create cca-flavor --vcpus 4 --ram 8192 --disk 50 \ --property trait:HW_CPU_AARCH64_HISI_VIRTCCA=required \ --property sw:swiotlb='${swiotlb_mb}' --property sw:qemu_cmdline="tmm-guest,id=tmm0,num-pmu-counters=1" \ --property hw:mem_secure=true

2. 创建机密虚拟机。

```
openstack server create --image
openEuler-image
--flavor
cca-flavor
--network public-network
cca-server
```


3. 强制关闭机密虚拟机。

```
openstack server stop
cca-server
```


4. 启动机密虚拟机。

```
openstack server start
cca-server
```


5. 删除机密虚拟机。

```
openstack server delete
cca-server
```


#### 配置机密虚拟机vCPU绑核和NUMA拓扑

1. 修改计算节点配置文件“/etc/nova/nova.conf” ，设置计算节点的绑核CPU范围。

```
[compute]
cpu_dedicated_set =
"0-63"
cpu_shared_set =
"64-127"
```


  若未配置cpu_dedicated_set，则OpenStack无法创建绑核虚拟机。 若仅配置cpu_dedicated_set，则OpenStack仅允许从该项指定范围的CPU集合内部署绑核虚拟机，且无法部署不绑核虚拟机。 同时配置cpu_dedicated_set和cpu_shared_set ，则OpenStack能同时部署绑核和不绑核虚拟机，绑核虚拟机从cpu_dedicated_set集合内选择CPU绑定部署，不绑核虚拟机从cpu_shared_set选择CPU部署。

2. 修改控制节点配置文件“/etc/nova/nova.conf” ，配置filter_scheduler，在enabled_filters选项中追加过滤器NUMATopologyFilter。

```
[filter_scheduler]
enabled_filters = ...,NUMATopologyFilter
available_filters = nova.scheduler.filters.all_filters
```


3. 创建具备绑核和NUMA拓扑属性的flavor，本示例创建了一个4核4 NUMA的机密虚拟机，其中每个NUMA分配了2048M内存，分别绑定了一个CPU。

```
openstack flavor create
cca-numa
-flavor
--vcpus
--ram
8192
--disk
\
--property hw:numa_nodes=
'4'
\
--property hw:numa_mem.0=
2048
\
--property hw:numa_mem.1=
2048
\
--property hw:numa_mem.2=
2048
\
--property hw:numa_mem.3=
2048
\
--property hw:numa_cpus.0=
"0"
\
--property hw:numa_cpus.1=
"1"
\
--property hw:numa_cpus.2=
"2"
\
--property hw:numa_cpus.3=
"3"
\
--property hw:cpu_policy=
'dedicated'
\
--property trait:HW_CPU_AARCH64_HISI_VIRTCCA=required \
--property sw:qemu_cmdline="tmm-guest,id=tmm0,num-pmu-counters=1" \
--property hw:mem_secure=true
```


  绑核和配置NUMA需同时设置，否则在创建虚拟机阶段会报错失败。

4. 使用3创建的flavor创建虚拟机。

```
openstack server create --image
openEuler-image
--flavor
cca-numa-flavor
--network
public-network
cca-num-server
```


#### 虚拟机信息查询

1. 查看所有已部署虚拟机的信息。

```
openstack server list
```


2. 查看指定虚拟机详细信息。

```
openstack server show
cca-server
```


3. 查看安全内存信息。

  a. 获取计算节点ID。

```
openstack resource provider list
```


  b. 根据节点ID查看资源库存，其中包含安全内存信息。

```
openstack resource provider inventory list ${resource_provider_id}
```


  c. 查看资源使用情况，SECURE_NUMA_x不支持实时查看资源占用情况。

```
openstack resource provider usage show ${resource_provider_id}
```


    当前基于inventory表实时刷新安全NUMA内存资源信息，现有inventory表刷新机制存在更新代次差异导致的刷新报错信息，不影响资源更新功能，属于正常现象。


#### 虚拟磁盘管理

1. 创建空白卷，size选项单位为G，默认使用virtio-blk。

```
openstack volume create --size 5 ${volume_name}
```


2. 查看空白卷对应ID。

```
openstack volume list
```


3. 在创建虚拟机时通过volume id指定该空白卷。

```
openstack server create --image
openEuler-image
\
--flavor
cca-flavor
\
--network
public-network
\
--block-device source_type=volume,disk_bus=virtio,uuid=${volume id} \
volume-server
```


4. 虚拟机实例成功部署后，使用virsh命令进入虚拟机，OpenStack创建的虚拟机名为instance-xxx。

```
virsh list
virsh console ${domain_id}
```


5. 输入用户名和密码登录后，使用以下命令能够看到对应创建的虚拟磁盘。

```
lsblk
```


  在创建虚拟机前设置镜像属性以启用SCSI。 openstack image set ${image-id} --property hw_scsi_model=virtio-scsi --property hw_disk_bus='scsi' 进入虚拟机后使用以下命令可以发现已成功应用SCSI。 lsblk -o NAME,TRAN,SUBSYSTEMS


#### 虚拟光驱管理

1. 准备ISO文件，并上传至OpenStack。

```
openstack image create ${iso-image-name} --file ./
your-image.iso
--disk-format iso
```


2. 基于该ISO文件创建存储卷，要求所创建卷的大小大于ISO文件的实际大小。

```
openstack volume create --image ${iso-image-uuid} --size 1 ${iso-volume-name}
```


3. 将该光驱卷挂载到指定的机密虚拟机实例。

```
openstack server add volume ${cvm_name} ${iso-volume-name}
```


4. 使用virsh命令登录虚拟机后，能够通过挂载命令查看ISO文件内容。

```
lsblk
mount /dev/vdb /mnt
ls /mnt
```


  挂载过程中若出现错误：libvirt.libvirtError: internal error: unable to execute QEMU command 'blockdev-add': aio=native was specified, but is not supported in this build，说明QEMU编译过程中未启用aio。 在QEMU编译环境中安装libaio-devel库后重新编译QEMU，QEMU将默认加入aio支持。 yum install libaio-devel -y


#### 机密虚拟机配置虚拟机网卡

1. 参考环境部署正常创建机密虚拟机。
2. 配置网络IP地址。
virsh console进入虚拟机，查看DHCP是否配置好IP地址，如未自动配置，参照如下方式手动配置。

  a. 打开“/etc/sysconfig/network-scripts/ifcfg-eth0”文件。

```
vim /etc/sysconfig/network-scripts/ifcfg-eth0
```


  b. 按“i”进入编辑模式，参考如下内容配置文件。

```
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
DEVICE=eth0
ONBOOT=yes
IPADDR=
xx.xx.xx.xx
PREFIX=
xx
STP=yes
```


  c. 按“Esc”键退出编辑模式，输入:wq!，按“Enter”键保存退出文件。
3. 为OpenStack对外网桥br-ex配置IP地址。

```
ip addr add
xx.xx.xx.xx/xx
dev
br-ex
ip link set
br-ex
up
```


4. 增加安全组规则。

  a. 查看安全组列表。

```
openstack security group list
```


  b. 查看默认安全组规则。

```
openstack security group rule list default
```


  c. 配置安全组规则。

```
openstack security group rule create
-
-proto icmp --remote-ip
xx.xx.xx.xx/xx
default
openstack security group rule create --proto tcp --dst-port 22 --remote-ip
xx.xx.xx.xx/xx
default
```


    如需让任意IP地址通过br-ex访问虚拟机，可配置--remote-ip为0.0.0.0/0。


#### 机密虚拟机冷迁移

1. 配置证书。
OpenStack使用SCP完成迁移工作，因此需要在迁移虚拟机的计算节点间配置证书，此处将虚拟机实例初始部署节点称为源节点，迁移后的部署节点称为目标节点。

  a. 在源节点执行以下操作：

    1. 以nova用户的身份执行生成密钥对命令，创建密钥的配置建议使用默认配置。

```
sudo -u nova ssh-keygen
```


    2. 获取公钥内容。

```
cat /var/lib/nova/.ssh/
xxx.pub
```


  b. 在目标节点执行以下操作：
    将1.a.ii
    获取的源节点公钥内容写入authorized_keys，确保nova用户具有该文件的读权限。

```
cd /var/lib/nova/.ssh
vim authorized_keys
chown nova:nova /var/lib/nova/.ssh/*
```


  c. 在源节点执行以下操作：
    以nova用户身份执行ssh命令登录目标节点，若不设置密码并成功登录说明证书配置生效。

```
sudo -u nova ssh -o BatchMode=yes nova@{target_node_ip}
```

若执行该命令显示“Host key verification failed.”，使用以下命令将目标节点主机密钥加入源节点nova用户的known_hosts文件：

```
sudo -u nova ssh-keyscan -H {target_ip} >> /var/lib/nova/.ssh/known_hosts
```


2. 执行迁移命令。

  a. 在控制节点执行迁移命令，其中host参数指定的是目标节点的名称。

```
openstack server migrate  --host ${target_node_name} ${cvm_name} --os-compute-api-version 2.56
```


  b. 等待几分钟后，手动确认完成最后的迁移流程。

```
openstack server resize confirm ${cvm_name}
```


    执行确认命令后显示以下内容是正常现象，说明虚拟机迁移状态仍未更新，请稍后再执行确认指令。 虚拟机若挂载了数据卷会导致冷迁移失败。 冷迁移失败后，使用openstack命令删除虚拟机，使用virsh命令仍能够查看到残留的domain定义文件，需要手动执行以下命令删除。 virsh undefine instance-xxx


#### 机密虚拟机撤离

1. 撤离指令仅在虚拟机部署节点失效情况下才能执行，为便于验证，执行下述命令将节点服务设置为down。

```
openstack compute service set --down ${node_name} nova-compute --os-compute-api-version 2.11
```


2. 执行撤离命令。

```
openstack server evacuate ${cvm_name}
```


3. 撤离完成后，查看虚拟机详细信息能够观察到虚拟机实例在其他节点正常运行。

```
openstack server show ${cvm_name}
```
