GNS3是创建拓扑,验证设计的优秀工具。路由器、防火墙可作为“设备”拖动到工作区内,其数量仅受限于你的PC的计算能力和I/O性能。
但你可否想过,可以创建Windows或Linux虚拟机作为“设备”来使用,也就是说,可用将其拖动到工作区与其它设备配合搭建拓扑,从而完成更复杂的实验。
以下步骤需要连接GNS3 VM(Ubuntu)建议用MobaXterm,因为很容易粘贴命令执行,上传下载文件也很方便。
1、GNS3 VM修改网卡模式,固定IP地址
GNS3 VM要修改网卡模式以使得自身可以上网。建议改为桥接模式以获得更好的网络可见性和通信能力。
此外,由于所有的计算都由GNS3 VM承担,也要为其分配适当的内存和算力。
本文为其 分配了8GB内存和16核心的CPU:
从GNS3 VM欢迎屏幕上找到SSH连接地址,用终端软件连接GNS3 VM改为静态地址:
因为默认的DHCP会造成GNS3 VM的地址在不断变化。建议用MobaXterm连接,因为很容易粘贴命令执行,上传下载文件也很方便。
sudo -i
cd /etc/netplan/ && ll
vim abc.yaml
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: no
addresses:
- 192.168.0.100/24
routes:
- to: default
via: 192.168.0.1
nameservers:
addresses: [202.96.64.68]
netplan apply
其中的地址和默认网关依你的具体情况改写。
2、升级QEMU版本
GNS3 VM 3.0.5中的QEMU版本号为8.2.2:
目前的最新版为10.1.0,Ubuntu的源没有现成的安装包,只能编译源码。
① 去内核官网https://www.kernel.org/ 下载内核压缩包
② 将内核压缩包传入GNS3 VM的/home/gns3家目录
③ sudo -i
bash <(curl -sSL https://linuxmirrors.cn/main.sh) #换国内源
apt update && apt upgrade -y #更新软件包
apt install neofetch lrzszntpdate wget xz-utils -y
ntpdate ntp1.aliyun.com #同步时间
mkdir /opt/test && cd /opt/test
#编译工作在 /opt/test目录下进行,因为编译过程会产生巨量的文件,sda1容量不够
mv /home/gns3/linux-6.17.1.tar.xz . && tar -xvf linux-6.17.1.tar.xz&& cd linux-6.17.1/
apt install -y gcc make bc libssl-dev libelf-dev flex bison libncurses-dev zstd
cp /boot/config-$(uname -r) .config && make menuconfig #把/boot下的文件改名拷贝为.config,再创建.config。AI说这是以当前系统能正常运行的配置作为安全起点再行修改,更稳妥。点Save,2次回车,点Exit。
wc -l .config#如果是1万条左右就是完整的;如果是WSL环境就不完整,详见B站这个视频。
scripts/config --disable SYSTEM_TRUSTED_KEYS
scripts/config --disable SYSTEM_REVOCATION_KEYS
neofetch #在编译之前查看内核版本
exit #官方不建议以root身份编译内核
cd /opt/test/linux-6.17.1
sudo time make -j$(nproc) #开始编译,会显示编译过程所花费的时间。
#如有提示直接回车;要保持终端窗口最大化,否则有可能编译失败;16核CPU花费了1小时10分钟;
sudo -i
cd /opt/test/linux-6.17.1
make modules_install && make install && /usr/sbin/grub-mkconfig -o /boot/grub/grub.cfg
reboot #重启系统
重启之后,GNS3的欢迎屏幕显示QEMU的版本号为10.1.0,成绩成功!
清除编译后的残留文件:
sudo -i
cd /home/gns3/qemu-10.1.0 && make distclean && cd /home/gns3 && rm -rf qemu-10.1.0
rm -rf qemu-10.1.0.tar.xz #清除编译后残留的文件
3、编译Linux内核
如果你愿意折腾,可以通过编译源码的方式得到最新的内核。
建议在用户权限下编译内核,因为在root权限下编译内核有可能会破坏当前的系统,当写入系统敏感配置会因为权限不够而被阻止。
GNS3 VM是Ubuntu Linux虚拟机,lsblk可见用户家目录使用硬盘sda,容量20GB;Dynamips、IOU、QEMU使用硬盘sdb,容量1T。
这就带来一个问题:如果以用户权限编译内核,就是在用户的家目录里编译(sda硬盘),但在编译的过程中会产生大量的临时文件,默认20GB容量是不够的;所以编译工作要放在sdb上进行,并在事后清除这些临时文件。
编译过程相当耗时,16核CPU花费了1小时10分钟。
截止本文完成,最新的内核版本是6.17.1。
① 去内核官网https://www.kernel.org/ 下载内核压缩包,当前最新版本6.17.1
② 将内核压缩包传入GNS3 VM。如果终端软件是以gns3账号登录,就传入 /home/gns3家目录,因为有写入权限。根据经验,如果使用mobaxterm,用gns3账号登录,左侧的目录树默认就是处于/home/gns3之下,可以传入文件到该目录。
③ sudo -i
bash <(curl -sSL https://linuxmirrors.cn/main.sh) 换国内源
apt update && apt upgrade -y 更新软件包
apt install neofetch lrzsz ntpdate wget xz-utils -y
ntpdate ntp1.aliyun.com #同步时间
mkdir /opt/test && cd /opt/test
#编译工作在 /opt/test目录下进行。因为编译过程会产生巨量的文件,/root和/home目录都挂载于根目录 /dev/sda,容量才20GB,不够用;/opt挂载于 /dev/sdb,容量1T。
#可以直接从内核网站下载内核的压缩包:wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.17.tar.xz
#但太慢了,所以我在第①步已经用迅雷下载了内核压缩包并且传入了gns3的家目录
mv /home/gns3/linux-6.17.1.tar.xz . && tar -xvf linux-6.17.1.tar.xz && cd linux-6.17.1/
apt install -y gcc make bc libssl-dev libelf-dev flex bison libncurses-dev zstd
cp /boot/config-$(uname -r) .config && make menuconfig #把/boot下的文件改名拷贝为.config,再创建.config。AI说这是以当前系统能正常运行的配置作为安全起点再行修改,更稳妥。点Save,2次回车,点Exit。
scripts/config --disable SYSTEM_TRUSTED_KEYS
scripts/config --disable SYSTEM_REVOCATION_KEYS
neofetch #在编译之前查看内核版本
cd /opt/test/linux-6.17.1
time make -j$(nproc) #开始编译,会显示编译过程所花费的时间。如有提示直接回车;要保持终端窗口最大化,否则有可能编译失败
cd /opt/test/linux-6.17.1
make modules_install && make install && /usr/sbin/grub-mkconfig -o /boot/grub/grub.cfg
最后的提示:arc/x86/boot
reboot #重启系统
重启之后登录GNS3 VM,运行neofetch,内核版本号应该更新了:
清理编译后的残留文件:
sudo -i
cd /opt/test/linux-6.17.1 && make distclean && cd /opt/ && rm -rf /opt/test #清除所有临时文件
4、在QEMU里安装虚拟机
以安装Windows虚拟机为例,当然也可以安装Linux虚拟机。
有2种安装方法:用ISO镜像安装系统,以及上传安装好系统的 .VMDK虚拟磁盘
方法一:使用ISO镜像安装系统
注意:由于运行完整操作系统的虚拟机消耗资源巨大,要给GNS3 VM分配足够的内存和CPU核心。
第一步、Edit→Preference→QEMU→Qemu VMs→New,输入虚拟机的名字,比如WIN7-32:
第二步、选择平台
i386 和 x86_64 是 QEMU 虚拟机中“平台”(Platform)选项中的两种 CPU 架构,它们代表不同的处理器指令集架构(ISA)。在 GNS3 的 QEMU 虚拟机设置中,选择哪个取决于你要运行的操作系统版本和硬件兼容性。即使是 32 位系统,QEMU 也能通过 x86_64 启动并兼容运行(但不能反向),使用 x86_64 可以更好地支持多核、大内存、现代网络驱动等。
即使安装的是 32 位系统,如果你的虚拟机分配了超过 4GB 内存,也必须用 x86_64,否则会出错或无法启动。
本例是32位的WIN7,平台选择i386,内存选择2048M,也就是2GB内存:
第三步、选择终端类型。因为是Windows系统,需要vnc以显示图形界面:
第四步、选择虚拟机的硬盘。对于WIN7,50GB够用了,当然也可以选择更大容量的:
第五步、配置完毕之后,点击Edit继续编辑,给CPU增加到2个核心,并且开机后自动用vnc连接:
若想要给Windows虚拟机添加第二块硬盘,进入HDD选项卡,在Disk1哪里指定磁盘文件和接口,文件名来自于第4步的磁盘文件列表:
进入CD/DVD选项卡,载入WIN7-32安装镜像,等待一会就上传至GNS3 VM,点OK。
第六步、把WIN7-32设备部拖进工作区开机,会自动弹出VNC的开机界面,开始安装操作系统。
注:按照此方法创建的WIN7-32设备每次拖动到工作区都要重装系统,若不想如此麻烦,见下文。
方法二:上传VMware workstation虚拟机使用的 .VMDK文件
先准备好一台已经安装好Windows系统的VMware workstation虚拟机,找到其 .vmdk文件的路径。
GNS3上传路径1:File→Image management
GNS3上传路径2:Edit→Preference→QEMU→Qemu VMs
上传之后,Edit→Preference→QEMU→Qemu VMs→New,给虚拟机起名,平台选择32位的i386,或者64位的x86_64(建议后者),设置虚拟机内存,设置vnc为终端软件,在Existring images的下拉菜单里就能看到刚才上传的 .vmdk文件,选择它,ok。点Edit编辑虚拟机参数,增加vCPU的核心数,也可以增加内存,OK之后虚拟机建立完毕,可以拖到工作区使用了。
5、使用现成的QEMU磁盘作为虚拟机的初始磁盘(模板)
根据第4节的方法创建的Qemu设备虽然可以运行了,但处于”等待安装系统“的状态。也就是说,每往工作区拖动一个实例,开机后都要重新安装系统,很明显这样太麻烦了。能否在QEMU里安装好系统和所需软件之后,将其状态保存下来,以后新创建的虚拟机都以此为模板,开机即可用呢?
可以的!我们在创建QEMU VMs虚拟机设备的时候,导入已安装好系统的 .qcow2磁盘作为其硬盘。之后根据它克隆出的设备,开机就是可用状态了。
具体思路是:
-
得到模板虚拟机磁盘文件的绝对路径。
-
将其拷贝到GNS3 VM的镜像目录。
-
当新建虚拟机,该文件就会出现在磁盘选择列表中,选择它,开机就是有系统的状态。
具体步骤:
① 获得QEMU虚拟机磁盘的路径
先做好一个完整的、安装了操作系统以及所需软件的QEMU Windows虚拟机作为模板。当其正在运行的时候,登录GNS3 VM执行命令:
ps aux|grep qemu
会出现一大堆参数,其中就有 .qcow2 文件的绝对路径,是一个很长的路径,前导有file= ,类似于:
file=/opt/gns3/projects/4b1fff8f-6fef-48f7-aac2-ee3fe741c823/project-files/qemu/76f3e4fe-8965-47f9-a430-cadc4d18945f/hda_disk.qcow2
记录下这个路径。当Windows安装完毕,所需软件也安装完毕,该文件可以当作模板使用了。。
② 关闭虚拟操作系统,将 .qcow2文件拷贝到入GNS3 VM的磁盘存放目录,作为虚拟机设备的初始磁盘(模板)。 磁盘存放目录来自于GNS3 VM开机欢迎屏幕:
cd /opt/gns3/images/QEMU
cp /opt/gns3/projects/4b1fff8f-6fef-48f7-aac2-ee3fe741c823/project-files/qemu/76f3e4fe-8965-47f9-a430-cadc4d18945f/hda_disk.qcow2 Windows7.qcow2
sudo chmod a+x Windows7.qcow2 #加上可执行权限
注:只有模板虚拟机才是完整的磁盘,根据模板虚拟机克隆出来的虚拟机都是差分磁盘,必须要有父盘才能使用,所以要找模板虚拟机的磁盘。
③ 创建直接可用的QEMU虚拟机设备
初始磁盘准备完毕!今后若要创建直接可用的QEMU虚拟机,选择这个初始磁盘(模板)即可。
进入GNS3→Edit→Preference→QEMU→Qemu VM→New,起个名字→配置内存→选择vnc→出现了刚才拷贝过去的文件,选择它:
点Edit增大内存和CPU核心,勾选Auto start console,点击OK。
现在已经做好了一个开机可用的Windows7设备模板。从GNS3左侧设备面板拖出即是现成的Windows系统。
-
把虚拟机设备拖动到工作区之后要等待一段时间,图标才会出现在工作区,同样删除也有延迟。
-
在运行中发现,如果直接点GNS3 顶端的“开机”键同时打开多个虚拟机,有可能出现只打开一个的情况,但若逐个开机且期间有几十秒的间隔,就都成功开机了。
-
从同一个模板拖动出的多个windows,它们的机器名和sid都是相同的
6、备份和恢复 .qcow2文件
使用MobaXterm、SecureFX之类的软件,可以把QEMU的 .qcow2文件导入GNS3 VM的镜像存放目录,或反向导出至到物理主机作为备份,操作很方便。
如第5节所言,备份的是模板虚拟机的磁盘而非差分磁盘。
7、物理主机与QEMU Windows虚拟机交换文件的方法
如果你在虚拟机里创建了一些文件,该怎样拷贝到物理主机?
或者反向,怎样把物理主机的文件拷贝到虚拟windows的桌面?
注意:不是拷贝 .qcow2虚拟磁盘文件,而是拷贝虚拟机里的文件。
方法是:在GNS3 VM里用QEMU的命令直接挂载 .qcow2虚拟磁盘文件到一个目录,文件就列出了。
第一步:sudo -i #进入root模式
第二步:获得虚拟机 .qcow2文件的路径:当虚拟机正在运行的时候,进入GNS3 VM命令行执行命令:ps aux|grep qemu
会出现一大堆参数,其中就有 .qcow2 文件的绝对路径,开头是file= 后面跟磁盘路径,类似于:
file=/opt/gns3/projects/4b1fff8f-6fef-48f7-aac2-ee3fe741c823/project-files/qemu/76f3e4fe-8965-47f9-a430-cadc4d18945f/hda_disk.qcow2
第三步:关闭虚拟机
第四步:modprobe nbd max_part=8 #告诉系统加载 nbd 驱动,让普通文件可以被当作“块设备”(即虚拟硬盘)使用。max_part=8:表示每个虚拟硬盘最多支持 8 个分区
lsblk #多了16个设备:
假设要拷出的文件在Windows桌面,那就要关注nbd0p2设备,这是nbd0磁盘的第二个分区,也就是Windows的系统分区,桌面就在此分区。
第五步:qemu-nbd -c /dev/nbd0 hda_disk.qcow2 #将 .qcow2 文件挂载到 /dev/nbd0 这个虚拟设备上
第六步:mkdir /os #创建挂载目录
第七步:mount /dev/nbd0p2 /os #把Windows分区挂载到 /os目录
第八步:ls /os就可见windows目录了。
第九步:cd /os/Users/用户名/Desktop && ll #进入到了桌面。其它目录按此思路执行
第十步:用MobaXterm或SecureFX把文件从虚拟机拷贝到物理机,或者反向拷贝都可以(这个过程就是在修改 .qcow2文件)。
拷贝完毕之后要卸载目录,否则虚拟机无法开机:
umount /os
qemu-nbd -d /dev/nbd0 #断开 qcow2 与 /dev/nbd0 的连接。
卸载目录之后虚拟机开机,文件就存在了。
8、增加GNS3 VM的磁盘空间
登录GNS3 VM的Shell,运行lsblk:可见有2块磁盘,其中sda1容量为20GB,gns3用户的家目录就在此磁盘。如果你在做实验时发现容量不够,可以无损扩容:
① 扩展“物理”磁盘空间
运行poweroff关闭GNS3,修改sda1的磁盘的大小为100GB:
② 扩展分区空间,用满物理磁盘空间
sudo -i
parted /dev/sda #进入parted的命令行
print 该命令列出该磁盘下的分区信息
resizepart 1 100% #把上面列出的1号分区的容量扩展到磁盘全部容量的100%,回答Yes,若扩展成功无输出。
quit #退出parted
partprobe /dev/sda #让内核重新读取更新后的分区表,避免“设备忙”或大小未更新的问题。
resize2fs /dev/sda1 #扩展文件系统到最大空间。
df -h #可见文件系统当前管理的空间是100GB。