GNS3 3.0.5创建QEMU虚拟机、升级QEMU和Linux内核等技巧

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磁盘作为其硬盘。之后根据它克隆出的设备,开机就是可用状态了。

具体思路是:

  1. 得到模板虚拟机磁盘文件的绝对路径。

  2. 将其拷贝到GNS3 VM的镜像目录。

  3. 当新建虚拟机,该文件就会出现在磁盘选择列表中,选择它,开机就是有系统的状态。

具体步骤:

① 获得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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值