GNS3 是一个免费自由开源的网络模拟器(全称 Graphics Network Simulator),可以搭建模拟的网络拓扑并在其中运行虚拟的网络设备进行实验。VyOS 是一个开源的 Linux 发行版,组合 Linux 与一组软件包,构成一个路由器平台,还提供了一个(听说长得像 Juniper 的)CLI 界面用于中心管理整个系统。自然,GNS3 可以方便地实验与学习 VyOS。
然而,VyOS 在近几年大幅度变更授权模式,虽然最新的源代码仍是开放的,但所有的稳定 LTS 版本均不再免费开放任何源代码与二进制文件。要获取 LTS 版本必须购买一个(相当昂贵)的授权,而能免费获取到的只剩下滚动更新的 rolling release 与半年一发布,且没有经过广泛测试的 VyOS Stream 这两个版本的源代码包与 iso。另外,曾经(以及现在对于付费用户)VyOS 的预编译二进制包除了普通的通用 ISO,还包括了虚拟机镜像,例如此处在 GNS3 中可以使用的 QEMU qcow2 镜像,而在现在的授权模型下不付费也无法再获取这些额外的镜像。
因此,非付费用户想在 GNS3 中运行 VyOS 就需要自己虚拟机镜像了。如果只是一次性使用,自然可以直接创建一个空白的 Linux Appliance 然后挂载 VyOS ISO 镜像,但正经使用还是最好创建一个 GNS3 Appliance Template。VyOS 在 GNS3 Marketplace 中提供了一个 gns3a 文件,但那个版本需要配合官方发布的镜像使用,目前只有付费版能拿到,因此我们要从 0 开始做。
笔者在做完之后才发现在 GNS3 上安装 VyOS 的教程已经在 VyOS 的官方文档库中详细写过了:https://docs.vyos.io/en/latest/installation/virtual/gns3.html ,不过笔者还是打算发一发自己的版本。笔者的安装方法与官方的略不同,后者直接在 GNS3 环境中进行了安装,而笔者是直接在裸 QEMU 中安装好,再配置 GNS3 Template的。
准备
以下所有教程基于 VyOS 1.5 (circinus) rolling 20251028 版本,GNS3 2.2.54 版本,未来如果有大版本变动本教程可能无效,如果以下教程在最新版本做不下去请自行查阅官方有无新版教程。
- 首先确保自己有正常工作的 GNS3。笔者使用的是 GNS3 VM Hyper-V(基于 Debian),再从 Windows 连接,如果是纯 Windows 运行 GNS3 本地实例可能会稍微头疼一点,建议还是有基于 Linux 的 GNS3 实例
 - 其次请从 VyOS 官网下载最新的 ISO 镜像,例如 rolling release 可以在这里下载
 - 再次请确保有一定的 Linux 熟练度
 - 以下所有命令,如果存在形如 
gns3@gns3vm:~$的提示符,说明实际运行的命令在美元符号 $ 后面 
qcow2 镜像制作
通过 SSH 等手段登录到 GNS3 所在的机器,例如 GNS3 VM,然后先通过任意手段把 ISO 上传进去。

创建一个容量为 16 GB 的空白 qcow2 镜像(自行调整文件名)。
gns3@gns3vm:~$ qemu-img create -f qcow2 -o preallocation=off ~/vyos-20251028-rolling.qcow2 16G
Formatting '/home/gns3/vyos-20251028-rolling.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off preallocation=off compression_type=zlib size=17179869184 lazy_refcounts=off refcount_bits=16
笔者此处选择了使用 UEFI 进行 QEMU 虚拟机的引导,其实用 BIOS 也行,只是笔者不喜欢。GNS3 VM 已经安装好了 UEFI 引导所需要的固件,即 OVMF 包。如果用别的系统,由于 kraxel.org 已经停止分发预编译的 OVMF,因此需要用 Linux 发行版提供的 OVMF 文件,例如 Debian 上可以使用 sudo apt install ovmf 安装。
OVMF 分两个部分,代码(OVMF_CODE)与变量(OVMF_VARS),前者模拟的是真实 PC 的固件,后者模拟的是 NVRAM,因此需要先复制一份 OVMF_VARS 出来,以免弄乱原始的版本。
gns3@gns3vm:~$ cp /usr/share/OVMF/OVMF_VARS_4M.fd ~/vyos_OVMF_VARS_4M.fd
接下来,启动 QEMU 将 VyOS 安装进去。
/usr/bin/qemu-system-x86_64 -enable-kvm -m 2G -cpu host -smp 2 \
    -vga none -serial stdio \
    -device virtio-net-pci,mac=CA:66:CC:FF:00:01 \
    -device virtio-net-pci,mac=CA:66:CC:FF:00:02 \
    -device virtio-net-pci,mac=CA:66:CC:FF:00:03 \
    -device virtio-net-pci,mac=CA:66:CC:FF:00:04 \
    -device virtio-net-pci,mac=CA:66:CC:FF:00:05 \
    -device virtio-net-pci,mac=CA:66:CC:FF:00:06 \
    -device virtio-net-pci,mac=CA:66:CC:FF:00:07 \
    -device virtio-net-pci,mac=CA:66:CC:FF:00:08 \
    -boot d \
    -cdrom /home/gns3/vyos-2025.10.28-0019-rolling-generic-amd64.iso \
    -drive if=pflash,format=raw,unit=0,readonly=on,file=/usr/share/OVMF/OVMF_CODE_4M.fd \
    -drive if=pflash,format=raw,unit=1,file=/home/gns3/vyos_OVMF_VARS_4M.fd \
    -drive file=/home/gns3/vyos-20251028-rolling.qcow2
