☰
PNET导入锐捷镜像完整指南:从格式转换到模板配置避坑
2026/10/1 16:34:03 网站建设 项目流程

搞网络模拟器的人,这几年基本都绕不开 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 -y

raw 转 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/kvm:PNET 自己跑在物理机时,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%,多半是宿主机的虚拟化没开。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询