ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

EVE-NG 自定义镜像制作:qcow2 转换与 yml 模板实战

EVE-NG 自定义镜像制作:qcow2 转换与 yml 模板实战 EVE-NG 这个模拟器玩到一定阶段迟早会撞上一堵墙官方镜像包里没有你手上那个特定版本的设备系统或者你压根想跑一个自己定制过的 Linux、Windows。这时候摆在你面前的只有两条路——要么到处求人分享一个 eve-ng 镜像要么自己动手做一个。前者受制于人版本对不对、镜像里干不干净、有没有被人塞过后门全凭运气后者听起来很唬人实际上只要把 EVE-NG 对镜像文件的那套命名规则和调用逻辑摸清楚剩下的基本就是qemu-img几条命令加上一份几十行的 yml 模板文件。我自己前后做过十几个镜像从最简单的 Ubuntu Server 到带图形界面的 Windows踩过的坑基本都能归到命名没对上和控制台类型配错这两类里。这篇文章面向的是已经装好 EVE-NG、能正常拉节点做实验但被官方镜像不够用卡住的人也适合想给自己的实验环境做一套精简私有镜像库的读者。整套流程不依赖任何额外付费工具一台能跑 EVE-NG 的宿主机加一个原始 ISO 就够了。1. 先搞懂 EVE-NG 镜像到底是什么东西1.1 镜像在系统里的物理形态很多人第一次听到EVE-NG 镜像会下意识以为它是个封装好的、类似手机刷机包那样的整体文件。不是的。EVE-NG 本质上是一套跑在 Linux 上的 KVM/QEMU 前端它自己不产生任何虚拟化能力所有的虚拟设备其实都是 QEMU 进程。所以所谓一个 EVE-NG 镜像拆开来看其实只有三样东西。第一样是磁盘文件通常是 qcow2 格式里面装着这台设备的操作系统和配置第二样是描述文件也就是模板 yml告诉 EVE-NG 这个设备该给多少内存、几个网卡、用什么控制台、加哪些 QEMU 参数第三样是图标文件纯装饰用让拓扑图上看起来不至于全是问号。这三样东西分别放在三个不同的目录里彼此靠目录名和文件名建立关联。理解这一点特别关键因为后面九成的镜像不显示启动黑屏问题根子都出在这个关联没对上。提示EVE-NG 本身不校验镜像内容的合法性它只按约定去某个路径找某个文件名。这意味着自由度很高也意味着规则错了它不会给你任何有意义的报错只会静默地起不来。1.2 目录结构与命名规则QEMU 类镜像的存放根目录固定是/opt/unetlab/addons/qemu/。在这个目录下每一个子目录代表一个可选镜像目录名就是你在拓扑里添加节点时下拉列表里看到的那个名字。所以linux-ubuntu-20.04这样的目录名既是路径也是显示名。目录内部的文件名是 EVE-NG 硬编码的不能随便改。不同文件名对应不同的磁盘控制器和插槽位置下面这张表是我整理的核心对照关系建议直接存下来。文件名对应控制器与位置典型使用场景virtioa.qcow2第一块 virtio 磁盘Linux、大部分网络设备系统virtiob.qcow2第二块 virtio 磁盘需要独立数据盘的场景sataa.qcow2第一块 SATA 磁盘系统内缺 virtio 驱动时hda.qcow2第一块 IDE 磁盘老系统、部分 Windows 版本cdrom.iso光驱从 ISO 安装系统、放驱动盘这里有个细节值得说清楚文件名里的a、b是插槽序号不是磁盘类型的一部分。virtioa和virtiob是两块不同的盘你可以同时放进去EVE-NG 会按顺序挂载。另外还有virtiosata.qcow2这种写法在一些老模板里能见到那是历史遗留新版本统一用上面的规则照着现有官方镜像目录 ls 一下就能对出来。1.3 自己做镜像到底值不值先说结论值得而且比你想的省事。理由有三个。版本自主。官方镜像库更新的节奏永远慢于厂商发版尤其是一些小众防火墙、老版本路由系统你需要的那个版本很可能永远不会有现成的。自己做一次以后所有版本都能自己搓。体积可控。官方发布的镜像为了兼容各种场景往往塞了一堆你用不到的组件。你自己从最小化安装开始做一个 Linux 镜像压到 1GB 以内很轻松宿主机磁盘能省出一大截。环境干净。这一点做实验的人最有体会。别人分享的镜像里可能残留了旧配置、旧密码、甚至一些你不想让别人知道的默认账号。自己从 ISO 装一遍root 密码是什么、里面有什么服务全在你掌控之内。2. 动手之前的准备工作2.1 环境与工具清单先把要用的东西列清楚缺一样后面都会卡住。EVE-NG 宿主机已经装好并能正常启动节点SSH 能登录。裸机安装体验最好虚拟机上跑 EVE-NG 的话宿主必须开启 CPU 虚拟化直通否则 QEMU 只能走软件模拟慢到没法用。qemu-img工具绝大多数发行版的qemu-utils包自带一条apt install qemu-utils或者yum install qemu-img就搞定。验证方式是qemu-img --version能出版本号就行。原始素材一个 ISO 安装盘或者一份别人给的原生磁盘镜像vmdk、img、vhd 都行。注意素材本身要是你自己合法持有的别拿带商业授权的厂商镜像到处传自己实验室里用和对外分发是两码事。磁盘空间至少预留原始素材体积的三到五倍。qcow2 是稀疏格式转换过程中会临时占用额外空间空间不够会转一半失败。注意所有涉及/opt/unetlab/的操作都要用 root 或者 sudo。普通用户执行qemu-img转换转出来的文件属主不对EVE-NG 起节点时会直接报权限错误而且这个错误在界面上看不出来只能去翻日志。2.2 素材来源的取舍逻辑素材有两大类选择哪一类决定了完全不同的操作路径。第一类是现成的磁盘镜像比如某个设备厂商提供的虚拟化版本文件常见扩展名是.vmdk、.ova、.img、.vhd。这类素材的好处是开箱即用系统已经装好了你只需要做格式转换和参数适配。麻烦的地方在于磁盘控制器可能对不上需要改模板或者加驱动。第二类是裸 ISO 安装盘比如官方发布的各种系统安装镜像。这类素材的好处是绝对干净、体积最小、你能完全控制安装过程代价是要在 EVE-NG 里走一遍安装流程多花二十分钟到一小时。我做私有镜像几乎都用这条路因为装完之后系统的每一个组件我都心里有数。判断标准其实很简单如果这个素材你能拿到已经装好的版本就优先用现成的如果只有安装盘那就老老实实装一遍别去网上找来源不明的已装好版本。2.3 控制器与网卡类型的选型逻辑这是新手最容易忽略、但直接影响成败的一环。QEMU 给虚拟机提供磁盘和网卡有好几种型号不同型号走不同的驱动路径性能差距能到两三倍而老系统往往压根没有新驱动的支持。磁盘控制器上virtio是性能最好的走的是半虚拟化路径Linux 内核从很早的版本就内置了驱动所以 Linux 类镜像无脑选virtioa.qcow2。SATA 和 IDE 是模拟真实硬件性能差一截但胜在兼容性无敌老系统和不带 virtio 驱动的 Windows 用得上。网卡的情况类似。virtio-net同样性能最好但 Windows 默认不带驱动你得额外挂一个驱动 ISO 装进去。e1000是模拟 Intel 千兆网卡几乎所有系统都自带驱动是拿不准时的安全选择。这个选择最终落在模板的nic字段上2.3 节的结论是先求能跑起来再求跑得快把镜像调通之后再回头换 virtio 也不迟。3. 从原始素材到可用 qcow2 的转换实操3.1 qemu-img 的探查与转换命令拿到素材的第一件事不是转换是看清楚它到底是什么。qemu-img info这条命令看着简单但它是排查问题的起点。qemu-img info source.vmdk输出里有几个字段要重点看file format是真实格式virtual size是这块盘对外声称的容量disk size是实际占用空间backing file说明这个镜像是增量盘还是独立盘。如果出现了backing file说明你拿到的是个快照增量文件必须把它的父盘一起拿来才能转换成功单独转出来的盘是坏的。确认无误之后就是转换qemu-img convert -p -f vmdk -O qcow2 -o preallocationmetadata source.vmdk virtioa.qcow2参数逐个解释一下因为这行命令里每个字都有用。-p是显示进度转换大镜像的时候不看进度你会怀疑它是不是卡死了。-f vmdk是显式指定源格式虽然qemu-img一般能自动识别但显式写出来能避免识别错误导致的诡异问题。-O qcow2是目标格式EVE-NG 只认 qcow2。-o preallocationmetadata是预分配元数据好处是写入性能更好坏处是占用空间会变大磁盘紧张的话可以去掉。如果源文件是 raw 格式的 img把-f vmdk换成-f raw就行如果是 vhd换成-f vpc。转换完成后务必再跑一次qemu-img info virtioa.qcow2确认结果格式那一行显示qcow2才算成。3.2 磁盘扩容与预分配官方镜像经常有个毛病系统装的时候只给了 8GB 或者 10GB跑起来没几天就满了。扩容分两步缺一不可新手最常犯的错就是只做了第一步。第一步在宿主机上扩 qcow2 文件的虚拟容量qemu-img resize virtioa.qcow2 20G注意20G是在原有基础上增加 20G如果写成20G就变成把总容量设成 20G盘里原来的数据一旦超过这个数就直接损坏了。这是我自己踩过的坑一条命令毁了一个装了两小时的镜像后来所有 resize 操作我都会先qemu-img info看一眼当前容量。第二步在 guest 系统内部扩分区和文件系统。只做第一步的话你启动系统会发现可用空间根本没变因为你只是给了虚拟机一块更大的物理盘里面的分区表还是原来的。Linux 上大概是这样growpart /dev/vda 1 resize2fs /dev/vda1 # ext4 文件系统 xfs_growfs / # 或者 xfs 文件系统用这条Windows 上更直观进磁盘管理右键系统分区选扩展卷一路下一步就行。提示扩容操作必须在虚拟机全部关机、EVE-NG 里没有任何节点引用这个镜像的情况下执行。镜像正在被 QEMU 进程占用时 resize轻则失败重则文件损坏。3.3 目录创建、命名与权限修复转换好的盘要放到正确的位置。假设我做的是一台 Ubuntu 20.04我会这样建目录mkdir -p /opt/unetlab/addons/qemu/linux-ubuntu-20.04 mv virtioa.qcow2 /opt/unetlab/addons/qemu/linux-ubuntu-20.04/目录名的命名有几个约定俗成的规矩不是强制但能省很多事。用全小写、用连字符分隔别用空格和中文。前缀尽量和你要用的模板name字段保持一致比如模板里写name: linux那目录叫linux-xxx就能被识别到对不上的话节点添加界面的镜像下拉列表里可能压根看不到这个选项。这一点是 EVE-NG 的隐式约定官方文档里写得含糊但实际用起来就是这个规律。最后一步是权限修复这一步绝对不能省/opt/unetlab/wrappers/unl_wrapper -a fixpermissions这条命令会遍历所有镜像目录把属主和权限统一成 EVE-NG 期望的状态。跑完之后你会看到一堆文件权限被改动的输出是正常的。跳过这一步的直接后果是节点能添加一点启动就转圈然后失败日志里写着 permission denied。4. 从 ISO 做一个全新镜像的完整流程4.1 准备空盘和 ISO 文件这条路我从头到尾走过好几遍稳定性最好。假设要做一台 Windows 10 实验机。先建目录把安装盘放进去mkdir -p /opt/unetlab/addons/qemu/win-10 cp /path/to/win10.iso /opt/unetlab/addons/qemu/win-10/cdrom.iso注意文件名必须原样叫cdrom.iso叫win10.isoEVE-NG 是不认的。然后手工创建一块空盘容量按你需要给cd /opt/unetlab/addons/qemu/win-10 qemu-img create -f qcow2 hda.qcow2 60G为什么 Windows 用hda.qcow2而不是virtioa.qcow2因为 Windows 原版安装盘不带 virtio 存储驱动如果你用 virtio 盘安装程序走到选择安装位置那一步会告诉你找不到任何驱动器。用 IDE 的hda就能绕过这个问题虽然性能差一点但对实验环境来说完全够用。Linux 就没这个顾虑直接建virtioa.qcow2即可没必要浪费一块 IDE 盘位。4.2 在 EVE-NG 里走一遍安装磁盘和 ISO 准备好之后去 EVE-NG 界面里添加节点。这里有个技巧先拿一份现成的同类官方模板来改别从零手写。比如做 Windows 就找官方的 Windows 模板复制一份改个 name 和 icon这套做法能规避掉大量字段拼写错误。节点起来之后会通过 VNC 连上控制台Windows 必须用 VNC 控制台因为安装界面是图形化的telnet 看不到。第一次启动要走启动顺序确保它从光驱引导。安装过程跟在物理机上没有区别分区、装系统、装驱动、设密码一步步来。装完 Windows 之后强烈建议装一个虚拟化增强驱动把网卡换成 virtio 型号网络吞吐能提升明显。Linux 这边有个特有的坑要处理如果你想让节点用 telnet 控制台而不是 VNC必须在系统内部把串口控制台打开否则连上去就是黑屏。具体是两步。先改 GRUB 内核参数在GRUB_CMDLINE_LINUX里加上consolettyS0,115200n8然后update-grub。再启用串口终端服务systemctl enable serial-gettyttyS0.service systemctl start serial-gettyttyS0.service这两步做完EVE-NG 的 telnet 控制台才能真正接管登录提示符会出现在 telnet 里。这是几乎所有Linux 镜像 telnet 黑屏问题的根因官方文档里往往一笔带过。4.3 安装完成后的收尾工作系统装完、配置调好之后有几个收尾动作我每次都做。关机。让 guest 系统正常关机不要直接强行关节点否则文件系统可能没同步完qcow2 里会留下不一致状态。清理。把系统里的临时文件、安装日志、缓存、测试账号全删掉把机器名、主机记录清干净。这一步是为了做出来的镜像足够干净也为了体积小。改启动顺序。安装阶段模板里的qemu_options一般带着-boot orderdc意思是优先从光驱启动。装完之后要改成-boot orderc让系统从硬盘启动。不改的话每次开机它都先去读光驱如果cdrom.iso还在你会莫名其妙又进一次安装界面。改完之后如果你不需要光驱了可以把cdrom.iso删掉但要注意有些设备的模板会检查这个文件是否存在删之前最好确认一下模板里没有依赖它。最后再跑一次fixpermissions然后就可以在拓扑里正式用这个镜像了。5. 给自己的镜像配一份模板和图标5.1 yml 模板字段逐个拆解模板文件放在/opt/unetlab/html/templates/下面很多版本还会细分成intel/和amd/两个子目录。这个分类是为了适配不同 CPU 平台的 QEMU 参数稳妥做法是两个目录各放一份相同的文件省得以后换平台时抓瞎。一份典型的模板长这样type: qemu name: win-10 description: Windows 10 Custom icon: win.png cpulimit: 1 cpu: 2 ram: 4096 ethernet: 4 console: vnc nic: e1000 shutdown: 1 qemu_options: -machine typepc,accelkvm -vga std -usbdevice tablet -boot orderc字段的含义值得一个个说清楚因为改错一个就起不来。type固定 qemu告诉 EVE-NG 这是个 QEMU 类设备。name是模板名和镜像目录名的前缀最好对应。icon是图标文件名放在图标目录里。cpulimit是 CPU 时间片的限制比例0 到 1 之间一般填 1 表示不限制。cpu是分配几个虚拟核心。ram单位是 MB这个字段最容易填错填 4096 是 4GB填 4 就变成 4MB系统根本起不来。ethernet是最大网卡槽位数决定了拓扑里这个节点最多能连几根线。console选vnc或者telnet这是图形系统和无头系统的分水岭。nic是默认网卡型号。qemu_options是直接透传给 QEMU 的原始参数威力最大也最容易出事。注意qemu_options里不要瞎加参数。EVE-NG 自己会在启动时注入一批必要参数你手写的如果和它冲突QEMU 会直接拒绝启动报错信息还非常隐晦。最安全的做法是把同类型官方模板的这行参数原样抄过来只改-boot order这种明确的开关。5.2 参数取值怎么算才合理模板参数不是拍脑袋填的它直接决定你的宿主机能同时开多少个节点。这个账要算清楚。内存是最硬的约束。假设宿主机 64GBEVE-NG 自身和系统开销吃掉 4GB剩 60GB 可用。如果每个节点给 4GB理论上能开 15 个但实际留 20% 余量比较稳也就是同时跑 12 个左右。这就是为什么做镜像时要克制能给小内存的别给大内存。Linux 服务器类镜像给 512MB 到 1024MB 就够了Windows 桌面系统最少 4096MB 才能跑得动。CPU 核心数上实验环境的设备绝大多数时间都是空闲的cpu: 1完全够用cpulimit: 1不限制时间片。给太多核心除了让调度器更累以外没有实际收益。网卡数ethernet按需要给。做基础路由实验 4 个口够用做较复杂的拓扑给 8 个。这个值给小了后面拓扑里想多连一根线都连不上改模板又得重启节点所以宁可稍微给大一点。控制台类型的选择有个简单判断法系统装完之后你需要看到图形界面吗。需要用vnc只需要命令行用telnet。telnet 的优势是拓扑里点一下就能进命令行、复制粘贴方便、还能在无图形界面下工作所以 Linux 和网络设备系统一律优先 telnet。5.3 图标与模板落盘图标文件放在/opt/unetlab/html/images/icons/。格式用 PNG尺寸别太大64×64 到 128×128 就很好看太大反而在拓扑里显得突兀。文件名要和模板里的icon字段完全一致包括大小写。模板文件放好之后在 EVE-NG 界面里刷新一下页面新建节点的时候就能在下拉列表里看到你自定义的模板和镜像了。如果看不到先检查三件事模板文件的扩展名是不是.yml、YAML 缩进是不是用空格而不是 Tab、镜像目录名的前缀和模板name对不对得上。这三条覆盖了我遇到过的绝大多数模板不显示问题。6. 常见问题与排查实录6.1 启动类故障速查表下面这张表是我把自己和同事遇到过的问题归了一遍之后的总结基本上照着查能解决八成故障。现象最可能的原因处理动作镜像下拉列表里找不到目录名前缀与模板 name 不匹配、权限不对改名对齐前缀重跑 fixpermissions节点一点启动就转圈后失败文件属主错误用 root 执行 fixpermissions控制台黑屏无输出console 类型与系统实际配置矛盾Windows 用 vncLinux 用 telnet 需先配串口终端提示找不到可启动设备磁盘文件名不对、启动顺序错核对virtioa/hda命名改-boot order安装时找不到硬盘Windows 装到 virtio 盘上换成hda.qcow2或加载 virtio 驱动系统里容量没变大只扩了 qcow2 没扩分区进 guest 用 growpart 或磁盘管理扩卷运行极慢、卡顿KVM 没启用走了软件模拟检查宿主虚拟化支持确认accelkvm生效6.2 网络不通的排查顺序网络问题看着玄学其实排查顺序是固定的从下往上捋一遍基本都能定位。先确认拓扑里的线拉了没有。这话听起来像废话但我确实在排查了半小时之后发现自己忘了连线。EVE-NG 的节点之间不连线就是物理隔离什么配置都不会通。再确认接口名和 IP 配置对上了没有。EVE-NG 分配的网卡顺序和拓扑里的连线顺序是对应的但如果你在设备里改过接口命名规则对应关系就乱了。进去ip link看一眼别凭记忆。然后确认网卡型号的驱动装没装。Windows 用 virtio 网卡但没装驱动设备管理器里会是一个黄色感叹号接口压根不存在。这种情况换 e1000 最快。最后看二层配置。同一网段内不通先看 VLAN 划分再看 STP 是不是把某条链路给阻塞了。这一步是很多明明配置都对却不通的真正原因。6.3 几个我实际踩过的坑别在镜像里留 DHCP 自动获取。EVE-NG 本身不提供 DHCP 服务节点起来之后你要是配了自动获取它会一直发请求然后等超时启动过程能慢上好几分钟。做镜像的时候就把网络配成静态或者干脆在模板说明里写清楚。转换大镜像时别中途打断。qemu-img convert没有断点续传CtrlC 之后得到一个半成品qemu-img info看容量是对的但启动起来会各种诡异错误。我现在的习惯是转换大文件都用screen或者nohup挂着跑避免 SSH 断线把它带停。模板文件的两个目录都要放。我遇到过好几次在intel/目录里加了模板界面上死活不显示后来发现当前环境走的是amd/目录。两个都放一份成本几乎为零省心。做完镜像先自己完整跑一遍开关机。关机再开机看看配置有没有丢、启动顺序对不对、网卡数量是不是和模板一致。这一步花五分钟能避免后面实验做到一半环境崩掉重来。我吃过不止一次这个亏——安装完直接就开始搭拓扑跑到一半发现重启后网卡全乱了前面的实验白做。最后分享一个我最近在用的思路把做好的镜像目录整个打包备份一份换宿主机或者重装 EVE-NG 的时候直接解压回去再跑一次 fixpermissions 就能用。整套镜像库的迁移时间从半天压缩到十分钟比什么导出导入工具都靠谱。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表