这里给了双核 2G 八网卡的配置,可自行根据需求调整,且不需要与最终模板一致。同时也请自行按需调整 MAC 地址、文件路径与文件名(特别是 ISO 与 qcow2 的文件名)。-vga none -serial stdio 使得我们可以直接通过当前 Shell 访问到虚拟机的“屏幕/键盘”。
开始运行后,需要等一段时间才会完成引导,开始进入系统(期间可能显示 GRUB),并且启动相当慢。注意在进入虚拟机内部的 Shell 之后不能按 Ctrl+C,否则会退掉整个 QEMU,似乎可以通过 stty intr ^] 来把外部的 Shell 的强制退出换到 Ctrl+] 上面去,笔者没有试,反正里面也没几条命令要打。

进入系统后,使用默认用户名密码(均是 vyos)登录系统,再敲 install image 即可进入安装向导。

以下为笔者安装时的输入,以及看到的输出(上图显示磁盘是 3.0 GB 是当时创建错了):
Welcome to VyOS - vyos ttyS0
vyos login: vyos
Password: 
Welcome to VyOS!
   ┌── ┐
   . VyOS 2025.10.28-0019-rolling
   └ ──┘  current
 * Documentation:  https://docs.vyos.io/en/latest
 * Project news:   https://blog.vyos.io
 * Bug reports:    https://vyos.dev
You can change this banner using "set system login banner post-login" command.
VyOS is a free software distribution that includes multiple components,
you can check individual component licenses under /usr/share/doc/*/copyright
---
WARNING: This VyOS system is not a stable long-term support version and
         is not intended for production use.
vyos@vyos:~$ install image
Welcome to VyOS installation!
This command will install VyOS to your permanent storage.
Would you like to continue? [y/N] y
What would you like to name this image? (Default: 2025.10.28-0019-rolling) 
Please enter a password for the "vyos" user: 
WARNING: Default password used. Consider changing it on next login.
Please confirm password for the "vyos" user: 
What console should be used by default? (K: KVM, S: Serial)? (Default: S) 
Probing disks
1 disk(s) found
The following disks were found:
Drive: /dev/sda (16.0 GB)
Which one should be used for installation? (Default: /dev/sda) 
Installation will delete all data on the drive. Continue? [y/N] y
Searching for data from previous installations
No previous installation found
Would you like to use all the free space on the drive? [Y/n] 
Creating partition table...
The following config files are available for boot:
	1: /opt/vyatta/etc/config/config.boot
	2: /opt/vyatta/etc/config.boot.default
Which file would you like as boot config? (Default: 1) 
Creating temporary directories
Mounting new partitions
Creating a configuration file
Copying system image files
Installing GRUB configuration files
Installing GRUB to the drive
Cleaning up
Unmounting target filesystems
Removing temporary files
The image installed successfully; please reboot now.
安装完成后,可以 shutdown now 关掉虚拟机,此时镜像就安装好了。笔者安装出来文件有 748 MiB。
gns3@gns3vm:~$ ls -lh vyos-20251028-rolling.qcow2
-rw-r--r-- 1 gns3 gns3 748M Oct 29 16:29 vyos-20251028-rolling.qcow2
接下来可以试试从镜像启动,看看安装效果
/usr/bin/qemu-system-x86_64 -enable-kvm -m 2G -cpu host -smp 2 \
    -vga none -serial stdio \
    -device virtio-net-pci,mac=CA:66:CC:FF:00:01 \
    -device virtio-net-pci,mac=CA:66:CC:FF:00:02 \
    -device virtio-net-pci,mac=CA:66:CC:FF:00:03 \
    -device virtio-net-pci,mac=CA:66:CC:FF:00:04 \
    -device virtio-net-pci,mac=CA:66:CC:FF:00:05 \
    -device virtio-net-pci,mac=CA:66:CC:FF:00:06 \
    -device virtio-net-pci,mac=CA:66:CC:FF:00:07 \
    -device virtio-net-pci,mac=CA:66:CC:FF:00:08 \
    -drive if=pflash,format=raw,unit=0,readonly=on,file=/usr/share/OVMF/OVMF_CODE_4M.fd \
    -drive if=pflash,format=raw,unit=1,file=/home/gns3/vyos_OVMF_VARS_4M.fd \
    -drive file=/home/gns3/vyos-20251028-rolling.qcow2
同样自行替换各种路径,笔者看到效果如下:

使用向导里设置的用户名、密码登录后,即可进系统。如果有什么要安装的,可以在这里安装,例如 qemu-guest-agent。最后关机,将镜像拷到 GNS3 的镜像目录下
gns3@gns3vm:~$ cp vyos-20251028-rolling.qcow2 /opt/gns3/images/QEMU/
gns3@gns3vm:~$
制作 Template 文件
接下来在 GNS3 的图形化界面选择 File-New Template,选择 “Manually create ......”

此处的 UI/UX 设计得比较令人迷惑,直接打开了 GNS3 的 Preferences 窗口。这里需要在左边选择 “Qemu VMs”,并点下面的“New”。填好名字下一步。

磁盘镜像这里没有可选的,因此暂且选个空镜像。

别的没啥可讲的,一路 Next 即可。接下来点 “Edit”编辑刚刚创建的虚拟机,

根据上图与实际资源修改图标、类别、内存、CPU 数量、关闭时操作等(这里用 ACPI 做到优雅退出)。其次切换到 HDD 设置硬盘。

这里不能点“Browse”选取本地镜像,而应该直接输入类似 /opt/gns3/images/QEMU/vyos-20251028-rolling.qcow2 的镜像路径(对于 GNS3 VM,必须在 /opt/gns3/images/QEMU,而文件名是第一步自己取的)。“Disk Interface”选“virtio”。
“Network”部分根据需求配置网卡,建议“Type”选“virtio-net-pci”:

注意上图配置了 “First Port Name”,这里有错误,实际上此框应该留空,否则会出来两个 eth0。懒得重新截图了。

由于笔者用 UEFI 安装的,因此 Advanced 选项卡的这里也要勾上。最后 OK 保存,并开个 Project 把刚刚创建的 VyOS Appliance 放下来,右键开机看看是否能正常启动。

导出
GNS3 目前还没有自带从当前安装导出 Appliance 到 gns3a 文件的功能,此问题在 GitHub 上有讨论。里面有人给出了一组 Python 脚本从 API 导出
python .\export_appliance.py http://192.168.112.155:80 "VyOS Universal Router 20251028-rolling" | out-file -Encoding utf-8 -FilePath vyos-rolling.gns3a
笔者导出并对比官方的 VyOS gns3a 文件修改后得到如下文件,可供参考/编辑。
vyos-rolling.gns3a
{
    "appliance_id": "29a575d0-271a-4aa3-9bb3-349b2bc88c03",
    "name": "VyOS Universal Router 20251028-rolling",
    "category": "router",
    "description": "Export of template 'VyOS Universal Router 20251028-rolling'",
    "vendor_name": "VyOS",
    "vendor_url": "http://www.example.com",
    "product_name": "VyOS Universal Router 20251028-rolling",
    "registry_version": 4,
    "status": "experimental",
    "maintainer": "chariri",
    "maintainer_email": "unknown@example.org",
    "symbol": ":/symbols/affinity/circle/blue/router.svg",
    "first_port_name": "eth0",
    "port_name_format": "eth{0}",
    "qemu": {
        "adapter_type": "virtio-net-pci",
        "adapters": 6,
        "ram": 3072,
        "cpus": 2,
        "hda_disk_interface": "virtio",
        "arch": "x86_64",
        "console_type": "telnet",
        "kvm": "allow",
        "on_close": "shutdown_signal"
    },
    "images": [
        {
            "filename": "vyos-20251028-rolling.qcow2",
            "version": "0.0",
            "md5sum": "d62ce5684972618d39b1c08c34c7119f",
            "filesize": 784072704
        }
    ],
    "versions": [
        {
            "name": "0.0",
            "images": {
                "hda_disk_image": "vyos-20251028-rolling.qcow2"
            }
        }
    ]
}
这样就正式制作完毕了。
Comments NOTHING