PNET导入锐捷镜像完整指南:从格式转换到模板配置避坑
搞网络模拟器的人这几年基本都绕不开 PNET 和 EVE-NG 这对兄弟。上个月帮一个合作伙伴做方案预验证客户环境里从接入交换机到出口防火墙全是锐捷我打算先在模拟器里把所有配置流程完整跑一遍再进机房。结果折腾了两个晚上坑踩了不少总算把锐捷镜像导进 PNET并且正常启动、完成交互验证。回头翻了翻网上的教程要么截图过时要么只说了大流程没讲为什么这样弄新手照做大概率还是卡住。所以这篇文章就把完整导入过程、遇到的问题和我自己用的避坑方法整理出来。它适合两类人看一类是刚在 PNET 或者 EVE-NG 上装好环境、想把锐捷设备加进去的工程师另一类是明明已经导入了锐捷镜像但节点起不来、VNC 一直黑屏不知道从哪里排查的兄弟。我会尽量把每一步的“为什么”也讲清楚而不是只丢给你一条命令。1. PNET与锐捷镜像先弄懂这套体系是怎么转起来的1.1 PNET在模拟器圈子里的位置PNET 这个名字国内很多人会写成一个词 PNET Lab其实它和 EVE-NG 一样本质上是一台定制化的 Ubuntu 服务器上面部署了 QEMU、Docker、Dynamips 这些虚拟化引擎然后通过一个 Web 界面统一管理实验拓扑。EVE-NG Pro 要 License社区版功能又砍了不少PNET 就是社区里基于 EVE-NG 架构重新打包的一套 Web 控制台在某些环境里比原版更容易装、更容易用。说到锐捷设备模拟圈子里的主流手段无非是几类GNS3 上挂锐捷固件、H3C 的 HCL 模拟器、以及基于 QEMU 的通用模拟平台。GNS3 支持锐捷设备其实很早但它更偏向路由器和小规模实验拓扑稍大、设备一多进程管理就费劲。HCL 只能模拟自家那套东西和锐捷没关系。真正能把锐捷交换机、路由器、防火墙放进同一个实验环境里和华为、思科、Linux 服务器混布拓扑的还是 EVE-NG/PNET 这类 QEMU 平台。这里需要明确一个底层逻辑PNET 能跑锐捷不是锐捷官方给模拟器做了适配而是因为锐捷的主流设备镜像本身就是跑在 x86 平台上的系统盘QEMU 这种通用虚拟机可以把它们当普通虚拟机镜像来引导。所以导入锐捷镜像这件事本质上就是“把一块虚拟硬盘接进一台 QEMU 虚拟机并让 PNET 认识这个新设备类型”。理解了这一点后面所有报错就都好排查了。1.2 QEMU虚拟机与镜像类型的基本逻辑PNET 设备导入的核心目录在 /opt/unetlab/addons/qemu/QEMU 类型的设备镜像都放在这里面。每一个设备类型就是一个子目录子目录里放磁盘镜像文件。你在 Web 界面拖一个节点出来PNET 实际上是调用了 qemu-system-x86_64 之类的进程把目录下的磁盘文件当作虚拟机硬盘来引导。所以你在镜像目录里看到的东西大致是这样的/opt/unetlab/addons/qemu/ ├── cisco-iosv/ │ └── hda.qcow2 ├── ruijie-s5750/ │ └── hda.qcow2 └── ...目录名、镜像文件名都是后面模板引用的依据。目录名不能有空格不能用中文最好统一小写厂商加型号用短横线连接。镜像文件名我习惯统一改成 hda.qcow2这是 PNET 模板默认找的第一块硬盘文件名。你不按这个走也可以但模板里就要单独指定文件名给自己添麻烦没必要。再说镜像格式。常见的 QEMU 镜像有 qcow2 和 raw 两种qcow2 是 QEMU 的写时复制格式支持按需分配空间文件实际占用通常比虚拟大小小raw 是裸格式简单粗暴但占空间。PNET 的模板和启动脚本一般默认按 qcow2 处理所以拿到镜像后我的建议是无脑统一成 qcow2。这步操作很简单后面会给你命令。1.3 需要准备的环境与工具清单我先把这次导入用到的环境和工具列出来你照着准备基本不会缺东西。项目建议方案说明PNET宿主机独立服务器或VMware虚拟机至少4核8GB内存多开节点时16GB更稳CPU虚拟化BIOS/VMM开启VT-x或AMD-V虚拟机里跑PNET还要开嵌套虚拟化镜像文件锐捷交换机/路由器/防火墙的QEMU镜像后缀是.qcow2或.img都行后面统一转文件传输WinSCP、MobaXterm或scp命令镜像几个GB别用网页上传面板传远程操作Xshell、MobaXterm需要进后台改文件权限和模板浏览器Chrome或Edge最新版VNC控制台依赖WebSocket和弹窗权限工具里最容易忽略的是 CPU 虚拟化。PNET 宿主机如果是 VMware 里的虚拟机必须在虚拟机的 CPU 设置里打开“虚拟化 Intel VT-x/EPT 或 AMD-V/RVI”也就是嵌套虚拟化。不开的话qemu 只能走软件模拟启动一个锐捷交换机可能要五分钟而且 VNC 经常黑屏。很多人导入锐捷镜像失败第一步就死在这个地方。2. 锐捷镜像的获取与预处理2.1 镜像文件长什么样先检查再动手镜像来源我就不展开说了大家手上既然要导入锐捷镜像多半已经通过实验环境、培训资料或者公司测试资产拿到了文件。拿到之后第一件事不是急急忙忙传到 PNET 里而是先在本地 Linux 环境或者 PNET 后台用 file 命令检查真实格式file ruijie-s5750.img常见输出有这几种QEMU QCOW2 Image (v3)是标准的 qcow2 镜像直接能用DOS/MBR boot sector一般说明是 raw 格式镜像虽然 QEMU 也能引导但建议转成 qcow2如果是 gzip 压缩包或者其他虚拟机格式的 vmdk先解压和转换别直接扔进设备目录。我还想强调一点文件后缀是会骗人的。有时候别人分享的文件叫 .img实际上内容是 qcow2有时候文件名是 .qcow2但 file 一看是 raw。PNET 模板和启动脚本通常依赖 qcow2 格式所以统一用 qemu-img info 看一次最稳qemu-img info ruijie-s5750.qcow2输出里重点看file format、virtual size、disk size这三项。virtual size 是镜像“看起来”多大disk size 是实际占用的磁盘空间qcow2 由于按需分配占用空间通常小于虚拟大小。看完这些你心里就有数了。2.2 硬盘镜像的格式转换与磁盘调整如果检查下来镜像不是 qcow2或者你希望把虚拟磁盘尺寸调整一下可以用 qemu-img 工具处理。PNET 宿主机一般自带 qemu-utils没有就自己装apt install qemu-utils -yraw 转 qcow2 的标准命令qemu-img convert -f raw -O qcow2 ruijie-s5750.img ruijie-s5750.qcow2如果本来就是 qcow2只是文件名不规范直接用 mv 改名就行不需要重新转换。转换的时候注意宿主机磁盘空间raw 转 qcow2 本质上是一次完整拷贝目标盘空间不够会直接失败。改完以后我习惯再用 qemu-img check 检查一遍镜像是否完整qemu-img check ruijie-s5750.qcow2再说一个容易被忽略的点锐捷模拟镜像通常只需要一块系统盘默认虚拟磁盘尺寸我觉得 8G 就足够大了。你是要在里面跑网络操作系统不是装 Linux 桌面配置文件很小不需要像普通虚拟机那样扩容到几十 G。如果某些版本引导时提示磁盘空间不足再考虑 qemu-img resize 扩大虚拟容量。但 resize 只是把磁盘声明变大系统内部的分区还要手动扩展这一步对网络模拟来说反而容易把系统搞坏非必要别做。2.3 上传到PNET并规范存放镜像准备到位后用 WinSCP 或者 scp 传到 PNET 的 /opt/unetlab/addons/qemu/ 目录。这里的关键是新建一个符合规范的子目录并把磁盘镜像放进去、按约定命名。我自己在 PNET 上建的结构是这样的/opt/unetlab/addons/qemu/ruijie-s5750/hda.qcow2目录名解释一下ruijie 标识厂商s5750 是设备型号中间用短横线连接不要用空格、不要用中文、不要用点号。设备型号最好和你手上的镜像版本对应比如 rsr20、rsr30 是路由器s5750、s6220 是交换机rg-wall 这类可以建防火墙节点。目录名就是后面 Web 界面识别设备的依据起得规范能省很多事。磁盘镜像的文件名我统一放在目录下并命名为 hda.qcow2。PNET 模板在启动时会按这个默认名找第一块硬盘。上传完成后立刻修权限。QEMU 进程对镜像文件有读取要求如果权限不对节点会一启动就崩溃。执行chown -R root:root /opt/unetlab/addons/qemu/ruijie-s5750/ chmod -R 755 /opt/unetlab/addons/qemu/ruijie-s5750/也有更省事的办法直接在 PNET 后台执行修复脚本/opt/unetlab/wrappers/unl_wrapper -a fixpermissions这个脚本会把 /opt/unetlab 下所有文件权限统一修一遍。注意它依赖目录结构是标准的如果你把镜像放在奇怪的位置跑完脚本再确认一遍设备目录权限没有异常。3. 在PNET中注册锐捷设备模板3.1 Web界面添加模板的操作路径镜像放好只是第一步PNET 的 Web 界面里现在还没有“锐捷交换机”这个设备类型你需要注册一个模板告诉 PNET这个设备叫什么、用哪块镜像、分配多少内存、用几个网口、控制台走 VNC 还是 Telnet。多数版本的 PNET 在 Web 界面登录后左侧菜单里有 Templates 或者“系统→管理模板”之类的入口。不同版本菜单位置略有差异我这边以常见的 PNET 5.x/6.x 界面为例进入 Template 管理页面后选择 QEMU 类型添加一个新模板需要填设备名称、模板 ID、Console 类型、启动参数等。这里我说句实在话Web 界面添加模板在 PNET 某些版本里是残缺的填了名称和参数以后保存完经常发现节点列表里没反应。我在实际项目中更倾向于直接手写模板文件因为模板文件格式可控而且能一次性把多个参数写全、写对。Web 界面的作用反而是用来“验货”的建完以后去节点列表里看名称能不能显示出来。3.2 手写YAML模板文件的方法PNET 的 QEMU 模板文件存放在 /opt/unetlab/html/templates/intel/ 下面每个模板一个 YAML 文件文件名一般和设备类型对应。例如我为 S5750 交换机写的模板文件# /opt/unetlab/html/templates/intel/ruijie-s5750.yml type: qemu name: Ruijie-S5750 description: Ruijie S5750-series switch (QEMU) icon: switch.png category: switch qemu_arch: x86_64 qemu_version: 2.4.0 qemu_machine: pc qemu_cpu: 1 qemu_ram: 512 qemu_hda_disk: 8 qemu_nic: e1000 console: vnc注意不同版本 PNET/EV E-NG 的模板字段可能有差异比如有的版本用 memory 而不是 qemu_ram有的版本要求必须有网口数量字段。我上面这份是参考常见模板结构写的一个可用范例。实际操作时我更建议用另一个不会出错的笨办法在 templates/intel 目录下找一个现成的 QEMU 模板比如 cisco-iosv.yml复制一份改名为 ruijie-s5750.yml然后逐行修改设备名、描述、图标、内存和网口数量。这样做的好处是字段结构一定和当前版本匹配不怕漏字段。改完 YAML 以后回到 Web 界面的 Templates 页面刷新就能看到新增的 Ruijie-S5750 模板。如果你的 PNET 有缓存刷新可能看不到重启一下 Web 服务再试。这里还有个小细节锐捷路由器和防火墙的模板里qemu_ram 要适当调大。路由器 512MB 起步防火墙建议 1GB 到 2GB否则系统起来以后跑策略和会话表会比较吃力甚至直接 OOM 崩溃。3.3 权限修复与基础校验写完模板、放好镜像以后在 Web 界面创建实验、拖入节点、启动之前建议在后台执行一遍权限修复/opt/unetlab/wrappers/unl_wrapper -a fixpermissions然后检查模板文件语法。YAML 是最怕缩进错误的少一个空格都可能让你在 Web 界面里看不到模板或者设备一启动直接报错。可以在后台用 Python 快速校验python3 -c import yaml; yaml.safe_load(open(/opt/unetlab/html/templates/intel/ruijie-s5750.yml)); print(OK)如果这行命令输出 OK说明 YAML 语法没问题。输出报错就说明模板文件写错了根据错误信息去改。另外还要确认镜像文件名和模板字段对得上。模板里有 qemu_hda_disk: 8 这个字段时PNET 会到对应设备目录找 hda.qcow2如果找不到节点会在启动瞬间退出。我建议把目录里的镜像用 ls -lh 看一眼确认文件名确实是 hda.qcow2且大小不是 0 字节。4. 建拓扑、启动设备与连通性验证4.1 创建实验并拖入锐捷节点现在到了比较爽的一步打开 PNET 的 Web 界面新建一个实验在左侧设备列表的 Switch 分类或者你刚刚定义的分类下找到 Ruijie-S5750把它拖到画布上。拖入节点后先别急着右键启动。检查一下节点属性里的网口数量是否满足你的拓扑需要。锐捷交换机一般给 5 到 8 个口路由器给 4 个口防火墙给 8 个口。给的多了没必要因为每多一个网卡QEMU 进程就多一份开销。我的操作习惯是先把拓扑里所有节点拖齐用连线连好以后再统一启动。原因是 PNET 的 QEMU 节点支持热添加网卡但热添加以后设备内部接口编号不一定连续而且有的网络操作系统对热插拔识别不友好。相反一次性把所有网卡带起来再启动设备接口编号稳定很多后续配置不会出幺蛾子。这个过程和你平时用 GNS3 拖设备其实很像只是 PNET 对 QEMU 设备的管理更集中所有节点状态都在一个 Web 界面里就能控制。4.2 启动后如何确认设备真正起来了点启动以后节点状态会从 STOPPED 变成 RUNNING但 RUNNING 不代表系统引导成功。这里有个很容易踩的坑很多新手以为 RUNNING 就是能连了结果双击节点一片黑屏就开始怀疑镜像有问题。我的判断方法是打开 VNC 窗口后保持不关去后台执行进程检查命令ps -ef | grep qemu只要看到对应 qemu 进程还在说明虚拟机在跑耐心等一会儿。锐捷交换机和路由器的启动时间通常在 30 秒到 2 分钟第一次启动由于磁盘缓存没预热可能更慢。如果进程已经退出说明引导直接失败去查看 /opt/unetlab/tmp/ 下的日志或者检查模板参数。还有一种情况VNC 显示 BIOS 里的 Boot failed 或者 No bootable device那基本就是镜像文件或者磁盘命名问题和模板本身无关。顺带说一句双击节点后 VNC 窗口一片黑也不一定代表系统没起来。设备可能还在 BIOS 引导或内核加载阶段保持窗口别关等它自己跳转。这里和网上一些资料说的“看到黑屏就是失败”不一样我还是建议先看进程再下结论。4.3 锐捷基础CLI配置与连通性测试设备起来之后进入 VNC 控制台会看到锐捷设备经典的提示符。锐捷交换机的命令行和思科非常接近写过思科的人上手很快。下面是这次实验里我常用的一段最小配置Ruijie enable Ruijie # configure terminal Ruijie (config)# hostname SW1 SW1(config)# vlan 10 SW1(config-vlan)# name office SW1(config-vlan)# exit SW1(config)# interface vlan 10 SW1(config-if-VLAN 10)# ip address 192.168.10.254 255.255.255.0 SW1(config-if-VLAN 10)# exit SW1(config)# interface GigabitEthernet 0/1 SW1(config-if-GigabitEthernet 0/1)# switchport mode access SW1(config-if-GigabitEthernet 0/1)# switchport access vlan 10配置完以后我在拓扑里加了一个 Linux 云主机节点把云主机接到 SW1 的 GigabitEthernet 0/2 上云主机配 192.168.10.1/24然后从 SW1 ping 这台主机SW1# ping 192.168.10.1能通说明锐捷交换机节点不仅起来了二层转发也正常。这一步很重要很多人导镜像只验证到“能进 CLI”但三层二层转发是否正常完全不知道直到真正架上拓扑才发现问题。我建议所有朋友导入完镜像以后都亲自跑一次最小连通性测试别跳过。这个习惯在以后排查真实网络问题时会帮你区分“模拟器问题”和“配置问题”。5. 高频问题排查与锐捷命令速查5.1 启动失败类问题排查表这一部分是我觉得整篇里最有价值的因为镜像导入在网上能搜到一堆方法但真正让你崩溃的往往是各种奇怪的报错。下面按我自己踩坑的经验整理成一张排查表。你会发现这类问题和 HCL 模拟器设备启动失败、GNS3 里外部设备起不来是同一大类要么宿主虚拟化有问题要么镜像本身没适配好。现象可能原因解决办法节点启动后瞬间变STOPPED模板字段缺失或镜像路径不对后台ps -ef看qemu进程检查模板字段和hda.qcow2是否在对应目录VNC黑屏且qemu进程一直存在设备启动慢或显卡/串口输出被模板关闭等待1到2分钟确认模板console为vnc用telnet控制台测试VNC显示Boot failed/No bootable devicehda.qcow2命名不对或镜像其实不是引导盘检查文件名用qemu-img info确认格式启动后一直循环在BIOS界面qemu_machine或CPU类型选错把qemu_machine改为pc关掉多余的硬件虚拟化参数节点启动极慢宿主机没开嵌套虚拟化检查/dev/kvm没有则开启VM模拟器的CPU虚拟化引擎网口数量不对模板nics字段没设或设少了修改模板网口数量重启节点双击节点VNC弹不出来浏览器弹窗被拦截检查浏览器弹窗拦截设置把PNET地址加入白名单表格里几项需要单独展开。第一个是 /dev/kvmPNET 自己跑在物理机时KVM 默认就有如果 PNET 是 VMware 里的虚拟机需要在 VMware 的 CPU 设置里开启嵌套虚拟化否则 qemu 只能用软件模拟启动一个节点要五分钟都有可能开机也会比正常慢很多。第二个是控制台连接PNET 的 VNC 端口是按节点动态分配的如果 Web 界面双击打不开还可以通过后台查看节点获取的端口号然后用 VNC Viewer 手动连接。这个办法适合 Web 端 WebSocket 有问题但节点已经在跑的情况。5.2 界面与连接类问题排查Web 界面打不开是最先可能遇到的。装完 PNET 后访问 http://PNET的IP/如果页面空白或者 502多半是 nginx 服务没起来。后台执行 systemctl status nginx 或者 service nginx status 看一眼服务没启动就手动拉起来。这种情况常见于虚拟机重启后服务抢占顺序出问题或者镜像文件权限异常导致 Web 服务崩了。另一个常见问题是镜像导入以后Web 界面设备列表里显示两个相同的锐捷设备或者显示不出来。重复显示通常是模板文件重复你把重复的 YAML 文件清理掉再刷新就行显示不出来大概率是 YAML 语法错误回到 3.3 里的 Python 校验命令跑一遍基本能找到问题。还有个别版本对中文浏览器支持不好建议用 Chrome/Edge 的默认语言环境避免因为插件导致 WebSocket 建立失败。5.3 锐捷交换机/路由器/防火墙常用命令速查镜像导入只是开头真正用起来还是要会配锐捷的命令。这里把实验里最常用到的命令整理一份速查表给还不太熟悉锐捷命令风格的朋友。设备类型常用命令说明交换机enable / configure terminal进入特权/配置模式交换机show version查看系统版本与设备型号交换机show vlan查看VLAN信息交换机show mac-address-table查看MAC表排查二层连通性交换机interface vlan 10进入SVI接口配三层网关交换机ip dhcp pool vlan10配置DHCP地址池需先开service dhcp路由器show ip route查看路由表路由器ip route 0.0.0.0 0.0.0.0 下一跳配置静态默认路由防火墙security zone trust配置安全域把接口划入域防火墙policy rule 10配置安全策略匹配源和目的域锐捷的 DHCP 配置有个小坑。有些版本要先在全局开启 service dhcp再创建地址池否则地址池建了不生效。命令行如下Ruijie(config)# service dhcp Ruijie(config)# ip dhcp pool vlan10 Ruijie(dhcp-config)# network 192.168.10.0 255.255.255.0 Ruijie(dhcp-config)# default-router 192.168.10.254 Ruijie(dhcp-config)# dns-server 114.114.114.114 Ruijie(dhcp-config)# lease 1 0 0防火墙设备RG-WALL 系列和交换机的命令差别更大一点配置逻辑偏向安全域加安全策略先配接口地址再把接口划进 trust/untrust 域最后用 policy rule 放行流量。模拟器里调试防火墙时最容易出错的是忘记配置域间策略导致同一条流量从 trust 到 untrust 被默认拒绝VNC 里敲 show session 又看不到明显报错这种情况下去检查安全策略多半就是它。还有一个细节锐捷设备查看接口类型时命令是 show interfaces status可以看到每个接口是电口还是光口以及协商状态。这个在模拟器里意义不大但真机上很实用这里提一句省得大家来回找命令。6. 一些实践心得与额外建议最后说点我个人的体会。很多人喜欢找什么 PNET 懒人版就是那种下载下来直接带几百个镜像、打开就有思科锐捷华为设备的整合包。我自己其实也下载过结论是懒人版适合刚接触模拟器、想快速看到效果的初学者但真正做项目预配置、做实验教学我强烈建议自己手动导入锐捷镜像。原因是懒人版里的锐捷镜像版本往往很旧有些甚至是几年前的测试版和客户现实环境的版本差异太大测试出来的特性行为容易误导决策。而且懒人版经常捆绑了奇怪的模板配置加节点时报错你都不知道从哪里查起。手动导入看起来多花二十分钟但每一条命令、每一个模板字段你都亲手验证过后面出问题你知道去哪找原因。这个道理和做网络运维是一样的越黑盒的解决方案出问题时越难受。我后来每次新装 PNET都会把锐捷导入流程重新走一遍相当于给自己留一个可复现的操作清单比临时翻文档高效得多。再分享一个我常用的扩展做法锐捷设备在 PNET 里导好后不要只跑纯二层实验。我经常把锐捷交换机和 KVM 里的 Linux 服务器、还有 PNET 的云桥Cloud接起来模拟一个完整的三层园区网再在出口放一台锐捷防火墙做 NAT 和安全策略。因为 PNET 对 Docker 和 QEMU 结合得很好这种混合拓扑比纯 CLI 敲命令有说服力得多演示给同事或客户看也直观。如果你准备做无线相关的实验还可以尝试导入锐捷无线控制器的镜像配合模拟 AP 做集中管理。不过无线类镜像对 QEMU 的虚拟网卡模型比较挑启动后接口反复 flapping 的情况我也遇到过建议先确认模板里的 qemu_nic 参数再动手不要一上来就堆一堆无线节点。这次导入流程我已经完整跑通后面如果有新的锐捷镜像版本我大概率会沿用这套流程来导入唯一要变的只有模板里的设备型号、镜像文件名和内存大小。希望这篇文章能帮你省下我之前踩坑的那两个晚上。遇到启动问题先从镜像格式、目录命名、模板字段这三个地方查90% 的坑都在这三处剩下 10%多半是宿主机的虚拟化没开。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →