镜像存储结构

EVE-NG 对不同类型镜像采用不同的存储路径和文件组织方式,理解存储结构是镜像管理的基础。PRO 7.0.1-21 沿用与 v6 相同的目录结构,所有路径保持兼容。

目录规范

镜像类型存储路径文件格式组织方式
IOL(二进制可执行文件)/opt/unetlab/addons/iol/bin/.bin直接存放,一个镜像一个文件
QEMU(虚拟磁盘)/opt/unetlab/addons/qemu/.qcow2 / .img按设备名称建立文件夹,每个设备一个目录
设备模板(节点定义)/opt/unetlab/html/templates/.yml按 CPU 架构分 intel/amd 子目录
设备图标/opt/unetlab/html/images/icons/.png / .svg扁平存放,按文件名引用
配置脚本/opt/unetlab/config_scripts/.sh / .py按模板中 config_script 字段引用

QEMU 镜像目录命名规则

QEMU 镜像的目录名称决定了 EVE-NG 识别镜像的模板前缀。例如:

CODEtext
/opt/unetlab/addons/qemu/├── huawei-ar/│   └── huaweiar.vmdk        # 镜像文件├── fortinet-fgt/│   └── fgt.qcow2            # 镜像文件├── windows-server-2019/│   └── disk.qcow2           # 镜像文件

目录名 huawei-ar 必须与模板文件 huawei-ar.yml 的名称前缀一致,EVE-NG 才能正确匹配。

CPU 架构适配

模板文件按 CPU 架构分为两个子目录:

  • /opt/unetlab/html/templates/intel/ — Intel 系列 CPU 使用
  • /opt/unetlab/html/templates/amd/ — AMD 系列 CPU 使用

EVE-NG 会根据宿主机 CPU 品牌自动选择对应目录下的模板,无需手动指定。

镜像下载

EVE-NG 所有支持镜像均可在 EmulatedLab 论坛的镜像分享区获取。论坛汇聚了社区用户贡献的各类厂商设备镜像,覆盖 Cisco、华为、Juniper、Fortinet、深信服、H3C、锐捷等主流厂商。

镜像版本更新

镜像分享区保持最新版本更新,建议定期查看:https://www.emulatedlab.com/forum.php?mod=forumdisplay&fid=46

镜像下载需要消耗论坛积分,积分通过发帖、回帖、分享资源等方式获取。具体积分攻略:https://www.emulatedlab.com/thread-1371-1-1.html

v7 模板与图标独立更新

v7 起,模板(yml)、图标(png/svg)、配置脚本(sh)可通过 GIT 仓库独立更新,无需升级整个 EVE-NG 系统:

新增设备镜像支持时,官方通常会单独推送模板更新,更新频率约每月一次。

支持的镜像列表

手工导入镜像

手工导入适用于手动管理镜像文件的场景,需要使用 WinSCP 等 SFTP 工具连接到 EVE-NG 进行文件传输。

操作步骤

第一步:传输镜像文件

使用 WinSCP 连接到 EVE-NG 服务器,根据镜像类型上传到对应目录:

  1. IOL 镜像上传

    .bin 文件上传至 /opt/unetlab/addons/iol/bin/ 目录。IOL 镜像通常为 Cisco 二层/三层交换机镜像,文件体积较小(几十 MB)。

CODEtext
/opt/unetlab/addons/iol/bin/├── i86bi_LinuxL2-AdvEnterpriseK9-M_152_May_2018.bin└── i86bi_LinuxL3-AdvEnterpriseK9-M2_157_3_May_2018.bin
  1. QEMU 镜像上传

    QEMU 镜像通常为压缩包格式(如 .zip.tar.gz),需先在本地解压为文件夹,再将整个文件夹上传至 /opt/unetlab/addons/qemu/ 目录。

CODEtext
/opt/unetlab/addons/qemu/├── huawei-ar/│   └── huaweiar.qcow2├── fortinet-fgt/│   └── disk.qcow2└── windows-server-2019/  └── disk.qcow2
  1. 模板文件上传(如需要)

    若下载的镜像包含自定义模板(.yml 文件),需上传至 /opt/unetlab/html/templates/intel//opt/unetlab/html/templates/amd/,根据宿主机 CPU 选择对应目录。

  2. 图标文件上传(如需要)

    若需自定义设备图标,将 .png.svg 文件上传至 /opt/unetlab/html/images/icons/ 目录。

第二步:修复文件权限

镜像文件上传完成后,必须执行权限修复命令,否则节点可能无法正常启动:

TERMINALbash
/opt/unetlab/wrappers/unl_wrapper -a fixpermissions

该命令会自动设置正确的文件所有者、权限和 ACL 策略。

第三步:验证导入结果

在 EVE-NG Web 界面中创建新实验室,尝试添加节点。若镜像已正确导入,对应设备类型将出现在节点选择列表中。

常见问题处理

EID 工具导入镜像

EID 是由 @Guangran 开发的 EVE-NG 镜像管理工具,支持从云端仓库自动下载并导入镜像到 EVE-NG,大幅简化了手工上传的繁琐流程。

详情查看:https://eid.grbj.cn

自定义制作镜像

当官方镜像库中没有特定设备镜像时,可以自行制作。制作过程包括获取原始固件、转换格式、调整参数、测试验证。

制作 QEMU 镜像

第一步:获取设备固件

从设备厂商官网或授权渠道获取适用于虚拟化平台的固件文件。常见格式:

  • .img — 磁盘镜像格式
  • .qcow2 — QEMU 动态增长格式
  • .vmdk — VMware 虚拟磁盘格式
  • .tar.gz / .zip — 压缩包(可能包含多个文件)

第二步:转换镜像格式

使用 qemu-img 工具将原始格式转换为 EVE-NG 兼容的 qcow2 格式:

TERMINALbash
# IMG 转 QCOW2qemu-img convert -O qcow2 input.img output.qcow2# VMDK 转 QCOW2qemu-img convert -O qcow2 input.vmdk output.qcow2# 压缩并转换(节省存储空间)qemu-img convert -O qcow2 -c input.img output.qcow2

第三步:创建镜像目录

在 QEMU 存储路径下为新设备创建目录:

TERMINALbash
mkdir -p /opt/unetlab/addons/qemu/my-device-name

第四步:放置镜像文件

将转换后的 qcow2 文件放入目录,注意文件名约定:

  • 单磁盘:disk.qcow2
  • 多磁盘:disk0.qcow2disk1.qcow2
TERMINALbash
mv output.qcow2 /opt/unetlab/addons/qemu/my-device-name/disk.qcow2

第五步:创建模板文件

/opt/unetlab/html/templates/intel/ 创建模板文件 my-device-name.yml

CONFIG.../templates/intel/my-device-name.yml
---name: My Devicedirectory: my-device-nametype: qemucpu: 2ram: 4096eth: 4console: vncmgmt: someqemu_version: "8.0"

第六步:测试验证

重启 EVE-NG 相关服务后,在 Web 界面创建实验室测试节点启动:

TERMINALbash
/opt/unetlab/wrappers/unl_wrapper -a fixpermissions

镜像格式转换参数说明

参数说明
-O qcow2输出格式为 QCOW2
-c启用压缩,会降低性能但节省存储
-p显示转换进度
-m 8192指定转换时内存缓冲区大小(MB)

常见设备镜像制作示例

华为 AR 路由器镜像制作

TERMINALbash
# 假设原始文件为 ar_images.zip,解压后得到:# - ar2220.tar (可能包含多个组件)# 创建目录并解压mkdir -p /opt/unetlab/addons/qemu/huawei-ar2220tar -xzf ar_images.tar -C /opt/unetlab/addons/qemu/huawei-ar2220/# 转换并压缩(节省约 60% 空间)qemu-img convert -O qcow2 -c huawei-ar2220.img huawei-ar2220/disk.qcow2# 设置权限/opt/unetlab/wrappers/unl_wrapper -a fixpermissions

Fortinet FortiGate 防火墙镜像制作

TERMINALbash
# FortiGate 官方提供 qcow2 格式镜像,可直接使用# 下载 fortios.qcow2 后:mkdir -p /opt/unetlab/addons/qemu/fortinet-fgt60emv fortios.qcow2 /opt/unetlab/addons/qemu/fortinet-fgt60e/disk.qcow2# 创建模板cat > /opt/unetlab/html/templates/intel/fortinet-fgt60e.yml << 'EOF'---name: FortiGate 60Edirectory: fortinet-fgt60etype: qemucpu: 2ram: 2048eth: 6console: vncmgmt: someqemu_version: "8.0"EOF/opt/unetlab/wrappers/unl_wrapper -a fixpermissions

修改和创建镜像模板

模板文件(.yml)定义了 EVE-NG 如何启动和管理某个设备节点,包括分配 CPU 核心数、内存大小、网卡数量、コンソール类型等参数。

模板文件结构

EVE-NG 模板文件采用 YAML 格式,每个模板包含以下核心字段:

字段类型说明示例
name字符串Web 界面中显示的设备名称"Cisco vIOS Router"
directory字符串对应 QEMU 镜像目录名"vios-router"
type字符串引擎类型qemu / iol / dynamips
cpu整数分配 CPU 核心数2
ram整数分配内存大小(MB)2048
eth整数虚拟网卡数量4
console字符串控制台连接方式vnc / telnet / serial
mgmt字符串管理网络接口模式nat / bridge / e1000
icon字符串设备图标文件名router.png
cpu_limit整数CPU 使用上限百分比100
delay整数启动延迟(秒)10
qemu_version字符串QEMU 版本要求(v7 默认 8.x)"8.0"
config_script字符串配置脚本文件名huawei-startup.sh

创建自定义模板

场景:你已上传了一个自定义的华为 AR 路由器镜像,目录为 /opt/unetlab/addons/qemu/huawei-ar2220,现在需要创建模板使 EVE-NG 能够正确识别和启动它。

第一步:创建模板文件

/opt/unetlab/html/templates/intel/ 目录下创建 huawei-ar2220.yml

