Hyper-V 搭建 Linux 集群实战笔记(Internal Switch + NAT 方案)
目标:在 Hyper-V 上搭建多节点 Linux 集群,节点间固定 IP 互通,且都能上网
网络方案:Internal 虚拟交换机 + 宿主机 NAT(类似 VirtualBox Host-Only + NAT)
适用系统:AlmaLinux / RHEL / CentOS / Ubuntu / Debian 等
更新日期:2026-07-15
目录
- 一、网络架构设计
- 二、创建 Internal 虚拟交换机
- 三、配置宿主机 NAT(关键步骤)
- 四、创建 Linux 虚拟机
- 五、配置 Linux 静态 IP
- 六、创建其他节点(Node2、Node3...)
- 七、集群网络验证
- 八、宿主机防火墙放行(如需从外部访问集群)
- 九、常见问题排查
- 十、日常运维命令速查
- 十一、总结
一、网络架构设计
┌─────────────────────────────────────────┐
│ 宿主机 Windows 11 │
│ ┌─────────────────────────────────┐ │
│ │ vEthernet (InternalSwitch) │ │
│ │ IP: 192.168.100.1/24 (网关) │ │
│ │ NAT → 物理网卡 → 外网 │ │
│ └─────────────────────────────────┘ │
│ │ │ │ │
│ ┌─────┘ ┌─────┘ ┌─────┘ │
│ ▼ ▼ ▼ │
│ VM-Node1 VM-Node2 VM-Node3 │
│ 100.101 100.102 100.103 │
└─────────────────────────────────────────┘
| 节点 | 固定 IP | 用途 |
|---|---|---|
| 宿主机网关 | 192.168.100.1 |
VM 的网关和 DNS |
| Node1 | 192.168.100.101 |
Master / 管理节点 |
| Node2 | 192.168.100.102 |
Worker1 |
| Node3 | 192.168.100.103 |
Worker2 |
二、创建 Internal 虚拟交换机
2.1 图形界面方式
-
打开 Hyper-V 管理器 → 右侧"操作"面板 → 虚拟交换机管理器
-
左侧选择 "新建虚拟网络交换机" → 右侧选择 "内部" → 点击 "创建虚拟交换机"
-
填写属性:
- 名称(N):
InternalSwitch - 连接类型:内部(仅虚拟机与宿主机之间)
- 名称(N):
-
点击 应用(A) → 确定(O)
2.2 PowerShell 方式(推荐,更精确)
在宿主机以管理员打开 PowerShell,执行:
# 创建 Internal 类型的虚拟交换机
New-VMSwitch -SwitchName "InternalSwitch" -SwitchType Internal
验证创建成功:
Get-VMSwitch | Select Name, SwitchType
预期输出:
Name SwitchType
---- ----------
Default Internal
ExternalSwitch External
InternalSwitch Internal
三、配置宿主机 NAT(关键步骤)
Internal Switch 创建后,VM 和宿主机能互通,但还不能上网。需要在宿主机上配置 NAT 转发。
3.1 给宿主机的虚拟网卡设置 IP
# 查看虚拟网卡的确切名称
Get-NetAdapter | Where Name -Like "*InternalSwitch*"
预期输出:
Name InterfaceDescription Status
---- -------------------- ------
vEthernet (InternalSwitch) Hyper-V Virtual Ethernet Up
然后设置 IP:
New-NetIPAddress -IPAddress 192.168.100.1 -PrefixLength 24 -InterfaceAlias "vEthernet (InternalSwitch)"
如果提示接口已存在 IP,先查看已有 IP:
Get-NetIPAddress -InterfaceAlias "vEthernet (InternalSwitch)" | Select IPAddress, PrefixLength
3.2 创建 NAT 规则
New-NetNat -Name "InternalSwitch" -InternalIPInterfaceAddressPrefix 192.168.100.0/24
验证 NAT 创建成功:
Get-NetNat | Select Name, InternalIPInterfaceAddressPrefix
预期输出:
Name InternalIPInterfaceAddressPrefix
---- --------------------------------
InternalSwitch 192.168.100.0/24
3.3 验证宿主机配置
# 查看 InternalSwitch 网卡的 IP
Get-NetIPAddress -InterfaceAlias "vEthernet (InternalSwitch)" | Select IPAddress, PrefixLength
应该显示:
IPAddress PrefixLength
--------- ------------
192.168.100.1 24
四、创建 Linux 虚拟机
4.1 下载 AlmaLinux ISO
建议下载 AlmaLinux 9.x DVD ISO(约 9GB,包含完整软件包)。
4.2 创建第一台 VM(Node1)
Hyper-V 管理器 → 右侧"操作"面板 → 新建 → 虚拟机
| 步骤 | 配置项 | 值 |
|---|---|---|
| 1 | 名称 | AlmaLinux-Node1 |
| 1 | 位置 | D:\Hyper-V\Virtual Machines\(Hyper-V 默认) |
| 2 | 代数 | 第 2 代(AlmaLinux 9 默认 UEFI 启动,第 2 代兼容性更好) |
| 3 | 内存 | 2048 MB(2GB,Linux 足够) |
| 3 | 动态内存 | ✅ 勾选 |
| 4 | 网络 | InternalSwitch |
| 5 | 硬盘 | 路径 D:\Virtual Hard Disks\AlmaLinux-Node1\AlmaLinux-Node1.vhdx(先建子目录),大小 40 GB |
| 6 | 安装选项 | 选择下载的 AlmaLinux ISO |
重要:完成向导后,先不要启动虚拟机!右键 VM → 设置 → 安全 → 取消勾选"启用安全启动"。Linux 发行版通常没有微软签名的安全启动密钥,开启会导致无法引导。
4.4 安装 AlmaLinux
- 启动 VM → 连接控制台
- 选择 Install AlmaLinux 9.x
- 语言选择 简体中文
- 安装目的地:选中硬盘 → 点击"完成"(自动分区)
- 网络和主机名:
- 打开以太网开关(此时是 DHCP 状态,先不用管,装完再改静态 IP)
- 主机名设为
node1
- root 密码:设置密码
- 创建用户:建议创建一个普通用户(如
admin),勾选"设为管理员" - 点击 开始安装
安装完成后重启。
重要:重启后如果不进入系统而是回到安装菜单,说明 ISO 还在 DVD 驱动器里。
进入系统前先关机 → 编辑 VM 设置 → DVD 驱动器 → 选择 None,再启动。
五、配置 Linux 静态 IP
5.1 登录系统
用 root 或普通用户登录。
5.2 查看网卡状态
nmcli device status
情况 A:CONNECTION 列有名字(如 eth0)
DEVICE TYPE STATE CONNECTION
eth0 ethernet connected eth0
情况 B:CONNECTION 列为 --(安装时未配置网络)
DEVICE TYPE STATE CONNECTION
eth0 ethernet 已断开 --
网卡名称可能是
eth0、ens160、enp0s3等,以实际输出为准。以下命令中假设为eth0。
5.3 配置静态 IP
方式一:CONNECTION 有名字(用 modify)
nmcli connection modify eth0 \
ipv4.addresses 192.168.100.101/24 \
ipv4.gateway 192.168.100.1 \
ipv4.dns "8.8.8.8,114.114.114.114" \
ipv4.method manual
nmcli connection down eth0 && nmcli connection up eth0
方式二:CONNECTION 为 --(用 add 创建新连接)
nmcli connection add type ethernet con-name eth0 ifname eth0 \
ipv4.addresses 192.168.100.101/24 \
ipv4.gateway 192.168.100.1 \
ipv4.dns "8.8.8.8,114.114.114.114" \
ipv4.method manual
nmcli connection up eth0
DNS 必须用公共 DNS(如
8.8.8.8),不能用192.168.100.1(宿主机网关不是 DNS 服务器,无法解析域名)。
如果 modify 后 up 报错(IP 配置无法保留)
NetworkManager 状态混乱时,删除重来最干净:
nmcli connection delete eth0
nmcli connection add type ethernet con-name eth0 ifname eth0 \
ipv4.addresses 192.168.100.101/24 \
ipv4.gateway 192.168.100.1 \
ipv4.dns "8.8.8.8,114.114.114.114" \
ipv4.method manual
5.4 验证网络
# 查看 IP
ip addr | grep 192.168.100
预期输出:
inet 192.168.100.101/24 brd 192.168.100.255 scope global noprefixroute eth0
# Ping 宿主机网关(验证 VM 与宿主机互通)
ping 192.168.100.1 -c 4
# Ping 公网 IP(验证 NAT 是否通)
ping 8.8.8.8 -c 4
# Ping 域名(验证 DNS 是否生效)
ping baidu.com -c 4
三步全部通过,说明网络配置成功。
六、创建其他节点(Node2、Node3...)
6.1 复制 VM(最快方式)
不需要重复安装系统,直接复制 VHDX 创建新 VM。
前置知识:检查点与磁盘文件的关系
当 VM 有检查点(Checkpoint)时,Hyper-V 会创建差分磁盘链:
原始状态 ──→ 创建检查点1 ──→ 创建检查点2 ──→ 当前状态
│ │ │ │
│ .vhdx冻结 .avhdx1冻结 .avhdx2(活跃)
│ │ │ │
│ 只读父盘 差分磁盘1 差分磁盘2
└────────────────────────────────────────────────┘
合并后才是完整状态
.vhdx:创建第一个检查点时被冻结,只读,不包含检查点之后的任何变更.avhdx:差分磁盘,记录检查点之后的变更,不能单独复制(依赖父.vhdx)
直接复制
.vhdx= 只拿到检查点之前的旧状态,后续配置的静态 IP、安装的软件等都在.avhdx里,会丢失。
方案一:删除检查点后复制(最推荐,黄金镜像)
适用场景:不需要保留原 VM 的检查点,追求简单直接。这是搭建集群的最佳实践。
核心思路:配置完网络后,删除所有检查点让 .vhdx 合并为可写的完整状态,之后 .vhdx 就是黄金镜像,随时可以复制出新节点。
步骤:
-
关闭 Node1
Stop-VM -Name "AlmaLinux-Node1" -Save -
在 Hyper-V 管理器中删除检查点
- 选中
AlmaLinux-Node1→ 下方"检查点"面板 - 右键检查点 → 删除检查点
- 等待合并完成(底部有进度条)
- 选中
-
确认合并完成(
.avhdx消失)Get-ChildItem "D:\Virtual Hard Disks\" | Where Name -Like "AlmaLinux-Node1*" -
创建子目录并复制 VHDX
建议每个 VM 的 VHDX 放在独立子目录,方便管理:
# 创建子目录 New-Item -ItemType Directory -Path "D:\Virtual Hard Disks\AlmaLinux-Node2" -Force # 复制 VHDX 到子目录 Copy-Item "D:\Virtual Hard Disks\AlmaLinux-Node1.vhdx" ` "D:\Virtual Hard Disks\AlmaLinux-Node2\AlmaLinux-Node2.vhdx" -
创建新 VM 并关闭安全启动
New-VM没有参数直接关闭安全启动,但可以用分号把两个命令合并成一行执行:New-VM -Name "AlmaLinux-Node2" -MemoryStartupBytes 2GB -Generation 2 ` -VHDPath "D:\Virtual Hard Disks\AlmaLinux-Node2\AlmaLinux-Node2.vhdx" ` -SwitchName "InternalSwitch"; ` Set-VMFirmware -VMName "AlmaLinux-Node2" -EnableSecureBoot Off注意:
New-VM默认启用安全启动,Linux 必须关闭,否则启动时会报错"Start PXE over IPv4"(找不到可引导设备)。
为什么不需要保留检查点?
集群节点应该是可丢弃、可重建的。需要回滚时,直接删除 VM 从.vhdx重新创建即可,比检查点更简单。检查点链会占用额外磁盘空间,且结构复杂。
如果想保留回滚能力:可以在配置完网络后先创建一个新的检查点,然后删除旧的检查点。这样
.vhdx包含配置好网络的完整状态,同时保留了一个回滚点。后续 Node1 的变更写入.avhdx,不影响.vhdx的内容,你仍然可以随时复制.vhdx作为黄金镜像。
方案二:导出/导入(保留原 VM 检查点)
适用场景:原 VM 的检查点很重要,不能删除。
Hyper-V 导出功能会完整保存整个检查点链(包括 .vhdx + 所有 .avhdx),导入时复制为新 VM。
步骤:
-
关闭 Node1
Stop-VM -Name "AlmaLinux-Node1" -Save -
导出 Node1
Export-VM -Name "AlmaLinux-Node1" -Path "D:\VMs\Export" -
确认导出目录结构
Get-ChildItem "D:\VMs\Export\AlmaLinux-Node1" -Recurse导出目录包含:
Snapshots\— 检查点文件Virtual Hard Disks\—.vhdx和.avhdxVirtual Machines\—.vmcx配置文件(导入时需要用这个路径)
-
创建子目录避免 VHD 文件名冲突
Import-VM会原样复制 VHD 文件(文件名不变),如果目标目录已有AlmaLinux-Node1.vhdx会报错。必须先创建子目录:New-Item -ItemType Directory -Path "D:\Virtual Hard Disks\AlmaLinux-Node2" -Force -
导入为新 VM
-Path必须指向Virtual Machines子目录下的.vmcx文件:Import-VM -Path "D:\VMs\Export\AlmaLinux-Node1\Virtual Machines\你的虚拟机ID.vmcx" ` -Copy -GenerateNewId ` -VhdDestinationPath "D:\Virtual Hard Disks\AlmaLinux-Node2"注意:
GenerateNewId只生成新的 VM ID,不会改 VM 名称和 VHD 文件名- 导入后 VM 名称仍然是
AlmaLinux-Node1,需要手动重命名
-
重命名新 VM
导入后 Hyper-V 中会有两个
AlmaLinux-Node1(原 VM 和新导入的),不能直接用Rename-VM -Name(会把两个都改名)。正确做法:用 VMId 区分,通过管道重命名:
# 查看 VMId 区分原 VM 和新 VM Get-VM | Select Name, VMId # 新导入的 VM 会有新的 VMId(GenerateNewId 生成的) # 用 -Id 参数(不是 -VMId)指定要改名的 VM Get-VM -Id "新VM的VMId" | Rename-VM -NewName "AlmaLinux-Node2"或者分步写:
$vm = Get-VM -Id "新VM的VMId" Rename-VM -VM $vm -NewName "AlmaLinux-Node2" -
删除新 VM 的检查点(改名 VHD 前必须做!)
关键步骤:导入会把检查点链一起带过来。如果直接改名 VHD 文件,
.vhdx内部记录的.avhdx路径会失效,导致启动报错。Hyper-V 管理器 → 选中
AlmaLinux-Node2→ 下方"检查点"面板 → 右键检查点 → 删除检查点等待合并完成,确认
.avhdx文件消失:Get-ChildItem "D:\Virtual Hard Disks\AlmaLinux-Node2" # 预期只剩 .vhdx,没有 .avhdx -
改名 VHD 文件并更新路径
检查点合并后,
.vhdx成为独立文件,可以安全改名:- 文件资源管理器:
D:\Virtual Hard Disks\AlmaLinux-Node2\AlmaLinux-Node1.vhdx→ 重命名为AlmaLinux-Node2.vhdx - Hyper-V 管理器 → 右键
AlmaLinux-Node2→ 设置 → SCSI 控制器 → 硬盘驱动器 → 浏览 → 选择改名后的AlmaLinux-Node2.vhdx
- 文件资源管理器:
优点:原 VM 检查点完全保留,新 VM 独立运行
缺点:新 VM 也带着检查点链,占用额外空间;导入后必须先删检查点再改名,否则启动报错;操作步骤比复制 VHDX 复杂得多
6.2 启动 Node2 后修改配置(避免 IP 冲突)
无论用哪种方案复制,Node2 都是 Node1 的完整复制,IP 和主机名完全一样,必须修改:
# 修改主机名
hostnamectl set-hostname node2
# 修改静态 IP(注意改为 102)
nmcli connection modify eth0 \
ipv4.addresses 192.168.100.102/24 \
ipv4.gateway 192.168.100.1 \
ipv4.dns "8.8.8.8,114.114.114.114" \
ipv4.method manual
nmcli connection down eth0 && nmcli connection up eth0
注意:复制 VHDX 后,Node2 和 Node1 有相同的 MAC 地址。如果两个 VM 同时运行,需要让 Hyper-V 重新生成 MAC 地址:右键 Node2 → 设置 → 网络适配器 → 高级功能 → MAC 地址 → 动态分配。
6.3 修改 Node3(同理)
hostnamectl set-hostname node3
nmcli connection modify eth0 \
ipv4.addresses 192.168.100.103/24 \
ipv4.gateway 192.168.100.1 \
ipv4.dns "8.8.8.8,114.114.114.114" \
ipv4.method manual
nmcli connection down eth0 && nmcli connection up eth0
七、集群网络验证
7.1 节点间互通测试
在 Node1 上执行:
ping 192.168.100.102 -c 4
ping 192.168.100.103 -c 4
7.2 外网访问测试
在每个节点执行:
ping baidu.com -c 4
curl -I http://baidu.com
7.3 SSH 远程连接(从宿主机)
在宿主机 PowerShell 或终端中:
ssh admin@192.168.100.101
ssh admin@192.168.100.102
ssh admin@192.168.100.103
首次连接会提示确认指纹,输入
yes即可。
八、宿主机防火墙放行(如需从外部访问集群)
如果需要在宿主机上访问集群的某些端口(如 80、443、3306、6379 等),需要配置端口转发:
# 示例:将宿主机的 8081 端口转发到 Node1 的 80 端口
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8081 connectaddress=192.168.100.101 connectport=80
# 查看所有端口转发规则
netsh interface portproxy show all
# 删除规则
netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=8081
同时放行防火墙:
New-NetFirewallRule -DisplayName "Cluster-Port-8081" -Direction Inbound -Protocol TCP -LocalPort 8081 -Action Allow
九、常见问题排查
| 问题 | 原因 | 解决 |
|---|---|---|
| VM 无法上网 | ① NAT 规则未创建;② DNS 配置错误(用了 192.168.100.1 当 DNS) |
① 检查 Get-NetNat;② DNS 必须用公共 DNS(如 8.8.8.8),宿主机网关不是 DNS 服务器 |
VM 无法 Ping 通宿主机 192.168.100.1 |
宿主机防火墙拦截 | 检查 Windows 防火墙,或临时关闭测试 |
| VM 间无法互通 | 在同一 Internal Switch 下应该互通,检查 IP 是否在同一网段 | 确认都是 192.168.100.x/24 |
| 宿主机无法 SSH 到 VM | VM 未安装 SSH 或防火墙拦截 | systemctl status sshd,systemctl enable --now sshd |
| 复制 VHDX 后网络不通 | MAC 地址冲突 | 在 Hyper-V 设置中重新生成 MAC 地址 |
nmcli 命令报错 |
网卡名不对 | 用 nmcli device status 确认实际网卡名 |
十、日常运维命令速查
# 查看所有 VM 状态
Get-VM | Select Name, State, Uptime, MemoryAssigned
# 启动/关闭/重启 VM
Start-VM -Name "AlmaLinux-Node1"
Stop-VM -Name "AlmaLinux-Node1" -Save # 休眠
Stop-VM -Name "AlmaLinux-Node1" -Force # 强制关机
Restart-VM -Name "AlmaLinux-Node1" -Force
# 查看 VM IP(通过 Hyper-V 集成服务)
Get-VM -Name "AlmaLinux-Node1" | Select Name, @{N='IP';E={(Get-VMNetworkAdapter -VMName $_.Name).IPAddresses}}
# 连接控制台
vmconnect localhost "AlmaLinux-Node1"
# 删除 NAT(如需重建)
Get-NetNat -Name "InternalSwitch" | Remove-NetNat
# 删除虚拟交换机(如需重建)
Remove-VMSwitch -Name "InternalSwitch" -Force
十一、总结
| 步骤 | 操作 | 命令/路径 |
|---|---|---|
| 1 | 创建 Internal Switch | New-VMSwitch -SwitchName "InternalSwitch" -SwitchType Internal |
| 2 | 宿主机配置 IP | New-NetIPAddress -IPAddress 192.168.100.1 -PrefixLength 24 -InterfaceAlias "vEthernet (InternalSwitch)" |
| 3 | 创建 NAT 规则 | New-NetNat -Name "InternalSwitch" -InternalIPInterfaceAddressPrefix 192.168.100.0/24 |
| 4 | 创建 Linux VM | Hyper-V 管理器 → 新建虚拟机,网络选 InternalSwitch |
| 5 | VM 内配置静态 IP | nmcli connection modify eth0 ipv4.addresses 192.168.100.101/24 ... |
| 6 | 验证 | ping 192.168.100.1、ping baidu.com、ssh admin@192.168.100.101 |
核心优势:此方案下 VM 的 IP 完全由你控制,不受路由器 DHCP 影响,换 Wi-Fi、重启路由器都不会改变集群内部网络。非常适合本地开发测试和 K8s 集群搭建。
更新时间:2026-07-15
适用环境:Windows 11 + Hyper-V + AlmaLinux 9 / RHEL 9 / CentOS 9

浙公网安备 33010602011771号