跳至内容

6 个配置文件

在本章中,您必须以非特权用户身份运行命令(如果您从头开始遵循本书,则为“incusadmin”)。

安装 Incus 时,您将获得一个默认配置文件,您无法删除或修改它。您可以使用默认配置文件为您的容器创建新的配置文件。

如果您检查您的容器列表,您会注意到在每种情况下 IP 地址都来自桥接接口。在生产环境中,您可能希望使用其他东西。这可能是来自您 LAN 接口的 DHCP 分配的地址,或来自您 WAN 的静态分配的地址。

如果您使用两个接口配置 Incus 服务器,并在每个接口上分配一个 WAN 和 LAN 上的 IP,那么您可以根据容器需要面对的接口来分配容器的 IP 地址。

从 Rocky Linux 版本 9.4(以及 Red Hat Enterprise Linux 的任何错误修复副本)开始,使用配置文件静态或动态分配 IP 地址的方法不起作用。

有一些方法可以解决这个问题,但这并不愉快。这似乎与对 Network Manager 所做的更改有关,这些更改影响了macvlanmacvlan 允许您创建具有不同 2 层地址的多个接口。

请注意,在选择基于 RHEL 的容器镜像时,这会带来弊端。

创建macvlan 配置文件并分配它

要创建您的macvlan 配置文件,请使用以下命令

incus profile create macvlan

如果您在多接口机器上,并且想要多个基于您想要到达的网络的macvlan 模板,您可能会使用“lanmacvlan”或“wanmacvlan”或任何您尝试用来标识配置文件的名称。在配置文件创建语句中使用“macvlan”由您决定。

您想要更改macvlan 接口,但在您这样做之前,您需要知道 Incus 服务器的父接口是什么。此接口将具有一个 LAN(在本例中)分配的 IP。要查找该接口,请使用

ip addr

在 192.168.1.0/24 网络中查找具有 LAN IP 分配的接口

2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 40:16:7e:a9:94:85 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.106/24 brd 192.168.1.255 scope global dynamic noprefixroute enp3s0
       valid_lft 4040sec preferred_lft 4040sec
    inet6 fe80::a308:acfb:fcb3:878f/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

在本例中,接口是“enp3s0”。

接下来,更改配置文件

incus profile device add macvlan eth0 nic nictype=macvlan parent=enp3s0

此命令将所有参数添加到macvlan 配置文件中,这些参数是使用所必需的。

使用以下命令检查此命令创建的内容

incus profile show macvlan

这将为您提供类似于以下内容的输出

config: {}
description: ""
devices:
  eth0:
    nictype: macvlan
    parent: enp3s0 
    type: nic
name: macvlan
used_by: []

配置文件可用于许多其他用途,但为容器分配静态 IP 或使用您自己的 DHCP 服务器是常见的需求。

要将macvlan 配置文件分配给 rockylinux-test-8,您需要执行以下操作

incus profile assign rockylinux-test-8 default,macvlan

对 rockylinux-test-9 做同样的事情

incus profile assign rockylinux-test-9 default,macvlan

这表示您想要默认配置文件,并应用macvlan 配置文件。

Rocky Linux macvlan

Network Manager 在 RHEL 发行版及其克隆中一直在不断变化。因此,macvlan 配置文件的工作方式不起作用(至少与其他发行版相比),并且需要额外的操作才能从 DHCP 或静态分配 IP 地址。

请记住,这一切主要与 Rocky Linux 无关,而是与上游包的实现有关。

如果您想运行 Rocky Linux 容器并使用macvlan 从您的 LAN 或 WAN 网络分配 IP 地址,则该过程将根据操作系统的容器版本(8.x 或 9.x)而有所不同。

Rocky Linux 9.x macvlan - DHCP 修复

首先,让我们说明在分配macvlan 配置文件后停止和重新启动两个容器时会发生什么。

但是,分配配置文件不会更改默认配置,默认配置为 DHCP。

要测试这一点,请执行以下操作

incus restart rocky-test-8
incus restart rocky-test-9

再次列出您的容器,并注意 rockylinux-test-9 现在没有 IP 地址

incus list
+-------------------+---------+----------------------+------+-----------+-----------+
|       NAME        |  STATE  |         IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-8 | RUNNING | 192.168.1.114 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-9 | RUNNING |                      |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| ubuntu-test       | RUNNING | 10.146.84.181 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+

如您所见,您的 Rocky Linux 8.x 容器从 LAN 接口接收了 IP 地址,而 Rocky Linux 9.x 容器则没有。

为了进一步演示问题,您必须在 Rocky Linux 9.0 容器上运行dhclient。这将向我们展示,应用macvlan 配置文件

incus exec rockylinux-test-9 dhclient

另一个容器列表现在显示以下内容

+-------------------+---------+----------------------+------+-----------+-----------+
|       NAME        |  STATE  |         IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-8 | RUNNING | 192.168.1.114 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-9 | RUNNING | 192.168.1.113 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| ubuntu-test       | RUNNING | 10.146.84.181 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+