CONFIG.../templates/intel/huawei-ar2220.yml
---name: Huawei AR2220directory: huawei-ar2220type: qemucpu: 2ram: 4096eth: 4console: vncmgmt: naticon: huawei-router.pngcpu_limit: 80delay: 15

第二步:创建配置脚本(可选)

若需要在节点启动时自动执行配置,可创建脚本文件 /opt/unetlab/config_scripts/huawei-ar2220-init.sh

TERMINALbash
#!/bin/bash# 华为 AR 启动配置脚本# 功能:设置管理接口 IP、加载预设配置echo "Running Huawei AR2220 init script..."# 配置管理接口cat > /tmp/huawei_init.txt << 'EOF'interface GigabitEthernet0/0/0 ip address 192.168.1.100 255.255.255.0 undo shutdownEOF# 将配置推送给节点(通过 serial 或 expect)EOF

在模板中添加 config_script: huawei-ar2220-init.sh 字段引用此脚本。

第三步:上传自定义图标(可选)

若需使用自定义图标,将图标文件(如 huawei-router.png)上传至 /opt/unetlab/html/images/icons/,并在模板中指定 icon 字段。

第四步:验证模板

TERMINALbash
# 重启 EVE-NG Web 服务systemctl restart apache2# 检查模板语法/opt/unetlab/wrappers/unl_wrapper -a check

在 Web 界面创建新实验室,若模板正确加载,你创建的设备类型将出现在”添加节点”列表中。

模板字段详解

cpu(CPU 核心数)

分配给虚拟节点的 CPU 核心数量。增加 CPU 可提升多核路由协议(如 OSPF、BGP)的计算性能,但会占用更多宿主机资源。

资源规划

建议单个节点 CPU 不超过 4 核,总节点 CPU 总和不超过宿主机物理核心数,避免调度竞争导致所有节点性能下降。

ram(内存 MB)

分配给虚拟节点的内存大小。网络设备镜像通常需要:

  • Cisco vIOS/IOL:512MB~2048MB
  • 华为 AR:1024MB~4096MB
  • FortiGate:2048MB~4096MB
  • Windows 虚拟机:4096MB+

eth(网卡数量)

虚拟节点的前置网卡数量。注意:某些设备第一个接口预留给管理,后续接口才是实验可用接口。

设备类型管理接口实验接口
Cisco vIOSManagement0/0GigabitEthernet0/0 起
华为 ARGE0/0/0GE0/0/1 起
FortiGateport1port2 起

console(控制台类型)

说明
vncVNC 图形控制台,Web 界面直接访问
telnet通过 TCP 5999+ 端口连接,需外部终端
serial串行控制台,用于特殊设备

mgmt(管理网络模式)

说明
natNAT 模式,节点通过宿主机转发访问外网
bridge桥接模式,节点直接连接到宿主机网桥
e1000指定网卡驱动类型

cpu_limit(CPU 上限百分比)

限制该节点可使用的宿主 CPU 资源上限,默认 100%(无限制)。设置较低值可以防止单一节点耗尽所有资源。

CONFIG
cpu_limit: 50  # 该节点最多使用宿主 CPU 的 50%

delay(启动延迟秒数)

节点启动指令发出后,延迟指定秒数再执行下一步。某些设备(如 FortiGate)启动较慢,适当增加延迟可避免拓扑启动时序问题。

qemu_version(QEMU 版本要求)

指定该模板需要使用的 QEMU 模拟器版本,确保镜像兼容性。EVE-NG PRO 7.0.1-21 默认内置 QEMU 8.x,部分较老的镜像需要显式指定低版本:

CONFIG
qemu_version: "8.0"   # v7 默认qemu_version: "7.0"   # 部分老镜像需要qemu_version: "6.0"   # 兼容性场景

镜像兼容性判断

当你获取到一个镜像但不确定其模板参数时,可通过以下方法判断:

方法一:检查镜像文件头

TERMINALbash
# 查看 QCOW2 镜像信息qemu-img info /opt/unetlab/addons/qemu/my-device/disk.qcow2# 输出示例:image: disk.qcow2file format: qcow2virtual size: 10G (10737418240 bytes)disk size: 8.5Gcluster_size: 65536Format specific information:    compat: 1.1    lazy refcounts: false    refcount bits: 16    corrupt: false

方法二:查看镜像内的操作系统

TERMINALbash
# 挂载镜像查看分区(需安装 qemu-utils)modprobe nbd max_part=8qemu-nbd --connect=/dev/nbd0 /opt/unetlab/addons/qemu/my-device/disk.qcow2partprobe /dev/nbd0fdisk -l /dev/nbd0# 完成后断开qemu-nbd --disconnect=/dev/nbd0

方法三:参考社区模板库

EmulatedLab 论坛提供了大量预定义模板,可对照设备型号搜索参考模板参数。

模板调试技巧

问题检查项解决方法
节点启动后立即退出cpu / ram 配置过低增加 CPU 和内存分配
节点启动但无网络eth 数量不足检查模板 eth 值是否匹配实际需求
控制台显示黑屏console 类型错误尝试改为 telnetvnc
启动卡在 BIOS镜像格式问题重新转换镜像格式
性能异常低cpu_limit 设置过低检查模板中 cpu_limit 值