- 1. 禅道介绍
- 1.1 关于禅道项目管理软件
- 1.2 如何获得支持
- 1.3 各版本功能差异
- 1.4 关注我们
- 2. 安装禅道
- 2.1. 环境搭建
- 2.1.1 搭建Ubuntu环境安装禅道
- 2.1.2 搭建Centos环境安装禅道
- 2.1.3 安装PHP的ioncube扩展
- 2.2. 安装禅道
- 2.2.1 选择适合您的安装方法
- 2.2.2 新版本禅道的安装升级
- 2.2.3 Windows一键安装包(新版)
- 2.2.4 Windows一键安装包(旧版)
- 2.2.5 linux用一键安装包(推荐)
- 2.2.6 使用源码包安装(各系统通用)
- 2.2.7 使用源码包安装(MAC系统)
- 2.2.8 基于禅道当前的一键安装包(Windows和Linux)如何源码安装旗舰版禅道
- 2.2.9 渠成命令行安装禅道
- 2.2.10 Docker和Kubernetes方式部署禅道
- 2.3. 安装12开源版
- 2.3.1 选择适合您的安装方法
- 2.3.2 使用云禅道在线项目管理服务
- 2.3.3 (推荐)windows用一键安装包安装
- 2.3.4 (推荐)Linux用一键安装包
- 2.3.5 linux下用lampp集成包安装
- 2.3.6 使用源码包安装(MAC系统)
- 2.3.7 MAC下用XAMPP安装禅道
- 2.3.8 MAC下用XAMPP-VM安装禅道
- 2.3.9 使用源码包安装(各系统通用)
- 2.3.10 宝塔面板安装禅道
- 2.3.11 华芸NAS在线安装
- 2.3.12 Centos7.4系统下安装httpd,mariadb,php7.2环境运行禅道
- 2.3.13 Centos8系统下安装httpd,mariadb,php7.2环境运行禅道
- 2.3.14 安装ioncube扩展
- 2.3.15 安装swoole扩展
- 2.3.16 Docker方式部署禅道
- 2.4. 安装12企业版
- 2.4.1 禅道企业版安装包安装方式(各系统通用)
- 2.4.2 (推荐)Windows一键安装包安装
- 2.4.3 (推荐)Linux一键安装包安装
- 2.4.4 centos 7.x 源码安装禅道企业版
- 2.5 安装PHP的LDAP扩展
- 2.6 在线安装云禅道
- 2.7 安装 APCu扩展
- 2.8 安装DuckDB引擎
- 2.1. 环境搭建
- 3. 升级禅道
- 3.1. 升级12开源版
- 3.1.1 选择和自己环境对应的升级方式
- 3.1.2 通过源代码方式升级(通用)
- 3.1.3 windows一键安装包的升级
- 3.1.4 linux一键安装包升级
- 3.2. 升级12企业版
- 3.3. 升级禅道新版本
- 3.3.1 选择和自己环境对应的升级方式
- 3.3.2 通过源代码方式升级(通用)
- 3.3.3 windows一键安装包的升级
- 3.3.4 linux一键安装包升级
- 3.3.5 docker安装禅道-升级禅道
- 3.3.6 旧版Docker镜像升级说明
- 3.3.7 通过Roadrunner管理定时任务
- 3.4 如何安装ioncube扩展
- 3.1. 升级12开源版
- 4. 维护配置
- 4.1. 维护禅道
- 4.1.1 初始化管理脚本
- 4.1.2 备份禅道
- 4.1.3 恢复删除的资源
- 4.1.4 如何更新燃尽图
- 4.1.5 一键安装包如何实现mysql异机连接
- 4.1.6 linux一键安装包配置https
- 4.1.7 禅道一键安装包迁移/更新禅道一键安装包
- 4.2. 配置禅道
- 4.2.1 设置是否允许匿名访问
- 4.2.2 如何配置email发信
- 4.2.3 如何成为超级管理员
- 4.2.4 配置禅道系统为静态访问
- 4.2.5 去掉禅道访问地址中的zentao
- 4.2.6 linux一键安装包去掉禅道访问地址中的zentao
- 4.2.7 集成禅道和svn
- 4.2.8 集成禅道和git
- 4.2.9 在第三方应用中集成禅道
- 4.2.10 第三方应用配置免密登录禅道
- 4.2.11 第三方应用集成禅道客户端进行消息通知
- 4.2.12 集成webhook
- 4.2.13 集成ZDOO
- 4.2.14 客户端集成
- 4.2.15 禅道的翻译功能
- 4.2.16 浏览器通知的设置
- 4.2.17 集成钉钉工作消息通知
- 4.2.18 集成企业微信应用消息通知
- 4.2.19 集成飞书群机器人
- 4.2.20 集成飞书消息通知
- 4.2.21 集成版本库、集成Jenkins,并进行构建
- 4.2.22 解决一键安装包密码口令弱的问题
- 4.3. 性能优化
- 4.1. 维护禅道
- 5. 快速入门
- 5.1. 12版本快速入门
- 5.1.1 禅道使用的基本流程和产品、研发、测试之间的三权分立
- 5.1.2 禅道的新手教程
- 5.1.3 创建第一个产品
- 5.1.4 添加第一个需求
- 5.1.5 开始第一个项目
- 5.1.6 确定项目要完成的需求列表
- 5.1.7 为需求分解任务
- 5.1.8 提交bug
- 5.1.9 禅道的自定义功能
- 5.1.10 文档管理
- 5.1.11 如何排查产品、项目是否有访问权限
- 5.1.12 年度总结,工作内容统计一览表说明
- 5.2. 12版创建分组和用户
- 5.2.1 建立部门结构
- 5.2.2 添加一个用户帐号
- 5.2.3 批量维护帐号
- 5.2.4 设置分组,建立权限体系
- 5.3. 12版本最简使用
- 5.3.1 使用禅道来进行项目任务管理
- 5.3.2 只使用禅道来做bug管理
- 5.3.3 只使用禅道来进行产品管理
- 5.3.4 个人使用禅道来做事务跟踪管理
- 5.4. 12版本基本使用
- 5.4.1 敏捷开发及scrum简介
- 5.4.2 禅道和scrum的对应关系
- 5.4.3 视频教程:第一个演示项目
- 5.4.4 维护联系人
- 5.4.5 导入excel、csv参考文档
- 5.4.6 工作方式的切换
- 5.4.7 操作获取积分功能
- 5.4.8 自定义必填项功能
- 5.5. 12版本进阶使用
- 5.5.1. 使用流程
- 5.5.1.1 禅道使用流程图解
- 5.5.2. 个人管理
- 5.5.2.1 使用待办进行个人事务管理
- 5.5.2.2 关注需要自己处理的任务、需求、bug
- 5.5.2.3 通过我的档案查看或者修改个人信息
- 5.5.2.4 视频教程:禅道使用之个人篇
- 5.5.3. 产品经理篇
- 5.5.3.1 维护产品
- 5.5.3.2 维护产品线
- 5.5.3.3 创建和评审需求
- 5.5.3.4 变更和评审需求
- 5.5.3.5 需求的状态和研发阶段
- 5.5.3.6 需求的注意事项
- 5.5.3.7 维护产品模块
- 5.5.3.8 建立发布计划
- 5.5.3.9 建立发布
- 5.5.3.10 路线图
- 5.5.3.11 文档管理
- 5.5.3.12 主持产品会议
- 5.5.3.13 参与项目管理、演示和总结
- 5.5.3.14 需求的基本统计报表
- 5.5.3.15 视频教程:禅道使用之产品经理篇
- 5.5.4. 项目经理篇
- 5.5.4.1 建立项目
- 5.5.4.2 组建项目团队
- 5.5.4.3 确定项目要完成的需求列表
- 5.5.4.4 组织进行任务分解
- 5.5.4.5 召开每天的站立会议
- 5.5.4.6 通过燃尽图了解项目的进展
- 5.5.4.7 通过各种列表的各种功能了解项目进展
- 5.5.4.8 召开演示会议和总结会议
- 5.5.4.9 项目任务基本的报表统计
- 5.5.4.10 视频教程:禅道使用之项目经理篇
- 5.5.5. 开发团队篇
- 5.5.5.1 参加项目计划会议,分解任务
- 5.5.5.2 领取任务,并每天更新任务
- 5.5.5.3 通过看板和树状图查看任务
- 5.5.5.4 创建版本
- 5.5.5.5 申请测试
- 5.5.5.6 解决bug
- 5.5.5.7 文档管理
- 5.5.5.8 确认bug
- 5.5.5.9 视频教程:禅道使用之开发团队篇
- 5.5.6. 测试团队篇
- 5.5.6.1 维护bug视图模块
- 5.5.6.2 提交bug
- 5.5.6.3 验证bug,关闭
- 5.5.6.4 激活bug
- 5.5.6.5 找到自己需要的bug
- 5.5.6.6 维护测试用例视图
- 5.5.6.7 创建测试用例
- 5.5.6.8 测试套件、报告和公共用例库的维护
- 5.5.6.9 管理测试版本
- 5.5.6.10 执行用例,提交Bug
- 5.5.6.11 查看报表统计
- 5.5.6.12 视频教程:禅道使用之测试团队篇
- 5.5.1. 使用流程
- 5.6. 12版本企业版使用
- 5.6.1 开源版功能
- 5.6.2 添加用户和权限维护
- 5.6.3 甘特图功能简介
- 5.6.4 工作日志管理功能简介
- 5.6.5 代码库(SVN GIT)及代码评审
- 5.6.6 日历功能简介
- 5.6.7 Excel导入导出功能简介
- 5.6.8 短信通知功能简介
- 5.6.9 运维管理
- 5.6.10 导出为Word功能简介
- 5.6.11 水晶报表(自定义报表)功能简介
- 5.6.12 LDAP用户验证功能简介
- 5.6.13 反馈管理
- 5.6.14 统计视图功能简介
- 5.6.15 文档管理
- 5.6.16 报表导出功能简介
- 5.6.17. 办公管理
- 5.6.18. 工作流
- 5.6.18.1 工作流内置流程
- 5.6.18.2 工作流功能简介
- 5.6.18.3 自定义内置工作流
- 5.6.18.4 新增工作流示例
- 5.6.18.5 工作流 JS、CSS 使用说明
- 5.6.19 视频及PPT资料
- 5.7. 新版本快速入门
- 5.7.1 15后新版本禅道的新增功能
- 5.7.2 15后新版本禅道的界面变化
- 5.7.3 15后新版本禅道的最简使用
- 5.1. 12版本快速入门
- 6. 按照角色使用
- 6.1. 管理员
- 6.1.1 维护组织部门
- 6.1.2 维护用户
- 6.1.3 维护权限
- 6.1.4. 办公管理(企业版)
- 6.1.5. 工作流(企业版)
- 6.1.5.1 功能简介(企业版)
- 6.1.5.2 内置工作流(企业版)
- 6.1.5.3 流程模板(企业版)
- 6.1.5.4 数据源(企业版)
- 6.1.5.5 验证规则(企业版)
- 6.1.6 短信通知(企业版)
- 6.1.7. 运维管理
- 6.1.8 LDAP用户验证(企业版)
- 6.2. 项目集负责人
- 6.3. 产品经理
- 6.4. 项目经理
- 6.4.1 维护项目和执行
- 6.4.2 维护团队
- 6.4.3 关联需求
- 6.4.4 分解任务
- 6.4.5 跟踪进度
- 6.4.6 甘特图(企业版)
- 6.4.7 代码评审(企业版)
- 6.4.8 瀑布项目的使用
- 6.4.9. 瀑布项目
- 6.4.9.1 维护项目的计划、阶段(旗舰版)
- 6.4.9.2 项目设计
- 6.4.9.3 项目矩阵
- 6.4.9.4 项目评审、配置(旗舰版)
- 6.4.9.5 项目报告、挣值管理(旗舰版)
- 6.4.9.6 项目调研、估算(旗舰版)
- 6.4.9.7 项目问题、风险
- 6.4.9.8 项目机会
- 6.4.9.9 项目过程、度量、QA(旗舰版)
- 6.4.9.10 项目培训
- 6.4.9.11 项目会议
- 6.4.10 看板项目的使用
- 6.4.11 融合敏捷项目
- 6.4.12 融合瀑布项目
- 6.4.13 文档管理(企业版)
- 6.4.14 Excel 导入导出(企业版)
- 6.4.15 Word 导出(企业版)
- 6.4.16 统计(企业版)
- 6.4.17 报表导出(企业版)
- 6.4.18 资产库管理
- 6.5. 研发人员
- 6.5.1 参加产品计划会议,分解任务
- 6.5.2 领取任务,并每天更新任务
- 6.5.3 创建版本,提交测试
- 6.5.4 确认Bug,解决Bug
- 6.5.5 执行的综合、需求、Bug、任务看板
- 6.6. 测试人员
- 6.1. 管理员
- 7. 功能介绍
- 7.1. 核心管理结构
- 7.1.1 项目集(Program)
- 7.1.2 项目(Project)
- 7.1.3 产品(Product)
- 7.1.4 执行(Execution)
- 7.1.5 管理模型
- 7.2. 地盘
- 7.3. 项目集
- 7.4. 产品
- 7.4.1 创建产品
- 7.4.2 维护模块
- 7.4.3 产品多分支/平台管理
- 7.4.4 维护计划
- 7.4.5 维护需求
- 7.4.6 需求的评审
- 7.4.7 创建发布
- 7.4.8 跟踪进度
- 7.4.9 业务需求&需求多层级
- 7.5. 项目
- 7.5.1. 项目通用功能
- 7.5.1.1 项目的基本设置
- 7.5.1.2 维护项目的执行
- 7.5.1.3 维护项目的需求
- 7.5.1.4 维护项目的Bug、用例、测试单、测试报告
- 7.5.1.5 维护项目的文档
- 7.5.1.6 维护项目的版本、发布
- 7.5.2 看板项目
- 7.5.3. 瀑布项目
- 7.5.3.1 维护项目的计划、阶段
- 7.5.3.2 项目设计
- 7.5.3.3 项目矩阵
- 7.5.3.4 项目评审
- 7.5.3.5 项目配置
- 7.5.3.6 项目报告、挣值管理
- 7.5.3.7 项目调研、估算(旗舰版)
- 7.5.3.8 项目问题、风险
- 7.5.3.9 项目机会
- 7.5.3.10 项目过程、度量、QA(旗舰版)
- 7.5.3.11 项目培训
- 7.5.3.12 项目会议
- 7.5.4 融合敏捷项目
- 7.5.5 融合瀑布项目
- 7.5.6 项目资源日历(插件)
- 7.5.1. 项目通用功能
- 7.6. 执行
- 7.6.1 参加产品计划会议,分解任务
- 7.6.2 领取任务,并每天更新任务
- 7.6.3 创建版本,提交测试
- 7.6.4 确认Bug,解决Bug
- 7.6.5 执行的综合、需求、Bug、任务看板
- 7.7. 测试
- 7.8. 自动化测试
- 7.9 DevOps(解决方案)
- 7.10. DevOps(旧版)
- 7.10.1. DevOps 功能
- 7.10.1.1 Git/SVN版本库管理和查看代码
- 7.10.1.2. 集成GitLab
- 7.10.1.2.1 绑定用户,关联issue,进行构建
- 7.10.1.2.2 合并请求
- 7.10.1.2.3 禅道中GitLab的权限
- 7.10.1.3 集成Jenkins,进行构建
- 7.10.1.4 集成SonarQube
- 7.10.1. DevOps 功能
- 7.11. 看板
- 7.11.1 通用看板功能
- 7.12. 资产库(旗舰版)
- 7.12.1 资产库管理(旗舰版)
- 7.13. 文档
- 7.14. BI
- 7.14.1 维度(企业版8.4+)
- 7.14.2 大屏(企业版8.4+)
- 7.14.3. 大屏设计器
- 7.14.3.1 大屏设计器界面布局
- 7.14.3.2 大屏设计器引用图表
- 7.14.3.3 大屏设计器引用透视表
- 7.14.4 透视表(企业版8.4+)
- 7.14.5 透视表(企业版10.2+)
- 7.14.6 图表(企业版8.4+)
- 7.14.7 数据表(企业版8.4+)
- 7.14.8. 度量项
- 7.14.8.1 查看度量项
- 7.14.8.2 创建度量项
- 7.14.8.3 度量项编码开发操作手册
- 7.14.9 统计(旧版)
- 7.14.10 报表导出(旧版)
- 7.14.11 自定义报表(旧版)
- 7.14.12 可视化(旧版)
- 7.14.13. SQL构建器
- 7.14.13.1 联表查询常用方式:左连接
- 7.14.13.2 SQL构建器使用手册
- 7.15. AI
- 7.15.1 AI小程序简介
- 7.15.2 创建与设计AI小程序(企业版)
- 7.15.3 调试AI小程序(企业版)
- 7.15.4 发布与禁用小程序
- 7.15.5 前台小程序的应用
- 7.15.6 AI小程序的导入导出
- 7.15.7 管理AI小程序权限
- 7.16. 组织
- 7.16.1 团队成员和工作信息
- 7.16.2 人力资源日历(需安装插件)
- 7.16.3 组织动态
- 7.16.4 公司信息
- 7.17. 办公(企业版)
- 7.18. 反馈
- 7.19. 学堂
- 7.20. 工作流(企业版)
- 7.20.1 功能简介(企业版)
- 7.20.2 内置工作流(企业版)
- 7.20.3 流程模板(企业版)
- 7.20.4 数据源(企业版)
- 7.20.5 验证规则(企业版)
- 7.21. 后台设置
- 7.21.1 首页
- 7.21.2. 系统设置
- 7.21.2.1 模式、备份、回收站
- 7.21.2.2 聊天
- 7.21.2.3 授权、安全、定时、时区、重建索引、表引擎
- 7.21.2.4 LDAP(企业版)
- 7.21.3 功能开关(超级管理员)
- 7.21.4. 人员管理
- 7.21.5 模型配置
- 7.21.6. 功能配置
- 7.21.6.1 地盘、产品、执行、测试、看板、文档、反馈
- 7.21.6.2 审批、度量、用户、会议室
- 7.21.6.3 审批流程(旗舰版)
- 7.21.6.4 审批流程(旗舰版5.1)
- 7.21.7 文档模板(旗舰版)
- 7.21.8. 通知设置
- 7.21.9 插件管理
- 7.21.10 二次开发
- 7.21.11 数据导入(管理员)
- 7.21.12. 权限维护和控制
- 7.21.12.1 项目集的权限维护和访问控制
- 7.21.12.2 产品的权限维护和访问控制
- 7.21.12.3 项目的权限维护和访问控制
- 7.21.12.4 执行的权限维护和访问控制
- 7.21.12.5 项目和执行的访问控制和数据关系
- 7.21.13. AI配置
- 7.21.14. DevOps设置
- 7.22. 运维
- 7.23. 客户端增强版会议SRS
- 7.23.1. 音视频会议配置
- 7.23.1.1 安装音视频服务端
- 7.23.1.2 安装SRS音视频服务端
- 7.23.1.3 开启和配置音视频功能
- 7.23.2. 发起会议
- 7.23.2.1 一对一会话中发起音视频会议
- 7.23.2.2 群组会话中发起音视频会议
- 7.23.2.3 独立发起音视频会议入口
- 7.23.3. 加入会议
- 7.23.3.1 分享音视频会议到会话
- 7.23.3.2 通过会议的ID加入会议
- 7.23.4. 预约会议
- 7.23.4.1 预约会议
- 7.23.5. 会议应用
- 7.23.5.1 音视频会议应用
- 7.23.1. 音视频会议配置
- 7.24. 客户端增强版会议Jitsi
- 7.1. 核心管理结构
- 8. 其他相关
ZAgent的使用 分享链接
本篇目录
ZAgent是禅道开源的软件自动化测试调度平台,它借助虚拟化技术,为用户提供了一个分布式、集中管理的的测试环境,从而提高测试执行效率,减少测试资产的投入。
随着敏捷、DevOps和CI/CD等研发过程和实践的广泛应用,软件测试、特别是自动化测试,面临着更大的机遇和挑战。自动化测试,作为流水线的构建、部署、验证、发布过程中的一个不可忽视的环节,其能否高效运行,同测试环境的有效管理是密不可分的。借助ZAgent,我们可自动化地、按需创建、用后即焚地管理和使用测试环境。
一、 部署KVM宿主机环境
这里使用Ubuntu20.04桌面版来作为宿主机,搭建虚拟化环境。
1. 首先,验证主机是支持虚拟化,有输出表明支持
root@pve:~# egrep -o "(vmx|svm)" /proc/cpuinfo vmx vmx vmx
2. 安装虚拟化软件
sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients libvirt-dev qemu virt-manager bridge-utils sudo service libvirtd restart
老的Ubuntu系统,请用以下命令替换。注意libvirt-daemon-system、libvirt-clients换成libvirt-bin。
sudo apt-get install qemu-kvm libvirt-bin qemu virt-manager bridge-utils sudo service libvirt-bin restart
3. 下载系统和驱动
· 从 这里下载微软Win10官方光盘镜像;
· 在 这里下载虚机I/O设备驱动,我选择的是稳定版virtio-win-0.1.185.iso。
4. 打开虚拟机管理工具
在图形界面中打开终端,输入virt-manager,启动虚拟机管理工具;
图中显示的QEMU/KVM表明,已成功连接到本地服务;
如果状态为断开,请双击尝试连接,若显示不能连接到libvirtd服务,可重启机器修复;
· 您也可以通过点击菜单“文件->添加连接”,来连接和管理远程宿主机上的虚拟机,格式形如qemu+ssh://user@192.168.0.56:22/system?socket=/var/run/libvirt/libvirt-sock。
· 点击菜单“文件->新建虚拟机”,打开虚拟机创建向导;
· 选择前面下载的Win10镜像文件作为本地安装介质;
· 网络设置页面,选择“主机设备”也就是宿主机的网卡,这样虚拟机会作为局域网中的一台电脑而存在;
· 按向导完成其他设置,并保存。
· 双击打开虚拟机窗口,点击”查看->详情“,进入虚拟机属性页面;
· 点击引导选项卡,设置系统从光盘启动;
· 点击左下角”添加硬件”,增加一个光盘,指向下载的virtio驱动;
· 启动后,自动从光盘安装系统;
· Windows安装向导中,选择加载驱动程序;
· 选择virtio驱动CDROM里,NetKVM目录下对应系统的文件;
· 完成后续的安装步骤。
· 安装完成后,再次打开虚拟机窗口;
· 进入CDROM选项卡,删除安装光盘;
· 启动虚拟机,更新系统,并安装测试相关软件;
· 完成后续的安装步骤。
二、安装KVM虚拟机
首先,我们来了解一下KVM虚拟机有关的几个概念和工具。
· kvm:基于内核的虚拟机(引擎)
· qemu:用于模拟虚拟机IO设备
· qemu-img:虚拟机磁盘管理工具
· libvirt:虚拟化服务的API接口
· virsh:基于libvirt实现的命令行工具
· qemu-manager:图形化管理工具
新建KVM虚拟机时,可以指定另一磁盘文件作为 BackingFile。BackingFile是一个只读的虚拟磁盘基础映像,可以在多个虚拟机间进行共享。基于BackingFile创建和运行虚拟机时,只会在自己的磁盘文件中增量地写入文件,从而提高效率、节省磁盘和维护成本。
虚拟机快照保存了虚拟机在某个指定时间点的状态,当我们在自动化测试过程中遭遇问题或错误时,可以利用快照保存、并恢复到执行中的某个时间点。借助BackingFile机制,虚拟机支持形如以下的多层依赖的快照链(<--表示依赖的方向)。
base image <-- vm01 <-- snap 1 <-- snap 2 <-- vm02(active)
可使用以下命令,将处于快照链中的某个虚机,导出形成一个独立的磁盘映像文件,其不再依赖其它映像。
qemu-img convert -O qcow2 vm02.qcow2 vm-templ.img
假设我们在用户的工作目录中,建立了以下目录。
kvm 根目录 iso 存放光盘镜像 base 存放基础磁盘镜像BackingFile share 存放共享磁盘镜像,用户存储测试工具、驱动等 image 存放测试机的磁盘镜像 xml 存放导出的虚拟机XML配置文件
1. 下面用一个例子,给大家介绍下快速创建测试虚拟机的方法。
· 按照上面的步骤,创建一个Win10虚拟机;
· 在虚拟机中,安装好Chrome浏览器和测试相关软件;
· 使用以下命令,新建一个用于保存工具的共享磁盘;
qemu-img create -f qcow2 -o cluster_size=2M kvm/share/tools.qcow2 10G
· 挂载共享磁盘到虚拟机,复制工具和文件到该共享磁盘;
· 移除该虚拟机,注意在确认对话框中,请选择“不删除相关磁盘文件”;
· 移动虚机主磁盘文件到基础镜像目录,如kvm/base/windows/win10。
· 执行以下命令,以上述基础镜像作为BackingFile,创建新的虚拟机磁盘;
qemu-img create -f qcow2 -o cluster_size=2M,backing_file=kvm/base/windows/win10/pro-x64-zh_cn.qcow2 kvm/image/test-win10-pro-x64-zh_cn-01.qcow2 50G
· 打开qemu-manager,新建测试虚拟机,挂在新创建的虚拟机磁盘和共享磁盘。
2. 除了使用图形界面的qemu-manager外,这里也提供一种命令行的方法,可用于代码中。
· 导出虚拟机XML配置文件;
virsh dumpxml test-win10-pro-x64-zh_cn > kvm/xml/test-win10-pro-x64-zh_cn.xml
· 修改XML配置文件中的以下字段:
name
uuid
vcpu
memory和currentMemory
mac address
第1块disk的source file
· 在第1块disk的Element中,加入以下BackingFile有关的内容:
<backingStore type="file" index="2"> <format type="qcow2"/> <source file="/home/aaron/kvm/base/windows/win10/pro-x64-zh_cn.qcow2"/> <backingStore/>
· 如需要用页面VNC访问虚拟机桌面,找到XML的graphics元素,修改成以下内容;
<graphics type="vnc" port="-1" autoport="yes" listen="0.0.0.0" passwd="P2ssw0rd"> <listen type="address" address="0.0.0.0"/> </graphics>
· 使用以下命令定义虚拟机;
virsh define kvm /xml/test-win10-pro-x64-zh_cn.xml
· 使用以下命令启动虚拟机;
virsh start test-win10-pro-x64-zh_cn
· 使用以下命令获取虚拟机的VNC端口编号,在VNC软件中使用”5900+该数字“的端口,访问虚拟机远程桌面;
virsh vncdisplay test-win10-pro-x64-zh_cn
2. 最后,我们介绍推荐的第三种方法,在代码中使用libvirt*接口来管理虚拟机。禅道基于GO语言的实现,请见 这里 。
# 查看虚拟机信息qemu-img info --backing-chain kvm/image/test-win10-pro-x64-zh_cn-01.qcow2 # 修改虚拟机磁盘大小qemu-img resize x64-pro-zh_cn.qcow2 +10G # 查看虚拟机里列表virsh list --all # 查看虚拟机VNC端口virsh vncdisplay win10-test # 导出虚拟机XML配置文件virsh dumpxml win10-test > win10-test.xml # 创建虚拟机磁盘镜像qemu-img create -f qcow2 -o cluster_size=2M,backing_file=base.qcow2 win10-test.qcow2 40G # 转换虚拟机镜像qemu-img convert -O qcow2 vm02.qcow2 vm-templ.img # 定义、取消定义,启动、停止虚拟机virsh define win10-test.xmlvirsh start win10-testvirsh destroy win10-testvirsh undefine win10-test
三、 部署远程桌面代理
在宿主机上,完成以下步骤。
1. 执行以下命令,克隆代理项目的代码到kvm目录下;
git clone https://github.com/novnc/websockify.git ~/kvm/websockify
2. 在websockify同级目录,新建token文件夹;
3. 在token文件夹中,新建如下格式的配置文件;
vm01: 192.168.1.215:5904
vm01:用于访问虚拟机的token; 192.168.1.215:宿主机的IP地址; 5901:虚拟机的VNC端口号。
注:由于QEMU/KVM虚拟机的VNC服务端口是自增的,在ZAgent启动宿主机代理时,我们使用代码来自动创建10个token文件,完成端口5901-5910到token的映射,并使用一个Map缓存起来。当宿主机代理收到创建虚拟机的请求时,可根据VNC的端口返回其对应的token。具体代码实现可参考 这里。
4. kvm下使用virt-manager,修改虚拟机远程桌面的类型为VNC Server,地址(Address)为所有接口(All interface),端口为自动(Auto);
5. 执行以下命令,启动websockify服务。6080为代理端口,../token/为端口转发配置文件所在的目录;
~/kvm/websockify/run --token-plugin TokenFile --token-source ~/kvm/token/ 6080
四、部署noVNC服务
1. 执行以下命令,获取远程桌面项目的代码;
https://github.com/novnc/noVNC.git
2. 将项目中的文件拷贝到Web服务器中,或使用以下步骤安装一个静态服务器;
- 从这里下载并安装node.js环境;
- 执行npm install -g light-server安装服务器;
- 执行light-server -s noVNC启动noVNC服务,默认端口为4000。
五、 访问远程桌面
1. 在工作电脑上,用浏览器打开http://<宿主机IP地址>:4000/vnc.html;
2. 填入以下信息:
主机:宿主机IP地址;
端口:websockify代理的端口号;
路径:websockify?token=vm01,其中vm01为上述token配置文件中的第一列。
3. 点击网页中的连接按钮,打开虚拟机vm01的远程桌面;
4. 另外,您也可使用简化版的vnc_lite.html页面来访问桌面。
http://<宿主机IP地址>:4000/vnc_lite.html?host=192.168.1.215&port=6080&path=websockify/?token=vm01
六、部署ZAgent应用服务
1. 从这里下载ZAgent应用,程序分为3个部分,分别为:
- 服务端程序 zagent-server
- 宿主机代理 zagent-host
- 虚拟机代理 zagent-vm
2. 复制zagent-server到服务器,执行;
./zagent-server
3. 复制zagent-host到宿主机,执行;
./zagent-host -t host -s http://服务器IP:服务器端口 -i 本机IP -p 本机端口
4. 启动前面安装的Win10虚拟机,在用户根目录下创建kvm文件夹,得到形如c:\Users\aaron\kvm的目录;
5. 复制zagent-vm文件到c:\Users\aaron\kvm\agent目录;
6. 复制以下内容,保存为c:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\zagent.bat。Windows StartUp目录下的zagent-vm代理程序,在系统启动时会被自动运行。
@echo on :start ping /n 3 114.114.114.114 | findstr "TTL=" && goto next || goto start :next cmd /k "cd /d c:\Users\aaron\kvm\agent && zagent-vm -t vm -s 服务器IP:服务器端口" pause
以上批处理文件通过ping 114.114.114.114命令,等待虚拟机网络就绪,然后运行zagent-vm程序。
7. 对于Linux的虚拟机,请使用以下Shell脚本启动ZAgent虚拟机代理。
#!/bin/sh export PATH=$PATH:$GOROOT/bin:$GOPATH/bin serverAdr="114.114.114.114" ping -c 1 $serverAdr > /dev/null 2>&1 while [ $? -ne 0 ]; do echo -e "\e[1A\e[K $(date): Connecting - ${serverAdr}" sleep 1 ping -c 1 $serverAdr > /dev/null 2>&1 done echo "$(date): Connected - ${serverAdr}"; cd /home/aaron/dev/project/zagent git fetch --all && git reset --hard origin/main && git pull go get all # nohup go run cmd/agent-vm/main.go -t vm > zagent.log 2>&1 go run cmd/agent-vm/main.go -t vm