这应该在停止和启动容器时发生,但它没有发生。假设您想每次都使用 DHCP 分配的 IP 地址,您可以通过一个简单的 crontab 条目来解决此问题。为此,您需要通过输入以下命令获取对容器的 shell 访问权限

incus shell rockylinux-test-9

接下来,让我们确定dhclient 的路径。为此,因为此容器来自最小镜像,您需要先安装which

dnf install which

然后运行

which dhclient

这将返回

/usr/sbin/dhclient

接下来,更改 root 的 crontab

crontab -e

添加此行

@reboot    /usr/sbin/dhclient

输入的 crontab 命令使用vi。使用Shift+:+w+q保存更改并退出。

退出容器并重新启动 rockylinux-test-9

incus restart rockylinux-test-9

另一个清单将显示容器已分配了 DHCP 地址

+-------------------+---------+----------------------+------+-----------+-----------+
|       NAME        |  STATE  |         IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-8 | RUNNING | 192.168.1.114 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-9 | RUNNING | 192.168.1.113 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| ubuntu-test       | RUNNING | 10.146.84.181 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+

Rocky Linux 9.x macvlan - 静态 IP 修复

在静态分配 IP 地址时,事情变得更加复杂。由于 Rocky Linux 9.x 中已弃用 network-scripts,唯一的方法是通过静态分配,并且由于容器使用网络的方式,您将无法使用普通的 ip route 语句设置路由。问题在于,在应用 macvlan 配置文件时分配的接口(在本例中为 eth0)无法通过网络管理器进行管理。解决方法是在重启后重命名容器的网络接口并分配静态 IP。您可以使用脚本并(再次)在 root 的 crontab 中运行。使用 ip 命令执行此操作。

为此,您需要再次获取容器的 shell 访问权限

incus shell rockylinux-test-9

接下来,您将在 /usr/local/sbin 中创建一个名为“static”的 bash 脚本

vi /usr/local/sbin/static

此脚本的内容并不复杂

#!/usr/bin/env bash

/usr/sbin/ip link set dev eth0 name net0
/usr/sbin/ip addr add 192.168.1.151/24 dev net0
/usr/sbin/ip link set dev net0 up
sleep 2
/usr/sbin/ip route add default via 192.168.1.1

您在这里做什么?

  • 您将 eth0 重命名为一个您可以管理的新名称(“net0”)
  • 您为容器分配了新分配的静态 IP 地址 (192.168.1.151)
  • 您启动了新的“net0”接口
  • 在添加默认路由之前,您需要等待 2 秒,以便接口处于活动状态
  • 您需要为您的接口添加默认路由

使用以下命令使您的脚本可执行

chmod +x /usr/local/sbin/static

将此添加到容器的 root crontab 中,时间为 @reboot

@reboot     /usr/local/sbin/static

最后,退出容器并重新启动它

incus restart rockylinux-test-9

等待几秒钟,然后再次列出容器

incus list

您应该看到成功

+-------------------+---------+----------------------+------+-----------+-----------+
|       NAME        |  STATE  |         IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-8 | RUNNING | 192.168.1.114 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-9 | RUNNING | 192.168.1.151 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| ubuntu-test       | RUNNING | 10.146.84.181 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+

Ubuntu macvlan

幸运的是,Ubuntu 的 Network Manager 实现没有破坏 macvlan 堆栈,使其部署变得容易得多!

就像您的 rockylinux-test-9 容器一样,您需要将配置文件分配给您的容器

incus profile assign ubuntu-test default,macvlan

要了解 DHCP 是否为容器分配了地址,请再次停止并启动容器

incus restart ubuntu-test

再次列出容器

+-------------------+---------+----------------------+------+-----------+-----------+
|       NAME        |  STATE  |         IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-8 | RUNNING | 192.168.1.114 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-9 | RUNNING | 192.168.1.151 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| ubuntu-test       | RUNNING | 192.168.1.132 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+

成功!

配置静态 IP 稍微有些不同,但并不难。您必须更改与容器连接关联的 .yaml 文件(10-incus.yaml)。对于此静态 IP,您将使用 192.168.1.201

vi /etc/netplan/10-incus.yaml

将当前内容更改为以下内容

network:
  version: 2
  ethernets:
    eth0:
      dhcp4: false
      addresses: [192.168.1.201/24]
      gateway4: 192.168.1.1
      nameservers:
        addresses: [8.8.8.8,8.8.4.4]

请保存您的更改并离开容器。

重启容器

incus restart ubuntu-test

再次列出您的容器时,您将看到您的静态 IP

+-------------------+---------+----------------------+------+-----------+-----------+
|       NAME        |  STATE  |         IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-8 | RUNNING | 192.168.1.114 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-9 | RUNNING | 192.168.1.151 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| ubuntu-test       | RUNNING | 192.168.1.201 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+

成功!

在此处使用的示例中,故意选择了一个难以配置的硬容器和两个不太难配置的容器。图像列表中还有更多版本的 Linux。如果您有偏好的版本,请尝试安装它,分配 macvlan 模板并设置 IP。

作者:Steven Spencer

贡献者:Ezequiel Bruni、Ganna Zhyrnova