OpenStack机密虚拟机白名单特性
本章节主要说明OpenStack支持机密虚拟机的白名单特性相关使用说明以及黑名单特性。
OpenStack使能机密虚拟机显式支持以下特性。
- 机密虚拟机创建、启动、强制关闭和删除
- 配置机密虚拟机vCPU绑核和NUMA拓扑
- 虚拟机信息查询
- 虚拟机事件上报
- 管理虚拟磁盘和光驱
- 虚拟串口
- 虚拟网卡
- 虚拟机冷迁移和撤离
OpenStack使能机密虚拟机禁用以下特性。
- 虚拟机挂起/恢复
- 虚拟机休眠/唤醒
- 虚拟机重启
- 虚拟机热迁移
- 虚拟机快照
- 设置虚拟时间、设置rtc时钟补偿速度
- 虚拟机安全启动
- vCPU热插拔、内存热插拔
- 内存复用、内存Qos、CPU Qos

OpenStack暂不支持vCPU热插拔、内存热插拔、内存Qos特性,无需屏蔽。
机密虚拟机创建、启动、强制关闭和删除
- 创建机密虚拟机对应的flavor。
openstack flavor create cca-flavor --vcpus 4 --ram 8192 --disk 50 \ --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
- 创建机密虚拟机。
openstack server create --image openEuler-image --flavor cca-flavor --network public-network cca-server
- 强制关闭机密虚拟机。
openstack server stop cca-server
- 启动机密虚拟机。
openstack server start cca-server
- 删除机密虚拟机。
openstack server delete cca-server
配置机密虚拟机vCPU绑核和NUMA拓扑
- 修改计算节点配置文件“/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部署。
- 修改控制节点配置文件“/etc/nova/nova.conf” ,配置filter_scheduler,在enabled_filters选项中追加过滤器NUMATopologyFilter。
[filter_scheduler] enabled_filters = ...,NUMATopologyFilter available_filters = nova.scheduler.filters.all_filters
- 创建具备绑核和NUMA拓扑属性的flavor,本示例创建了一个4核4个NUMA节点的机密虚拟机,其中每个NUMA分配了2048M内存,分别绑定了一个CPU。
openstack flavor create cca-numa-flavor --vcpus 4 --ram 8192 --disk 50 \ --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拓扑需同时设置,否则在创建虚拟机阶段会报错失败。
- 使用3创建的flavor创建虚拟机。
openstack server create --image openEuler-image --flavor cca-numa-flavor --network public-network cca-num-server
虚拟机信息查询
- 查看所有已部署虚拟机的信息。
openstack server list
- 查看指定虚拟机详细信息。
openstack server show cca-server
- 查看安全内存信息。
- 获取计算节点ID。
openstack resource provider list
- 根据节点ID查看资源库存,其中包含安全内存信息。
openstack resource provider inventory list ${resource_provider_id}
- 查看资源使用情况,SECURE_NUMA_x不支持实时查看资源占用情况。
openstack resource provider usage show ${resource_provider_id}
当前基于inventory表实时刷新安全NUMA内存资源信息,现有inventory表刷新机制存在更新代次差异导致的刷新报错信息,不影响资源更新功能,属于正常现象。
- 获取计算节点ID。
虚拟磁盘管理
- 创建空白卷,size选项单位为G,默认使用virtio-blk。
openstack volume create --size 5 ${volume_name}
- 查看空白卷对应ID。
openstack volume list
- 在创建虚拟机时通过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
- 虚拟机实例成功部署后,使用virsh命令进入虚拟机,OpenStack创建的虚拟机名为instance-xxx。
virsh list virsh console ${domain_id}
- 输入用户名和密码登录后,使用以下命令能够看到对应创建的虚拟磁盘。
lsblk
在创建虚拟机前设置镜像属性以启用SCSI。
openstack image set ${image-id} --property hw_scsi_model=virtio-scsi --property hw_disk_bus='scsi'
进入虚拟机后使用以下命令可以发现已成功应用SCSI。
lsblk -o NAME,TRAN,SUBSYSTEMS
虚拟光驱管理
- 准备ISO文件,并上传至OpenStack。
openstack image create ${iso-image-name} --file ./your-image.iso --disk-format iso
- 基于该ISO文件创建存储卷,要求所创建卷的大小大于ISO文件的实际大小。
openstack volume create --image ${iso-image-uuid} --size 1 ${iso-volume-name}
- 将该光驱卷挂载到指定的机密虚拟机实例。
openstack server add volume ${cvm_name} ${iso-volume-name}
- 使用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
机密虚拟机配置虚拟机网卡
- 参考环境部署正常创建机密虚拟机。
- 配置网络IP地址。
virsh console进入虚拟机,查看DHCP是否配置好IP地址,如未自动配置,参照如下方式手动配置。
- 打开“/etc/sysconfig/network-scripts/ifcfg-eth0”文件。
vim /etc/sysconfig/network-scripts/ifcfg-eth0
- 按“i”进入编辑模式,参考如下内容配置文件。
TYPE=Ethernet BOOTPROTO=static DEFROUTE=yes DEVICE=eth0 ONBOOT=yes IPADDR=xx.xx.xx.xx PREFIX=xx STP=yes
- 按“Esc”键退出编辑模式,输入:wq!,按“Enter”键保存退出文件。
- 打开“/etc/sysconfig/network-scripts/ifcfg-eth0”文件。
- 为Openstack对外网桥br-ex配置IP地址。
ip addr add xx.xx.xx.xx/xx dev br-ex ip link set br-ex up
- 增加安全组规则。
- 查看安全组列表。
openstack security group list
- 查看默认安全组规则。
openstack security group rule list default
- 配置安全组规则。
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。
- 查看安全组列表。
机密虚拟机冷迁移
- 配置证书。
OpenStack使用scp完成迁移工作,因此需要在迁移虚拟机的计算节点间配置证书,此处将虚拟机实例初始部署节点称为源节点,迁移后的部署节点称为目标节点。
- 在源节点执行以下操作:
- 在目标节点执行以下操作:
将1.a.ii获取的源节点公钥内容写入authorized_keys,确保nova用户具有该文件的读权限。
cd /var/lib/nova/.ssh vim authorized_keys chown nova:nova /var/lib/nova/.ssh/*
- 在源节点执行以下操作:
- 执行迁移命令。
- 在控制节点执行迁移命令,其中Host参数指定的是目标节点的名称。
openstack server migrate --host ${target_node_name} ${cvm_name} --os-compute-api-version 2.56
- 等待几分钟后,手动确认完成最后的迁移流程。
openstack server resize confirm ${cvm_name}
- 执行确认命令后回显以下内容是正常现象,说明虚拟机迁移状态仍未更新,请稍后再执行确认指令。
- 虚拟机若挂载了数据卷会导致冷迁移失败。
- 冷迁移失败后,使用openstack命令删除虚拟机,使用virsh命令仍能够查看到残留的domain定义文件,需要手动执行以下命令删除。
virsh undefine instance-xxx
- 在控制节点执行迁移命令,其中Host参数指定的是目标节点的名称。
机密虚拟机撤离
- 撤离指令仅在虚拟机部署节点失效情况下才能执行,为便于验证,执行下述命令将节点服务设置为down。
openstack compute service set --down ${node_name} nova-compute --os-compute-api-version 2.11
- 执行撤离命令。
openstack server evacuate ${cvm_name}
- 撤离完成后,查看虚拟机详细信息能够观察到虚拟机实例在其他节点正常运行。
openstack server show ${cvm_name}