• [技术干货] openEuler 网卡基础查询指令
    一、openEuler 网卡基础查询指令(必掌握)**openEuler 基于 Linux 内核,继承了传统 Linux 网卡管理工具(如 ip、nmcli),同时兼容部分 ifconfig 指令(需安装 net-tools 工具包),以下是最常用的查询指令:1. 查看网卡列表与状态(核心指令) # 方法1:ip 指令(推荐,openEuler 默认自带) ip addr show # 缩写:ip a # 输出说明: # inet 192.168.1.100/24:IPv4 地址与子网掩码 # inet6 fe80::20c:29ff:fe12:3456/64:IPv6 地址 # link/ether 00:0c:29:12:34:56:MAC 地址 # UP BROADCAST RUNNING MULTICAST:网卡状态(UP 表示启用)   # 方法2:nmcli 指令(NetworkManager 管理工具,默认启用) nmcli connection show # 查看所有网络连接(含网卡关联关系) nmcli device status # 查看网卡设备状态(DEVICE 列是网卡名,STATE 列是状态)   # 方法3:ifconfig 指令(需安装 net-tools,兼容老习惯) yum install -y net-tools # 安装依赖 ifconfig # 查看所有激活网卡信息 ifconfig -a # 查看所有网卡(含未激活) 2. 查看网卡流量与统计信息 # 方法1:ip -s 指令(查看收发数据包统计) ip -s link show eth0 # eth0 为网卡名,替换为实际名称 # 输出说明: # RX: bytes packets errors dropped:接收字节、数据包、错误数、丢弃数 # TX: bytes packets errors dropped:发送字节、数据包、错误数、丢弃数   # 方法2:sar 指令(实时监控流量,需安装 sysstat) yum install -y sysstat sar -n DEV 1 5 # 每1秒采集1次,共5次(DEV 表示网卡设备) 3. 查看网卡硬件信息 # 查看网卡型号与驱动 lspci | grep -i ethernet # 输出网卡硬件型号(如 Intel I219-LM) ethtool eth0 | grep -i driver # 查看网卡驱动(如 e1000e)   # 查看网卡速率与双工模式 ethtool eth0 # 输出速率(Speed)、双工(Duplex)、唤醒模式等 二、网卡配置修改指令(临时 / 永久生效)1. 临时配置(重启网卡 / 系统后失效,适合测试) # 1. 启用/禁用网卡 ip link set eth0 up # 启用 eth0 网卡 ip link set eth0 down # 禁用 eth0 网卡 nmcli device connect eth0 # 用 nmcli 启用网卡 nmcli device disconnect eth0 # 用 nmcli 禁用网卡   # 2. 临时设置 IPv4 地址 ip addr add 192.168.1.100/24 dev eth0 # 添加 IPv4 地址 ip addr del 192.168.1.100/24 dev eth0 # 删除 IPv4 地址   # 3. 临时设置网关 ip route add default via 192.168.1.1 dev eth0 # 设置默认网关 ip route del default via 192.168.1.1 # 删除默认网关   # 4. 临时设置 DNS(修改 /etc/resolv.conf,重启后失效) echo "nameserver 8.8.8.8" > /etc/resolv.conf # 设置谷歌 DNS echo "nameserver 114.114.114.114" >> /etc/resolv.conf # 添加国内 DNS 2. 永久配置(重启后生效,生产环境推荐)openEuler 推荐通过 nmcli 或修改网络配置文件实现永久配置,以下是两种主流方式:(1)通过 nmcli 指令配置(图形化工具兼容,推荐) # 1. 创建新的网络连接(绑定 eth0 网卡) nmcli connection add type ethernet con-name eth0-static ifname eth0 # con-name:连接名称(自定义,如 eth0-static) # ifname:绑定的网卡名(如 eth0)   # 2. 配置静态 IPv4 地址、网关、DNS nmcli connection modify eth0-static \ ipv4.method manual \ # 手动配置 IPv4(auto 为 DHCP) ipv4.addresses 192.168.1.100/24 \ # IPv4 地址+子网掩码 ipv4.gateway 192.168.1.1 \ # 网关 ipv4.dns 8.8.8.8,114.114.114.114 # DNS(多个用逗号分隔)   # 3. 激活配置并生效 nmcli connection up eth0-static # 激活连接 nmcli connection reload # 重新加载配置(若修改后未生效) (2)修改配置文件(传统方式,/etc/sysconfig/network-scripts/) # 1. 编辑网卡配置文件(文件名格式:ifcfg-网卡名) vi /etc/sysconfig/network-scripts/ifcfg-eth0   # 2. 配置静态 IP(关键参数) TYPE=Ethernet BOOTPROTO=static # 静态 IP(dhcp 为自动获取) NAME=eth0 # 网卡名称 DEVICE=eth0 # 设备名(需与网卡名一致) ONBOOT=yes # 开机自动激活 IPADDR=192.168.1.100 # IPv4 地址 NETMASK=255.255.255.0 # 子网掩码(或 PREFIX=24) GATEWAY=192.168.1.1 # 网关 DNS1=8.8.8.8 # 首选 DNS DNS2=114.114.114.114 # 备用 DNS   # 3. 重启网卡生效 systemctl restart NetworkManager # 重启 NetworkManager 服务 # 或 重启单个网卡 nmcli connection down eth0 && nmcli connection up eth0 3. 配置网卡别名(多 IP 场景) # 方法1:临时添加别名(eth0:0 为别名,重启失效) ip addr add 192.168.1.101/24 dev eth0 label eth0:0   # 方法2:永久添加别名(修改配置文件) cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0:0 vi /etc/sysconfig/network-scripts/ifcfg-eth0:0 # 修改关键参数: NAME=eth0:0 DEVICE=eth0:0 IPADDR=192.168.1.101 # 新的 IP 地址 # 其他参数(如 NETMASK、GATEWAY)可复用或修改   # 激活别名 nmcli connection up eth0:0 三、网卡故障排查指令(高频问题解决)1. 网卡无法激活 / 启动失败 # 1. 查看网卡状态与错误日志 nmcli device status # 确认网卡 STATE 是否为 disconnected journalctl -u NetworkManager | grep -i eth0 # 查看 NetworkManager 日志,找错误原因(如配置文件语法错误)   # 2. 检查网卡是否被禁用(硬件层面) rfkill list # 查看是否有无线网卡被软禁用(有线网卡一般不涉及) ethtool eth0 | grep -i link # 查看 Link detected: yes/no(no 表示硬件故障或未插网线)   # 3. 重置网卡配置(解决配置冲突) nmcli connection delete eth0-static # 删除原有连接 nmcli connection add type ethernet con-name eth0-static ifname eth0 # 重新创建 2. 网卡无法获取 IP 地址(DHCP 场景) # 1. 手动触发 DHCP 获取 dhclient eth0 # 向 DHCP 服务器请求 IP ip addr show eth0 # 查看是否获取到 IP   # 2. 查看 DHCP 日志(排查服务器问题) journalctl -u dhclient | grep -i eth0   # 3. 检查网关与 DNS 连通性 ping 192.168.1.1 # ping 网关(测试链路) ping 8.8.8.8 # ping DNS(测试外网连通性) 3. 网卡速率异常 / 丢包 # 1. 查看丢包与错误统计 ip -s link show eth0 # 重点关注 errors、dropped 数值是否持续增长   # 2. 重新协商网卡速率(强制千兆全双工) ethtool -s eth0 speed 1000 duplex full autoneg off # speed:速率(10/100/1000),duplex:双工(half/full),autoneg:自动协商(on/off)   # 3. 检查网线与交换机端口(硬件层面) # 更换网线(推荐 Cat5e 及以上),确认交换机端口速率配置与网卡一致 四、网卡高级配置指令(优化与特殊场景)1. 网卡绑定(Bonding,高可用 / 负载均衡) # 1. 安装 bonding 模块(openEuler 默认内置) modprobe bonding # 加载模块 lsmod | grep bonding # 验证模块加载   # 2. 创建 Bond 接口(通过 nmcli) nmcli connection add type bond con-name bond0 ifname bond0 mode 1 # mode 1:主备模式(active-backup),mode 0:负载均衡(round-robin)   # 3. 添加从网卡到 Bond 接口 nmcli connection add type ethernet con-name bond0-slave1 ifname eth0 master bond0 nmcli connection add type ethernet con-name bond0-slave2 ifname eth1 master bond0   # 4. 配置 Bond 接口 IP 并激活 nmcli connection modify bond0 ipv4.method manual ipv4.addresses 192.168.1.200/24 ipv4.gateway 192.168.1.1 nmcli connection up bond0 nmcli connection up bond0-slave1 nmcli connection up bond0-slave2   # 5. 验证 Bond 状态 cat /proc/net/bonding/bond0 # 查看主备状态、从网卡信息 2. 网卡流量限速(tc 指令) # 限制 eth0 网卡出站速率为 100Mbit/s tc qdisc add dev eth0 root tbf rate 100mbit burst 100k latency 50ms # rate:限制速率(10mbit/100mbit/1gbit),burst:突发流量,latency:延迟阈值   # 查看限速配置 tc qdisc show dev eth0   # 删除限速配置 tc qdisc del dev eth0 root 3. 关闭网卡节能模式(避免速率波动) # 临时关闭(重启失效) ethtool -C eth0 rx-usecs 0 tx-usecs 0 # 关闭接收/发送节能延迟 ethtool --set-eee eth0 eee off # 关闭 EEE 节能(部分网卡支持)   # 永久关闭(添加到开机脚本) echo 'ethtool -C eth0 rx-usecs 0 tx-usecs 0' >> /etc/rc.d/rc.local chmod +x /etc/rc.d/rc.local # 赋予执行权限 五、核心指令速查表(快速参考)操作场景推荐指令查看网卡列表ip a / nmcli device status启用 / 禁用网卡ip link set eth0 up/down临时设置静态 IPip addr add 192.168.1.100/24 dev eth0永久设置静态 IPnmcli connection modify 或修改 ifcfg 文件查看网卡流量统计ip -s link show eth0 / sar -n DEV 1 5排查网卡启动失败`journalctl -u NetworkManager创建 Bond 绑定nmcli connection add type bond查看网卡驱动与速率ethtool eth0六、总结openEuler 网卡管理以 ip 和 nmcli 为核心指令,覆盖查询、配置、故障排查全场景,相比传统 ifconfig 更强大、更兼容现代 Linux 系统。日常运维中,建议优先使用 nmcli 进行永久配置(避免配置文件冲突),用 ip 指令进行临时测试与查询,结合 ethtool、journalctl 等工具快速定位故障。掌握本文核心指令,可高效处理网卡配置、速率优化、高可用绑定等常见需求,保障 openEuler 系统网络稳定运行。 
  • openEuler 国产化替代:平衡生态兼容与自主创新
    一、兼容和创新的双重定位openEuler 在国产化替代中采用 "兼容为桥、创新为核" 的策略:    兼容面:以 RPM 包管理、systemd 服务、glibc 库等基础架构与 RHEL/CentOS 高度兼容,实现平滑迁移    创新点:在内核优化、容器技术、硬件适配、安全机制等层面构建自主技术体系,打造差异化竞争力 二、生态兼容性的核心实现1. 基础架构兼容:无缝对接 RHEL 生态软件包兼容:采用与 RHEL/CentOS 完全一致的RPM+DNF/YUM包管理体系,支持 95% 以上 CentOS/RHEL 二进制包直接安装运行ABI/API 兼容性:共享相同底层库和内核特性,确保 Oracle、SAP 等企业级应用无需重编译即可运行支持 EPEL 仓库,扩展软件源范围服务与工具兼容:采用 systemd 作为服务管理器,与 RHEL/CentOS 完全一致,运维习惯零迁移兼容 Shell 脚本、系统命令和配置文件格式,减少应用适配工作量2. 迁移与适配工具链:降低迁移门槛智能迁移工具:migrate2openEuler:自动检测 CentOS 7/8 兼容性问题,提供依赖分析和解决方案,将迁移周期从 "月级" 缩至 "人天级"容器化验证:支持 Docker/Podman 运行 CentOS 容器,实现 "应用隔离 + 平滑过渡",特别适合老旧系统迁移二进制分析工具:检查应用与 openEuler 的兼容性,识别需要重编译的组件三、自主创新技术的深度整合1. 内核级创新:构建差异化竞争力多架构统一支持:自研统一内核 + 架构适配层,支持 x86_64、ARM64 (鲲鹏)、RISC-V、LoongArch 等多种架构,一套代码通吃多平台,打破 "芯片 - 系统绑定" 传统模式针对国产芯片 (鲲鹏、昇腾) 深度优化,实现性能超越:鲲鹏架构下,通过硬件亲和调度和内存优化,使数据库性能提升 30%+毕昇 JDK 针对鲲鹏优化,Java GC 停顿时间降至 200ms 内,大幅提升应用响应速度关键技术突破:A-Tune 智能调优:自研 AI 驱动系统调优框架,根据负载自动调整内核参数,性能提升 40%+,已在金融行业规模部署Gazelle 高性能协议栈:基于 DPDK 实现零拷贝,使网络延迟降低 20%,吞吐量提升 50%,特别适合云原生和微服务场景UniProton 实时内核:工业级硬实时系统,控制周期抖动≤3μs,已在智能制造领域实现数控精度提升 8 倍2. 安全与自主可控能力:构建国产化护城河安全技术体系:内置国密算法支持(SM2/SM3/SM4),满足政务、金融等行业合规要求,已成为国家标准secGear 统一开发框架:兼容 ARM/Intel/AMD 多平台,实现 "一次开发、多端安全部署",已在金融行业商用基于 TrustZone/iTrustee 构建安全底座,提供从芯片到应用的全链路保护自主组件替代:iSulad 容器引擎:自研替代 Docker,在轻量化、安全性和性能方面实现超越,已在华为云大规模应用openGauss 数据库:原生深度集成,提供 "OS+DB" 软硬协同优化,性能提升 50%+openEuler Intelligence:首个 AI 原生操作系统,集成大模型实现代码辅助生成、智能运维和故障预测,重构人机交互模式四、平衡策略的核心实现:兼容与创新的融合1. "分层解耦" 架构:兼容与创新互不干扰开放兼容层:保留 RPM 包管理、systemd 服务、glibc 等基础组件,与 RHEL/CentOS 生态无缝对接支持在 openEuler 上运行 CentOS 容器,提供 "兼容沙箱",保护原有投资自主创新层:内核层:自研调度算法、内存管理优化 (如 folio 特性)、实时性增强,不影响上层兼容性服务层:用 iSula 替代 Docker、A-Tune 替代传统调优工具,在不改变接口的前提下提升性能和安全性应用生态:构建 openEuler 原生应用市场,同时兼容 RPM 生态,形成 "双轮驱动"2. "渐进式迁移" 策略:平滑过渡与自主升级并行三步走策略:兼容先行:优先确保业务系统可在 openEuler 上稳定运行,利用容器、二进制兼容等技术实现 "零中断迁移"能力提升:逐步替换为 openEuler 自研组件 (iSula、A-Tune 等),在保持功能的同时提升性能和安全性全面创新:基于 openEuler 自主技术栈 (如鲲鹏芯片适配、国密支持) 重构关键业务,形成差异化竞争力混合部署模式:核心 - 边缘架构:核心系统保留兼容模式,边缘和新增业务采用 openEuler 原生能力,实现 "平滑演进"资源隔离:通过 cgroups、namespace 等技术实现不同应用间资源隔离,保障关键业务稳定性五、应用场景与价值:平衡策略的实际成效典型应用场景:场景兼容策略创新价值企业数据中心迁移RPM 兼容 + 服务管理一致,运维零成本A-Tune 智能调优 + 鲲鹏加速,性能提升 30%+金融核心系统二进制兼容 + 容器隔离,保障业务连续性secGear 机密计算 + 国密支持,构建安全护城河云原生平台兼容 K8s 生态,降低云服务商迁移成本iSula+openGauss 软硬协同,提供差异化云服务信创工程兼容原有应用,保护投资多芯片支持 + 国密合规,满足自主可控要求实际成效:在电信、金融、政务等行业成功替代 CentOS/RHEL,市场份额持续提升,已成为国内服务器操作系统首选之一已适配超过 18,100 款解决方案,与 6,300 + 生态伙伴建立合作,形成完整产业链支持在 ARM 服务器市场占据主导地位,鲲鹏 + 欧拉组合已成为国产算力首选解决方案六、总结一下下:平衡的艺术openEuler 在国产化替代中成功实现了兼容与创新的平衡,核心在于其 "兼容不是简单模仿,创新不是全盘否定" 的设计哲学:兼容层面:通过 RPM 包管理、ABI 兼容和迁移工具,构建了与 RHEL/CentOS 生态的 "无缝连接",大幅降低迁移成本创新层面:在内核优化、芯片适配、安全机制等关键领域突破,形成自主技术体系,构建差异化竞争力融合策略:采用 "分层解耦 + 渐进迁移",让用户可以在保护原有投资的同时,逐步拥抱自主创新技术这种平衡策略使 openEuler 既能满足企业平滑迁移的需求,又能为国家信息技术自主可控战略提供坚实支撑,成为国产化替代浪潮中的理想选择。
  • [大赛资讯] 风口已至!2025 华为 ICT 基础软件赛道:共筑数字底座,共创产业新生态
    风口已至!2025华为ICT基础软件赛道:共筑数字底座,共创产业新生态当数字经济成为全球经济增长的核心引擎,ICT基础软件作为“数字底座的基石”,正迎来前所未有的发展机遇。2025年,随着国产化替代进入深水区、全场景智能加速渗透、“东数西算”等国家战略持续落地,华为ICT基础软件赛道已从“技术攻坚期”迈入“生态爆发期”,诚邀全球开发者、企业伙伴、行业同仁携手,共拓万亿级市场蓝海,共建自主可控、开放共赢的产业新生态。一、时代风口:为什么2025是ICT基础软件的“黄金元年”?1. 国产化替代进入“深水区”,刚需驱动赛道爆发当前,我国ICT产业正加速从“引进消化”向“自主创新”转型,基础软件作为信息安全的“命脉”,成为国产化替代的核心领域。从政企办公系统到金融、能源、交通等关键行业核心业务,对自主可控的操作系统、数据库、中间件等基础软件需求呈爆发式增长。据IDC预测,2025年中国基础软件市场规模将突破3500亿元,年复合增长率超18%,其中国产化基础软件占比将提升至40%以上,赛道红利持续释放。2. 全场景智能时代,基础软件需“跨端协同”能力5G、AI、物联网、云计算的深度融合,推动终端形态从“单一设备”向“全场景互联”演进——手机、平板、车机、工业终端、智能穿戴等设备需要统一的软件底座支撑。华为ICT基础软件以“全场景协同”为核心设计理念,打破设备壁垒,实现“一次开发、多端部署”“数据互通、体验一致”,完美匹配智能汽车、工业互联网、智慧政务等新兴场景的需求,成为全场景智能的“技术枢纽”。3. 国家战略加持,政策资源向基础软件倾斜从“数字中国建设整体布局规划”到“新一代人工智能发展规划”,国家层面持续加大对基础软件、核心技术的支持力度,通过税收优惠、研发补贴、政府采购等政策,为ICT基础软件产业营造良好发展环境。2025年,“东数西算”工程进入全面落地阶段,全国一体化算力网络建设需要海量自主可控的基础软件支撑,为赛道参与者提供了广阔的应用舞台。二、华为ICT基础软件赛道:四大核心方向,构筑技术护城河华为以“把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界”为使命,深耕ICT基础软件多年,形成了以“欧拉、鸿蒙、高斯、HMS Core”为核心的技术底座,覆盖操作系统、数据库、应用生态三大关键领域,为伙伴提供从底层技术到上层应用的全栈支持。1. 欧拉(openEuler):服务器操作系统的“国产化标杆”作为面向数字基础设施的开源操作系统,欧拉聚焦服务器、云计算、边缘计算、嵌入式等场景,兼容x86、ARM等多种架构,已成为国产化服务器操作系统的首选。截至2024年底,欧拉生态伙伴超4000家,覆盖硬件厂商、软件开发商、集成商,在政府、金融、能源、交通等行业实现规模化应用。2025年,欧拉将持续深化“开源共治”,推出更贴合行业场景的定制化版本,推动国产化服务器操作系统渗透率进一步提升。2. 鸿蒙(HarmonyOS):全场景智能的“统一底座”鸿蒙是面向万物互联时代的分布式操作系统,通过“分布式技术”实现多设备协同,让手机、平板、车机、智能家电等融为一体,为用户提供“超级终端”体验。目前,鸿蒙设备数量已突破8亿台,开发者超220万人,生态应用超800万个。2025年,鸿蒙将重点发力智能汽车、工业控制、智慧家居等垂直场景,推出更轻量化的嵌入式版本,降低设备接入门槛,同时开放更多核心能力,支持伙伴开发差异化场景应用。3. 高斯(GaussDB):企业级数据库的“性能王者”高斯数据库是华为自主研发的企业级分布式数据库,具备高可用、高性能、高安全、易扩展等特性,支持事务、分析、时序等多场景混合负载,可适配金融核心系统、政务数据中台、工业数据存储等关键场景。截至2024年,高斯DB已服务超1000家大型企业客户,在银行核心交易系统、政务大数据平台等场景实现国产化替代。2025年,高斯DB将进一步优化分布式架构,提升AI原生能力,推出更多行业解决方案,助力企业实现数据价值最大化。4. HMS Core:全球应用生态的“赋能引擎”HMS Core是华为面向全球开发者的移动应用开发平台,提供应用开发、测试、分发、运营全流程支持,开放AI、地图、支付、推送等核心能力,帮助开发者快速构建高质量应用。目前,HMS Core全球注册开发者超600万人,集成HMS Core的应用覆盖190多个国家和地区。2025年,HMS Core将深化“全球协同”,推出更多跨端开发工具,降低开发者多端适配成本,同时加强与海外应用市场的合作,助力中国开发者走向全球。三、生态赋能:华为与伙伴“共生共荣”的核心优势华为ICT基础软件赛道的核心竞争力,不仅在于技术硬实力,更在于“开放、合作、共赢”的生态理念。2025年,华为将从技术、资源、市场三大维度,为赛道参与者提供全方位支持,让伙伴“低成本创新、高效率变现”。1. 技术赋能:全栈工具链+免费培训,降低开发门槛提供全套开发工具:包括DevEco Studio(鸿蒙/欧拉开发工具)、GaussDB开发套件、HMS Core SDK等,支持“一站式开发、一键式部署”;免费技术培训与认证:通过华为开发者学院(HUAWEI DevEco Academy)提供线上线下培训,覆盖操作系统、数据库、应用开发等课程,颁发行业认可的技术认证;专家一对一指导:组建技术专家团队,为伙伴提供场景化解决方案咨询、技术难题攻关等定制化支持。2. 资源扶持:资金+流量+场景,助力伙伴快速成长资金支持:联合华为云、产业投资基金,为优质创业项目提供投融资对接服务,最高可获得千万元级投资;流量倾斜:通过华为应用市场、鸿蒙智联商城、欧拉生态市场等渠道,为伙伴产品提供曝光机会,助力精准获客;场景开放:开放华为内部场景及政企客户资源,为伙伴提供试点验证、项目合作机会,加速产品商业化落地。3. 生态协同:共建标准+共享成果,打造产业合力开源共治:欧拉、鸿蒙均采用开源模式,联合全球开发者共建技术标准,伙伴可参与核心代码贡献,共享技术成果;行业联盟:成立ICT基础软件产业联盟,汇聚硬件厂商、软件开发商、集成商、科研机构,推动行业标准制定、产业链协同;成果共享:共享生态案例、市场数据、客户资源,降低伙伴市场推广成本,实现“1+1>2”的生态效应。四、加入我们:2025,共赴ICT基础软件的“黄金赛道”无论是深耕行业多年的企业伙伴,还是怀揣创新梦想的开发者,无论是专注技术研发的团队,还是聚焦市场推广的渠道商,都能在华为ICT基础软件赛道找到属于自己的机会:开发者:可基于鸿蒙、欧拉、HMS Core开发场景化应用,通过应用分发、技术服务实现商业变现;企业伙伴:可基于华为基础软件进行二次开发、行业定制,或成为硬件适配伙伴、解决方案集成商,共享行业订单;投资者:可关注赛道内优质创业项目、生态伙伴,把握国产化替代与数字经济的双重红利。2025年,ICT基础软件已不是“选择题”,而是“必修课”;不是“孤军奋战”,而是“生态共荣”。华为愿以开放的姿态、全栈的能力、共赢的理念,与全球伙伴携手,攻克核心技术、共建产业生态、共享发展机遇,让自主可控的ICT基础软件赋能千行百业,为数字中国建设注入强劲动力!加入华为ICT基础软件赛道,让我们一起:以技术为基,以生态为翼,共创数字时代的新辉煌!(如需了解更多合作详情,可访问华为开发者联盟官网、欧拉开源社区、鸿蒙生态官网,或参加2025华为ICT基础软件生态大会,与行业大咖、技术专家、合作伙伴面对面交流。)
  • Atune工具小知识
    Atune(Automatic Tuning)是华为开发的系统自动调优工具,核心目标是通过算法分析系统负载特征,自动优化 OS、应用等参数以提升性能。 Atune 的算法核心模块(Engine = 引擎),是实现 “自动调优” 的关键。一些核心逻辑包括:分析系统负载特征(如 CPU 密集型、IO 密集型应用);调用内置的优化算法(如机器学习模型、启发式算法),结合负载特征计算最优参数(如内核参数、应用配置);生成可执行的优化方案,传递给 atuned 执行。 他和 “算法优化” 的关系是:直接承担 “用算法计算优化参数” 的核心职责 Atune-engine 主要通过在线静态调优和离线动态调优两种方式实现算法优化: 在线静态调优数据采集与打标签:在离线情况下采集系统运行数据,包括 CPU 使用率、内存占用、磁盘 I/O 等,最高支持 52 维数据采集,并为每个数据集打标签。模型训练:利用双层分类模型进行训练,第一层分类器识别出默认类型和高吞吐类型;第二层分类器识别到具体的应用。通过训练,使模型能够根据采集的数据识别出不同的业务类型和负载情况。负载识别与配置下发:在线时,基于训练好的模型,对运行环境进行负载识别,根据识别结果从优化配置库中选取最优配置下发,实现对系统的调优,整个过程速度可达分钟级别。优化配置库中的参数一部分来自资深工程师在实际环境中调优得到的人工经验,一部分是通过 atune 提供的离线动态调优功能得到的最优参数。离线动态调优参数选择:对于工程师给定的众多参数,使用 LHS(拉丁超立方抽样算法)算法和 Traverse 算法,均匀采集几个点,自动选择最重要的几个参数进行调优,减少不必要的参数调整,提高调优效率。贝叶斯算法迭代优化:采用贝叶斯优化算法对筛选出的重要参数空间进行迭代搜索,不断优化参数值。在这个过程中,根据贝叶斯算法的原理,迭代次数越多,模型越准确,直到算法收敛,获取到最优配置,最终返回给服务器。该过程可能以天为单位,主要面向专业工程师,需要给定配置参数和评价指标,如对于性能越高越好的应用,评价指标可能就是吞吐量。 
  • x2openEuler的https冷知识
    ​为了更便捷的实现CentOS系统迁移到国产openEuler系统 ,具备批量化原地升级能力,提升迁移能效,搭建x2openEuler平台是一个不错的方案。​而大家知道吗,x2openEuler工具的HTTPS默认端口号很特殊哦:它居然是——18082​​核心依据:​​安装过程中的默认配置​​在部署x2openEuler工具时,启动Web服务会提示设置HTTPS端口,​​默认值为18082​​。用户可直接按回车键采用此默认值,无需手动修改。# 安装过程中提示的默认端口配置Please enter HTTPS port(default: 18082):The HTTPS port 18082 is valid. Set the HTTPS port to 18082 (y/n default: y)​​实际访问地址​​通过浏览器访问x2openEuler的Web管理界面时,需使用 https://<服务器IP>:18082 的格式(例如 https://192.168.31.221:18082/x2openEuler/#/login),进一步验证18082是HTTPS服务的默认端口。   ​​443​​:443是标准HTTPS服务的默认端口(如网站加密访问),但x2openEuler作为独立迁移工具,​​未使用此通用端口​​。​​ 8443​​:8443常用于其他管理控制台(如Kubernetes Dashboard),​​未被x2openEuler采用​​。​​ 18080​​:18080是x2openEuler中Gunicorn应用服务的默认端口(用于内部通信),​​而非面向用户的HTTPS端口​​。 注意哦​​自定义可能性​​:虽然18082是默认值,但用户可在安装过程中​​手动指定其他端口​​(如改为8443或更高端口),需根据实际配置确认。​​防火墙规则​​:若无法访问x2openEuler界面,需检查防火墙是否放行18082端口:sudo firewall-cmd --zone=public --add-port=18082/tcp --permanentsudo firewall-cmd --reload此操作确保端口可被外部访问。   
  • [交流吐槽] 尝试发帖
    尝试发帖,完成一个测试任务
  • [问题求助] openEuler22.03LTSSP4装openGauss6.0.0的初始化时报:no data was returned by command ""/opt/software/openGauss/openGauss/bin/gaus..
    不是真实的机器是虚拟机,使用QEMU创建的虚拟机因为我是为了和工作环境的机器保持一致,所以没用x86的镜像,也不知道x86的是不是就可以装好…iso为:openEuler-22.03-LTS-SP4-aarch64-dvd.isoopenGauss安装包为:openGauss-Server-6.0.0-openEuler22.03-aarch64.tar.bz2安装路径:/opt/software/openGauss/openGauss安装包路径:/opt/software/openGauss/install目前的情况是:完整报错:[omm@openEuler openGauss]$ gs_initdb -D /opt/software/openGauss/openGauss/data/single_node --nodename=single_node -w ******* no data was returned by command ""/opt/software/openGauss/openGauss/bin/gaussdb" -V" The program "gaussdb" is needed by gs_initdb but was not found in the same directory as "/opt/software/openGauss/openGauss/bin/gs_initdb". Check your installation. 权限情况:/opt drwxr-xr-x. 3 root root 4096 7月 1 13:44 opt /opt/software drwxrwsr-x. 3 root sftgrp 4096 7月 1 13:44 software /opt/software/openGauss drwxrwsr-x. 4 omm omm 4096 7月 1 13:44 openGauss /opt/software/openGauss/install&openGauss drwxrwsr-x. 2 root sftgrp 4096 7月 1 14:02 install drwx--S---. 10 omm omm 4096 7月 1 15:58 openGauss /opt/software/openGauss/openGauss/* [omm@openEuler openGauss]$ ll 总用量 36 drwxr-s---. 2 omm omm 4096 9月 29 2024 bin drwxrwsr-x. 2 omm omm 4096 7月 2 09:30 data drwxr-s---. 3 omm omm 4096 9月 29 2024 etc drwxr-s---. 3 omm omm 4096 9月 29 2024 include drwxr-s---. 4 omm omm 4096 9月 29 2024 jre drwxr-s---. 5 omm omm 4096 9月 29 2024 lib drwxr-s---. 5 omm omm 4096 9月 29 2024 share drwxr-s---. 2 omm omm 4096 7月 2 09:11 simpleInstall -rw-r-----. 1 omm omm 47 9月 29 2024 version.cfg /opt/software/openGauss/openGauss/bin/* [omm@openEuler bin]$ ll 总用量 151452 -rw-r--r--. 1 omm omm 7297 9月 29 2024 alarmItem.conf -rwxr-xr-x. 1 omm omm 5891 9月 29 2024 bind_net_irq.sh -r--r--r--. 1 omm omm 58784 9月 29 2024 cluster_guc.conf -rw-r-----. 1 omm omm 6455 9月 29 2024 dms_contrl.sh -rw-r-----. 1 omm omm 9306 9月 29 2024 dss_clear.sh -rwxr-x---. 1 omm omm 5392744 9月 29 2024 dsscmd -rw-r-----. 1 omm omm 11803 9月 29 2024 dss_contrl.sh -rwxr-x---. 1 omm omm 4724168 9月 29 2024 dssserver -rwxr-x---. 1 omm omm 1838040 9月 29 2024 ecpg -rwxr-x---. 1 omm omm 134792 9月 29 2024 encrypt -rwxr-x---. 1 omm omm 131679648 9月 29 2024 gaussdb -rwxr-x---. 1 omm omm 267040 9月 29 2024 gs_assessment -rwxr-x---. 1 omm omm 207416 9月 29 2024 gs_basebackup -rwxr-x---. 1 omm omm 265360 9月 29 2024 gs_cgroup -rwxr-x---. 1 omm omm 470752 9月 29 2024 gs_ctl -rwxr-x---. 1 omm omm 1121 9月 29 2024 gs_dbmind -rwxr-x---. 1 omm omm 661664 9月 29 2024 gs_dump -rwxr-x---. 1 omm omm 267456 9月 29 2024 gs_dumpall lrwxrwxrwx. 1 omm omm 7 9月 29 2024 gs_encrypt -> gaussdb -rwxr-x---. 1 omm omm 332520 9月 29 2024 gs_guc -rwxr-x---. 1 omm omm 279152 9月 29 2024 gs_initdb -rwxr-xr-x. 1 omm omm 30469 9月 29 2024 gs_plan_simulator.sh -rwxr-x---. 1 omm omm 673000 9月 29 2024 gs_probackup -rwxr-x---. 1 omm omm 791888 9月 29 2024 gsql -rwxr-x---. 1 omm omm 332832 9月 29 2024 gs_restore -rwxr-x---. 1 omm omm 206920 9月 29 2024 gs_retrieve lrwxrwxrwx. 1 omm omm 13 9月 29 2024 gs_tar -> gs_basebackup -rwxr-x---. 1 omm omm 140520 9月 29 2024 gstrace ......gs_initdb和gaussdb两个文件都是有的环境变量配置是这样[omm@openEuler bin]$ cat /home/omm/.bashrc # Source default setting [ -f /etc/bashrc ] && . /etc/bashrc # User environment PATH export PATH # openGauss PATH export GAUSSHOME=/opt/software/openGauss/openGauss export PATH=$GAUSSHOME/bin:$PATH export LD_LIBRARY_PATH=$GAUSSHOME/lib:$LD_LIBRARY_PATH export GS_CLUSTER_NAME=dbCluster输出也是可以输出的:[omm@openEuler bin]$ echo $GAUSSHOME /opt/software/openGauss/openGauss ######分隔 [omm@openEuler bin]$ gsql -V gsql (openGauss 6.0.0 build aee4abd5) compiled at 2024-09-29 19:31:41 commit 0 last mr ######分隔 [omm@openEuler bin]$ /opt/software/openGauss/openGauss/bin/gaussdb -V gaussdb (openGauss 6.0.0 build aee4abd5) compiled at 2024-09-29 19:31:41 commit 0 last mr然后一些别的参数啥的也检查了:##防火墙 ####### [omm@openEuler bin]$ systemctl status firewalld ○ firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: man:firewalld(1) ##RemoveIPC ####### [omm@openEuler bin]$ loginctl show-session | grep RemoveIPC RemoveIPC=no [omm@openEuler bin]$ systemctl show systemd-logind | grep RemoveIPC RemoveIPC=no ##ulimit ####### [omm@openEuler bin]$ ulimit -n 100000 一头雾水,三四天了一直是这个问题,之前以为是数据库没装好,后来发现装好了只是初始化不行…
  • 资源释放了
    自己搞了5年的网站,最开始在阿里云上搭建的,1核心2G内存,40G的硬盘,那时候刚知道LNMP,然后知道了Wordpress,连tmux都不知道。当知道Redhat 8暂停支持,Centos8也要很快不更新后,域名、资源迁移到了,华为云的HECS,加入了Openeuler的大家庭,云耀云服务器|x.medium.2|1vCPUs|2GB|linux *1高IO|40.0GB *1公网IP *1动态BGP|固定带宽|1.0Mbps *1这是当时最便宜的配置,蹭了B站官网的直播,还有优惠券可以用。Openeuler使用起来和Centos无异,网站更新到22年,之后因为工作调整,没有再继续更新,期间访问了自己的网站,没有卡顿、没有崩溃。作为一个搞机电工程项目的人,在日日夜夜的繁忙、加班中,资源到期了好几次。直到今天,突然想起来自己有日子没续资源了当再次打开控制台时,没有HECS,没有弹性公网IP,等待的是30条未读信息。全是包年/包月资源即将释放提醒。然而这些提醒,已经是半个月前了。五年了,当时单纯是为了满足自己的好奇,做了个方便自己查询的规范网站,没打算让这个网站为我挣钱。对要不要年年续费的抉择还是有的,现在资源释放了,竟然感到了一丝轻松,还好自己学到了东西,没有浪费时间和经历。同时感到一丝感激,感谢那些曾经点进那个网站的朋友们,让我度过了曾经最迷茫的那段日子。感谢!
  • [课程学习] nvwa
    安装安装内核热升级工具。# yum install nvwa -y 部署内核热升级工具本章介绍内核热升级工具的配置部署:配置介绍内核热升级工具的配置文件位于/etc/nvwa,配置文件包括:nvwa-restore.yaml该配置文件用于指导内核热升级工具在内核热升级过程中如何保存和恢复现场,具体配置如下:pidspids用于指明nvwa热升级过程中需要保留和恢复的进程,此处的进程通过进程号(pid)进行标识,需要注意的是,nvwa管理的进程在nvwa服务启动后,会被自动恢复。servicesservices用于指明nvwa热升级过程中需要保留和恢复的服务。与pids的区别在于,内核热升级工具可以直接保存和恢复进程的状态,对于服务,内核热升级工具则需要依赖systemd进行相关操作。此处的服务名称,应该使用systemd中使用的服务名称。需要注意的是,对于nvwa管理的服务,是否要在nvwa启动时自动恢复,取决于systemd中有没有使能该服务,且当前支持的服务类型只有notify和oneshot。restore_netrestore_net用于指明是否需要内核热升级工具保存和恢复网络配置,如果网络配置有误,有可能导致恢复后网络不可用,默认关闭。enable_quick_kexecenable_quick_kexec用于指明是否需要使能quick kexec特性,quick kexec是nvwa社区推出的,加速内核重启过程的一个特性。使用该特性,需要在cmdline中,加入"quickkexec=128M"。128指分配给quick kexec特性的内存大小,该内存将用于在升级过程中加载kernel和initramfs,因此大小需要大于升级过程中涉及到的kernel,initramfs大小之和。该特性默认关闭。enable_pin_memoryenable_pin_memory用于指明是否需要使能pin memory特性,pin memory是nvwa社区推出的,加速进程保存恢复过程的一个特性。使用该特性,需要在cmdline中,加入"max_pin_pid_num=10 redirect_space_size=2M pinmemory=200M@0x640000000"。其中,max_pin_pid_num代表支持pin memory恢复的最大进程数目,redirect_space_size代表pin memory过程中重定向物理页所需要的预留内存空间,建议配置为pin memory总预留内存的1/100,pinmemory指明这段内存的起点和大小。从0x640000000开始的200M空间,是pin memory使用的全部内存空间,这段空间不应该被其他程序使用。nvwa-restore.yaml的配置示例pids: - 14109 services: - redis restore_net: false enable_quick_kexec: true enable_pin_memory: true nvwa-server.yaml该文件包含了内核热升级工具运行过程中,需要使用到的配置信息,具体如下:criu_dir用于指明内核热升级工具在保存现场过程中,存储产生的信息文件夹路径。需要注意的是,这些信息可能会占用较大的磁盘空间。criu_exe用于指明内核热升级工具使用的criu可执行文件路径,除非是对criu进行调测,一般不建议修改。kexec_exe用于指明内核热升级工具使用的kexec可执行文件路径,除非是对kexec进行调测,一般不建议修改。systemd_etc用于指明覆盖systemd配置过程中,使用到的文件夹路径。该路径由systemd决定,一般不需要修改。log_dir存放内核热升级工具产生的log信息,log模块当前未启用。内核热升级工具日志信息的查看,参考[使用方法-产生的日志信息](。nvwa-server.yaml的配置示例criu_dir: /var/nvwa/running/ criu_exe: /usr/sbin/criu kexec_exe: /usr/sbin/kexec systemd_etc: /etc/systemd/system/ log_dir: /etc/nvwa/log/使能内核热升级工具内核热升级工具的运行依赖配置文件,配置文件修改后应该重新运行内核热升级工具程序。安装成功后,可以通过systemd的相关命令来操作内核热升级工具。使能nvwa。 systemctl enable nvwa启动nvwa。 systemctl start nvwa查看nvwa服务状态及相关信息。 systemctl status nvwa更多用法参考systemd用法。使用命令用法nvwa help打印帮助信息,打印的信息如下:NAME: nvwa - a tool used for openEuler kernel update. USAGE: nvwa [global options] command [command options] [arguments...] VERSION: 0.1 COMMANDS: update specify kernel version for nvwa to update init init nvwa running environment help, h Shows a list of commands or help for one command GLOBAL OPTIONS: --help, -h show help (default: false) --version, -v print the version (default: false) nvwa update <kernel version>热升级到内核某一版本,nvwa会去/boot目录下寻找内核镜像和ramfs,kernel的命名格式需为vmlinuz-<kernel version>, rootfs命名格式需为initramfs-<kernel version>.img 。需要注意的是,升级过程有可能会失败,如果失败,部分被dump的进程或者服务,将停止运行。nvwa init清除nvwa产生的现场信息以及对systemd的配置修改,用于nvwa执行前或者执行失败后,对现场进行清理。使用限制对于需要通过nvwa保存的service,其配置中需要设置标准输出(StandardOutput)和错误输出(StandardError),以redis为例:[Unit] Description=Redis persistent key-value database After=network.target [Service] ExecStart=/usr/bin/redis-server /etc/redis.conf --supervised systemd Type=notify User=redis Group=redis RuntimeDirectory=redis RuntimeDirectoryMode=0755 StandardOutput=file:/root/log1.log StandardError=file:/root/log2.log [Install] WantedBy=multi-user.target使用加速特性需要修改cmdline以及分配合适的内存,参见下方[加速特性说明及使用](。运行过程中需要关闭SELINUX。理论上,仅需要在执行nvwa update之后和系统重启nvwa恢复现场这段时间前关闭。稳妥起见,建议全程关闭SELINUX。加速特性说明及使用cpu park(加速内核重启过程)。cpu park,是在使用kexec过程,使cpu进入一种忙等的状态,更快的响应主核发送的中断请求,减少状态的变化。使用cpu park,需要在cmdline中加入"cpuparkmem=0x200000000",其中0x200000000是一段未被其他程序使用的内存起始地址,cpuparkmem将占用从该地址开始,size为1M左右的内存空间。需要注意的是,在内存允许的情况下,此处的地址选择,建议范围在4G(0x100000000)之后,前4G通常被系统各组件预留,容易冲突。quick kexec(加速内核启动过程)。quick kexec,是对kexec加载镜像过程中的一种加速。使用quick kexec,需要在配置文件中使能相关选项,更多信息参考[安装与部署-配置介绍](。pin_memory(加速现场保存恢复过程)。pin memory,是对criu进行现场保存恢复过程中的一种加速。使用pin memory,需要在配置文件中使能相关选项,更多信息参考[安装与部署-配置介绍](。产生的日志信息内核热升级工具产生的日志分为两部分:运行过程产生的日志:通过service nvwa status查看。保留现场过程中产生的日志:日志位于criu_dir指定的路径对应命名的进程/服务文件夹中。
  • [课程学习] StratoVirt
    安装软硬件要求最低硬件要求处理器架构:仅支持AArch64和x86_64处理器架构。AArch64需要ARMv8及更高版本且支持虚拟化扩展;x86_64支持VT-x。2核CPU4GiB内存16GiB可用磁盘空间软件要求操作系统:openEuler 22.03 LTS SP2安装组件使用StratoVirt虚拟化,需要安装StratoVirt。安装前,请确保已经配置了openEuler yum源。使用root权限,安装StratoVirt组件,参考命令如下。# yum install stratovirt 查看是否安装成功。$ stratovirt -version StratoVirt 2.1.0 准备环境使用说明StratoVirt仅支持运行于x86_64和AArch64处理器架构下并启动相同架构的Linux虚拟机。建议在 openEuler 22.03 LTS SP2 版本编译、调测和部署该版本 StratoVirt。StratoVirt支持以非root权限运行。环境要求运行StratoVirt需要具备如下环境:/dev/vhost-vsock设备(用于实现mmio)nmap工具Kernel镜像和rootfs镜像准备设备和工具StratoVirt运行需要实现mmio设备,所以运行之前确保存在设备/dev/vhost-vsock查看该设备是否存在:$ ls /dev/vhost-vsock /dev/vhost-vsock若该设备不存在,请执行如下命令生成/dev/vhost-vsock设备。$ modprobe vhost_vsock为了能够使用QMP命令,需要安装nmap工具,在配置yum源的前提下,可执行如下命令安装nmap。# yum install nmap 准备镜像制作kernel镜像当前版本的StratoVirt仅支持x86_64和AArch64平台的PE格式内核镜像。此格式内核映像可通过以下方法生成。获取openEuler的kernel源代码,参考命令如下:$ git clone $ cd kernel查看并切换kernel的版本到openEuler-22.03-LTS-SP2,参考命令如下:$ git checkout openEuler-22.03-LTS-SP2 配置并编译Linux kernel。目前有两种方式可以生成配置文件:1. 使用推荐配置([获取配置文件]($ make menuconfig使用下面的命令制作并转换kernel镜像为PE格式,转化后的镜像为vmlinux.bin。$ make -j vmlinux && objcopy -O binary vmlinux vmlinux.bin如果想在x86平台使用bzImzge格式的kernel,可以使用如下命令进行编译。$ make -j bzImage制作rootfs镜像rootfs镜像是一种文件系统镜像,在StratoVirt启动时可以装载带有init的ext4格式的镜像。下面是制作ext4 rootfs镜像的简单方法。准备一个大小合适的文件(例如在/home中创建10GiB空间大小的文件)。$ cd /home $ dd if=/dev/zero of=./rootfs.ext4 bs=1G count=10 在此文件上创建空的ext4文件系统。$ mkfs.ext4 ./rootfs.ext4挂载文件镜像。创建/mnt/rootfs,使用root权限,将rootfs.ext4挂载到/mnt/rootfs目录。$ mkdir /mnt/rootfs # 返回刚刚创建文件系统的目录(如/home) $ cd /home $ sudo mount ./rootfs.ext4 /mnt/rootfs && cd /mnt/rootfs获取对应处理器架构的最新alpine-mini rootfs。对于AArch64处理器架构,从[alpine](网站获取最新alpine-mini rootfs,例如:alpine-minirootfs-3.16.0-aarch64.tar.gz ,参考命令如下:$ wget http://dl-cdn.alpinelinux.org/alpine/latest-stable/releases/aarch64/alpine-minirootfs-3.16.0-aarch64.tar.gz $ tar -zxvf alpine-minirootfs-3.16.0-aarch64.tar.gz $ rm alpine-minirootfs-3.16.0-aarch64.tar.gz对于x86_64处理器架构,从[alpine](网站获取指定架构最新alpine-mini rootfs,例如:alpine-minirootfs-3.16.0-x86_64.tar.gz,参考命令如下:$ wget http://dl-cdn.alpinelinux.org/alpine/latest-stable/releases/x86_64/alpine-minirootfs-3.16.0-x86_64.tar.gz $ tar -zxvf alpine-minirootfs-3.16.0-x86_64.tar.gz $ rm alpine-minirootfs-3.16.0-x86_64.tar.gz为ext4文件镜像制作一个简单的/sbin/init,参考命令如下:$ rm sbin/init; touch sbin/init && cat > sbin/init <<EOF #! /bin/sh mount -t devtmpfs dev /dev mount -t proc proc /proc mount -t sysfs sysfs /sys ip link set up dev lo exec /sbin/getty -n -l /bin/sh 115200 /dev/ttyS0 poweroff -f EOF sudo chmod +x sbin/init卸载rootfs镜像。$ cd /home; umount /mnt/rootfs至此, rootfs制作成功,已可使用ext4 rootfs镜像文件rootfs.ext4,该文件在/home目录下。获取标准启动所需固件固件 (firmware) 是指设备内部保存的设备驱动程序。操作系统只有通过固件才能按照标准启动的方式进行启动。 StratoVirt 当前只支持在 x86_64 和 aarch64 架构下按照 UEFI (Unified Extensible Firmware Interface) 接口进行标准启动。EDK II 是实现了 UEFI 标准的开源软件,StratoVirt 使用 EDK II 作为标准启动的固件。因此需要获取EDK II的固件文件。可以通过 yum 命令来进行 EDK II 固件文件的安装,具体命令如下。x86_64 架构上运行以下命令:$ sudo yum install -y edk2-ovmfaarch64 架构上运行以下命令:$ sudo yum install -y edk2-aarch64EDK II 的固件包括两个文件:一个文件用于保存可执行代码,另一个文件用于保存启动配置信息。安装成功之后,在 x86_64 架构上,固件文件 OVMF_CODE.fd 与固件配置文件 OVMF_VARS.fd 会保存在 /usr/share/edk2/ovmf 路径下;在 aarch64 架构上, 固件文件 QEMU_EFI-pflash.raw 和固件配置文件 vars-template-pflash.raw 则是保存在 /usr/share/edk2/aarch64 路径下。虚拟机配置概述使用 StratoVirt 时,可以通过命令行参数指定虚拟机配置,也支持对接 libvirt ,通过 XML 文件配置。本章介绍命令行方式的配置方式。![img](本文中的 /path/to/socket 为用户自定义路径下的 socket 文件。从 openEuler 22.03 LTS SP2 版本开始,取消了对 json 文件的支持。规格说明StratoVirt 支持启动轻量级虚拟机和标准虚拟机。轻量级虚拟机使用轻量级 microVM 主板,以及 mmio 总线。标准虚拟机支持标准启动,在 x86 平台使用 Q35 主板,AArch64 架构下使用 virt 主板以及 PCI 总线。轻量级虚拟机虚拟机 CPU 个数:[1, 254]。虚拟机内存大小:[256 MiB, 512 GiB]。虚拟机磁盘个数(包括热插的磁盘):[0, 6]。虚拟机网卡个数(包括热插的网卡):[0, 2]。虚拟机 console 设备仅支持单路连接。主机 CPU 架构为 x86_64 时,最多可以配置 11 个 mmio 设备,但是除了磁盘和网卡,建议最多配置 2 个其他设备; AArch64 平台,最多可以配置 160 个 mmio 设备,但是除了磁盘和网卡,建议最多配置 12 个其他设备。标准虚拟机虚拟机 CPU 个数:[1, 254]。虚拟机内存大小:[256 MiB, 512 GiB]。虚拟机 console 设备仅支持单路连接。只支持 1 个 console 设备。最多支持 32 个 PCI 设备。PCI 设备挂载的 PCI 总线 slot 取值范围: [0, 32);function 取值范围 [0, 8)。最小配置StratoVirt 能够运行的最小配置为:PE 格式或 bzImage 格式(仅 x86_64)的 Linux 内核镜像。将 rootfs 镜像设置成 virtio-blk 设备,并添加到内核参数中。使用 api-channel 控制 StratoVirt。如果要使用串口 登录,添加一个串口到内核启动命令行,AArch64平台标准机型为ttyAMA0,其他情况为ttyS0。配置介绍命令格式使用 cmdline 配置的命令格式如下:$ /path/to/stratovirt -[参数1] [参数选项] -[参数2] [参数选项] …使用说明首先,为确保可以创建 api-channel 需要的 socket,可以参考如下命令清理环境:$ rm [参数] [用户自定义socket文件路径] 然后,运行 cmdline 命令。$ /path/to/stratovirt -[参数1] [参数选项] -[参数2] [参数选项] ...基本信息配置基本配置信息如下表所示:参数参数选项说明-nameVMname配置虚拟机名称(字符长度:1-255字符)-kernel/path/to/vmlinux.bin配置内核镜像-appendconsole=ttyS0 root=/dev/vda reboot=k panic=1 rw配置内核命令行参数,标准虚拟化X86_64平台默认使用console=ttyS0,AArch64平台默认使用console=ttyAMA0。在配置了virtio-console设备但是没有配置serial串口设备时,需要配置为console=hvc0(与架构平台无关)-initrd/path/to/initrd.img配置initrd文件-smp[cpus=]个数配置cpu个数,范围[1, 254]-m内存大小MiB、内存大小GiB,默认单位MiB配置内存大小,范围[256MiB, 512GiB]-qmpunix:/path/to/socket,server,nowait配置api-channel,运行前须保证socket文件不存在-D/path/to/logfile配置日志文件-pidfile/path/to/pidfile配置pid文件,必须和-daemonize一起使用。运行前须保证pid文件不存在-disable-seccompNA关闭Seccomp,默认打开-daemonizeNA开启进程daemon化虚拟机类型通过-machine参数来指定启动的虚拟机的类型。参数说明type:启动虚拟机的类型(轻量级虚拟化为“MicroVm”类型,标准虚拟化在x86_64平台为”q35“,在AArch64平台为”virt”)。dump-guest-core:进程panic时,是否dump虚拟机内存(可选配置)。mem-share:是否与其他进程共享内存(可选配置)。磁盘配置虚拟机磁盘配置包含以下配置项drive_id: 磁盘的id。path_on_host: 磁盘的路径。serial_num: 磁盘的串号(可选配置)。read_only: 是否只读(可选配置)。direct: 是否以“O_DIRECT”模式打开(可选配置)。iothread: 配置iothread属性(可选配置)。throttling.iops-total: 配置磁盘QoS,以限制磁盘的io操作(可选配置)。if:driver的类型,block设备为“none”(可选配置,默认值为“none”)。bus:设备要挂载的bus。addr:设备要挂载的slot和function号。multifunction:是否开启pci多功能(可选配置)。磁盘配置方式磁盘的配置分为两步:driver的配置和block设备的配置。轻量虚拟机配置格式为:-drive id=drive_id,file=path_on_host[,readonly=off][,direct=off][,throttling.iops-total=200][,if=none] -device virtio-blk-device,drive=drive_id,id=blkid[,iothread=iothread1][,serial=serial_num] 标准虚拟机配置格式为:-drive id=drive_id,file=path_on_host[,readonly=off][,direct=off][,throttling.iops-total=200][,if=none] -device virtio-blk-pci,drive=drive_id,bus=pcie.0,addr=0x3.0x0,id=blkid[,iothread=iothread1,][serial=serial_num][,multifunction=on] 下面对throttling.iops-total和iothread两个配置项进行详细说明:磁盘QoS简介QoS(Quality of Service)是服务质量的意思。在云场景中,单主机内会启动多台虚拟机,当某台虚拟机对磁盘访问压力大时,由于同主机的磁盘访问总带宽有限,这会挤占其他虚拟机的访问带宽,从而造成对其他虚拟机IO影响。为了降低影响,可以为虚拟机配置QoS属性,限制它们对磁盘访问的速率,从而降低对彼此的影响。注意事项当前QoS支持配置磁盘的iops。iops的设定范围是[0, 1000000],0为不限速;实际iops不会超过设定值,并且不会超过后端磁盘实际性能的上限。只能限制平均iops,无法限速瞬时的突发流量。配置方式用法:命令行-drive xxx,throttling.iops-total=200 参数:throttling.iops-total:当配置了iops后,本磁盘在虚拟机内部的IO下发速度,不会超过此配置值。xxx:表示磁盘的其他设置。iothreadiothread配置细节见[配置iothread](网卡配置虚拟机网卡的配置包含以下配置项:id:唯一的设备 id。tap:指定 tap 设备。ifname:host 上的 tap 设备名。mac:设置虚拟机 mac 地址(可选配置)。iothread:配置磁盘的 iothread 属性(可选配置)。网卡 iothread 配置详见 [配置iothread](配置方式![img](使用网络前请先使用如下命令配置好 host 网桥和 tap 设备。$ yum install -y bridge-utils iproute net-tools $ brctl addbr qbr0 $ ip tuntap add tap0 mode tap $ brctl addif qbr0 tap0 $ ifconfig qbr0 up; ifconfig tap0 up $ ifconfig qbr0 192.168.0.1 配置 virtio-net(本文中 [] 表示可选参数)轻量级虚拟机:-netdev tap,id=netdevid,ifname=host_dev_name[,vhostfd=2] -device virtio-net-device,netdev=netdevid,id=netid[,iothread=iothread1,mac=12:34:56:78:9A:BC] 标准虚拟机:-netdev tap,id=netdevid,ifname=host_dev_name[,vhostfd=2] -device virtio-net-pci,netdev=netdevid,id=netid,bus=pcie.0,addr=0x2.0x0[,multifunction=on,iothread=iothread1,mac=12:34:56:78:9A:BC] 配置 vhost-net轻量级虚拟机:-netdev tap,id=netdevid,ifname=host_dev_name,vhost=on[,vhostfd=2] -device virtio-net-device,netdev=netdevid,id=netid[,iothread=iothread1,mac=12:34:56:78:9A:BC] 标准虚拟机:-netdev tap,id=netdevid,ifname=host_dev_name,vhost=on[,vhostfd=2] -device virtio-net-pci,netdev=netdevid,id=netid,bus=pcie.0,addr=0x2.0x0[,multifunction=on,iothread=iothread1,mac=12:34:56:78:9A:BC] chardev 配置将来自 Guest 的 I/O 重定向到宿主机的 chardev。chardev 后端的类型可以是:stdio、pty、socket 和 file。其中 file 仅支持输出时设置。配置项:id:唯一的设备 id。backend:重定向的类型。path:设备重定向文件路径。仅 socket 和 file 类型的设备需要此参数。server:将 chardev 作为服务器运行。仅 socket 类型的设备需要此参数。nowait:预期状态为断开连接。仅 socket 类型的设备需要此参数。使用 chardev 时,会创建并使用 console 文件,所以启动 stratovirt 之前,请确保 console 文件不存在。配置方式-chardev backend,id=chardev_id[,path=path,server,nowait] 串口配置串口是虚拟机的设备,用于主机和虚拟机之间传送数据。使用串口时,kernel 命令行中配置 console=ttyS0 ,在 AArch64 平台上标准启动时,配置 console=ttyAMA0 。配置项:chardev:重定向的 chardev 设备。backend、path、server、nowait:这些参数的含义与 chardev 中的相同。配置方式-serial chardev:chardev_id或者:-chardev backend[,path=path,server,nowait] console 设备配置virtio-console 是通用的串口设备,用于主机和虚拟机之间传送数据。当只配 console 并通过 console 进行 I/O 操作时,kernel 启动参数中配置 console=hvc0。console 设备有如下配置项:id: 设备的 id。path:virtio console 文件路径。socket:以 socket 的方式重定向。chardev:重定向的 chardev 设备。配置方式console 配置分为三步:首先指定 virtio-serial,然后创建字符设备,最后创建 virtconsole 设备。轻量级虚拟机:-device virtio-serial-device[,id=virtio-serial0] -chardev socket,path=socket_path,id=virtioconsole1,server,nowait -device virtconsole,chardev=virtioconsole1,id=console_id标准虚拟机:-device virtio-serial-pci,bus=pcie.0,addr=0x1.0x0[,multifunction=on,id=virtio-serial0] -chardev socket,path=socket_path,id=virtioconsole1,server,nowait -device virtconsole,chardev=virtioconsole1,id=console_idvsock 设备配置vsock 也是主机和虚拟机之间通信的设备,类似于 console,但具有更好的性能。配置项:id: 唯一的设备 id。guest_cid: 唯一的 context id 。配置方式:轻量级虚拟机:-device vhost-vsock-device,id=vsock_id,guest-cid=3 标准虚拟机:-device vhost-vsock-pci,id=vsock_id,guest-cid=3,bus=pcie.0,addr=0x1.0x0[,multifunction=on] 内存大页配置概述StratoVirt 支持为虚拟机配置内存大页,相比传统的 4KiB 内存分页模式,大页内存可以有效减少 TLB Miss 次数和缺页中断次数,能够显著提升内存密集型业务性能。注意事项指定的大页挂载的目录,必须是绝对路径。仅支持在启动时配置。仅支持静态大页。使用大页前, 在Host上需要配置好大页。使用大页特性, 指定虚拟机内存规格必须是大页页面大小的整数倍。互斥特性内存大页和 ballon 特性互斥,同时配置时,balloon 特性无效。配置方式配置Host上大页挂载将大页文件系统挂载到指定目录上,其中 /path/to/hugepages为用户自定义的空目录。$ mount -t hugetlbfs hugetlbfs /path/to/hugepages设置大页数目设置静态大页数目, num为指定的大页数目$ sysctl vm.nr_hugepages=num查询大页统计信息$ cat /proc/meminfo | grep Hugepages如果需要查看其他页面大小的大页统计信息, 可以查看 /sys/kernel/mm/hugepages/hugepages-*/目录下相关信息。![img](请根据大页使用情况,配置StratoVirt内存规格和大页。如果大页资源不足,虚拟机会启动失败。启动StratoVirt时添加大页配置命令行-mem-path /page/to/hugepages其中 /page/to/hugepages为大页文件系统挂载的目录,仅支持绝对路径。![img](典型配置: 指定StratoVirt命令行中的mem-path项为:大页文件系统挂载的目录。 推荐使用典型配置启用StratoVirt的大页特性。配置iothread简介当StratoVirt启动了带iothread配置的虚拟机后,会在主机上启动独立于主线程的单独线程,这些单独线程可以用来处理设备的IO请求,一方面提升设备的IO性能,另一方面降低对管理面消息处理的影响。注意事项支持配置最多8个iothread线程支持磁盘和网卡配置iothread属性。iothread线程会占用主机CPU资源,在虚拟机内部大IO压力情况下,单个iothread占用的CPU资源取决于磁盘的访问速度,例如普通的SATA盘会占用20%以内CPU资源。创建iothread线程命令行:-object iothread,id=iothread1 -object iothread,id=iothread2参数:id:用于标识此iothread线程,该id可以被设置到磁盘或网卡的iothread属性。当启动参数配置了iothread线程信息,虚拟机启动后会在主机上启动相应id名的线程。配置磁盘或网卡的iothread属性命令行配置轻量虚拟机:磁盘-device virtio-blk-device xxx,iothread=iothread1网卡-device virtio-net-device xxx,iothread=iothread2标准虚拟机:磁盘-device virtio-blk-pci xxx,iothread=iothread1网卡-device virtio-net-pci xxx,iothread=iothread2 参数:iothread:设置成 iothread 线程的 id,指明处理本设备 I/O 的线程。xxx: 表示磁盘或者网卡的其他配置配置balloon设备简介在虚拟机运行过程中,由虚拟机里的balloon驱动来动态占用或释放内存,从而动态改变这台虚拟机当前可用内存,达到内存弹性的效果。注意事项启用balloon前须确保guest和host的页面大小相同。guest内核须开启balloon特性支持。开启内存弹性时,有可能造成虚拟机内部轻微卡顿、内存性能下降。互斥特性大页内存互斥。在x86下,由于中断数量有限,所以balloon设备和其他virtio的数量(默认使用6个block设备,2个net设备和1个串口设备)总和不得超过11个。规格每个VM只能配置1个balloon设备。配置方式轻量级虚拟机:-device virtio-balloon-device,deflate-on-oom=true 标准虚拟机:-device virtio-balloon-pci,bus=pcie.0,addr=0x4.0x0,deflate-on-oom=true[,multifunction=on] ![img](deflate-on-oom的取值为bool类型,表示是否开启auto deflate特性。开启时,如果balloon已经回收部分内存,当guest需要内存时,balloon设备会自动放气,归还内存给guest。不开启则不会自动归还。使用qmp命令回收虚拟机内存时,应确保回收后虚拟机仍然有足够的内存来保持最基本的运行。否则可能会出现一些操作超时,以及导致虚拟机内部无法申请到空闲内存等现象。如果虚拟机内部开启内存大页,balloon不能回收大页占用内存。deflate-on-oom=false时,当Guest中内存不足时,balloon不会自动放气并归还内存,可能会引起Guest内部OOM,进程被Kill,甚至虚拟机无法正常运行。配置RNG设备简介Virtio RNG是半虚拟化的随机数生成器设备,用于为guest提供硬件随机数生成能力。配置方式Virtio RNG可配置为Virtio mmio设备或者virtio PCI设备,Virtio RNG配置为Virtio mmio设备时,命令行参数如下:-object rng-random,id=objrng0,filename=/path/to/random_file -device virtio-rng-device,rng=objrng0,max-bytes=1234,period=1000 Virtio RNG配置为Virtio PCI设备时,命令行参数如下:-object rng-random,id=objrng0,filename=/path/to/random_file -device virtio-rng-pci,rng=objrng0,max-bytes=1234,period=1000,bus=pcie.0,addr=0x1.0x0,id=rng-id[,multifunction=on] 参数:filename:在host上用于生成随机数的字符设备路径,例如/dev/random;period:限制随机数字符速率的定时周期,单位为毫秒;max-bytes:在period时间内字符设备生成随机数的最大字节数;bus:Virtio RNG设备挂载的总线名称;addr:Virtio RNG设备地址,参数格式为addr=[slot].[function],分别表示设备的slot号和function号,均使用十六进制表示,其中Virtio RNG设备的function号为0x0。注意事项如不配置period和max-bytes,则不对随机数字符读取速率进行限制;如配置限速,则max-bytes/period*1000的设定范围为[64, 1000000000],建议不应设置过小,以防获取随机数字符速率过慢;只能限制平均随机数字符数,无法限制瞬间的突发流量;guest如需使用Virtio RNG设备,guest内核需要使能配置:CONFIG_HW_RANDOM=y,CONFIG_HW_RANDOM_VIA=y,CONFIG_HW_RANDOM_VIRTIO=y;用户在配置Virtio RNG设备时,请检查熵池是否足够,以免引起虚拟机卡顿问题,例如配置字符设备路径为/dev/random,当前熵池大小可通过/proc/sys/kernel/random/entropy_avail查看,熵池满时的大小为4096,通常应该大于1000。配置示例轻量级虚拟机此处给出创建一个轻量级虚拟机的最小配置示例。登录主机,删除 socket 文件,确保可以创建 QMP。$ rm -f /tmp/stratovirt.socket运行 StratoVirt 。$ /path/to/stratovirt \ -kernel /path/to/vmlinux.bin \ -append console=ttyS0 root=/dev/vda rw reboot=k panic=1 \ -drive file=/home/rootfs.ext4,id=rootfs,readonly=false \ -device virtio-blk-device,drive=rootfs \ -qmp unix:/tmp/stratovirt.socket,server,nowait \ -serial stdio运行成功后,将根据指定的配置参数创建并启动虚拟机。标准虚拟机此处给出在 ARM 平台创建一个标准虚拟机的最小配置示例。删除 socket 文件,确保可以创建 QMP 。$ rm -f /tmp/stratovirt.socket运行 StratoVirt 。$ /path/to/stratovirt \ -kernel /path/to/vmlinux.bin \ -append console=ttyAMA0 root=/dev/vda rw reboot=k panic=1 \ -drive file=/path/to/edk2/code_storage_file,if=pflash,unit=0[,readonly=true] \ -drive file=/path/to/edk2/data_storage_file,if=pflash,unit=1, \ -drive file=/home/rootfs.ext4,id=rootfs,readonly=false \ -device virtio-blk-device,drive=rootfs,bus=pcie.0,addr=0x1 \ -qmp unix:/tmp/stratovirt.socket,server,nowait \ -serial stdio管理虚拟机概述StratoVirt可以查询虚拟机信息并对虚拟机的资源和生命周期进行管理。由于StratoVirt使用QMP管理虚拟机,所以查询虚拟机信息,也需要先连接到虚拟机。查询虚拟机信息简介:StratoVirt可以查询虚拟机状态、vCPU拓扑信息、vCPU上线情况等。查询状态使用query-status命令查询虚拟机的运行状态。用法:{ “execute”: “query-status” }示例:<- { "execute": "query-status" } -> { "return": { "running": true,"singlestep": false,"status": "running" } 查询拓扑使用query-cpus命令查询所有CPU的拓扑结构。用法:{ “execute”: “query-cpus” }示例:<- { "execute": "query-cpus" } -> {"return":[{"CPU":0,"arch":"x86","current":true,"halted":false,"props":{"core-id":0,"socket-id":0,"thread-id":0},"qom_path":"/machine/unattached/device[0]","thread_id":8439},{"CPU":1,"arch":"x86","current":true,"halted":false,"props":{"core-id":0,"socket-id":1,"thread-id":0},"qom_path":"/machine/unattached/device[1]","thread_id":8440}]} 查询vCPU上线情况使用query-hotpluggable-cpus命令查询所有vCPU的online/offline情况。用法:{ “execute”: “query-hotpluggable-cpus” }示例:<- { "execute": "query-hotpluggable-cpus" } -> {"return":[{"props":{"core-id":0,"socket-id":0,"thread-id":0},"qom-path":"/machine/unattached/device[0]","type":"host-x86-cpu","vcpus-count":1},{"props":{"core-id":0,"socket-id":1,"thread-id":0},"qom-path":"/machine/unattached/device[1]","type":"host-x86-cpu","vcpus-count":1}]} 其中,online的vCPU具有qom-path项,offline的vCPU则没有。管理虚拟机生命周期简介StratoVirt可以对虚拟机进行启动、暂停、恢复、退出等生命周期进行管理。创建并启动虚拟机通过命令行参数指定虚拟机配置,创建并启动虚拟机。使用命令行参数给出虚拟机配置,创建并启动虚拟机的命令如下:$ /path/to/stratovirt -[参数1] [参数选项] -[参数2] [参数选项] ...![img](轻量虚拟启动后,内部会有eth0和eth1两张网卡。这两张网卡预留用于网卡热插拔。热插的第一张网卡是eth0,热插的第二张网卡是eth1,目前只支持热插两张virtio-net网卡。连接虚拟机StratoVirt当前采用QMP管理虚拟机,暂停、恢复、退出虚拟机等操作需要通过QMP连接到虚拟机进行管理。在主机上打开新的命令行窗口B,并使用root权限进行api-channel连接,参考命令如下:# ncat -U /path/to/socket连接建立后,会收到来自StratoVirt的问候消息,如下所示:{"QMP":{"version":{"qemu":{"micro":1,"minor":0,"major":4},"package":""},"capabilities":[]}} 现在,可以在窗口B中输入QMP命令来管理虚拟机。![img](QMP提供了stop、cont、quit和query-status等来管理和查询虚拟机状态。管理虚拟机的QMP命令均在窗口B中进行输入。符号:<-表示命令输入,->表示QMP结果返回。暂停虚拟机QMP提供了stop命令用于暂停虚拟机,即暂停虚拟机所有的vCPU。命令格式如下:{“execute”:“stop”}示例:使用stop暂停该虚拟机的命令和回显如下:<- {"execute":"stop"} -> {"event":"STOP","data":{},"timestamp":{"seconds":1583908726,"microseconds":162739}} -> {"return":{}} 恢复虚拟机QMP提供了cont命令用于恢复处于暂停状态suspend的虚拟机,即恢复虚拟机所有vCPU的运行。命令格式如下:{“execute”:“cont”}示例:使用cont恢复该虚拟机的命令和回显如下:<- {"execute":"cont"} -> {"event":"RESUME","data":{},"timestamp":{"seconds":1583908853,"microseconds":411394}} -> {"return":{}} 退出虚拟机QMP提供了quit命令用于退出虚拟机,即退出StratoVirt进程。命令格式如下:{“execute”:“quit”}示例:<- {"execute":"quit"} -> {"return":{}} -> {"event":"SHUTDOWN","data":{"guest":false,"reason":"host-qmp-quit"},"timestamp":{"ds":1590563776,"microseconds":519808}} 管理虚拟机资源热插拔磁盘StratoVirt支持在虚拟机运行过程中调整磁盘数量,即在不中断业务前提下,增加或删除虚拟机磁盘。注意事项对于标准机型,需要虚拟机内核开启 CONFIG_HOTPLUG_PCI_PCIE=y 配置。对于标准机型,目前支持热插拔设备到 Root Port 设备,Root Port 设备需要在虚拟机启动前配置。不建议在虚拟机启动、关闭、内部高压力等状态下进行设备热插拔,可能会因为虚拟机内驱动没有及时响应导致虚拟机出现异常。热插磁盘用法:轻量机型:{"execute": "blockdev-add", "arguments": {"node-name": "drive-0", "file": {"driver": "file", "filename": "/path/to/block"}, "cache": {"direct": true}, "read-only": false}} {"execute": "device_add", "arguments": {"id": "drive-0", "driver": "virtio-blk-mmio", "addr": "0x1"}} 标准机型:{"execute": "blockdev-add", "arguments": {"node-name": "drive-0", "file": {"driver": "file", "filename": "/path/to/block"}, "cache": {"direct": true}, "read-only": false}} {"execute":"device_add", "arguments":{"id":"drive-0", "driver":"virtio-blk-pci", "drive": "drive-0", "addr":"0x0", "bus": "pcie.1"}} 参数对于轻量机型,blockdev-add 中的 node-name 要和 device_add 中的 id 一致,如上都是 drive-0。对于标准机型 drive 参数需要和 blockdev-add 中的 node-name 一致。/path/to/block 是被热插磁盘的镜像路径,不能是启动 rootfs 的磁盘镜像。对于轻量机型,addr 参数从 0x0 开始与虚拟机的 vda 映射,0x1 与 vdb 映射,以此类推。为了兼容 QMP 协议,“addr” 也可以用 “lun” 代替,但是 lun=0 与客户机的 vdb 映射。对于标准机型,目前 addr 参数需要指定为 0x0。对于标准机型,bus 为设备要挂载的总线名称,目前只支持热插到 Root Port 设备,需要和 Root Port 的 id 保持一致。对于轻量机型,StratoVirt 支持的最大 virtio-blk 磁盘数量是6个,热插磁盘时请注意规格约束。对于标准机型,热插磁盘的数量取决于 Root Port 设备的数量。示例轻量机型:<- {"execute": "blockdev-add", "arguments": {"node-name": "drive-0", "file": {"driver": "file", "filename": "/path/to/block"}, "cache": {"direct": true}, "read-only": false}} -> {"return": {}} <- {"execute": "device_add", "arguments": {"id": "drive-0", "driver": "virtio-blk-mmio", "addr": "0x1"}} -> {"return": {}} 标准机型:<- {"execute": "blockdev-add", "arguments": {"node-name": "drive-0", "file": {"driver": "file", "filename": "/path/to/block"}, "cache": {"direct": true}, "read-only": false}} -> {"return": {}} <- {"execute":"device_add", "arguments":{"id":"drive-0", "driver":"virtio-blk-pci", "drive": "drive-0", "addr":"0x0", "bus": "pcie.1"}} -> {"return": {}} 热拔磁盘用法:轻量机型:{"execute": "device_del", "arguments": {"id":"drive-0"}} 标准机型:{"execute": "device_del", "arguments": {"id":"drive-0"}} {"execute": "blockdev-del", "arguments": {"node-name": "drive-0"}} 参数:id 为热拔磁盘的 ID 号。node-name 为磁盘后端名称。示例轻量机型:<- {"execute": "device_del", "arguments": {"id": "drive-0"}} -> {"event":"DEVICE_DELETED","data":{"device":"drive-0","path":"drive-0"},"timestamp":{"seconds":1598513162,"microseconds":367129}} -> {"return": {}} 标准机型:<- {"execute": "device_del", "arguments": {"id":"drive-0"}} -> {"return": {}} -> {"event":"DEVICE_DELETED","data":{"device":"drive-0","path":"drive-0"},"timestamp":{"seconds":1598513162,"microseconds":367129}} <- {"execute": "blockdev-del", "arguments": {"node-name": "drive-0"}} -> {"return": {}} 当收到 DEVICE_DELETED 事件时,表示设备在 StratoVirt 侧被移除。热插拔网卡StratoVirt支持在虚拟机运行过程中调整网卡数量,即在不中断业务前提下,给虚拟机增加或删除网卡。注意事项对于标准机型,需要虚拟机内核开启 CONFIG_HOTPLUG_PCI_PCIE=y 配置。对于标准机型,目前支持热插拔设备到 Root Port 设备,Root Port 设备需要在虚拟机启动前配置。不建议在虚拟机启动、关闭、内部高压力等状态下进行设备热插拔,可能会因为虚拟机内驱动没有及时响应导致虚拟机出现异常。热插网卡准备工作(需要使用root权限)创建并启用Linux网桥,例如网桥名为 qbr0 的参考命令如下:# brctl addbr qbr0 # ifconfig qbr0 up 创建并启用 tap 设备,例如设备名为 tap0 的参考命令如下:# ip tuntap add tap0 mode tap # ifconfig tap0 up 添加 tap 设备到网桥:# brctl addif qbr0 tap0 用法轻量机型:{"execute":"netdev_add", "arguments":{"id":"net-0", "ifname":"tap0"}} {"execute":"device_add", "arguments":{"id":"net-0", "driver":"virtio-net-mmio", "addr":"0x0"}} 标准机型:{"execute":"netdev_add", "arguments":{"id":"net-0", "ifname":"tap0"}} {"execute":"device_add", "arguments":{"id":"net-0", "driver":"virtio-net-pci", "addr":"0x0", "netdev": "net-0", "bus": "pcie.1"}} 参数对于轻量机型,netdev_add 中的 id 应该和 device_add 中的 id 一致,ifname 是后端的 tap 设备名称。对于标准机型,netdev 参数需要和 netdev_add 中的 id 一致。对于轻量机型,addr 参数从 0x0 开始与虚拟机的 eth0 映射,0x1 和虚拟机的 eth1 映射。对于标准机型,目前 addr 参数需要指定为 0x0。对于标准机型,bus 为设备要挂载的总线名称,目前只支持热插到 Root Port 设备,需要和 Root Port 的 id 保持一致。xxxxxxxxxx // clone secGear repositorygit clone示例轻量机型:<- {"execute":"netdev_add", "arguments":{"id":"net-0", "ifname":"tap0"}} -> {"return": {}} <- {"execute":"device_add", "arguments":{"id":"net-0", "driver":"virtio-net-mmio", "addr":"0x0"}} -> {"return": {}} 其中,addr:0x0对应虚拟机内部的eth0。标准机型:<- {"execute":"netdev_add", "arguments":{"id":"net-0", "ifname":"tap0"}} -> {"return": {}} <- {"execute":"device_add", "arguments":{"id":"net-0", "driver":"virtio-net-pci", "addr":"0x0", "netdev": "net-0", "bus": "pcie.1"}} -> {"return": {}} 热拔网卡用法轻量机型:{"execute": "device_del", "arguments": {"id": "net-0"}} 标准机型:{"execute": "device_del", "arguments": {"id":"net-0"}} {"execute": "netdev_del", "arguments": {"id": "net-0"}} 参数id:网卡的ID号,例如 net-0。netdev_del 中的 id 是网卡后端的名称。示例轻量机型:<- {"execute": "device_del", "arguments": {"id": "net-0"}} -> {"event":"DEVICE_DELETED","data":{"device":"net-0","path":"net-0"},"timestamp":{"seconds":1598513339,"microseconds":97310}} -> {"return": {}} 标准机型:<- {"execute": "device_del", "arguments": {"id":"net-0"}} -> {"return": {}} -> {"event":"DEVICE_DELETED","data":{"device":"net-0","path":"net-0"},"timestamp":{"seconds":1598513339,"microseconds":97310}} <- {"execute": "netdev_del", "arguments": {"id": "net-0"}} -> {"return": {}} 当收到 DEVICE_DELETED 事件时,表示设备在 StratoVirt 侧被移除。热插拔直通设备StratoVirt 标准机型支持在虚拟机运行过程中调整直通设备数量,即在不中断业务前提下,给虚拟机增加或删除直通设备。注意事项需要虚拟机内核开启 CONFIG_HOTPLUG_PCI_PCIE=y 配置。目前支持热插拔设备到 Root Port 设备,Root Port 设备需要在虚拟机启动前配置。不建议在虚拟机启动、关闭、内部高压力等状态下进行设备热插拔,可能会因为虚拟机内驱动没有及时响应导致虚拟机出现异常。热插直通设备用法{"execute":"device_add", "arguments":{"id":"vfio-0", "driver":"vfio-pci", "bus": "pcie.1", "addr":"0x0", "host": "0000:1a:00.3"}} 参数id 为热插设备的 ID 号。bus 为设备要挂载的总线名称。addr 为设备要挂载的 slot 和 function 号,目前 addr 参数需要指定为 0x0。host 为直通设备在主机上的 domain 号, bus 号, slot 号和 function 号。示例<- {"execute":"device_add", "arguments":{"id":"vfio-0", "driver":"vfio-pci", "bus": "pcie.1", "addr":"0x0", "host": "0000:1a:00.3"}} -> {"return": {}} 热拔直通设备用法{"execute": "device_del", "arguments": {"id": "vfio-0"}} 参数id 为热拔设备的 ID 号。在热插设备时指定。示例<- {"execute": "device_del", "arguments": {"id": "vfio-0"}} -> {"return": {}} -> {"event":"DEVICE_DELETED","data":{"device":"vfio-0","path":"vfio-0"},"timestamp":{"seconds":1614310541,"microseconds":554250}} 当收到 DEVICE_DELETED 事件时,表示设备在 StratoVirt 侧被移除。Balloon设备使用使用balloon设备可以从虚拟机回收空闲的内存。Balloon通过qmp命令来调用。qmp命令使用如下:用法:{"execute": "balloon", "arguments": {"value": 2147483648}} 参数:value: 想要设置的guest内存大小值,单位为字节。如果该值大于虚拟机启动时配置的内存值,则以启动时配置的内存值为准。示例:启动时配置的内存大小为4GiB,在虚拟机内部通过free命令查询虚拟机空闲内存大于2GiB,那么可以通过qmp命令设置guest内存大小为2147483648字节。<- {"execute": "balloon", "arguments": {"value": 2147483648}} -> {"return": {}} 查询虚拟机的当前实际内存:<- {"execute": "query-balloon"} -> {"return":{"actual":2147483648}} 虚拟机内存快照简介虚拟机内存快照是指将虚拟机的设备状态和内存信息保存在快照文件中。当虚拟机系统损坏时,可以使用内存快照将虚拟机恢复到快照对应时间点,从而提升系统的可靠性。StratoVirt 支持对处于暂停状态(suspend)的虚拟机制作快照,并且支持虚拟机以快照文件为虚拟机模板批量创建新的虚拟机。只要制作快照的时间点在虚拟机启动完成并进入用户态之后,快速启动就能够跳过内核启动阶段和用户态服务初始化阶段,在毫秒级完成虚拟机启动。互斥特性虚拟机配置了如下设备或使用了如下特性时,不能制作和使用内存快照:vhost-net 设备vfio 直通设备balloon 设备大页内存mem-shared 特性配置了内存后端文件 mem-path制作快照针对 StratoVirt 虚拟机,可以参考如下步骤制作存储快照:创建并启动虚拟机。在 Host 上执行 QMP 命令暂停虚拟机:<- {"execute":"stop"} -> {"event":"STOP","data":{},"timestamp":{"seconds":1583908726,"microseconds":162739}} -> {"return":{}} 确认虚拟机处于暂停状态:<- {"execute":"query-status"} -> {"return":{"running":true,"singlestep":false,"status":"paused"}} 执行如下 QMP 命令,在任一指定的绝对路径下创建虚拟机快照,例如 /path/to/template 路径,参考命令如下:<- {"execute":"migrate", "arguments":{"uri":"file:/path/to/template"}} -> {"return":{}} 确认快照是否创建成功。<- {"execute":"query-migrate"} 如果回显 {“return”:{“status”:“completed”}} ,说明快照创建成功。快照创建成功,会在指定路径 /path/to/template 生成 memory 和 state 两个目录。state文件包含虚拟机设备状态的信息,memory文件包含虚拟机内存的数据信息,memory 文件大小接近配置的虚拟机内存。查询快照状态当前在整个快照过程中,存在5种状态:None: 快照资源没有准备完成Setup: 快照资源准备完成,可以进行快照Active: 处于制作快照状态中Completed: 快照制作成功Failed: 快照制作失败可以通过在 Host 执行query-migrateqmp 命令查询当前快照的状态,如当虚拟机快照制作成功时查询:<- {"execute":"query-migrate"} -> {"return":{"status":"completed"}} 恢复虚拟机注意事项快照以及从快照启动特性支持的机型包括:microvmq35(x86_64)virt(aarch64平台)在使用快照恢复时,配置的设备必须与制作快照时保持一致当使用 microvm 机型,并且在快照前使用了磁盘/网卡的热插特性,在恢复时需要将热插的磁盘/网卡配置进启动命令行从快照文件中恢复虚拟机命令格式stratovirt -incoming URI参数说明URI:快照的路径,当前版本只支持 file 类型,后加上快照文件的绝对路径示例假设制作快照所使用的虚拟机是通过以下命令创建的:$ stratovirt \ -machine microvm \ -kernel /path/to/kernel \ -smp 1 -m 1024 \ -append "console=ttyS0 pci=off reboot=k quiet panic=1 root=/dev/vda" \ -drive file=/path/to/rootfs,id=rootfs,readonly=off,direct=off \ -device virtio-blk-device,drive=rootfs \ -qmp unix:/path/to/socket,server,nowait \ -serial stdio那么,使用快照恢复虚拟机的参考命令如下(此处假设快照存放的路径为 /path/to/template ):$ stratovirt \ -machine microvm \ -kernel /path/to/kernel \ -smp 1 -m 1024 \ -append "console=ttyS0 pci=off reboot=k quiet panic=1 root=/dev/vda" \ -drive file=/path/to/rootfs,id=rootfs,readonly=off,direct=off \ -device virtio-blk-device,drive=rootfs \ -qmp unix:/path/to/another_socket,server,nowait \ -serial stdio \ -incoming file:/path/to/template
  • [技术干货] secGear
    安装 secGearX86环境环境要求硬件环境支持Intel SGX(Intel Software Guard Extensions) 特性的处理器。操作系统openEuler 20.03 LTS SP2及以上openEuler 22.09openEuler 22.03 LTS及以上环境准备购买支持Intel SGX特性设备,参考对应设备BIOS配置手册,开启SGX特性。安装操作配置openEuler yum源,在线yum源或通过ISO挂载配置本地yum源,配置在线源如下(仅以22.03-LTS-SP2举例,其他版本需要使用版本对应的yum源)。vi openEuler.repo [osrepo] name=osrepo baseurl=http://repo.openeuler.org/openEuler-22.03-LTS-SP2/everything/x86_64/ enabled=1 gpgcheck=1 gpgkey=http://repo.openeuler.org/openEuler-22.03-LTS-SP2/everything/x86_64/RPM-GPG-KEY-openEuler安装secGear#安装编译工具 yum install cmake ocaml-dune #安装secGear yum install secGear-devel #检查是否安装成功。命令和回显如下表示安装成功。 rpm -qa | grep -E 'secGear|ocaml-dune|sgx' secGear-xxx secGear-devel-xxx ocaml-dune-xxx libsgx-epid-xxx libsgx-enclave-common-xxx libsgx-quote-ex-xxx libsgx-aesm-launch-plugin-xxx libsgx-uae-service-xxx libsgx-ae-le-xxx libsgx-urts-xxx sgxsdk-xxx sgx-aesm-service-xxx linux-sgx-driver-xxx libsgx-launch-xxx使用接口说明secGear 机密计算统一开发框架提供了屏蔽TEE SDK差异的基础接口,还提供了switchless、远程证明、安全通道等高级特性。基础接口cc_enclave_create创建 enclave 接口功能:初始化接口,函数根据不同 type,调用不同的 TEE 创建函数,完成不同 TEE 方案关于 enclave 上下文初始化,由非安全侧调用。![img](由于 Intel SGX 限制,多线程并发调用 cc_enclave_create 时存在内存映射的竞争关系,会导致创建 enclave 概率性失败。所以编码时要避免线程并发调用 cc_enclave_create。函数声明:cc_enclave_result_t cc_enclave_create( const char* path, enclave_type_t type, uint32_t version, uint32_t flags, const enclave_features_t* features, uint32_t features_count, cc_enclave_t ** enclave); 参数:path:入参,要加载的 enclave 路径type:入参,用来指定 TEE 解决方案, 如 SGX_ENCLAVE_TYPE、GP_ENCLAVE_TYPE、AUTO_ENCLAVE_TYPEversion:入参,指定的 enclave engine 的版本,目前只有一个版本,取值为 0。flags:入参,标志位,说明这个 enclave 运行状态,例如调试状态 SECGEAR_DEBUG_FLAG、模拟状态 SECGEAR_SIMULATE_FLAG(目前不支持)features:入参,用于设置一些关于 enclave 支持的特性,例如 SGX 的 PCL、 switchless 等。目前不支持,请设置为 NULLfeatures_count:入参,入参 features 特性结构体的数量。目前不支持,请设置为 0enclave:出参,创建的 enclave 上下文返回值:CE_SUCCESS:认证信息验证成功CE_ERROR_INVALID_PARAMETER:输入参数有误CE_ERROR_OUT_OF_MEMORY:无可用内存CC_FAIL:通用错误CC_ERROR_UNEXPECTED:不可预期错误CC_ERROR_ENCLAVE_MAXIMUM:单个 app 创建的 enclave 数量达到最大CC_ERROR_INVALID_PATH:安全二进制路径无效CC_ERROR_NO_FIND_REGFUNC:enclave 引擎搜索失败cc_enclave_destroy销毁 enclave 接口功能:调用不同 TEE 的退出函数,释放已经创建的 enclave 实体,由非安全侧调用。函数声明:cc_enclave_result_t cc_enclave_destroy (cc_enclave_t ** enclave);参数:enclave:入参,已经创建 enclave 的上下文返回值:CE_SUCCESS:认证信息验证成功CE_ERROR_INVALID_PARAMETER:输入参数有误CE_ERROR_OUT_OF_MEMORY:无可用内存CC_ERROR_NO_FIND_UNREGFUNC:enclave引擎搜索失败CC_FAIL:通用错误CC_ERROR_UNEXPECTED:不可预期错误cc_malloc_shared_memory创建共享内存功能:开启switchless特性后,创建安全环境与非安全环境可同时访问的共享内存,由非安全侧调用。函数声明:void *cc_malloc_shared_memory(cc_enclave_t *enclave, size_t size); 参数:enclave:入参,安全环境上下文句柄。因不同平台共享内存模型不同,同时为了保持接口跨平台一致性,该参数仅在ARM平台被使用,SGX平台该入参会被忽略size:入参,共享内存大小返回值:NULL:共享内存申请失败其他:为创建的共享内存的首地址cc_free_shared_memory释放共享内存功能:开启switchless特性后,释放共享内存,由非安全侧调用。函数声明:cc_enclave_result_t cc_free_shared_memory(cc_enclave_t *enclave, void *ptr); 参数:enclave:入参,安全环境上下文句柄。因不同平台共享内存模型不同,同时为了保持接口跨平台一致性,该参数仅在ARM平台被使用(该参数必须与调用cc_malloc_shared_memory接口时传入的enclave保持一致),SGX平台该入参会被忽略ptr:入参,cc_malloc_shared_memory接口返回的共享内存地址返回值:CC_ERROR_BAD_PARAMETERS:入参非法CC_ERROR_INVALID_HANDLE:无效enclave或者传入的enclave与ptr所对应的enclave不匹配(仅在ARM平台生效,SGX平台会忽略enclave,故不会对enclave进行检查)CC_ERROR_NOT_IMPLEMENTED:该接口未实现CC_ERROR_SHARED_MEMORY_START_ADDR_INVALID:ptr不是cc_malloc_shared_memory接口返回的共享内存地址(仅在ARM平台生效)CC_ERROR_OUT_OF_MEMORY:内存不足(仅在ARM平台生效)CC_FAIL:一般性错误CC_SUCCESS:成功cc_enclave_generate_random随机数生成功能:用于在安全侧生成密码安全的随机数。函数声明:cc_enclave_result_t cc_enclave_generate_random(void *buffer, size_t size) 参数:buffer:入参,生成随机数的缓冲区size:入参,缓冲区的长度返回值:CE_OK:认证信息验证成功CE_ERROR_INVALID_PARAMETER:输入参数有误CE_ERROR_OUT_OF_MEMORY:无可用内存cc_enclave_seal_data数据持久化功能:用于加密 enclave 内部数据,使数据可以在 enclave 外部持久化存储,由安全侧调用。函数声明:cc_enclave_result_t cc_enclave_seal_data( uint8_t *seal_data, uint32_t seal_data_len, cc_enclave_sealed_data_t *sealed_data, uint32_t sealed_data_len, uint8_t *additional_text, uint32_t additional_text_len) 参数:seal_data:入参,需要加密的数据seal_data_len:入参,需要加密数据的长度sealed_data:出参,加密后的数据处理句柄sealed_data_len:出参,加密后的密文长度additional_text:入参,加密所需的附加消息additional_text_len:入参,附加消息长度返回值:CE_SUCCESS:数据加密成功CE_ERROR_INVALID_PARAMETER:输入参数有误CE_ERROR_OUT_OF_MEMORY:无可用内存CC_ERROR_SHORT_BUFFER:传入的buffer过小CC_ERROR_GENERIC:底层硬件通用错误cc_enclave_unseal_data数据解密功能:用于解密 enclave 密封过的数据,用于将外部持久化数据重新导回 enclave 环境中,由安全侧调用。函数声明:cc_enclave_result_t cc_enclave_unseal_data( cc_enclave_sealed_data_t *sealed_data, uint8_t *decrypted_data, uint32_t *decrypted_data_len, uint8_t *additional_text, uint32_t *additional_text_len) 参数:sealed_data:入参,已加密数据的句柄decrypted_data:出参,解密之后的密文数据bufferdecrypted_data_len:出参,解密后密文长度additional_text:出参,解密后附加消息additional_text_len:出参,解密后附加消息长度返回值:CE_SUCCESS:数据解密成功CE_ERROR_INVALID_PARAMETER:输入参数有误CE_ERROR_OUT_OF_MEMORY:无可用内存CC_ERROR_SHORT_BUFFER:传入的buffer过小CC_ERROR_GENERIC:底层硬件通用错误cc_enclave_get_sealed_data_size获取加密数据的大小功能:用于 sealed_data 数据的大小,主要用于分配解密后的数据空间,由安全侧调用。函数声明:uint32_t cc_enclave_get_sealed_data_size(const uint32_t add_len, const uint32_t seal_data_len); 参数:add_len:入参,附加消息长度seal_data_len:入参,需要加密数据的长度返回值:UINT32_MAX:参数错误或函数执行错误others:函数执行成功,返回值为当前 sealed_data 结构的大小cc_enclave_get_encrypted_text_size获取加密消息的长度功能:获取加密数数据中加密消息的长度,由安全侧调用。函数声明:uint32_t cc_enclave_get_encrypted_text_size(const cc_enclave_sealed_data_t *sealed_data); 参数:sealed_data:入参,加密数据的句柄返回值:UINT32_MAX:参数错误或函数执行错误others:函数执行成功,返回值为当前 sealed_data 中加密消息的长度cc_enclave_get_add_text_size获取附加消息的长度功能:获取加密数数据中附加消息的长度,由安全侧调用。函数声明:uint32_t cc_enclave_get_add_text_size(const cc_enclave_sealed_data_t *sealed_data); 参数:sealed_data:入参,加密数据的句柄返回值:UINT32_MAX:参数错误或函数执行错误others:函数执行成功,返回值为当前sealed_data中附加消息的长度cc_enclave_memory_in_enclave安全内存检查功能:用于校验指定长度的内存地址是否都属于安全侧内存,由安全侧调用。函数声明:bool cc_enclave_memory_in_enclave(const void *addr, size_t size) 参数:addr:入参,指定需要校验的内存地址size:入参,自内存地址起需要校验的长度返回值:true:指定区域内存都在安全区范围内false:指定区域的内存有部分或者全部不在安全范围内cc_enclave_memory_out_enclave安全内存检查功能:用于校验指定长度的内存地址是否都属于非安全侧内存,由安全侧调用。函数声明:bool cc_enclave_memory_out_enclave(const void *addr, size_t size) 参数:addr:入参,指定需要校验的内存地址size:入参,自内存地址起需要校验的长度返回值:true:指定区域内存都在非安全区false:指定区域的内存有部分或者全部在安全区PrintInfo消息打印功能:用于安全侧日志的打印,本接口输出安全侧用户想打印的信息,输入日志保存在非安全侧’/var/log/secgear/secgear.log’中。函数声明:void PrintInfo(int level, const char *fmt, ...); 参数:level:入参,日志打印等级,可选项为PRINT_ERROR, PRINT_WARNING, PRINT_STRACE, PRINT_DEBUGfmt: 入参,需要输出的字符串返回值:无switchlessswitchless 是对普通 ecall(REE调用TEE的接口) 的性能优化特性,有两级开关,可以通过如下方法开启。switchless 总开关通过 cc_enclave_create 函数的 enclave_features_t 参数配置switchless特性,开启总开关,详见[switchless样例]( typedef struct { uint32_t num_uworkers; uint32_t num_tworkers; uint32_t switchless_calls_pool_size; uint32_t retries_before_fallback; uint32_t retries_before_sleep; uint32_t parameter_num; uint32_t workers_policy; uint32_t rollback_to_common; } cc_sl_config_t; 配置项说明num_uworkers非安全侧代理工作线程数,用于执行switchless OCALL,当前该字段仅在SGX平台生效,ARM平台可以配置,但是因ARM平台暂不支持OCALL,所以配置后不会生效。 规格: ARM:最大值:512;最小值:1;默认值:8(配置为0时) SGX:最大值:4294967295;最小值:1num_tworkers安全侧代理工作线程数,用于执行switchless ECALL。 规格: ARM:最大值:512;最小值:1;默认值:8(配置为0时) SGX:最大值:4294967295;最小值:1switchless_calls_pool_sizeswitchless调用任务池的大小,实际可容纳switchless_calls_pool_size * 64个switchless调用任务(例:switchless_calls_pool_size=1,可容纳64个switchless调用任务)。 规格: ARM:最大值:8;最小值:1;默认值:1(配置为0时) SGX:最大值:8;最小值:1;默认值:1(配置为0时)retries_before_fallback执行retries_before_fallback次汇编pause指令后,若switchless调用仍没有被另一侧的代理工作线程执行,就回退到switch调用模式,该字段仅在SGX平台生效。 规格:SGX:最大值:4294967295;最小值:1;默认值:20000(配置为0时)retries_before_sleep执行retries_before_sleep次汇编pause指令后,若代理工作线程一直没有等到有任务来,则进入休眠状态,该字段仅在SGX平台生效。 规格: SGX:最大值:4294967295;最小值:1;默认值:20000(配置为0时)parameter_numswitchless函数支持的最大参数个数,该字段仅在ARM平台生效。 规格: ARM:最大值:16;最小值:0workers_policyswitchless代理线程运行模式,该字段仅在ARM平台生效。 规格: ARM: WORKERS_POLICY_BUSY:代理线程一直占用CPU资源,无论是否有任务需要处理,适用于对性能要求极高且系统软硬件资源丰富的场景; WORKERS_POLICY_WAKEUP:代理线程仅在有任务时被唤醒,处理完任务后进入休眠,等待再次被新任务唤醒rollback_to_common异步switchless调用失败时是否回退到普通调用,该字段仅在ARM平台生效。 规格: ARM:0:否,失败时仅返回相应错误码;其他:是,失败时回退到普通调用,此时返回普通调用的返回值ecall 函数的开关通过 transition_using_threads 关键字开启对应 ecall 的 switchless。enclave { include "secgear_urts.h" from "secgear_tstdc.edl" import *; from "secgear_tswitchless.edl" import *; trusted { public int get_string([out, size=32]char *buf); public int get_string_switchless([out, size=32]char *buf) transition_using_threads; }; }; 远程证明远程证明提供接口如下, 调用方式参考[远程证明样例](用户接口接口功能头文件库文件证明服务cc_prepare_ra_env初始化证明环境sg_ra_report.hlibsecgear_ra.so证明服务cc_get_ra_report获取远程证明报告sg_ra_report.hlibsecgear_ra.soTAcc_local_attest本地证明sg_local_attest.hlibsecgear_la.a验证者cc_verify_report校验远程证明报告sg_ra_report_verify.hlibsecgear_verify.so安全通道安全通道以lib库方式提供,分为客户端、服务端host、服务端enclave三部分,分别由业务程序的客户端、服务端CA、服务端TA调用。模块头文件库文件依赖客户端secure_channel_client.hlibcsecure_channel.soopenssl服务端hostsecure_channel_host.hlibusecure_channel.soopenssl服务端enclavesecure_channel_enclave.hlibtsecure_channel.soTEE及TEE软件栈接口列表接口名所属头文件、库功能备注cc_sec_chl_client_initsecure_channel_client.h libcsecure_channel.so安全通道客户端初始化调用前需初始化参数ctx中网络连接和消息发送钩子函数cc_sec_chl_client_finisecure_channel_client.h libcsecure_channel.so安全通道客户端销毁通知服务端销毁本客户端的信息,销毁本地安全通道信息cc_sec_chl_client_callbacksecure_channel_client.h libcsecure_channel.so安全通道协商消息处理函数处理安全通道协商过程中,服务端发送给客户端的消息。在客户端消息接收处调用cc_sec_chl_client_encryptsecure_channel_client.h libcsecure_channel.so安全通道客户端的加密接口无cc_sec_chl_client_decryptsecure_channel_client.h libcsecure_channel.so安全通道客户端的解密接口无int (*cc_conn_opt_funcptr_t)(void *conn, void *buf, size_t count);secure_channel.h消息发送钩子函数原型由用户客户端和服务端实现,实现中指定安全通道协商消息类型,负责发送安全通道协商消息到对端cc_sec_chl_svr_initsecure_channel_host.h libusecure_channel.so安全通道服务端初始化调用前需初始化ctx中enclave_ctxcc_sec_chl_svr_finisecure_channel_host.h libusecure_channel.so安全通道服务端销毁销毁安全通道服务端以及所有客户端信息cc_sec_chl_svr_callbacksecure_channel_host.h libusecure_channel.so安全通道协商消息处理函数处理安全通道协商过程中,客户端发送给服务端的消息。在服务端消息接收处调用,调用前需初始化与客户端的网络连接和发送消息函数,详见[样例](cc_sec_chl_enclave_encryptsecure_channel_enclave.h libtsecure_channel.so安全通道enclave中的加密接口无cc_sec_chl_enclave_decryptsecure_channel_enclave.h libtsecure_channel.so安全通道enclave中的解密接口无注意事项安全通道仅封装密钥协商过程、加解密接口,不建立网络连接,协商过程复用业务的网络连接。其中客户端和服务端的网络连接由业务建立和维护,在安全通道客户端和服务端初始化时传入消息发送钩子函数和网络连接指针。客户端和服务端网络消息接收函数的读buffer长度要预留足够大,能够容纳 12320 字节的安全通道初始化消息。 详见[安全通道样例](开发工具secGear 提供了一套工具集,方便用户开发应用程序。本章介绍相关工具及其使用方法。代码生成工具简介secGear codegen 用于解析 EDL 文件生成中间 C 代码,即辅助生成安全测与非安全侧文件互相调用的代码。secGear codegen 定义的 EDL 文件格式与 intel SGX SDK edger8r 相同,但是不支持 Intel 的完整语法定义:只能在方法中使用 public,不加 public 的函数声明默认为 private不支持从非安全侧到安全侧,以及安全侧到非安全侧的 Switchless CallsOCALL(Outside call) 不支持部分调用模式(如 cdecl,stdcall,fastcall)EDL 文件语法为类 C 语言语法,这里主要描述与 C 语言的差异部分:成员含义include “my_type.h”使用外部包含文件中定义的类型trusted声明 TA(Trusted Application)侧可用安全函数untrusted声明 TA 侧可用不安全函数return_type定义返回值类型parameter_type定义参数类型[in , size = len]对ecall而言,表示该参数需要将数据从非安全侧传入安全侧,ocall反之(指针类型需要使用此参数,其中 size 表示实际使用的 buffer)[out, size = len]对ecall而言,表示该参数需要将数据从安全侧传出到非安全侧,ocall反之(指针类型需要使用此参数,其中 size 表示实际使用的 buffer)使用说明命令格式codegen 的命令格式如下:codegen < --trustzone | --sgx > [–trusted-dir | –untrusted-dir | --trusted | --untrusted ] edlfile参数说明各参数含义如下:参数是否可选参数含义–trustzone | --sgx必选只在当前运行命令目录下生成机密计算架构对应接口函数,不加参数默认生成 SGX 接口函数–search-path可选用于指定被转译的edl文件所依赖文件的搜索路径–use-prefix可选用于给代理函数名称加上前缀,前缀名为edl的文件名–header-only可选指定代码生成工具只生成头文件–trusted-dir可选指定生成安全侧辅助代码所在目录,不指定该参数默认为当前路径–untrusted-dir可选指定生成非安全侧函数辅助代码所在目录–trusted可选生成安全侧辅助代码–untrusted可选生成非安全侧辅助代码edlfile必选需要转译的 EDL 文件,例如 hello.edl示例转译 helloworld.edl ,在 enclave-directory 下生成安全侧辅助代码,host-directory 下生成非安全辅助代码的命令示例如下:$ codegen --sgx --trusted-dir enclave-directory --untrusted-dir host-directory helloworld.edl转译 helloworld.edl ,在当前目录生成安全侧辅助代码,不生成非安全辅助代码的命令示例如下:$ codegen --sgx --trusted helloworld.edl转译 helloworld.edl ,在当前目录生成非安全侧辅助代码,不生成安全辅助代码的命令示例如下:$ codegen --sgx --untrusted helloworld.edl转译 helloworld.edl ,在 当前目录生成安全侧和非安全侧辅助代码的命令示例如下:$ codegen --sgx helloworld.edl签名工具简介secGear sign_tool 是一款命令行工具,包含编译工具链和签名工具,用于 enclave 签名。sign_tool 有两种签名形式:单步签名:仅适用于 debug 调试模式两步签名:商用场景。需要从第三方平台或者独立的安全设备获取签名私钥,对 envlave 进行签名使用指导命令格式sign_tool 包含 sign 指令(对 enclave 进行签名)和 digest 指令(生成摘要值)。命令格式为:sign_tool.sh -d [sign | digest] -x -i -p -s [OPTIONS] –o参数说明sign 指令参数参数含义是否必选-aapi_level,标识 iTrustee TA 的 GP API version,默认为 1可选-c配置文件可选-d指定签名工具要进行的操作( sign 或者 digest )单步仅执行sign,两步需要先执行digest,再执行sign-e设备的公钥证书,用于保护加密 rawdata 的 AES key (iTrustee必需)仅 iTrustee 类型必选-fOTRP_FLAG,是否支持 OTRP 标准协议,默认为 0可选-i待签名的库文件必选-k单步签名所需私钥(pem文件)仅 SGX 类型必选-m安全配置文件 mainfest.txt,由用户自行配置仅 iTrustee 类型必选-o指定输出文件名 其中 iTrustee 类型时格式为:“/output_path/uuid.sec”, uuid 必须和 manifest.txt 中 gpd.ta.appID 一致必选-p两步签名所需的签名服务器公钥证书(pem文件)必选-s两步签名所需的已签名摘要值必选-tTA_TYPA,标识 iTrustee 的 TA 二进制格式,默认为 1可选-xencalve type(sgx 或 trustzone)必选-h打印帮助信息可选单步签名enclave 类型为 SGX,给 test.enclave 签名,输出签名文件 signed.enclave 的示例如下:$ sign_tool.sh –d sign –x sgx –i test.enclave -k private_test.pem –o signed.enclave两步签名以 SGX 为例,两步签名的操作步骤如下:生成摘要值使用 sign_tool 签名,生成摘要值 digest.data 和临时中间文件 signdata(该文件在生成签名文件时使用,并在签名后自动删除)。参考命令如下:$ sign_tool.sh –d digest –x sgx –i input –o digest.data将 digest.data 发送至签名机构或平台,并获取对应签名。使用获取的签名生成签名后的动态库 signed.enclave。$ sign_tool.sh –d sign –x sgx–i input –p pub.pem –s signature –o signed.enclave说明:为发布 Intel SGX 支持的正式版本应用,需要申请 Intel 白名单。流程请参考 Intel 文档:安全应用开发指南这里给出基于 secGear 接口开发一个 C 语言程序 helloworld 的例子,方便用户理解使用 secGear 开发应用程序。下载样例git clone 目录结构说明cd examples/helloworld #目录结构如下 ├── helloworld │ ├── CMakeLists.txt │ ├── enclave │ │ ├── CMakeLists.txt │ │ ├── Enclave.config.xml │ │ ├── Enclave.lds │ │ ├── hello.c │ │ ├── manifest.txt │ │ └── config_cloud.ini │ ├── helloworld.edl │ └── host │ ├── CMakeLists.txt │ └── main.c代码主体分为三块:非安全侧程序(main.c)非安全侧与安全侧调用接口头文件(helloworld.edl)安全侧程序(hello.c)准备工作除以上三部分主体代码外,还有编译工程文件(CMakeLists.txt)、开发者证书(SGX的Enclave.config.xml/Enclave.lds,鲲鹏的manifest.txt/config_cloud.ini)。![img](鲲鹏开发者证书需要向华为业务负责人[申请开发者证书](SGX以Debug模式调试,暂时不用申请。如需正式商用并且用intel的远程证明服务,需要向Intel[申请License](申请成功后会得到开发者证书相关文件,需要放置到代码目录相应位置。开发步骤基于secGear做机密计算应用拆分改造,类似于独立功能模块提取,识别敏感数据处理逻辑,提取成独立的lib库,部署在可信执行环境中,对非安全侧提供的接口定义在EDL文件中。开发步骤如下图所示:开发非安全侧main函数及接口,管理enclave并调用安全侧函数。开发EDL文件(类似C语言头文件定义非安全侧与安全侧交互接口)开发安全侧接口实现调用代码生成工具,根据EDL自动生成非安全侧与安全侧交互源码,并分别编译到非安全侧与安全侧二进制文件中,非安全侧逻辑直接调用安全侧对应的接口即可,无需关心自动的生成的交互代码,降低开发成本。调用签名工具对安全侧二进制签名,实现安全侧程序可信启动。![img](编译运行ARM环境// clone secGear repository git clone // build secGear and examples cd secGear source environment mkdir debug && cd debug && cmake -DENCLAVE=GP .. && make && sudo make install // run helloworld /vendor/bin/secgear_helloworldx86环境// clone secGear repository git clone // build secGear and examples cd secGear source /opt/intel/sgxsdk/environment && source environment mkdir debug && cd debug && cmake .. && make && sudo make install // run helloworld ./examples/helloworld/host/secgear_helloworld
  • [分享交流] ATune笔记
    安装与部署软硬件要求硬件要求鲲鹏920处理器软件要求操作系统:openEuler 22.03 LTS SP2环境准备安装openEuler系统,安装方法参考 [openEuler 22.03 LTS SP2安装指南](安装A-Tune需要使用root权限。安装A-Tune本节介绍A-Tune的安装模式和安装方法。安装模式介绍A-Tune支持单机模式和分布式模式安装:单机模式client和server安装到同一台机器上。分布式模式client和server分别安装在不同的机器上。两种安装模式的简单图示如下:![](安装操作安装A-Tune的操作步骤如下:挂载openEuler的iso文件。# mount openEuler-22.03-LTS-SP2-aarch64-dvd.iso /mnt配置本地yum源。# vim /etc/yum.repos.d/local.repo配置内容如下所示:[local] name=local baseurl=file:///mnt gpgcheck=1 enabled=1将RPM数字签名的GPG公钥导入系统。# rpm --import /mnt/RPM-GPG-KEY-openEuler安装A-Tune服务端。![](本步骤会同时安装服务端和客户端软件包,对于单机部署模式,请跳过步骤5。# yum install atune -y # yum install atune-engine -y若为分布式部署,请安装A-Tune客户端。# yum install atune-client -y验证是否安装成功。命令和回显如下表示安装成功。# rpm -qa | grep atune atune-client-xxx atune-db-xxx atune-xxx atune-engine-xxx部署A-Tune本节介绍A-Tune的配置部署。配置介绍A-Tune配置文件/etc/atuned/atuned.cnf的配置项说明如下:A-Tune服务启动配置可根据需要进行修改。protocol:系统gRPC服务使用的协议,unix或tcp,unix为本地socket通信方式,tcp为socket监听端口方式。默认为unix。address:系统gRPC服务的侦听地址,默认为unix socket,若为分布式部署,需修改为侦听的ip地址。port:系统gRPC服务的侦听端口,范围为0~65535未使用的端口。如果protocol配置是unix,则不需要配置。connect:若为集群部署时,A-Tune所在节点的ip列表,ip地址以逗号分隔。rest_host:系统rest service的侦听地址,默认为localhost。rest_port:系统rest service的侦听端口,范围为0~65535未使用的端口,默认为8383。engine_host:与系统atune engine service连接的地址。engine_port:与系统atune engine service连接的端口。sample_num:系统执行analysis流程时采集样本的数量,默认为20。interval:系统执行analysis流程时采集样本的间隔时间,默认为5s。grpc_tls:系统gRPC的SSL/TLS证书校验开关,默认不开启。开启grpc_tls后,atune-adm命令在使用前需要设置以下环境变量方可与服务端进行通讯:export ATUNE_TLS=yesexport ATUNED_CACERT=<客户端CA证书路径>export ATUNED_CLIENTCERT=<客户端证书路径>export ATUNED_CLIENTKEY=<客户端密钥路径>export ATUNED_SERVERCN=servertlsservercafile:gRPC服务端CA证书路径。tlsservercertfile:gRPC服务端证书路径。tlsserverkeyfile:gRPC服务端密钥路径。rest_tls:系统rest service的SSL/TLS证书校验开关,默认开启。tlsrestcacertfile:系统rest service的服务端CA证书路径。tlsrestservercertfile:系统rest service的服务端证书路径。tlsrestserverkeyfile:系统rest service的服务端密钥路径。engine_tls:系统atune engine service的SSL/TLS证书校验开关,默认开启。tlsenginecacertfile:系统atune engine service的客户端CA证书路径。tlsengineclientcertfile:系统atune engine service的客户端证书路径。tlsengineclientkeyfile:系统atune engine service的客户端密钥路径。system信息system为系统执行相关的优化需要用到的参数信息,必须根据系统实际情况进行修改。disk:执行analysis流程时需要采集的对应磁盘的信息或执行磁盘相关优化时需要指定的磁盘。network:执行analysis时需要采集的对应的网卡的信息或执行网卡相关优化时需要指定的网卡。user:执行ulimit相关优化时用到的用户名。目前只支持root用户。日志信息根据情况修改日志的级别,默认为info级别,日志信息打印在/var/log/messages中。monitor信息为系统启动时默认采集的系统硬件信息。tuning信息tuning为系统进行离线调优时需要用到的参数信息。noise:高斯噪声的评估值。sel_feature:控制离线调优参数重要性排名输出的开关,默认关闭。配置示例#################################### server ############################### # atuned config [server] # the protocol grpc server running on # ranges: unix or tcp protocol = unix # the address that the grpc server to bind to # default is unix socket /var/run/atuned/atuned.sock # ranges: /var/run/atuned/atuned.sock or ip address address = /var/run/atuned/atuned.sock # the atune nodes in cluster mode, separated by commas # it is valid when protocol is tcp # connect = ip01,ip02,ip03 # the atuned grpc listening port # the port can be set between 0 to 65535 which not be used # port = 60001 # the rest service listening port, default is 8383 # the port can be set between 0 to 65535 which not be used rest_host = localhost rest_port = 8383 # the tuning optimizer host and port, start by engine.service # if engine_host is same as rest_host, two ports cannot be same # the port can be set between 0 to 65535 which not be used engine_host = localhost engine_port = 3838 # when run analysis command, the numbers of collected data. # default is 20 sample_num = 20 # interval for collecting data, default is 5s interval = 5 # enable gRPC authentication SSL/TLS # default is false # grpc_tls = false # tlsservercafile = /etc/atuned/grpc_certs/ca.crt # tlsservercertfile = /etc/atuned/grpc_certs/server.crt # tlsserverkeyfile = /etc/atuned/grpc_certs/server.key # enable rest server authentication SSL/TLS # default is true rest_tls = true tlsrestcacertfile = /etc/atuned/rest_certs/ca.crt tlsrestservercertfile = /etc/atuned/rest_certs/server.crt tlsrestserverkeyfile = /etc/atuned/rest_certs/server.key # enable engine server authentication SSL/TLS # default is true engine_tls = true tlsenginecacertfile = /etc/atuned/engine_certs/ca.crt tlsengineclientcertfile = /etc/atuned/engine_certs/client.crt tlsengineclientkeyfile = /etc/atuned/engine_certs/client.key #################################### log ############################### [log] # either "debug", "info", "warn", "error", "critical", default is "info" level = info #################################### monitor ############################### [monitor] # with the module and format of the MPI, the format is {module}_{purpose} # the module is Either "mem", "net", "cpu", "storage" # the purpose is "topo" module = mem_topo, cpu_topo #################################### system ############################### # you can add arbitrary key-value here, just like key = value # you can use the key in the profile [system] # the disk to be analysis disk = sda # the network to be analysis network = enp189s0f0 user = root #################################### tuning ############################### # tuning configs [tuning] noise = 0.000000001 sel_feature = false A-Tune engine配置文件/etc/atuned/engine.cnf的配置项说明如下:A-Tune engine服务启动配置可根据需要进行修改。engine_host:系统atune engine service的监听地址,默认为localhost。engine_port:系统atune engine service的监听端口,范围为0~65535未使用的端口,默认为3838。engine_tls:系统atune engine service的SSL/TLS证书校验开关,默认开启。tlsenginecacertfile:系统atune engine service的服务端CA证书路径。tlsengineservercertfile:系统atune engine service的服务端证书路径。tlsengineserverkeyfile:系统atune engine service的服务端密钥路径。日志信息根据情况修改日志的级别,默认为info级别,日志信息打印在/var/log/messages中。配置示例 #################################### engine ############################### [server] # the tuning optimizer host and port, start by engine.service # if engine_host is same as rest_host, two ports cannot be same # the port can be set between 0 to 65535 which not be used engine_host = localhost engine_port = 3838 # enable engine server authentication SSL/TLS # default is true engine_tls = true tlsenginecacertfile = /etc/atuned/engine_certs/ca.crt tlsengineservercertfile = /etc/atuned/engine_certs/server.crt tlsengineserverkeyfile = /etc/atuned/engine_certs/server.key #################################### log ############################### [log] # either "debug", "info", "warn", "error", "critical", default is "info" level = info启动A-TuneA-Tune安装完成后,需要启动A-Tune服务才能使用。启动atuned服务:# systemctl start atuned查询atuned服务状态:# systemctl status atuned若回显为如下,则服务启动成功。![](启动A-Tune engine若需要使用AI相关的功能,需要启动A-Tune engine服务才能使用。启动atune-engine服务:# systemctl start atune-engine查询atune-engine服务状态:# systemctl status atune-engine若回显为如下,则服务启动成功。![](使用方法总体说明使用A-Tune需要使用root权限。atune-adm支持的命令可以通过 atune-adm help/–help/-h 查询。使用方法中所有命令的使用举例都是在单机部署模式下,如果是在分布式部署模式下,需要指定服务器IP和端口号,例如:# atune-adm -a 192.168.3.196 -p 60001 listdefine、update、undefine、collection、train、upgrade不支持远程执行。命令格式中,[ ] 表示参数可选,<> 表示参数必选,具体参数由实际情况确定。查询负载类型list功能描述查询系统当前支持的profile,以及当前处于active状态的profile。命令格式atune-adm list使用示例# atune-adm list Support profiles: +------------------------------------------------+-----------+ | ProfileName | Active | +================================================+===========+ | arm-native-android-container-robox | false | +------------------------------------------------+-----------+ | basic-test-suite-euleros-baseline-fio | false | +------------------------------------------------+-----------+ | basic-test-suite-euleros-baseline-lmbench | false | +------------------------------------------------+-----------+ | basic-test-suite-euleros-baseline-netperf | false | +------------------------------------------------+-----------+ | basic-test-suite-euleros-baseline-stream | false | +------------------------------------------------+-----------+ | basic-test-suite-euleros-baseline-unixbench | false | +------------------------------------------------+-----------+ | basic-test-suite-speccpu-speccpu2006 | false | +------------------------------------------------+-----------+ | basic-test-suite-specjbb-specjbb2015 | false | +------------------------------------------------+-----------+ | big-data-hadoop-hdfs-dfsio-hdd | false | +------------------------------------------------+-----------+ | big-data-hadoop-hdfs-dfsio-ssd | false | +------------------------------------------------+-----------+ | big-data-hadoop-spark-bayesian | false | +------------------------------------------------+-----------+ | big-data-hadoop-spark-kmeans | false | +------------------------------------------------+-----------+ | big-data-hadoop-spark-sql1 | false | +------------------------------------------------+-----------+ | big-data-hadoop-spark-sql10 | false | +------------------------------------------------+-----------+ | big-data-hadoop-spark-sql2 | false | +------------------------------------------------+-----------+ | big-data-hadoop-spark-sql3 | false | +------------------------------------------------+-----------+ | big-data-hadoop-spark-sql4 | false | +------------------------------------------------+-----------+ | big-data-hadoop-spark-sql5 | false | +------------------------------------------------+-----------+ | big-data-hadoop-spark-sql6 | false | +------------------------------------------------+-----------+ | big-data-hadoop-spark-sql7 | false | +------------------------------------------------+-----------+ | big-data-hadoop-spark-sql8 | false | +------------------------------------------------+-----------+ | big-data-hadoop-spark-sql9 | false | +------------------------------------------------+-----------+ | big-data-hadoop-spark-tersort | false | +------------------------------------------------+-----------+ | big-data-hadoop-spark-wordcount | false | +------------------------------------------------+-----------+ | cloud-compute-kvm-host | false | +------------------------------------------------+-----------+ | database-mariadb-2p-tpcc-c3 | false | +------------------------------------------------+-----------+ | database-mariadb-4p-tpcc-c3 | false | +------------------------------------------------+-----------+ | database-mongodb-2p-sysbench | false | +------------------------------------------------+-----------+ | database-mysql-2p-sysbench-hdd | false | +------------------------------------------------+-----------+ | database-mysql-2p-sysbench-ssd | false | +------------------------------------------------+-----------+ | database-postgresql-2p-sysbench-hdd | false | +------------------------------------------------+-----------+ | database-postgresql-2p-sysbench-ssd | false | +------------------------------------------------+-----------+ | default-default | false | +------------------------------------------------+-----------+ | docker-mariadb-2p-tpcc-c3 | false | +------------------------------------------------+-----------+ | docker-mariadb-4p-tpcc-c3 | false | +------------------------------------------------+-----------+ | hpc-gatk4-human-genome | false | +------------------------------------------------+-----------+ | in-memory-database-redis-redis-benchmark | false | +------------------------------------------------+-----------+ | middleware-dubbo-dubbo-benchmark | false | +------------------------------------------------+-----------+ | storage-ceph-vdbench-hdd | false | +------------------------------------------------+-----------+ | storage-ceph-vdbench-ssd | false | +------------------------------------------------+-----------+ | virtualization-consumer-cloud-olc | false | +------------------------------------------------+-----------+ | virtualization-mariadb-2p-tpcc-c3 | false | +------------------------------------------------+-----------+ | virtualization-mariadb-4p-tpcc-c3 | false | +------------------------------------------------+-----------+ | web-apache-traffic-server-spirent-pingpo | false | +------------------------------------------------+-----------+ | web-nginx-http-long-connection | true | +------------------------------------------------+-----------+ | web-nginx- +------------------------------------------------+-----------+ ![img](Active为true表示当前激活的profile,示例表示当前激活的profile是web-nginx-http-long-connection。分析负载类型并自优化analysis功能描述采集系统的实时统计数据进行负载类型识别,并进行自动优化。命令格式atune-adm analysis [command options] [APP_NAME]参数说明OPTIONS参数描述–model, -m用户自训练产生的新模型–characterization, -c使用默认的模型进行应用识别,不进行自动优化–times value, -t value制定收集数据的时长–script value, -s value指定需要运行的文件使用示例使用默认的模型进行应用识别# atune-adm analysis --characterization 使用默认的模型进行应用识别,并进行自动优化# atune-adm analysis 使用自训练的模型进行应用识别# atune-adm analysis --model /usr/libexec/atuned/analysis/models/new-model.m自定义模型A-Tune支持用户定义并学习新模型。定义新模型的操作流程如下:用define命令定义一个新应用的profile用collection命令收集应用对应的系统数据用train命令训练得到模型define功能描述添加用户自定义的应用场景,及对应的profile优化项。命令格式atune-adm define <service_type> <application_name> <scenario_name> <profile_path>使用示例新增一个profile,service_type的名称为test_service,application_name的名称为test_app,scenario_name的名称为test_scenario,优化项的配置文件为example.conf。# atune-adm define test_service test_app test_scenario ./example.confexample.conf 可以参考如下方式书写(以下各优化项非必填,仅供参考),也可通过atune-adm info查看已有的profile是如何书写的。 [main] # list its parent profile [kernel_config] # to change the kernel config [bios] # to change the bios config [bootloader.grub2] # to change the grub2 config [sysfs] # to change the /sys/* config [systemctl] # to change the system service status [sysctl] # to change the /proc/sys/* config [script] # the script extension of cpi [ulimit] # to change the resources limit of user [schedule_policy] # to change the schedule policy [check] # check the environment [tip] # the recommended optimization, which should be performed manunalycollection功能描述采集业务运行时系统的全局资源使用情况以及OS的各项状态信息,并将收集的结果保存到csv格式的输出文件中,作为模型训练的输入数据集。![img](本命令依赖采样工具perf,mpstat,vmstat,iostat,sar。CPU型号目前仅支持鲲鹏920,可通过dmidecode -t processor检查CPU型号。命令格式atune-adm collection <OPTIONS>参数说明OPTIONS参数描述–filename, -f生成的用于训练的csv文件名:名称-时间戳.csv–output_path, -o生成的csv文件的存放路径,需提供绝对路径–disk, -b业务运行时实际使用的磁盘,如/dev/sda–network, -n业务运行时使用的网络接口,如eth0–app_type, -t标记业务的应用类型,作为训练时使用的标签–duration, -d业务运行时采集数据的时间,单位秒,默认采集时间1200秒–interval,-i采集数据的时间间隔,单位秒,默认采集间隔5秒使用示例# atune-adm collection --filename name --interval 5 --duration 1200 --output_path /home/data --disk sda --network eth0 --app_type test_type train功能描述使用采集的数据进行模型的训练。训练时至少采集两种应用类型的数据,否则训练会出错。命令格式atune-adm train <OPTIONS>参数说明OPTIONS参数描述–data_path, -d存放模型训练所需的csv文件的目录–output_file, -o训练生成的新模型使用示例使用data目录下的csv文件作为训练输入,生成的新模型new-model.m存放在model目录下。# atune-adm train --data_path /home/data --output_file /usr/libexec/atuned/analysis/models/new-model.m undefine功能描述删除用户自定义的profile。命令格式atune-adm undefine <profile>使用示例删除自定义的profile。# atune-adm undefine test_service-test_app-test_scenario 查询profileinfo功能描述查看对应的profile内容。命令格式atune-adm info <profile>使用示例查看web-nginx-http-long-connection的profile内容:# atune-adm info web-nginx-http-long-connection *** web-nginx-http-long-connection: # # nginx http long connection A-Tune configuration # [main] include = default-default [kernel_config] #TODO CONFIG [bios] #TODO CONFIG [bootloader.grub2] iommu.passthrough = 1 [sysfs] #TODO CONFIG [systemctl] sysmonitor = stop irqbalance = stop [sysctl] fs.file-max = 6553600 fs.suid_dumpable = 1 fs.aio-max-nr = 1048576 kernel.shmmax = 68719476736 kernel.shmall = 4294967296 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_syncookies = 1 net.ipv4.ip_local_port_range = 1024 65500 net.ipv4.tcp_max_tw_buckets = 5000 net.core.somaxconn = 65535 net.core.netdev_max_backlog = 262144 net.ipv4.tcp_max_orphans = 262144 net.ipv4.tcp_max_syn_backlog = 262144 net.ipv4.tcp_timestamps = 0 net.ipv4.tcp_synack_retries = 1 net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_fin_timeout = 1 net.ipv4.tcp_keepalive_time = 60 net.ipv4.tcp_mem = 362619 483495 725238 net.ipv4.tcp_rmem = 4096 87380 6291456 net.ipv4.tcp_wmem = 4096 16384 4194304 net.core.wmem_default = 8388608 net.core.rmem_default = 8388608 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 [script] prefetch = off ethtool = -X {network} hfunc toeplitz [ulimit] {user}.hard.nofile = 102400 {user}.soft.nofile = 102400 [schedule_policy] #TODO CONFIG [check] #TODO CONFIG [tip] SELinux provides extra control and security features to linux kernel. Disabling SELinux will improve the performance but may cause security risks. = kernel disable the nginx log = application更新profile用户根据需要更新已有profile。update功能描述将已有profile中原来的优化项更新为new.conf中的内容。命令格式atune-adm update <profile> <profile_path>使用示例更新名为test_service-test_app-test_scenario的profile优化项为new.conf。# atune-adm update test_service-test_app-test_scenario ./new.conf 激活profileprofile功能描述手动激活profile,使其处于active状态。命令格式atune-adm profile <profile>参数说明profile名参考list命令查询结果。使用示例激活web-nginx-http-long-connection对应的profile配置。# atune-adm profile web-nginx-http-long-connection 回滚profilerollback功能描述回退当前的配置到系统的初始配置。命令格式atune-adm rollback使用示例# atune-adm rollback 更新数据库upgrade功能描述更新系统的数据库。命令格式atune-adm upgrade <DB_FILE>参数说明DB_FILE新的数据库文件路径使用示例数据库更新为new_sqlite.db。# atune-adm upgrade ./new_sqlite.db 系统信息查询check功能描述检查系统当前的cpu、bios、os、网卡等信息。命令格式atune-adm check使用示例# atune-adm check cpu information: cpu:0 version: Kunpeng 920-6426 speed: 2600000000 HZ cores: 64 cpu:1 version: Kunpeng 920-6426 speed: 2600000000 HZ cores: 64 system information: DMIBIOSVersion: 0.59 OSRelease: 4.19.36-vhulk1906.3.0.h356.eulerosv2r8.aarch64 network information: name: eth0 product: HNS GE/10GE/25GE RDMA Network Controller name: eth1 product: HNS GE/10GE/25GE Network Controller name: eth2 product: HNS GE/10GE/25GE RDMA Network Controller name: eth3 product: HNS GE/10GE/25GE Network Controller name: eth4 product: HNS GE/10GE/25GE RDMA Network Controller name: eth5 product: HNS GE/10GE/25GE Network Controller name: eth6 product: HNS GE/10GE/25GE RDMA Network Controller name: eth7 product: HNS GE/10GE/25GE Network Controller name: docker0 product: 参数自调优A-Tune提供了最佳配置的自动搜索能力,免去人工反复做参数调整、性能评价的调优过程,极大地提升最优配置的搜寻效率。tuning功能描述使用指定的项目文件对参数进行动态空间的搜索,找到当前环境配置下的最优解。命令格式![img](在运行命令前,需要满足如下条件:服务端的yaml配置文件已经编辑完成并放置于 atuned服务下 */etc/atuned/tuning/* 的目录中。客户端的yaml配置文件已经编辑完成并放置于atuned客户端任意目录下。atune-adm tuning [OPTIONS] <PROJECT_YAML>参数说明OPTIONS参数描述–restore, -r恢复tuning优化前的初始配置–project, -p指定需要恢复的yaml文件中的项目名称–restart, -c基于历史调优结果进行调优–detail, -d打印tuning过程的详细信息![img](当使用参数时,-p参数后需要跟具体的项目名称且必须指定该项目yaml文件。PROJECT_YAML:客户端yaml配置文件。配置说明表 1 服务端yaml文件配置名称配置说明参数类型取值范围project项目名称。字符串-startworkload待调优服务的启动脚本。字符串-stopworkload待调优服务的停止脚本。字符串-maxiterations最大调优迭代次数,用于限制客户端的迭代次数。一般来说,调优迭代次数越多,优化效果越好,但所需时间越长。用户必须根据实际的业务场景进行配置。整型>10object需要调节的参数项及信息。object 配置项请参见[表2](--表 2 object项配置说明配置名称配置说明参数类型取值范围name待调参数名称字符串-desc待调参数描述字符串-get查询参数值的脚本--set设置参数值的脚本--needrestart参数生效是否需要重启业务枚举“true”, “false”type参数的类型,目前支持discrete, continuous两种类型,对应离散型、连续型参数枚举“discrete”, “continuous”dtype该参数仅在type为discrete类型时配置,目前支持int, float, string类型枚举int, float, stringscope参数设置范围,仅在type为discrete且dtype为int或float时或者type为continuous时生效整型/浮点型用户自定义,取值在该参数的合法范围step参数值步长,dtype为int或float时使用整型/浮点型用户自定义items参数值在scope定义范围之外的枚举值,dtype为int或float时使用整型/浮点型用户自定义,取值在该参数的合法范围options参数值的枚举范围,dtype为string时使用字符串用户自定义,取值在该参数的合法范围表 3 客户端yaml文件配置说明配置名称配置说明参数类型取值范围project项目名称,需要与服务端对应配置文件中的project匹配字符串-engine调优算法字符串“random”, “forest”, “gbrt”, “bayes”, “extraTrees”iterations调优迭代次数整型>=10random_starts随机迭代次数整型<iterationsfeature_filter_engine参数搜索算法,用于重要参数选择,该参数可选字符串“lhs”feature_filter_cycle参数搜索轮数,用于重要参数选择,该参数配合feature_filter_engine使用整型-feature_filter_iters每轮参数搜索的迭代次数,用于重要参数选择,该参数配合feature_filter_engine使用整型-split_count调优参数取值范围中均匀选取的参数个数,用于重要参数选择,该参数配合feature_filter_engine使用整型-benchmark性能测试脚本--evaluations性能测试评估指标evaluations 配置项请参见[表4](--表 4 evaluations项配置说明配置名称配置说明参数类型取值范围name评价指标名称字符串-get获取性能评估结果的脚本--type评估结果的正负类型,positive代表最小化性能值,negative代表最大化对应性能值枚举“positive”,“negative”weight该指标的权重百分比,0-100整型0-100threshold该指标的最低性能要求整型用户指定配置示例服务端yaml文件配置示例:project: "compress" maxiterations: 500 startworkload: "" stopworkload: "" object : - name : "compressLevel" info : desc : "The compresslevel parameter is an integer from 1 to 9 controlling the level of compression" get : "cat /root/A-Tune/examples/tuning/compress/compress.py | grep 'compressLevel=' | awk -F '=' '{print $2}'" set : "sed -i 's/compressLevel=\\s*[0-9]*/compressLevel=$value/g' /root/A-Tune/examples/tuning/compress/compress.py" needrestart : "false" type : "continuous" scope : - 1 - 9 dtype : "int" - name : "compressMethod" info : desc : "The compressMethod parameter is a string controlling the compression method" get : "cat /root/A-Tune/examples/tuning/compress/compress.py | grep 'compressMethod=' | awk -F '=' '{print $2}' | sed 's/\"//g'" set : "sed -i 's/compressMethod=\\s*[0-9,a-z,\"]*/compressMethod=\"$value\"/g' /root/A-Tune/examples/tuning/compress/compress.py" needrestart : "false" type : "discrete" options : - "bz2" - "zlib" - "gzip" dtype : "string" 客户端yaml文件配置示例:project: "compress" engine : "gbrt" iterations : 20 random_starts : 10 benchmark : "python3 /root/A-Tune/examples/tuning/compress/compress.py" evaluations : - name: "time" info: get: "echo '$out' | grep 'time' | awk '{print $3}'" type: "positive" weight: 20 - name: "compress_ratio" info: get: "echo '$out' | grep 'compress_ratio' | awk '{print $3}'" type: "negative" weight: 80 使用示例进行tuning调优# atune-adm tuning --project compress --detail compress_client.yaml恢复tuning调优前的初始配置,compress为yaml文件中的项目名称# atune-adm tuning --restore --project compres
  • [课程学习] Fireworks Snet&Dnet
    firewalld 命令集 – firewall-cmdfirewall-cmd 是 Linux 上新使用的防火墙软件,类似于 iptables。 它是 firewalld 的字符界面管理工具。firewalld 是 CentOS 7 的一个重要特性,它主要有两个优点:支持动态更新,无需重启服务;引入了防火墙的 “zone” 概念。补充说明firewalld 相比 iptables 至少有两大优势:firewalld 可以动态修改单条规则,而不需要像 iptables 那样,修改规则后必须刷新所有规则才能生效。firewalld 在使用上更人性化,即使不了解 “五张表五条链” 且对 TCP/IP 协议不熟悉,也能实现大部分功能。需要注意的是,firewalld 自身并不具备防火墙的功能,而是像 iptables 一样,通过内核的 netfilter 来实现。 也就是说,firewalld 和 iptables 的作用都是维护规则,真正执行规则的是内核的 netfilter。 只是 firewalld 和 iptables 的结构和使用方法不同。命令格式firewall-cmd [选项 ...] 选项通用选项-h, --help: 显示帮助信息。-V, --version: 显示版本信息 (此选项不能与其他选项组合使用)。-q, --quiet: 不打印状态消息。状态选项--state: 显示 firewalld 的状态。--reload: 不中断服务的重新加载。--complete-reload: 中断所有连接的重新加载。--runtime-to-permanent: 将当前防火墙规则永久保存。--check-config: 检查配置正确性。日志选项--get-log-denied: 获取记录被拒绝的日志。--set-log-denied=<value>: 设置记录被拒绝的日志,只能为 'all', 'unicast', 'broadcast', 'multicast', 'off' 其中的一个。实例基本操作# 安装 firewalld yum install firewalld firewall-config # 启动 systemctl start firewalld # 停止 systemctl stop firewalld # 启用自动启动 systemctl enable firewalld # 禁用自动启动 systemctl disable firewalld # 查看状态 systemctl status firewalld # 或者 firewall-cmd --state关闭 firewalld 并使用 iptables (不推荐)systemctl stop firewalld systemctl disable firewalld yum install iptables-services systemctl start iptables systemctl enable iptables配置 firewalldfirewall-cmd --version # 查看版本 firewall-cmd --help # 查看帮助 # 查看设置: firewall-cmd --state # 显示状态 firewall-cmd --get-active-zones # 查看区域信息 firewall-cmd --get-zone-of-interface=eth0 # 查看指定接口所属区域 firewall-cmd --panic-on # 拒绝所有包 firewall-cmd --panic-off # 取消拒绝状态 firewall-cmd --query-panic # 查看是否拒绝 firewall-cmd --reload # 更新防火墙规则 firewall-cmd --complete-reload # 两者的区别是: # --reload 无需断开连接,是 firewalld 特性之一:动态添加规则 # --complete-reload 需要断开连接,类似重启服务 # 将接口添加到区域,默认接口都在 public firewall-cmd --zone=public --add-interface=eth0 # 永久生效再加上 --permanent 然后 reload 防火墙 firewall-cmd --permanent --zone=public --add-interface=eth0 firewall-cmd --reload # 设置默认接口区域,立即生效无需重启 firewall-cmd --set-default-zone=public # 查看所有打开的端口: firewall-cmd --zone=dmz --list-ports # 加入一个端口到区域: firewall-cmd --zone=dmz --add-port=8080/tcp # 若要永久生效方法同上 firewall-cmd --permanent --zone=dmz --add-port=8080/tcp firewall-cmd --reload # 打开一个服务,类似于将端口可视化。服务需要在配置文件中添加,/etc/firewalld 目录下有 services 文件夹。详情参考文档。 firewall-cmd --zone=work --add-service=smtp # 移除服务 firewall-cmd --zone=work --remove-service=smtp # 显示支持的区域列表 firewall-cmd --get-zones # 设置为家庭区域 firewall-cmd --set-default-zone=home # 查看当前区域 firewall-cmd --get-active-zones # 设置当前区域的接口 firewall-cmd --get-zone-of-interface=enp03s # 显示所有公共区域 (public) firewall-cmd --zone=public --list-all # 临时修改网络接口 (enp0s3) 为内部区域 (internal) firewall-cmd --zone=internal --change-interface=enp03s # 永久修改网络接口 enp03s 为内部区域 (internal) firewall-cmd --permanent --zone=internal --change-interface=enp03s firewall-cmd --reload服务管理# 显示服务列表 # Amanda, FTP, Samba 和 TFTP 等最重要的服务已经被 FirewallD 提供相应的服务,可以使用如下命令查看: firewall-cmd --get-services # 允许 SSH 服务通过 firewall-cmd --new-service=ssh # (这个命令有问题,不应该这么用,应该通过zone添加service) # 禁止 SSH 服务通过 (这个命令有问题,不应该这么用,应该通过zone移除service) firewall-cmd --delete-service=ssh # 打开 TCP 的 8080 端口 (这个命令有问题,不应该这么用,应该通过zone添加port) firewall-cmd --enable ports=8080/tcp # 临时允许 Samba 服务通过 600 秒 (这个命令有问题,不应该这么用,应该通过zone添加service) firewall-cmd --enable service=samba --timeout=600 # 显示当前服务 (这个命令有问题,不应该这么用,应该通过zone list all) firewall-cmd --list-services # 添加 HTTP 服务到内部区域 (internal) firewall-cmd --permanent --zone=internal --add-service=http firewall-cmd --reload # 在不改变状态的条件下重新加载防火墙 端口管理# 打开 443/TCP 端口 firewall-cmd --add-port=443/tcp # 永久打开 3690/TCP 端口 firewall-cmd --permanent --add-port=3690/tcp firewall-cmd --reload # 永久打开端口好像需要 reload 一下,临时打开好像不用,如果用了 reload 临时打开的端口就失效了 # 其它服务也可能是这样的,这个没有测试 # 查看防火墙,添加的端口也可以看到 firewall-cmd --list-all直接模式# FirewallD 包括一种直接模式,使用它可以完成一些工作,例如打开 TCP 协议的 9999 端口 firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 9000 -j ACCEPT firewall-cmd --reload自定义服务管理选项(末尾带有 [P only] 的话表示该选项除了与 --permanent 之外,不能与其他选项一同使用!)--new-service=<服务名>: 新建一个自定义服务 [P only]--new-service-from-file=<文件名> [--name=<服务名>]: 从文件中读取配置用以新建一个自定义服务 [P only]--delete-service=<服务名>: 删除一个已存在的服务 [P only]--load-service-defaults=<服务名>: Load icmptype default settings [P only]--info-service=<服务名>: 显示该服务的相关信息--path-service=<服务名>: 显示该服务的文件的相关路径 [P only]--service=<服务名> --set-description=<描述>: 给该服务设置描述信息 [P only]--service=<服务名> --get-description: 显示该服务的描述信息 [P only]--service=<服务名> --set-short=<描述>: 给该服务设置一个简短的描述 [P only]--service=<服务名> --get-short: 显示该服务的简短描述 [P only]--service=<服务名> --add-port=<端口号>[-<端口号>]/<protocol>: 给该服务添加一个新的端口(端口段) [P only]--service=<服务名> --remove-port=<端口号>[-<端口号>]/<protocol>: 从该服务上移除一个端口(端口段) [P only]--service=<服务名> --query-port=<端口号>[-<端口号>]/<protocol>: 查询该服务是否添加了某个端口(端口段) [P only]--service=<服务名> --get-ports: 显示该服务添加的所有端口 [P only]--service=<服务名> --add-protocol=<protocol>: 为该服务添加一个协议 [P only]--service=<服务名> --remove-protocol=<protocol>: 从该服务上移除一个协议 [P only]--service=<服务名> --query-protocol=<protocol>: 查询该服务是否添加了某个协议 [P only]--service=<服务名> --get-protocols: 显示该服务添加的所有协议 [P only]--service=<服务名> --add-source-port=<端口号>[-<端口号>]/<protocol>: 添加新的源端口(端口段)到该服务 [P only]--service=<服务名> --remove-source-port=<端口号>[-<端口号>]/<protocol>: 从该服务中删除源端口(端口段) [P only]--service=<服务名> --query-source-port=<端口号>[-<端口号>]/<protocol>: 查询该服务是否添加了某个源端口(端口段) [P only]--service=<服务名> --get-source-ports: 显示该服务所有源端口 [P only]--service=<服务名> --add-module=<module>: 为该服务添加一个模块 [P only]--service=<服务名> --remove-module=<module>: 为该服务移除一个模块 [P only]--service=<服务名> --query-module=<module>: 查询该服务是否添加了某个模块 [P only]--service=<服务名> --get-modules: 显示该服务添加的所有模块 [P only]--service=<服务名> --set-destination=<ipv>:<address>[/<mask>]: Set destination for ipv to address in service [P only]--service=<服务名> --remove-destination=<ipv>: Disable destination for ipv i service [P only]--service=<服务名> --query-destination=<ipv>:<address>[/<mask>]: Return whether destination ipv is set for service [P only]--service=<服务名> --get-destinations: List destinations in service [P only]控制端口 / 服务可以通过两种方式控制端口的开放,一种是指定端口号,另一种是指定服务名。虽然开放 http 服务就是开放了 80 端口,但是还是不能通过端口号来关闭。也就是说,通过指定服务名开放的就要通过指定服务名关闭;通过指定端口号开放的就要通过指定端口号关闭。 还有一个要注意的就是指定端口的时候一定要指定是什么协议,tcp 还是 udp。firewall-cmd --add-service=mysql # 开放mysql端口 (添加到默认zone,不推荐) firewall-cmd --remove-service=http # 阻止http端口 (从默认zone移除,不推荐) firewall-cmd --list-services # 查看开放的服务 (查看默认zone开放的服务,不推荐) firewall-cmd --add-port=3306/tcp # 开放通过tcp访问3306 (添加到默认zone,不推荐) firewall-cmd --remove-port=80/tcp # 阻止通过tcp访问80 (从默认zone移除,不推荐) firewall-cmd --add-port=233/udp # 开放通过udp访问233 (添加到默认zone,不推荐) firewall-cmd --list-ports # 查看开放的端口 (查看默认zone开放的端口,不推荐) 推荐做法:指定zone来添加端口和服务firewall-cmd --zone=public --add-service=http # 允许public区域http服务 firewall-cmd --zone=public --remove-service=http # 移除public区域http服务 firewall-cmd --zone=public --list-all # 查看public区域所有配置 firewall-cmd --zone=public --add-port=8080/tcp #允许public区域8080端口 firewall-cmd --zone=public --remove-port=8080/tcp # 移除public区域8080端口 伪装 IPfirewall-cmd --query-masquerade # 检查是否允许伪装IP firewall-cmd --add-masquerade # 允许防火墙伪装IP firewall-cmd --remove-masquerade# 禁止防火墙伪装IP 端口转发端口转发可以将指定地址访问指定的端口时,将流量转发至指定地址的指定端口。转发的目的如果不指定 ip 的话就默认为本机,如果指定了 ip 却没指定端口,则默认使用来源端口。 如果配置好端口转发之后不能用,可以检查下面两个问题:比如将 80 端口转发至 8080 端口,首先检查本地的 80 端口和目标的 8080 端口是否开放监听了。其次检查是否允许伪装 IP,没允许的话要开启伪装 IP。firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 # 将80端口的流量转发至8080 firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1 # 将80端口的流量转发至192.168.0.1 firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1:toport=8080 # 将80端口的流量转发至192.168.0.1的8080端口 当我们想把某个端口隐藏起来的时候,就可以在防火墙上阻止那个端口访问,然后再开一个不规则的端口,之后配置防火墙的端口转发,将流量转发过去。端口转发还可以做流量分发,一个防火墙拖着好多台运行着不同服务的机器,然后用防火墙将不同端口的流量转发至不同机器。富规则 (Rich Rules)接下来我们来看富规则的设置,即 rich rules。# 允许 192.168.2.208 主机的所有流量 firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.208" accept" # 允许 192.168.2.208 主机的 icmp 协议,即允许 192.168.2.208 主机 ping firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.2.208" protocol value="icmp" accept" # 取消允许 192.168.2.208 主机的所有流量 firewall-cmd --zone=drop --remove-rich-rule="rule family="ipv4" source address="192.168.2.208" accept" # 允许 192.168.2.208 主机访问 ssh 服务 firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.208" service name="ssh" accept" # 禁止 192.168.2.208 访问 https 服务,并返回错误信息 firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.208" service name="https" reject" # 注:如果是 drop 的话是直接丢弃,会返回 timeout(连接超时) # 允许 192.168.2.0/24 网段的主机访问 22 端口 firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.0/24" port protocol="tcp" port="22" accept" # 每分钟允许 2 个新连接访问 ftp 服务 firewall-cmd --add-rich-rule="rule service name=ftp limit value=2/m accept" # 允许新的 ipv4 和 ipv6 连接 ftp,并使用日志和审核,每分钟允许访问一次 firewall-cmd --add-rich-rule="rule service name=ftp log limit value="1/m" audit accept" # 拒绝来自 192.168.2.0/24 网段的连接,10 秒后自动取消 firewall-cmd --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 reject" --timeout=10 # 允许 ipv6 地址为 2001:db8::/64 子网的主机访问 dns 服务,并且每小时审核一次,300 秒后自动取消 firewall-cmd --add-rich-rule="rule family=ipv6 source address="2001:db8::/64" service name="dns" audit limit value="1/h" reject" --timeout=300 # 将来自 192.168.2.0/24 网段访问本机 80 端口的流量转发到本机的 22 端口 firewall-cmd --zone=drop --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 forward-port port=80 protocol=tcp to-port=22" # 将来自 192.168.2.0/24 网段访问本地 80 端口的流量转发到 192.168.2.208 主机的 22 端口 firewall-cmd --zone=drop --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 forward-port port=80 protocol=tcp to-port=22 to-addr=192.168.2.208" # 伪装,将来自局域网 192.168.2.0/24 网段访问外网的流量映射为网络出口公网 IP,即修改源 IP 地址 firewall-cmd --zone=drop --add-masquerade firewall-cmd --zone=drop --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 masquerade"
  • [课程学习] Keepalive配置实践
    Keepalived 配置实践1. Keepalived 实现 Nginx 的高可用集群1.1 实验组网介绍本实验由三台虚拟机组成,Nginx1 和 Nginx2 可以和上实验复用,其上运行 Nginx 服务,并通过 Keepalived 虚拟出一台主机供客户端访问。Nginx1 和 Nginx2 之间通过 10 网段进行心跳监控,并通过浮动 IP 192.168.1.20 对外提供服务,如果其中一台主机出现故障或 Nginx 进程出现故障,业务自动切换到另外一台主机上。1.2 实验步骤安装 keepalive在 Nginx1 和 Nginx2 上执行以下命令,进行 Keepalived 的安装:yum install -y keepalivedKeepalived 配置此次实验将 Nginx1 设置为主节点,Nginx2 设置为备节点,因此将 Nginx1 上的 keepalived 配置文件 (/etc/keepalived/keepalived.conf) 修改为以下内容:! Configuration File for keepalived global_defs { router_id Nginx1 } vrrp_instance Nginx { state MASTER interface ens192 virtual_router_id 51 priority 225 advert_int 1 authentication { auth_type PASS auth_pass Huawei@1 } virtual_ipaddress { 192.168.1.20/24 } } 将 Nginx2 的 keepalived 配置文件修改为以下内容! Configuration File for keepalived global_defs { router_id Nginx2 } vrrp_instance Nginx { state BACKUP interface ens192 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass Huawei@1 } virtual_ipaddress { 192.168.1.20/24 } } 配置完成后,分别在 Nginx1 和 Nginx2 上使用以下命令重启 Keepalived 服务:systemctl restart keepalived1.3 健康检查配置目前 Keepalived 仅能通过主机是否宕机来进行业务切换,如果仅 Nginx 业务出现故障是无法切换的,需在 Keepalive 中添加健康检查来达到检测 Nginx 是否可用的目的。首先开启 Nginx1 和 nginx2,并分别在 Nginx1 和 Nginx2 的 Keepalived 配置文件中添加健康检查的相关配置,具体如下:global_defs { router_id Nginx1 } vrrp_script nginx_check { script “/etc/keepalived/check.sh” interval 1 weight -5 fail 3 } vrrp_instance Nginx { …… track_script { nginx_check } } 2. Keepalived+LVS 实现 Nginx 集群2.1 实验介绍本实验将使用 Keepalived 为 LVS 提供高可用配置,同时 LVS 为后端的 Nginx1 和 Nginx2 提供负载均衡,最终通过 Keepalived+LVS 实现 Nginx 集群。2.2 实验步骤在 LVS1 和 LVS2 虚拟机上安装 keepalived 和 ipvsyum install -y keepalived ipvsadm修改 LVS1 的配置文件将 LVS1 的配置 keepalived 配置文件修改为以下内容:! Configuration File for keepalived global_defs { router_id Cluster1 } vrrp_instance Nginx { state MASTER interface ens192 mcast_src_ip 20.0.0.1 virtual_router_id 51 priority 255 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.20/24 } } virtual_server 192.168.1.20 80 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 50 protocol TCP real_server 192.168.1.14 80 { weight 1 TCP_CHECK { connect_timeout 3 retry 3 delay_before_retry 3 } } real_server 192.168.1.15 80 { weight 2 TCP_CHECK { connect_timeout 3 retry 3 delay_before_retry 3 } } } 修改 LVS2 的配置文件将 LVS2 的配置 keepalived 配置文件修改为以下内容:! Configuration File for keepalived global_defs { router_id Cluster2 } vrrp_instance Nginx { state BACKUP interface ens192 mcast_src_ip 20.0.0.2 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.20/24 } } virtual_server 192.168.1.20 80 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 50 protocol TCP real_server 192.168.1.14 80 { weight 1 TCP_CHECK { connect_timeout 3 retry 3 delay_before_retry 3 } } real_server 192.168.1.15 80 { weight 2 TCP_CHECK { connect_timeout 3 retry 3 delay_before_retry 3 } } } 测试完成就会发现为什么每次都是有 Nginx2 响应服务?通过 LVS 的链接默认开启了持久连接,且超时时间设置为了 50,因此,每次连接都转发至第一次分配的服务器上,将 Keepalived 配置文件中的相关配置注释掉即可实现负载均衡... virtual_server 192.168.1.20 80 { delay_loop 6 lb_algo rr lb_kind DR # persistence_timeout 50 protocol TCP ... 重启完成后,就会轮训到 nginx1 和 nginx2 上了。
  • [课程学习] Redis基础操作实践
    Redis 基础操作实践1.1 实验介绍本实验将安装单机版 Redis,并实践一些简单的 Redis 指令,例如对 key 的创建、查询和修改。1.2 实验操作在一台虚拟机上安装 Redisyum install -y redis6-6.2.7-1.oe2203.x86_64安装完成后,使用命令“systemctl start redis”启动 Redis 服务,具体如下:systemctl start redis登录 Redis 及基本操作实践完成 Redis 后,使用命令 redis-cli 登录 Redisredis-cli使用以下命令创建 KV 格式的数据:set test1 openEuler1 set test2 openEuler2 set test3 openEuler3使用以下命令查看当前数据库中的全部 key:keys *使用 get 命令查看具体某个 key 对应的 valueget test1使用 expire 命令可设置某个 key 的过期时间expire test1 2 使用 move 命令可将某个 key 值迁移到某个数据库中move test2 1 select 1 keys *思考:在当前状态下重启虚拟机后,Redis 中的数据是否还存在?答:存在。默认情况下,Redis 会自动生成一个 dump.rdb 文件,它是一个内存快照文件。设置 Redis 登录密码修改 Redis 的配置文件 /etc/redis/redis.conf,将“requirepass foobared”(当前版本是第 480 行)取消注释,并把“foobared”设置为对应的密码480 requirepass Qwer1234修改完成后,重启 Redis 服务,然后测试密码是否生效Redis 的持久化存储配置修改 Redis 配置文件,将“dbfilename”设置为 snapshot.rdb,并通过“dir”指定所保存的路径,如下234 rdbchecksum yes 235 236 # The filename where to dump the DB 237 dbfilename snapshot.rdb 238 239 # The working directory. 240 # 241 # The DB will be written inside this directory, with the filename specified 242 # above using the 'dbfilename' configuration directive. 243 # 244 # The Append Only File will also be created inside this directory. 245 # 246 # Note that you must specify a directory here, not a file name. 247 dir /var/lib/redis并通过“save”设置 RDB 策略,例如在 10s 中有 1 个 key 发生变化,则保存快照,如下202 #save 900 1 203 #save 300 10 204 #save 60 10000 205 save 10 1 修改完成后,重启 redis 服务,然后进入 Redis,手动创建两个 key,系统就会在指定的目录中创建快照文件。