Proxmox 虚拟环境
作为另一种选择,您可以考虑在 Proxmox VE 中构建实验室。在内部,EVE-NG、带有 libvirtd 的 Ubuntu 原生 KVM 和 Proxmox VE 上的虚拟机管理程序是相同的。在这三个环境中, QEMU 都运行虚拟机。每个环境都有自己的 CLI 和 GUI,并使用 Debian 或 Ubuntu Linux 发行版。
Proxmox VE 相对于 EVE-NG 和 Ubuntu 原生 KVM with libvirtd 的优势是:
- 易于构建虚拟机管理程序群集,这限制了单个 BMS 的范围。
- 易于连接共享存储,例如 Ceph。
- 使用 SDN 选项在服务器之间虚拟化网络。
- REST API作您的系统。
Proxmox VE 相对于 EVE-NG 和 Ubuntu 原生 KVM with libvirtd 的缺点是:
- 构建 UKSM 内核无法保存多个 vJunos 交换机实例的 RAM 使用情况。因此,每个 vJunos 交换机虚拟机都需要 5 GB RAM。
- 不运行压缩或支持 qcow2 映像,而是在存储选项上将其扩展为原始映像。因此,每个 vJunos 交换机虚拟机都需要 32 GB 的存储空间。
本文档包含使用本地配置的单个Proxmox服务器和标准Linux网桥在Proxmox VE上创建vJunos交换机VM的示例。这有助于与前面描述的其他两个环境进行比较。由于您尚未使用适用于 VM 的 Proxmox GUI,因此在 Proxmox VE 上创建虚拟机更改后,您必须在创建 juniper.conf 映像以及 Linux 桥接和 VM 接口后在本地运行配置更改。借助 CLI 示例,您可以更轻松地将其包含在脚本中以启动多个 vJunos 交换机虚拟机。
对于具有多个服务器的横向扩展实验室,我们建议使用具有 VXLAN 的 SDN 作为网络传输选项,而不是本地 Linux 网桥。
Proxmox VE准备
安装虚拟机管理程序后,创建用于实验室中的 vJunos 交换机虚拟机和其他计算机的网络。如上面的示例所示,使用 Proxmox GUI 创建标准 Linux 网桥,如下所示的三个,并确保它们被激活。
为每个 Linux 网桥分配一个名称,您可以选择将 MTU 设置为 9200。创建 VM 后,可以使用脚本更改 MTU 值。避免填充/更改任何其他值。
对于其余所有步骤,请使用服务器的 SSH 在本地运行 BASH 命令。首先,将 vJunos-switch 的 qcow2-image 下载到服务器。
mkdir -p /root/download
现在,使用 URL: https://support.juniper.net/support/downloads/?p=vjunos 将 vJunos-switch VM 的免费副本下载到目录中,然后验证副本是否已下载。
ls -l /root/download/ -rw-r--r-- 1 root root 3966631936 Aug 1 2023 vJunos-switch-23.2R1.14.qcow2
在 Proxmox VE 上部署 vJunos 交换机虚拟机
避免使用 Proxmox GUI 创建初始 vJunos 交换机虚拟机,因为 GUI 可能会添加其他参数,从而导致虚拟机无法正常工作。相反,请通过 CLI 创建初始 VM,并将其设置为模板。然后,使用此模板从 GUI 启动所有其他虚拟机。
使用 BASH,在本地服务器上执行后续步骤:
- 单独配置 VM:
- VM ID/编号。在这个例子中,它是
200. - 运行 VM 映像的存储。在这个例子中,它是存储
local-lvm.
- VM ID/编号。在这个例子中,它是
- 如果正在运行具有相同 ID 的现有 VM,请删除。如果您犯了错误并希望重试,这将很有用。
- 使用所有必需的参数创建新的 vJunos-switch VM,以便稍后正确启动它:
- VM 的名称。在示例中,
vswitch.您可以更改名称。 - RAM 和 CPU。请勿更改。
- 此 VM 正确启动所需的特殊 BIOS 和 CPU 选项。请勿更改选项。
- 启动顺序和串行屏幕。请勿更改。
- 首先是分配给 VM 的 fxp0 接口的网络
net0。如果需要,请进行更改,但请确保网络可以为 VM 提供 DHCP 租约。 - 其次,更多以
net1开头的网络,这将是 vJunos-switch 虚拟机的接口ge-0/0/0。您将需要根据您的实验室设计使用更多接口和其他 Linux 网桥进行更改。我们建议您保留每个接口的选项firewall=0,以免使内部设计过于复杂。
- VM 的名称。在示例中,
- 将 vJunos-switch qcow2-image 导入到选定的存储选项中。您可能需要更改 vJunos-switch qcow2 映像文件位置。
- 导入要提取到 BASH 变量的配置映像位置。
- 将映像位置添加到创建的 VM 以从中启动。
- 使用为此 VM 的初始 Junos OS 配置创建默认
juniper.conf值。 make-config.sh使用脚本创建嵌入个人juniper.conf文件的图像。- 将 Junos OS 配置映像导入到选定的存储选项。
- 导入要提取到 BASH 变量的配置映像位置。
- 将配置映像位置添加到创建的 VM。
- 检查并查看 VM 的完整配置。
- 可选:将虚拟机用作未来启动 vJunos-switch 的模板:
- 将当前 VM 定义为模板。
- 为克隆选择新的 VMID。
- 创建克隆 VM 以供以后使用。
- 如果需要,请更改克隆的接口分配。
- 启动 VM 或其克隆。
- 在本地查看已启动 VM 的 Linux 网桥分配。
- 在 Proxmox GUI 上查看 VM 是否已启动,然后访问控制台。
# configure the management ID for the VM and your storage location VMID="200" VMSTORAGE="local-lvm" # make sure any prior instance of this VM is down and deleted qm stop $VMID qm destroy $VMID # create a new VM without a virtual disk qm create $VMID --name switch1 --memory 5120 --cores 4 \ --args "-machine accel=kvm:tcg -smbios type=1,product=VM-VEX -cpu 'host,kvm=on'" \ --boot order=virtio0 --serial0 socket \ --net0 virtio,bridge=vmbr0 \ --net1 virtio,bridge=ge000,firewall=0 \ --net2 virtio,bridge=ge001,firewall=0 \ --net3 virtio,bridge=ge002,firewall=0 # import the vJunos image as qcow2 format in proxmox qm disk import $VMID /root/download/vJunos-switch-23.2R1.14.qcow2 $VMSTORAGE --format qcow2 | tee diskimport.txt . . transferred 31.6 GiB of 31.8 GiB (99.52%) transferred 31.8 GiB of 31.8 GiB (100.00%) transferred 31.8 GiB of 31.8 GiB (100.00%) Successfully imported disk as 'unused0:local-lvm:vm-200-disk-0' # extract image location from import VMIMAGE=`cat diskimport.txt | grep "imported disk" | awk '{print $5}' | sed 's/.:/ /' | awk '{print $2}' | sed 's/.$//'` echo $VMIMAGE local-lvm:vm-200-disk-0 # attach the qcow2 disk to the vm qm set $VMID --virtio0 $VMIMAGE,iothread=1,size=32G update VM 200: -virtio0 local-lvm:vm-200-disk-0,iothread=1,size=32G
查看 vJunos-switch 的默认 Junos OS 配置一章。本章将指导您为 vJunos 交换机虚拟机创建单独的 Junos OS 配置,这在其他环境中也类似。本章还将指导您添加采用配置,以便让每个新的 vJunos 交换机虚拟机自动显示在 Mist 云清单中。在这里,在不重复相同的步骤的情况下,您对远程 SSH 访问使用了与 fxp0 接口上的密码ABC123相同的root最小启动配置。
cat <<EOF >juniper.conf
system {
host-name vjunos;
root-authentication {
encrypted-password "\$6\$DOvFAxW9\$HpxgOaGEe5L6MtDJqbWepS5NT6EW23rCuu69gwwGVFr7BpzY2MHS34mPrR0LKRqoGI19tRgpz3vFJkEueW9mQ1"; ## SECRET-DATA
}
services {
ssh {
root-login allow;
protocol-version v2;
}
}
name-server {
8.8.8.8;
9.9.9.9;
}
arp {
aging-timer 5;
}
syslog {
file interactive-commands {
interactive-commands any;
}
file messages {
any notice;
authorization info;
}
}
}
interfaces {
fxp0 {
unit 0 {
family inet {
dhcp force-discover;
}
}
}
}
protocols {
lldp {
interface all;
}
lldp-med {
interface all;
}
}
EOF
此时,您必须已创建单独的 Junos OS 启动配置并继续该过程。
# download the make-config.sh script from the Juniper CDN if you do not have it yet
# https://webdownload.juniper.net/swdl/dl/anon/site/1/record/168885.html
chmod 777 make-config.sh
./make-config.sh juniper.conf myconfig.img
.
./config/juniper.conf
Cleaning up...
removed '/var/tmp/tmp.hhQ0rcM92K/config/juniper.conf'
removed directory '/var/tmp/tmp.hhQ0rcM92K/config'
removed directory '/var/tmp/tmp.hhQ0rcM92K'
removed directory '/var/tmp/tmp.gvCkmgmvXy'
Config disk myconfig.img created
# import the junos config image to proxmox storage
qm disk import $VMID myconfig.img $VMSTORAGE --format raw | tee diskimport.txt
.
transferred 1.0 MiB of 1.0 MiB (100.00%)
transferred 1.0 MiB of 1.0 MiB (100.00%)
Successfully imported disk as 'unused0:local-lvm:vm-200-disk-1'
# extract image location from import
VMIMAGE=`cat diskimport.txt | grep "imported disk" | awk '{print $5}' | sed 's/.:/ /' | awk '{print $2}' | sed 's/.$//'`
echo $VMIMAGE
local-lvm:vm-200-disk-1
# attach the config-image disk to the vm
qm set $VMID --ide0 $VMIMAGE,size=16M
update VM 200: -ide0 local-lvm:vm-200-disk-1,size=16M
现在,我们所有的准备工作都已经完成。可以查看生成的 VM 配置。
# review the VM configuration made qm config $VMID args: -machine accel=kvm:tcg -smbios type=1,product=VM-VEX -cpu 'host,kvm=on' boot: order=virtio0 cores: 4 ide0: local-lvm:vm-200-disk-1,size=4M memory: 5120 meta: creation-qemu=8.1.5,ctime=1728988040 name: switch1 net0: virtio=BC:24:11:01:06:0E,bridge=vmbr0 net1: virtio=BC:24:11:6B:0B:84,bridge=ge000,firewall=0 net2: virtio=BC:24:11:7E:5C:07,bridge=ge001,firewall=0 net3: virtio=BC:24:11:FB:40:37,bridge=ge002,firewall=0 serial0: socket smbios1: uuid=5b184467-bffe-45f3-8a4c-bb2182aa3aa5 virtio0: local-lvm:vm-200-disk-0,iothread=1,size=32524M vmgenid: a3299ccf-293b-4df2-9458-b0fa444a9c61
由于 VM 不包含任何凭据或其他限制因素,因此请在首次启动此 VM 之前将其用作模板。这允许您稍后以完整或链接到映像克隆的形式启动多个 VM。如果您决定继续,请按照以下步骤作。
qm template $VMID
Renamed "vm-200-disk-1" to "base-200-disk-1" in volume group "pve"
Logical volume pve/base-200-disk-1 changed.
WARNING: Combining activation change with other commands is not advised.
Renamed "vm-200-disk-0" to "base-200-disk-0" in volume group "pve"
Logical volume pve/base-200-disk-0 changed.
WARNING: Combining activation change with other commands is not advised.
# select a new VMID for the clone
VMID2="201"
# create a clone of of your template VM
qm clone $VMID $VMID2 --name switch1
create linked clone of drive ide0 (local-lvm:base-200-disk-1)
Logical volume "vm-201-disk-0" created.
create linked clone of drive virtio0 (local-lvm:base-200-disk-0)
Logical volume "vm-201-disk-1" created.
#
# at this point you may change the interfaces assigned according to your topology
#
# review the VM configuration for the clone
qm config $VMID2
args: -machine accel=kvm:tcg -smbios type=1,product=VM-VEX -cpu 'host,kvm=on'
boot: order=virtio0
cores: 4
ide0: local-lvm:vm-201-disk-0,size=4M
memory: 5120
meta: creation-qemu=8.1.5,ctime=1729094281
name: switch1
net0: virtio=BC:24:11:87:61:1B,bridge=vmbr0
net1: virtio=BC:24:11:B2:11:52,bridge=ge000,firewall=0
net2: virtio=BC:24:11:79:0C:A1,bridge=ge001,firewall=0
net3: virtio=BC:24:11:DF:BC:BF,bridge=ge002,firewall=0
serial0: socket
smbios1: uuid=b81068a9-8f7e-423a-bbb8-7738da5f98df
virtio0: local-lvm:vm-201-disk-1,iothread=1,size=32524M
vmgenid: de47f143-5f48-44c4-8674-beb7d1b91bd2
# start the clone vJunos-switch VM
qm start $VMID2
brctl show
bridge name bridge id STP enabled interfaces
ge000 8000.de5f3a3d3a9b no tap201i1
ge001 8000.da08ff719f7c no tap201i2
ge002 8000.8614a67130b7 no tap201i3
vmbr0 8000.5847ca7543fe no enp2s0
tap201i0
如果您尚未决定不使用模板/克隆,请立即启动第一个 vJunos-switch 虚拟机进行测试。
# start the new vJunos-switch VM
qm start $VMID
# review the linux-bridges and attached interfacs for our first VM
brctl show
bridge name bridge id STP enabled interfaces
ge000 8000.0ac0df72ec4b no tap200i1
ge001 8000.623437ae4bac no tap200i2
ge002 8000.72c0fc5f9933 no tap200i3
vmbr0 8000.5847ca7543fe no enp2s0
tap200i0
您现在可以在 Proxmox GUI 中查看 VM 控制台。请确保使用正确的按钮,以避免对路由引擎上的外部 VM 屏幕进行任何更改。路由引擎是所有 Junos OS 配置的开始地点,并且具有自己的屏幕。请参见下图,了解要选择的控制台选项。
Linux 网桥和虚拟机接口在 Proxmox VE 上创建虚拟机后的更改
启动 vJunos 交换机虚拟机并不能满足大多数实验室的需求。每次启动新 VM 后,都必须调整示例中使用的标准 Linux 网桥。有关详细说明,请参阅 Linux 桥接和 VM 接口在虚拟机创建后更改一章。因此,您无需在此处重复。EVE-NG 会自动管理这些调整。
Proxmox VE 不会通过本地 CLI 提供虚拟机接口详细信息及其名称。但是,这些详细信息可在 GUI 的 REST API 中找到。使用提供的命令pvesh,可以轻松访问虚拟机接口,并提取有关已创建虚拟机接口的基于JSON的信息。因此,使用 pvesh 和 jq 命令以及常规 BASH 编程更容易重建新脚本vm-bridge-update.sh。请参阅如下所示的说明。
apt-get install jq rm -f vm-bridge-update.sh touch vm-bridge-update.sh chmod 777 vm-bridge-update.sh vi vm-bridge-update.sh
将以下配置复制并粘贴到您的编辑器中。然后,保存并关闭。
#!/bin/bash
# use API to get first nodename
pvesh get /nodes --output-format json | jq -r '.[].node' >nodes.txt
VMNODE=`cat nodes.txt | head -1`
echo 'We run this on node: '$VMNODE
# use API to get nic interfaces of our VM
pvesh get /nodes/$VMNODE/qemu/$1/status/current --output-format json | jq -r '.nics | keys[]' >/tmp/vminterfacelist.txt
# ignore first interface fxp0
cat /tmp/vminterfacelist.txt | tail -n +2 >/tmp/vminterfacelist2.txt
#cat /tmp/vminterfacelist2.txt
while IFS= read -r line
do
INTERFACE="$line"
#echo $INTERFACE
BRIDGE=`find /sys/devices/virtual/net -name $INTERFACE | grep '/brif/' | sed 's/// /g' | awk '{print $5}'`
# change MTU to higher value
RUNME="ip link set dev "$INTERFACE" mtu 9200"
echo $RUNME
eval $RUNME
# enable LLDP and 802.1x on bridge
RUNME="echo 65528 > /sys/class/net/"$BRIDGE"/bridge/group_fwd_mask"
echo $RUNME
eval $RUNME
# enable LACP on link
RUNME="echo 16388 > /sys/class/net/"$INTERFACE"/brport/group_fwd_mask"
echo $RUNME
eval $RUNME
done < /tmp/vminterfacelist2.txt
num=0
while IFS= read -r line
do
INTERFACE="$line"
BRIDGE=`find /sys/devices/virtual/net -name $INTERFACE | grep '/brif/' | sed 's/// /g' | awk '{print $5}'`
MTU=`cat /sys/class/net/$BRIDGE/mtu`
if [ "$MTU" != "9200" ]; then
echo 'Warning! Bridge:'$BRIDGE' did not follow new MTU setting of interface:'$INTERFACE' check other interfaces attached to same bridge and correct please!'
num=1
fi
done < /tmp/vminterfacelist2.txt
exit $num
使用新脚本,现在可以在 VM 启动后更新 VM 的 Linux 网桥和接口。所选 API 的第一个节点适用于单个 Proxmox VE 安装。如果您有群集,则可能需要更改上述脚本。
./vm-bridge-update.sh $VMID We run this on node: proxmox1 ip link set dev tap200i1 mtu 9200 echo 65528 > /sys/class/net/ge000/bridge/group_fwd_mask echo 16388 > /sys/class/net/tap200i1/brport/group_fwd_mask ip link set dev tap200i2 mtu 9200 echo 65528 > /sys/class/net/ge001/bridge/group_fwd_mask echo 16388 > /sys/class/net/tap200i2/brport/group_fwd_mask ip link set dev tap200i3 mtu 9200 echo 65528 > /sys/class/net/ge002/bridge/group_fwd_mask echo 16388 > /sys/class/net/tap200i3/brport/group_fwd_mask
要验证 Linux 网桥增强功能的第一个测试,请检查来自 vJunos 交换机虚拟机的 LLDP 邻接方公告。 juniper.conf 使用说明但没有调整,您不会看到使用 tcpdump ) 的公告。请参阅以下示例。
root@proxmox1:~# tcpdump -eni ge000 tcpdump: verbose output suppressed, use -v[v]... for full protocol decode listening on ge000, link-type EN10MB (Ethernet), snapshot length 262144 bytes 13:47:37.917669 bc:24:11:6b:0b:84 > 01:80:c2:00:00:0e, ethertype LLDP (0x88cc), length 322: LLDP, length 308: vjunos 13:48:07.692425 bc:24:11:6b:0b:84 > 01:80:c2:00:00:0e, ethertype LLDP (0x88cc), length 322: LLDP, length 308: vjunos
要执行最终测试,请启动与第一个虚拟机 1:1 连接的第二个 vJunos 交换机。然后,在两个 VM 之间建立具有活动 LACP 的 LAG。Mist 云 GUI 中两个虚拟交换机的配置如下所示。
如果在 vJunos 交换机控制台上进行本地检查,应该会看到两台交换机之间存在 LLDP 邻接方和已建立的 LACP 链路。此步骤将验证您的实验室是否按预期工作。
root@switch1> show lldp neighbors
Local Interface Parent Interface Chassis Id Port info System Name
ge-0/0/0 ae0 2c:6b:f5:3b:3b:c0 ge-0/0/0 switch2
ge-0/0/1 ae0 2c:6b:f5:3b:3b:c0 ge-0/0/1 switch2
ge-0/0/2 ae0 2c:6b:f5:3b:3b:c0 ge-0/0/2 switch2
root@switch1> show lacp interfaces
Aggregated interface: ae0
LACP state: Role Exp Def Dist Col Syn Aggr Timeout Activity
ge-0/0/0 Actor No No Yes Yes Yes Yes Fast Active
ge-0/0/0 Partner No No Yes Yes Yes Yes Fast Active
ge-0/0/1 Actor No No Yes Yes Yes Yes Fast Active
ge-0/0/1 Partner No No Yes Yes Yes Yes Fast Active
ge-0/0/2 Actor No No Yes Yes Yes Yes Fast Active
ge-0/0/2 Partner No No Yes Yes Yes Yes Fast Active
LACP protocol: Receive State Transmit State Mux State
ge-0/0/0 Current Fast periodic Collecting distributing
ge-0/0/1 Current Fast periodic Collecting distributing
ge-0/0/2 Current Fast periodic Collecting distributing