Hyper-V 搭建 Linux 集群实战笔记(Internal Switch + NAT 方案)

目标:在 Hyper-V 上搭建多节点 Linux 集群,节点间固定 IP 互通,且都能上网
网络方案:Internal 虚拟交换机 + 宿主机 NAT(类似 VirtualBox Host-Only + NAT)
适用系统:AlmaLinux / RHEL / CentOS / Ubuntu / Debian 等
更新日期:2026-07-15


目录


一、网络架构设计

┌─────────────────────────────────────────┐
│              宿主机 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 图形界面方式

  1. 打开 Hyper-V 管理器 → 右侧"操作"面板 → 虚拟交换机管理器

  2. 左侧选择 "新建虚拟网络交换机" → 右侧选择 "内部" → 点击 "创建虚拟交换机"

  3. 填写属性:

    • 名称(N)InternalSwitch
    • 连接类型:内部(仅虚拟机与宿主机之间)
  4. 点击 应用(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

官网:https://almalinux.org/

建议下载 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

  1. 启动 VM → 连接控制台
  2. 选择 Install AlmaLinux 9.x
  3. 语言选择 简体中文
  4. 安装目的地:选中硬盘 → 点击"完成"(自动分区)
  5. 网络和主机名
    • 打开以太网开关(此时是 DHCP 状态,先不用管,装完再改静态 IP)
    • 主机名设为 node1
  6. root 密码:设置密码
  7. 创建用户:建议创建一个普通用户(如 admin),勾选"设为管理员"
  8. 点击 开始安装

安装完成后重启。

重要:重启后如果不进入系统而是回到安装菜单,说明 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  已断开     --

网卡名称可能是 eth0ens160enp0s3 等,以实际输出为准。以下命令中假设为 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 就是黄金镜像,随时可以复制出新节点。

步骤

  1. 关闭 Node1

    Stop-VM -Name "AlmaLinux-Node1" -Save
    
  2. 在 Hyper-V 管理器中删除检查点

    • 选中 AlmaLinux-Node1 → 下方"检查点"面板
    • 右键检查点 → 删除检查点
    • 等待合并完成(底部有进度条)
  3. 确认合并完成.avhdx 消失)

    Get-ChildItem "D:\Virtual Hard Disks\" | Where Name -Like "AlmaLinux-Node1*"
    
  4. 创建子目录并复制 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"
    
  5. 创建新 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。

步骤

  1. 关闭 Node1

    Stop-VM -Name "AlmaLinux-Node1" -Save
    
  2. 导出 Node1

    Export-VM -Name "AlmaLinux-Node1" -Path "D:\VMs\Export"
    
  3. 确认导出目录结构

    Get-ChildItem "D:\VMs\Export\AlmaLinux-Node1" -Recurse
    

    导出目录包含:

    • Snapshots\ — 检查点文件
    • Virtual Hard Disks\.vhdx.avhdx
    • Virtual Machines\.vmcx 配置文件(导入时需要用这个路径
  4. 创建子目录避免 VHD 文件名冲突

    Import-VM 会原样复制 VHD 文件(文件名不变),如果目标目录已有 AlmaLinux-Node1.vhdx 会报错。必须先创建子目录:

    New-Item -ItemType Directory -Path "D:\Virtual Hard Disks\AlmaLinux-Node2" -Force
    
  5. 导入为新 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,需要手动重命名
  6. 重命名新 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"
    
  7. 删除新 VM 的检查点(改名 VHD 前必须做!)

    关键步骤:导入会把检查点链一起带过来。如果直接改名 VHD 文件,.vhdx 内部记录的 .avhdx 路径会失效,导致启动报错。

    Hyper-V 管理器 → 选中 AlmaLinux-Node2 → 下方"检查点"面板 → 右键检查点 → 删除检查点

    等待合并完成,确认 .avhdx 文件消失:

    Get-ChildItem "D:\Virtual Hard Disks\AlmaLinux-Node2"
    # 预期只剩 .vhdx,没有 .avhdx
    
  8. 改名 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 sshdsystemctl 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.1ping baidu.comssh admin@192.168.100.101

核心优势:此方案下 VM 的 IP 完全由你控制,不受路由器 DHCP 影响,换 Wi-Fi、重启路由器都不会改变集群内部网络。非常适合本地开发测试和 K8s 集群搭建。


更新时间:2026-07-15
适用环境:Windows 11 + Hyper-V + AlmaLinux 9 / RHEL 9 / CentOS 9

posted @ 2026-07-16 15:09  RK5123153  阅读(23)  评论(0)    收藏  举报