VMNet 网络

⚡ 要求macOS

VMNet 分配一个可从主机访问的"真实" IP 地址。

每种网络类型的配置步骤不同:

vzNAT

⚡ 要求Lima >= 0.14, macOS >= 13.0

对于 VZ 实例,“vzNAT” 网络可以如下配置:

limactl start --vm-type=vz --network=vzNAT
networks:
- vzNAT: true

IP 地址的范围不可指定。

“vzNAT” 网络不需要 socket_vmnet 二进制文件和 sudoers 文件。

socket_vmnet

托管(192.168.105.0/24)

socket_vmnet 可用于添加另一个可从主机和其他客户机访问的客户机 IP,而无需依赖 vz。 必须按照 https://github.com/lima-vm/socket_vmnet 上提供的说明进行安装。

请注意,使用 Homebrew 安装不安全,Lima 项目不推荐。 只有为当前用户启用了无密码 sudo 时,Homebrew 安装才能与 Lima 一起工作。 limactl sudoers 命令要求将 socket_vmnet 安装到只有 root 可写的安全路径中,并且会拒绝 Homebrew 安装到用户可写位置的 socket_vmnet

# 从源代码以 root 身份将 socket_vmnet 安装到 /opt/socket_vmnet
# 使用 https://github.com/lima-vm/socket_vmnet 上的说明
# 这假设 Xcode Command Line Tools 已经安装
git clone https://github.com/lima-vm/socket_vmnet
cd socket_vmnet
# 将 "v1.2.0" 更改为 https://github.com/lima-vm/socket_vmnet/releases 中的实际最新版本
git checkout v1.2.0
make
sudo make PREFIX=/opt/socket_vmnet install.bin

# 设置 sudoers 文件以从 Lima 启动 socket_vmnet
limactl sudoers >etc_sudoers.d_lima
less etc_sudoers.d_lima  # 验证文件看起来正确
sudo install -o root etc_sudoers.d_lima /etc/sudoers.d/lima
rm etc_sudoers.d_lima

注意

Lima v0.12 之前使用 vde_vmnet 来管理网络。 vde_vmnet 不再受支持。

Lima v0.14.0 及更高版本曾经也接受由 admin 用户拥有的 socket_vmnet 安装。 从 v1.0.0 开始,只接受 root 所有权。

网络在 $LIMA_HOME/_config/networks.yaml 中定义。如果此文件尚不存在,将使用这些默认设置创建:

默认设置
# socket_vmnet 可执行文件的路径。因为 socket_vmnet 通过 sudo 调用,所以应该
# 安装在只有 root 可以修改/替换的地方。这也意味着父目录
# 都不应该被用户可写。
#
# varRun 目录也不能被用户可写,因为它将
# 包含 socket_vmnet pid 文件。这些将通过 sudo 终止,所以替换
# pid 文件将允许杀死任意特权进程。但是 varRun
# 必须被守护进程用户可写。
#
# 路径段都不能是符号链接,这就是为什么必须是 /private/var
# 而不是 /var 等的原因。
paths:
# socketVMNet 需要 Lima >= 0.12。
  socketVMNet: /opt/socket_vmnet/bin/socket_vmnet
  varRun: /private/var/run/lima
  sudoers: /private/etc/sudoers.d/lima

group: everyone

networks:
  shared:
    mode: shared
    gateway: 192.168.105.1
    dhcpEnd: 192.168.105.254
    netmask: 255.255.255.0
  bridged:
    mode: bridged
    interface: en0
    # 桥接模式没有网关;dhcp 由外部网络管理
  host:
    mode: host
    gateway: 192.168.106.1
    dhcpEnd: 192.168.106.254
    netmask: 255.255.255.0

实例然后可以引用这些网络:

limactl start --network=lima:shared
networks:
  # Lima 可以自动管理在 $LIMA_HOME/_config/networks.yaml 中定义的网络的 socket_vmnet 守护进程。
  # socket_vmnet 二进制文件必须安装到只有 "root" 用户可以更改的安全位置。
  # - lima: shared
  #   # 实例的 MAC 地址;lima 将根据实例名称选择一个,
  #   # 所以 DHCP 分配的 ip 地址在实例重启时应该保持不变。
  #   macAddress: ""
  #   # 接口名称,默认为 "lima0"、"lima1" 等。
  #   interface: ""

当启动第一个引用网络的实例时,网络守护进程会自动启动,当最后一个实例停止后会自动停止。守护进程日志将存储在$LIMA_HOME/_networks 目录中。

由于启动和停止 socket_vmnet 守护进程的命令需要 root 权限,用户要么必须启用无密码 sudo,要么将所需命令添加到 sudoers 文件中。这可以通过以下方式完成:

limactl sudoers >etc_sudoers.d_lima
less etc_sudoers.d_lima  # 验证文件看起来正确
sudo install -o root etc_sudoers.d_lima /etc/sudoers.d/lima
rm etc_sudoers.d_lima

IP 地址由 macOS 的 bootpd 自动分配。 如果未分配 IP 地址,请尝试以下命令:

sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add /usr/libexec/bootpd
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --unblock /usr/libexec/bootpd

非托管

Lima 也可以连接到由 “socket” 寻址的"非托管"网络。这意味着守护进程不会由 Lima 控制,而必须在实例之前启动。接口类型(host、shared 或 bridged)在 socket_vmnet 中配置,而不是在 lima 中。

networks:
  - socket: "/var/run/socket_vmnet"