ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

EVE-NG加载qcow2镜像完全指南:从上传到排错

EVE-NG加载qcow2镜像完全指南:从上传到排错 玩EVE-NG的人十有八九都会遇到这个场景从厂商官网或者某个渠道下载了一个.qcow2文件满心欢喜地传到EVE-NG服务器上结果打开Web界面一看设备模板列表里根本没有它就算手动指定节点也起不来报一堆看不懂的错。这问题我第一回折腾的时候结结实实耗了一整个晚上最后发现居然是文件名大小写不对。EVE-NG作为目前用得最顺手的网络模拟器之一几乎所有跑在KVM上面的设备镜像最终都要以qcow2磁盘格式出现在/opt/unetlab/addons/qemu目录下才能被识别、被拉起。很多人第一次拿到一个qcow2文件时都会懵丢进服务器不行界面里找不到网上的教程又只讲一半。这篇文章就把我这些年添加、排错、优化qcow2镜像的完整流程和坑点全部摊开。适合两类人一是刚开始用EVE-NG做实验、手头有个qcow2却不知道怎么挂上去的新手二是经常帮团队维护EVE-NG环境、需要批量导入和管理镜像的仿真工程师。看完你会明白镜像加载的背后逻辑也能自己动手搞定各种稀奇古怪的qcow2文件。1. EVE-NG加载qcow2镜像的核心机制与前置认知很多人以为“新增镜像”就是把文件传到服务器这么简单其实EVE-NG对镜像的识别有一套自己的规则。不理解这套规则后面所有的操作都是盲人摸象。1.1 EVE-NG本身到底是怎么跑起一个qcow2镜像的EVE-NG的底层是QEMU/KVM虚拟化前端是一套Web管理界面。当你拖一个节点到拓扑里EVE-NG做的事情本质上是执行一条QEMU命令把/opt/unetlab/addons/qemu/目录下某个qcow2磁盘文件当成虚拟机硬盘启动起来。所以qcow2文件并不是“被安装”进EVE-NG的它只是VM的磁盘镜像。这么说可能还是有点抽象换个类比EVE-NG像一个酒店前台qcow2镜像像是拖着行李来入住的客人。酒店前台要接待客人得知道客人住哪个房间镜像目录名、行李箱上贴的名字对不对得上磁盘文件名、给客人安排几号房型的配置模板参数。这几样缺一不可否则客人就只能站在大厅里干瞪眼。EVE-NG扫描镜像的方式也非常简单粗暴每次刷新拓扑页面时它会去遍历/opt/unetlab/addons/qemu/下面的子目录把每个子目录识别成一个可用的“镜像”。你没看错是目录不是文件。EVE-NG根本不关心qcow2文件本身叫什么它只认目录名和后缀规律。这就解释了为什么很多人把镜像文件直接传到addons目录下设备列表里却什么都没有——因为文件根本没放进正确的子目录里。这就引出了我要讲的第一条核心规则qcow2镜像必须放在/opt/unetlab/addons/qemu/镜像目录名/目录内EVE-NG才会扫描到它。目录名建议用全小写字母、数字和下划线比如qemu-cisco-iosxr、qemu-fortinet-fgt。目录名就是你后续在Web界面里识别这个镜像的唯一标识起得不好后面看着都头疼。1.2 一个qcow2镜像要被EVE-NG正常拉起必须满足的四个条件结合上面的酒店类比我把这些年总结的四个必要条件列出来任何一个不满足节点都起不来或者起得不正常。目录名规范镜像必须位于/opt/unetlab/addons/qemu/下的独立子目录内目录名建议小写字母、数字、下划线组合EVE-NG在Web界面中添加节点时会把目录名展示出来供你选择。内置磁盘文件名固定目录内部的qcow2文件必须重命名为EVE-NG默认寻找的名字最常见的是hda.qcow2对应IDE/SATA磁盘、virtioa.qcow2对应virtio磁盘。EVE-NG不会自动去“找”目录里那个乱七八遭的原始文件名它只会按模板里写死的磁盘文件名去找。很多启动失败的案例最后都是死在文件名上。文件权限正确EVE-NG启动QEMU时是以独立用户身份运行的如果文件权限过高或过低导致QEMU进程无法读取磁盘文件节点就会启动失败。这个通过EVE-NG自带的修复脚本一条命令就能解决后面细说。模板配置匹配镜像所属的模板.yml文件决定了CPU架构、内存、网卡数量、启动参数、console类型等。EVE-NG也有“未分类”的通用启动方式但要跑得稳还是得针对镜像写模板尤其是那些对QEMU参数有特殊要求的设备。这四个条件拆开看都不复杂但叠加在一起就会出各种幺蛾子。我自己见过的至少有一半“镜像添加失败”问题都是卡在第二和第三个条件上。1.3 先分清你手里的镜像到底是哪种“动物”拿到一个qcow2文件后别急着上传先花30秒搞清楚它是什么类型的镜像。这直接决定了后面该用哪套方案。绝大多数网络设备镜像比如Cisco、Juniper、Fortinet、Palo Alto、华为、H3C厂商的虚拟化形态产品大多是单磁盘镜像一个qcow2文件就是一个完整的系统盘。这种最简单直接改名丢进去就能用。还有一小部分特殊设备比如某些版本的vSRX、vMX会附带一个独立的日志盘或数据盘这时候就要创建hda.qcow2和hdb.qcow2两个文件在模板里分别指定主盘和副盘。另外还要区分你手里文件的实际磁盘格式。虽然标题写的是qcow2但网上经常下到名不副实的东西——文件后缀是.qcow2实际上是个raw格式或者从别的模拟器里导出的是vmdk、vhd格式。这种情况不能直接丢给EVE-NG需要用qemu-img convert转成真正的qcow2格式顺便还能压一下体积。判断格式最稳的办法就是登上EVE-NG服务器在镜像所在目录执行file命令和qemu-img info命令结果一目了然。2. 镜像上传前检查与准备流程这一节讲的是“动手之前先动脑”。很多人一拿到镜像就急着往服务器里传结果传到一半发现磁盘满了、格式不对、文件损坏白白浪费几个小时。花几分钟做好检查后面能省下大量返工时间。2.1 用qemu-img检查镜像格式和完整性假设你已经把qcow2镜像下载到了本地电脑上第一件事不是上传而是先用本地工具或者EVE-NG服务器上的工具确认三件事真实格式、是否损坏、虚拟磁盘大小。在Windows本地可以装一个QEMU测试工具包或者在Linux环境里直接执行qemu-img info /data/images/MyRouter.qcow2输出大概长这样image: MyRouter.qcow2 file format: qcow2 virtual size: 8 GiB (8589934592 bytes) disk size: 1.2 GiB cluster_size: 65536重点看file format字段必须是qcow2。如果显示raw、vmdk那就是格式不对需要转换。virtual size表示虚拟机内部看到的磁盘大小disk size是实际占用的物理磁盘空间两个值差异越大说明镜像的稀疏特性越好、越适合上传。接着做一次完整性检查qemu-img check /data/images/MyRouter.qcow2如果输出末尾出现No errors were found on the image说明文件结构没问题。如果有报错或者Leaks之类的提示建议重新下载文件不要拿一个有坏块的镜像硬上后面启动到一半崩溃排查起来更痛苦。2.2 从GNS3或其他平台迁移镜像时的注意事项聊一个高频场景很多人之前在GNS3里用某款设备转到EVE-NG之后想把镜像也带过来。这个思路完全可行绝大多数GNS3镜像就是一个标准的qcow2文件EVE-NG是能直接用的但有几个细节必须处理。GNS3镜像的文件名通常保留着设备型号比如c7200-adventerprisek9-mz.124-25d.image这种是旧式IOS镜像不在讨论范畴但如果是vios-adventerprisek9-m.156-3.image.qcow2或者linux-ubuntu-desktop.qcow2这类文件它就是标准的QEMU磁盘镜像。迁移时你要做的就是把文件放到EVE-NG的镜像目录里并改名为hda.qcow2。这里有个容易踩的坑GNS3默认的镜像往往没有做过权限归一化文件所有者可能是你本地的普通用户传到服务器上后QEMU进程可能没有读取权限。所以从GNS3迁移过来的镜像上传完成后一定要执行权限修复命令不要想当然地觉得chmod 777就万事大吉。EVE-NG自己维护了一套用户和目录权限体系乱设权限反而可能引发其他问题。有少数GNS3设备镜像是给特定QEMU版本调优过的比如加了-cpu core2duo或者-machine pc-i440fx-2.1这类参数直接拿到EVE-NG上跑会启动异常。遇到这种情况别急着怀疑镜像坏了先去查设备官方文档或论坛看看有没有人分享过EVE-NG适配参数按参数去补模板。2.3 上传大镜像到EVE-NG的推荐姿势当前网络设备镜像动辄2GB到8GB上传环节很考验耐心也考验姿势。我推荐的做法是先传到/tmp目录再移动到addons目录。原因有两个一是避免上传中断导致addons目录底下留一个残缺的半文件影响EVE-NG扫描二是可以先在/tmp里对文件做一次qemu-img convert压缩或格式转换处理完了再移动。直接在目标目录里处理大文件万一中断EVE-NG扫到一个不完整的目录会报各种莫名奇妙的错误。上传工具我习惯用SCP命令行简单可靠scp /data/images/MyRouter.qcow2 rooteve-ng-ip:/tmp/EVE-NG默认SSH端口是22如果改过端口就加-P port参数。如果你更喜欢图形化WinSCP和FileZilla都行但注意在传输大文件时把连接类型选成SCP而不是SFTP有些EVE-NG老版本上SFTP传输大文件容易断。有条件的可以开压缩qcow2镜像本身已经是压缩过的再压意义不大但如果你是在本机先把raw转成qcow2再传传输时间会少很多。2.4 磁盘空间检查与分区规划建议这是一个特别容易被忽略但一旦忽略就必炸的环节。EVE-NG一般安装在Ubuntu服务器上很多人装系统时顺手就把/分区划了50GB等到要放镜像才发现空间不够。一个完整的实验拓扑光镜像就可能占掉20GB到40GB。上传之前先看一眼分区使用情况df -h /opt如果/opt所在分区剩余空间不足镜像大小的1.5倍宁可先扩充分区再传也别硬塞。为什么是1.5倍因为你的镜像放进addons目录之后实际运行时QEMU还会产生快照、临时文件等额外开销启动过程中写临时数据也是占空间的。如果你打算长期用EVE-NG做各种厂商设备实验我强烈建议把/opt独立分区容量至少给到200GB或者干脆把/opt/unetlab/addons目录做成一个独立的挂载点指向一个大容量数据盘。这样后续换系统、升级版本镜像目录可以单独保留不用跟着系统盘一起被格式化。我自己吃过一次亏重装EVE-NG没备份镜像结果几十GB的实验资产一夜清零从那以后我都是把镜像目录单独挂载到大存储上。3. 完整实操qcow2镜像从上传到成功启动前面铺垫了那么多原理和准备这节是正经的实操环节。我会按我平时添加镜像的顺序一步步走完整流程每个步骤都解释为什么这么做这样你照着操作的时候心里有数。3.1 在服务器上创建镜像目录并规范命名假设你已经通过SCP把镜像文件传到了/tmp/MyRouter.qcow2接下来SSH登录到EVE-NG服务器ssh rooteve-ng-ip然后创建一个专属镜像目录。目录名建议用下面的格式qemu-厂商-型号比如mkdir -p /opt/unetlab/addons/qemu/qemu-fortinet-fgt目录名为什么要这么起主要是可读性和唯一性。EVE-NG在Web界面里添加节点时会把这个目录名显示为“镜像文件”或“模板”选项如果你起名叫a1或者test过一个月再回来用自己都认不出这是哪个设备。虽然模板文件里可以设置一个更友好的显示名称但目录名仍然会出现在某些界面上所以还是从一开始就规范点。另外提醒一句EVE-NG默认不会把目录名里的-和_做特殊转换但中文、空格、特殊符号是坚决不要用的。老版本EVE-NG对中文目录名的支持极差轻则显示乱码重则节点创建失败。3.2 把qcow2文件重命名为EVE-NG能认的固定文件名这是整个流程里最啰嗦但最不能省的一步。把上传到/tmp的镜像移进目标目录顺便改名为hda.qcow2mv /tmp/MyRouter.qcow2 /opt/unetlab/addons/qemu/qemu-fortinet-fgt/hda.qcow2为什么是hda.qcow2这要回到EVE-NG生成QEMU启动命令的逻辑。EVE-NG默认把第一个磁盘设备定义为IDE接口QEMU里IDE设备名的传统写法就是hda、hdb。当模板没有额外指定磁盘类型时EVE-NG会去找hda.qcow2这个文件。如果你需要给虚拟机加第二块IDE硬盘就放hdb.qcow2第三块是hdc.qcow2以此类推。如果你的模板里把磁盘类型指定为virtio那么第一个磁盘文件名就要改成virtioa.qcow2。但这种情况相对少见EVE-NG官方模板大多默认IDE所以绝大多数场景下hda.qcow2就是最稳的选择。我自己的习惯是凡是拿不准该用哪个名字的镜像一律用hda.qcow2然后用EVE-NG的“未知模板”去启动等确认能跑起来再细调模板。这里有一个新手经常犯的错把原始目录整个mv进去导致路径变成/opt/unetlab/addons/qemu/qemu-xxx/MyRouter.qcow2/也就是把qcow2文件又套了一层目录。EVE-NG扫描到这个目录后会认为这是一个没有hda.qcow2的空镜像启动时直接报文件找不到。解决办法很简单确认路径确保qcow2文件是镜像目录的直接子文件而不是再嵌套一层。3.3 修复权限不做这一步节点基本起不来文件放好了名字也对但这时候直接去Web界面创建节点大概率会失败因为权限不对。EVE-NG的QEMU进程以unetlab用户身份运行你刚从/tmp移动过来的文件所有者是root而且可能没有开放读权限给其他用户。用EVE-NG自带的权限修复脚本一键搞定/opt/unetlab/wrappers/unl_wrapper -a fixpermissions这个命令会遍历/opt/unetlab下的所有文件把目录和文件的属主、权限统一调整为EVE-NG运行所需的状态。执行完之后可以用ls -l确认一下ls -l /opt/unetlab/addons/qemu/qemu-fortinet-fgt/正常情况下文件权限应该是-rw-r--r--644或者-rw-r--r--加特殊标记所有者是root但其他用户可读这样QEMU才能读盘。需要强调一点很多教程让用户执行chmod 777来“解决问题”这是非常不推荐的做法。EVE-NG对目录权限有严格要求/opt/unetlab下面有些目录在运行时会动态生成临时文件权限设得过宽松反而会引起其他安全隐患和奇怪的报错。凡是权限问题一律走官方脚本修复简单又不会错。3.4 在Web界面创建节点并选择镜像权限修复完后回到EVE-NG的Web界面。在拓扑画布里右键选择“Add a new node”添加节点在弹出的窗口里找到设备模板列表。如果你的镜像没有对应的专属模板它一般会出现在QEMU分类下名字就是你在3.1里创建的目录名。选中这个镜像给它起个节点名分配CPU和内存。这里有个经验值可以参考普通路由器镜像1到2核CPU、1GB到2GB内存就够跑防火墙类镜像建议2核加4GB内存起步如果是带图形界面的Linux镜像内存给到4GB以上体验才流畅。EVE-NG里的“CPU”是vCPU不是你物理机的核心数但同一台物理机上跑的节点多了CPU超分太狠会影响性能所以别无脑给太高。创建完节点后在拓扑里选中它点工具栏上的“Start”按钮启动。启动的过程其实就是EVE-NG在后台执行qemu-system-x86_64命令把你的hda.qcow2挂上去运行。点击节点图标上的“Console”或者“VNC”按钮就能看到虚拟机的启动画面。如果一切顺利你会看到设备正常引导进入系统登录界面到这一步镜像就算是成功加进来了。3.5 手动编写模板让设备名优雅地出现在列表里用“目录名”方式添加的节点能用但不足之处很明显Web界面上显示的设备名就是你起的目录名而且默认的QEMU参数可能不适合这个设备。想让设备以一个优雅的名称出现在“Cisco”“Fortinet”等分类下并且预设好CPU、内存、网卡数量和启动参数就需要手动编写一个模板文件。模板文件的存放路径是/opt/unetlab/html/templates/每个模板是一个.yml文件。最简单的做法是复制一个现有模板做修改cp /opt/unetlab/html/templates/vios.yml /opt/unetlab/html/templates/myrouter.yml然后用vim编辑它把关键字段改掉。一个典型的EVE-NG QEMU模板长这样type: qemu name: MyRouter description: 自定义路由器镜像 icon: Router.png category: router qemu_ver: 6.2.0 console: telnet qemu_arch: x86_64 cpu: 2 memory: 2048 eth: 8各个字段的含义不难理解name是设备在Web界面上显示的名字icon是图标文件名对应/opt/unetlab/html/images/里的图标资源category决定它出现在左侧工具栏的哪个分类console指定是走telnet还是VNCcpu和memory是对虚拟机的初始CPU和内存分配eth是网卡数量。改完保存后不需要重启EVE-NG服务回到Web界面清一下浏览器缓存再刷新拓扑页面就能在设备列表里看到这个新模板了。有些EVE-NG版本右上角有“Settings → Clear cache”按钮也可以用。需要提醒的是不同版本EVE-NG的模板字段名可能有细微差别复制现有模板来改是最稳妥的方式不要照着我这个示例硬套到老版本上。老版本比如EVE-NG 2.0.3-112和2.0.5-94模板字段会略有出入以你实际版本里现有的模板字段为准。3.6 特殊镜像的模板调优UEFI启动与额外QEMU参数大部分设备镜像用默认QEMU参数就能跑起来但有少数镜像对启动方式有特殊要求。比如某些新版本的路由器镜像需要UEFI引导默认的SeaBIOS启动方式会直接卡在引导界面还有些镜像对CPU型号、机器类型有要求启动时报KVM: entry failed或者直接崩溃。针对这些需求EVE-NG模板里可以通过qemu_options字段透传额外的QEMU启动参数。举个例子qemu_options: -machine q35 -bios /usr/share/OVMF/OVMF_CODE.fd这行配置的意思是让QEMU用q35机器类型并使用UEFI固件启动。不同镜像需要的参数不同建议以设备厂商的官方部署文档为准。有时候这类参数也能在Web界面的节点属性里临时加上去但为了长期稳定复现还是写在模板里更省心。另外如果镜像需要不止一个磁盘比如数据盘那就需要在模板里指定磁盘数量并在镜像目录里放置对应的hdb.qcow2。我自己在调一款带独立日志盘的防火墙镜像时就碰到过这种情况当时不熟悉模板字段折腾了很久才明白EVE-NG默认只创建一个磁盘设备第二个磁盘不声明模板是不会自动挂载的。4. 常见问题排查与三年实测避坑记录这节算是整个教程的“售后部分”。下面这些问题都是我在实操中真实遇到过的或者帮别人排查时经常见到的。我按现象、原因、解法三列整理成速查表方便你对照排查。4.1 镜像启动问题速查表现象可能原因解决办法节点启动后一直处于“Stopped”状态忘记执行权限修复命令执行/opt/unetlab/wrappers/unl_wrapper -a fixpermissions启动报错提示找不到hda.qcow2磁盘文件名不对或文件路径多了一层嵌套目录检查文件路径将qcow2文件直接命名为hda.qcow2放在镜像目录下终端画面停在海报页或黑屏镜像引导方式需要UEFI或console类型选择错误在模板里加qemu_options指定UEFI固件切换console类型为VNC或telnet节点启动成功但接口数量不对模板里eth字段设置得太少修改模板eth数量并重新创建节点启动极慢或启动后操作卡顿物理机资源不足或qcow2镜像碎片化严重减少同时运行的节点数用qemu-img convert整理镜像Web界面添加节点时看不到新镜像模板缓存未刷新或镜像目录没被正确扫描到清除浏览器缓存检查目录是否存在且权限已修复从GNS3迁移过来的镜像启动就报错原始镜像针对不同QEMU版本做了参数调优查阅设备文档在EVE-NG模板里补充对应QEMU参数4.2 一个真实的排查复盘从启动失败到找出问题有一次我给EVE-NG加一个vSRX镜像过程看似一帆风顺创建目录、放文件、改权限、刷页面、加节点。结果一启动节点状态秒变“Stopped”点开详情页没有明显报错。我去看EVE-NG的节点日志路径一般是/opt/unetlab/tmp/0/拓扑ID/下的wrapper.log和qemu.log。打开一看里面写着一行关键错误drive file/opt/unetlab/addons/qemu/qemu-vsrx/hda.qcow2 could not open (No such file or directory)。但我明明确认过文件就在那里。后来用ls -l仔细看才发现文件名是HDA.qcow2大小写不一样。这个文件是从某论坛下载的原始镜像里自带的文件名就是大写的HDA.qcow2我mv的时候只改了目录名没改文件名。Linux是大小写敏感的系统EVE-NG找的是小写的hda.qcow2自然找不到。改成小写后节点秒起。这个案例的教训是所有看起来“玄学”的启动失败90%都能在日志里找到答案。遇到问题先看日志不要凭感觉瞎试。4.3 镜像占用空间太大用qemu-img convert给镜像瘦身很多qcow2镜像下载下来都是“虚胖”的虚拟磁盘标称8GB实际文件可能也是8GB因为发布者没有对镜像做收缩。这时候用qemu-img convert重新转换一次可以大幅压缩体积。qemu-img convert -c -O qcow2 /opt/unetlab/addons/qemu/qemu-xxx/old.qcow2 /tmp/new.qcow2-c参数表示压缩-O qcow2表示输出格式。转换完成后再把新文件移回镜像目录覆盖原文件。这个操作本质上是重写一遍qcow2的元数据把未使用的块标记为空压缩之后文件体积常常能缩减50%以上尤其是那些安装完系统后没用多久的镜像。但要注意一点这个操作必须在设备关机状态下进行不能在EVE-NG节点运行时对正在使用的镜像文件做转换否则会导致磁盘数据损坏。转换前最好先备份原镜像虽然少见但转换过程中如果发生断电、磁盘满等意外原文件可能就废了。4.4 录一段我的个人体会镜像管理工作流的建议折腾了三年EVE-NG我最大的体会是镜像管理这事一开始就规划好目录结构和命名规范能省掉后面无数麻烦。我现在的做法是每个厂商一个独立目录里面再按版本细分子目录比如/opt/unetlab/addons/qemu/qemu-cisco-iosxr/7.3.2/需要切换版本时直接改目录名或者软链接指向当前要用的版本。配合写一个简单的备份脚本定期把addons目录下自定义的镜像打包存到NAS或者移动硬盘既不怕系统重装也能在同事之间快速复制环境。另外还有个小技巧如果你要添加的镜像其实只是某个现有模板的“换壳版”比如同一款设备的两个版本镜像但又不想让Web界面里出现一堆重复模板可以把第二个版本的目录放到同一个模板目录下EVE-NG会在你创建节点时让你选择具体用哪个目录名这样界面清爽设备版本管理也清晰。这个做法在社区版和Pro版里都适用我自己一直在用。
返回列表