Rancher Elemental Bare Metal 网络接口名称变更问题

环境中的 Bare Metal 节点通过 ifnames=1 开启了网络接口命名预测,但在进行 OS 升级后,接口名称由 ens* 变成了 enp*,导致原有的 bond 配置无法生效,网络中断。


环境信息

  • Rancher Prime:v2.13.1-ent2-rc1
  • Elemental Helm Chart:108.0.0+up1.7.4
  • SUSE Linux Micro:6.0(2.1.3-3.64 / 2.1.3-6.216)
  • SUSE OS Management UI Plugin:3.0.1

根本原因分析

问题是由 SUSE-RU-2025:20203-1 引入的 systemd 网络接口命名方案变更所致:https://lists.suse.com/pipermail/sle-updates/2025-June/039721.html

该补丁将 systemd 和 udev 升级到 254.24-1.1 版本,并包含 PED-12317,用于保留 SLE 15 系列所使用的网络设备命名方案。

测试结果如下:

  • 原始 2.1.3-3.64 镜像使用 systemd 254.9-1.9,ID_NET_NAMING_SCHEME 默认为 v253。
  • 2.1.3-6.216 镜像使用 systemd 254.27-4.1,ID_NET_NAMING_SCHEME 默认为 sle15-sp4。

在受影响的 PCI bridge 拓扑中,sle15-sp4 命名方案使 net_id 仅根据 PCI 路径生成 ID_NET_NAME_PATH=enp* 候选名称,而不再生成对应的 ID_NET_NAME_SLOT=ens* 候选名称。

因此,在 v253 命名方案下原本命名为 ens* 的网络接口,在升级到 2.1.3-6.216 后会被重命名为 enp*


问题复现


部署 Rancher Prime

使用 Docker 部署 Rancher Prime:

1
2
3
4
5
6
7
8
docker run -d --restart=unless-stopped --name rancher \
-v /var/lib/rancher:/var/lib/rancher \
-v /etc/rancher/k3s/registries.yaml:/etc/rancher/k3s/registries.yaml:ro \
-e CATTLE_BOOTSTRAP_PASSWORD=<BOOTSTRAP_PASSWORD> \
-e CATTLE_SYSTEM_DEFAULT_REGISTRY=<PRIVATE_REGISTRY> \
-p 80:80 -p 443:443 \
--privileged \
<PRIVATE_REGISTRY>/prime/rancher:v2.13.1-ent2-rc1

安装 SUSE OS Management UI 插件和 Elemental

从 Rancher Prime UI 安装以下组件:


创建 MachineRegistration

在 local 集群导入如下 YAML:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
apiVersion: elemental.cattle.io/v1beta1
kind: MachineRegistration
metadata:
name: test
namespace: fleet-default
spec:
machineName: "m-${Product/UUID}"

config:
cloud-config:
name: test-machine-registration
stages:
boot:
- name: Configure Root SSH Access
authorized_keys:
root:
- "<SSH_PUBLIC_KEY>"
commands:
- systemctl enable --now sshd.service

initramfs:
- files:
- content: |
name: Reboot to enable persistent interface naming
stages:
network:
- if: '! grep -q net.ifnames=1 /proc/cmdline'
commands:
- grub2-editenv /oem/grubenv set extra_cmdline="net.ifnames=1" && shutdown -r now
path: /oem/99_enable_persistent_interface_naming.yaml
permissions: 420

fs:
- name: Configure NetworkManager profiles
files:
# 管理网络连接不依赖 ens*/enp* 命名,bond 失效后仍然可以通过管理网络登陆节点
- path: /etc/NetworkManager/system-connections/mgmt-by-mac.nmconnection
owner: 0
group: 0
permissions: 384
content: |
[connection]
id=mgmt-by-mac
type=ethernet
autoconnect=true
autoconnect-priority=100

[ethernet]
mac-address=52:54:00:00:00:10

[ipv4]
method=auto
dns=172.16.16.1;
ignore-auto-dns=true

[ipv6]
method=disabled

# bond 配置
- path: /etc/NetworkManager/system-connections/bond0.nmconnection
owner: 0
group: 0
permissions: 384
content: |
[connection]
id=bond0
type=bond
interface-name=bond0
autoconnect=true
autoconnect-slaves=1

[bond]
mode=active-backup
miimon=100

[ipv4]
method=disabled

[ipv6]
method=disabled

# 这两个配置文件特意按 ens* 绑定,以便在从 3.64 升级到 6.216 时复现 bond 故障
- path: /etc/NetworkManager/system-connections/bond0-slave-ens2f0.nmconnection
owner: 0
group: 0
permissions: 384
content: |
[connection]
id=bond0-slave-ens2f0
type=ethernet
interface-name=ens2f0
master=bond0
slave-type=bond
autoconnect=true

[ethernet]

[bond-port]

- path: /etc/NetworkManager/system-connections/bond0-slave-ens7f0.nmconnection
owner: 0
group: 0
permissions: 384
content: |
[connection]
id=bond0-slave-ens7f0
type=ethernet
interface-name=ens7f0
master=bond0
slave-type=bond
autoconnect=true

[ethernet]

[bond-port]

elemental:
install:
device: /dev/sda
snapshotter:
type: btrfs
maxSnaps: 3
reboot: true

reset:
enabled: true
reset-oem: true
reset-persistent: true
reboot: true

machineInventoryLabels:
author: warner

创建 SeedImage

在 local 集群导入如下 YAML:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 用于测试从 2.1.3-3.64 升级到 2.1.3-6.216
apiVersion: elemental.cattle.io/v1beta1
kind: SeedImage
metadata:
name: test-213-364
namespace: fleet-default
spec:
type: raw

baseImage: "registry.suse.com/suse/sl-micro/6.0/baremetal-os-container:2.1.3-3.64"

registrationRef:
apiVersion: elemental.cattle.io/v1beta1
kind: MachineRegistration
name: test
namespace: fleet-default

cleanupAfterMinutes: 0

---
# 用于测试直接安装 2.1.3-6.216
apiVersion: elemental.cattle.io/v1beta1
kind: SeedImage
metadata:
name: test-213-6216
namespace: fleet-default
spec:
type: raw

baseImage: "registry.suse.com/suse/sl-micro/6.0/baremetal-os-container:2.1.3-6.216"

registrationRef:
apiVersion: elemental.cattle.io/v1beta1
kind: MachineRegistration
name: test
namespace: fleet-default

cleanupAfterMinutes: 0

测试 1:从 2.1.3-3.64 升级到 2.1.3-6.216

使用 Harvester 等虚拟化环境不利于模拟 Bare Metal PCI bridge 拓扑,所以使用 QEMU / KVM 方式进行复现。


创建 Elemental Machine

使用 QEMU / KVM 模拟 Bare Metal PCI bridge:

1
2
3
4
5
6
7
8
PCI root bus 0000:00
├── 00:02.0 PCI bridge,ACPI _SUN=2
│ ├── 01:00.0 NIC,MAC 52:54:00:00:02:10
│ └── 01:00.1 NIC,MAC 52:54:00:00:02:11
├── 00:07.0 PCI bridge,ACPI _SUN=7
│ ├── 02:00.0 NIC,MAC 52:54:00:00:07:10
│ └── 02:00.1 NIC,MAC 52:54:00:00:07:11
└── 00:04.0 专用管理网卡, MAC 52:54:00:00:00:10

准备一台 KVM 主机,并下载已构建的两个 RAW 介质文件:

1
2
3
wget --no-check-certificate "https://<SEED_IMAGE_URL>/test-2026-08-06T06:53:01Z.raw" -O /root/test-213-364.raw

wget --no-check-certificate "https://<SEED_IMAGE_URL>/test-2026-08-10T07:05:50Z.raw" -O /root/test-213-6216.raw

在 KVM 主机上安装依赖项:

1
2
3
4
5
6
7
8
9
apt-get update
apt-get install -y \
qemu-system-x86 \
qemu-utils \
ovmf \
swtpm \
swtpm-tools \
acpica-tools \
netcat-openbsd

创建专用实验目录和 RAW 工作副本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mkdir -p /root/elemental-ifname-repro
cd /root/elemental-ifname-repro

cp --reflink=auto --sparse=always \
/root/test-213-364.raw \
/root/elemental-ifname-repro/elemental-node.raw

qemu-img resize -f raw \
/root/elemental-ifname-repro/elemental-node.raw 40G

cp /usr/share/OVMF/OVMF_VARS.fd \
/root/elemental-ifname-repro/OVMF_VARS.fd

mkdir -p \
/root/elemental-ifname-repro/runtime \
/root/elemental-ifname-repro/swtpm-state

创建 SSDT,用于模拟父桥的物理插槽:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
cd /root/elemental-ifname-repro

tee ssdt-parent-bridge-slots.dsl >/dev/null <<'EOF'
DefinitionBlock ("", "SSDT", 0x02, "CODEX", "BRGSLOTS", 0x00000001)
{
External (\_SB.PCI0.S10, DeviceObj)
External (\_SB.PCI0.S38, DeviceObj)

Scope (\_SB.PCI0.S10)
{
Name (_SUN, 0x02)
}

Scope (\_SB.PCI0.S38)
{
Name (_SUN, 0x07)
}
}
EOF

iasl -tc ssdt-parent-bridge-slots.dsl
ls -l ssdt-parent-bridge-slots.aml

启动持久化虚拟 TPM:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cd /root/elemental-ifname-repro

test ! -e runtime/qemu.pid || {
old_pid=$(sed -n '1p' runtime/qemu.pid)
ps -p "$old_pid" -o pid=,stat=,cmd=
}

pgrep -a swtpm || true

unlink runtime/swtpm.sock 2>/dev/null || true
unlink runtime/monitor.sock 2>/dev/null || true
unlink runtime/serial.sock 2>/dev/null || true
unlink runtime/qemu.pid 2>/dev/null || true

swtpm socket \
--tpm2 \
--tpmstate dir=/root/elemental-ifname-repro/swtpm-state \
--ctrl type=unixio,path=/root/elemental-ifname-repro/runtime/swtpm.sock \
--log file=/root/elemental-ifname-repro/swtpm.log \
--daemon

启动 QEMU:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
cd /root/elemental-ifname-repro

qemu-system-x86_64 \
-S \
-name elemental-ifname-repro \
-machine pc,accel=kvm \
-global PIIX4_PM.acpi-pci-hotplug-with-bridge-support=off \
-acpitable file=/root/elemental-ifname-repro/ssdt-parent-bridge-slots.aml \
-cpu host \
-smp 4 \
-m 8192 \
-nodefaults \
-device virtio-vga,bus=pci.0,addr=0x3 \
-vnc 127.0.0.1:1 \
-chardev socket,id=serial0,path=/root/elemental-ifname-repro/runtime/serial.sock,server=on,wait=off,logfile=/root/elemental-ifname-repro/serial.log \
-serial chardev:serial0 \
-monitor unix:/root/elemental-ifname-repro/runtime/monitor.sock,server=on,wait=off \
-drive if=pflash,format=raw,readonly=on,file=/usr/share/OVMF/OVMF_CODE.fd \
-drive if=pflash,format=raw,file=/root/elemental-ifname-repro/OVMF_VARS.fd \
-chardev socket,id=chrtpm,path=/root/elemental-ifname-repro/runtime/swtpm.sock \
-tpmdev emulator,id=tpm0,chardev=chrtpm \
-device tpm-tis,tpmdev=tpm0 \
-device pci-bridge,id=br-a,bus=pci.0,addr=0x2,chassis_nr=2,shpc=off \
-device pci-bridge,id=br-b,bus=pci.0,addr=0x7,chassis_nr=7,shpc=off \
-device virtio-scsi-pci,id=scsi0,bus=pci.0,addr=0x5 \
-drive if=none,file=/root/elemental-ifname-repro/elemental-node.raw,format=raw,id=osdisk,cache=none \
-device scsi-hd,drive=osdisk,bus=scsi0.0,bootindex=1 \
-netdev user,id=net-mgmt,hostfwd=tcp:127.0.0.1:2222-:22 \
-device virtio-net-pci,netdev=net-mgmt,bus=pci.0,addr=0x4,mac=52:54:00:00:00:10 \
-netdev hubport,id=net-a0,hubid=1 \
-device virtio-net-pci,netdev=net-a0,bus=br-a,addr=0x0.0,multifunction=on,mac=52:54:00:00:02:10 \
-netdev hubport,id=net-a1,hubid=1 \
-device virtio-net-pci,netdev=net-a1,bus=br-a,addr=0x0.1,multifunction=on,mac=52:54:00:00:02:11 \
-netdev hubport,id=net-b0,hubid=2 \
-device virtio-net-pci,netdev=net-b0,bus=br-b,addr=0x0.0,multifunction=on,mac=52:54:00:00:07:10 \
-netdev hubport,id=net-b1,hubid=2 \
-device virtio-net-pci,netdev=net-b1,bus=br-b,addr=0x0.1,multifunction=on,mac=52:54:00:00:07:11 \
-daemonize \
-pidfile /root/elemental-ifname-repro/runtime/qemu.pid

虚拟机最初会被 -S 选项暂停。在恢复运行之前,禁用四个测试接口的链路。保持这些接口断开,可防止 NetworkManager 在主机注册期间等待未配置测试接口的 DHCP:

1
2
3
4
5
6
7
printf '%s\n' \
'set_link net-a0 off' \
'set_link net-a1 off' \
'set_link net-b0 off' \
'set_link net-b1 off' \
'cont' |
timeout 4 nc -U /root/elemental-ifname-repro/runtime/monitor.sock

确认主机已成功注册到 Rancher Prime:

登录 Elemental Machine:

1
2
3
4
5
# 从 KVM 主机登录
ssh -p 2222 root@127.0.0.1

# 将 KVM 主机作为 SSH 跳板机进行远程登录
ssh -J root@<KVM_HOST_IP> -p 2222 root@127.0.0.1

登录后,启用测试网络接口端口:

1
2
3
4
5
6
printf '%s\n' \
'set_link net-a0 on' \
'set_link net-a1 on' \
'set_link net-b0 on' \
'set_link net-b1 on' |
timeout 4 nc -U /root/elemental-ifname-repro/runtime/monitor.sock

检查网络接口状态:

1
2
3
4
5
6
ip link show | grep -E "ens|enp|bond"
for n in /sys/class/net/*; do
test -f "$n/address" || continue
printf '%-16s mac=%s pci=' "${n##*/}" "$(sed -n '1p' "$n/address")"
readlink -f "$n/device"
done

ens4 是管理网络接口,不位于 PCI bridge 之后,主要用于登录。

检查操作系统信息:

1
2
3
4
grep -E '^(PRETTY_NAME|IMAGE_TAG)=' /etc/os-release
uname -a
/usr/lib/systemd/systemd --version | sed -n '1,2p'
cat /proc/cmdline

检查 SSDT 和物理插槽映射:

1
2
3
4
ls -l /sys/firmware/acpi/tables/SSDT
cat /sys/bus/pci/slots/2/address
cat /sys/bus/pci/slots/7/address
lspci -Dnn -t

检查旧命名方案的候选名称:

1
2
3
4
5
6
for n in ens2f0 ens2f1 ens7f0 ens7f1; do
echo "=== $n ==="
cat "/sys/class/net/$n/name_assign_type"
udevadm test-builtin net_id "/sys/class/net/$n" 2>/dev/null |
grep -E 'ID_NET_NAMING_SCHEME|ID_NET_NAME_(PATH|SLOT)'
done

在 2.1.3-3.64 版本中,ID_NET_NAMING_SCHEME 默认为 v253。

在模拟的 PCI bridge 拓扑中,net_id 会为每个测试接口同时生成 ID_NET_NAME_SLOTID_NET_NAME_PATH 候选名称。系统选用基于插槽的候选名称,因而得到 ens2f0ens2f1ens7f0ens7f1 等接口名称。


创建 Elemental RKE2 集群

使用该 Elemental Machine 创建 RKE2 集群:


使用 ManagedOSImage 升级操作系统

在 local 集群导入如下 YAML:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: elemental.cattle.io/v1beta1
kind: ManagedOSImage
metadata:
name: test-upgrade-213-6216
namespace: fleet-default
spec:
osImage: registry.suse.com/suse/sl-micro/6.0/baremetal-os-container:2.1.3-6.216

concurrency: 1
cordon: false
drain: null

clusterTargets:
- clusterName: "test"

验证升级后的接口命名

检查网络接口状态:

1
2
3
4
5
6
ip link show | grep -E "ens|enp|bond"
for n in /sys/class/net/*; do
test -f "$n/address" || continue
printf '%-16s mac=%s pci=' "${n##*/}" "$(sed -n '1p' "$n/address")"
readlink -f "$n/device"
done

检查操作系统信息:

1
2
3
4
grep -E '^(PRETTY_NAME|IMAGE_TAG)=' /etc/os-release
uname -a
/usr/lib/systemd/systemd --version | sed -n '1,2p'
cat /proc/cmdline

检查 SSDT 和物理插槽映射:

1
2
3
4
ls -l /sys/firmware/acpi/tables/SSDT
cat /sys/bus/pci/slots/2/address
cat /sys/bus/pci/slots/7/address
lspci -Dnn -t

检查新命名方案的候选名称:

1
2
3
4
5
6
for n in enp1s0f0 enp1s0f1 enp2s0f0 enp2s0f1; do
echo "=== $n ==="
cat "/sys/class/net/$n/name_assign_type"
udevadm test-builtin net_id "/sys/class/net/$n" 2>/dev/null |
grep -E 'ID_NET_NAMING_SCHEME|ID_NET_NAME_(PATH|SLOT)'
done


测试结论

从 2.1.3-3.64 升级到 2.1.3-6.216 后,成功复现了该问题。

升级后,ID_NET_NAMING_SCHEME 从 v253 变为 sle15-sp4。sle15-sp4 方案展开为:v238+bridge_no_slot+slot_function_id+16bit_index

由于该命名方案包含 bridge_no_slotnet_id 不会为 PCI bridge 后的测试接口生成 ID_NET_NAME_SLOT 候选名称,只会生成 ID_NET_NAME_PATH 候选名称,从而导致接口名称从 ens* 变为 enp*


测试 2:直接安装 2.1.3-6.216


验证接口命名

将 RAW 介质替换为 test-213-6216.raw,然后启动 QEMU 进行验证。

检查网络接口状态:

1
2
3
4
5
6
ip link show | grep -E "ens|enp|bond"
for n in /sys/class/net/*; do
test -f "$n/address" || continue
printf '%-16s mac=%s pci=' "${n##*/}" "$(sed -n '1p' "$n/address")"
readlink -f "$n/device"
done

检查操作系统信息:

1
2
3
4
grep -E '^(PRETTY_NAME|IMAGE_TAG)=' /etc/os-release
uname -a
/usr/lib/systemd/systemd --version | sed -n '1,2p'
cat /proc/cmdline

检查 SSDT 和物理插槽映射:

1
2
3
4
ls -l /sys/firmware/acpi/tables/SSDT
cat /sys/bus/pci/slots/2/address
cat /sys/bus/pci/slots/7/address
lspci -Dnn -t

检查新命名方案的候选名称:

1
2
3
4
5
6
for n in enp1s0f0 enp1s0f1 enp2s0f0 enp2s0f1; do
echo "=== $n ==="
cat "/sys/class/net/$n/name_assign_type"
udevadm test-builtin net_id "/sys/class/net/$n" 2>/dev/null |
grep -E 'ID_NET_NAMING_SCHEME|ID_NET_NAME_(PATH|SLOT)'
done


测试结论

直接安装 2.1.3-6.216 时,也观察到了相同的接口命名行为。

直接安装的系统同样使用 ID_NET_NAMING_SCHEME=sle15-sp4,并且 net_id 仅为模拟 PCI bridge 后的接口生成 ID_NET_NAME_PATH 候选名称。

这证实接口名称变更并非由 Elemental 操作系统升级过程本身引起,而是与 2.1.3-6.216 镜像中所包含的 systemd/udev 版本的网络接口命名行为有关。


总体结论

测试表明,无论是从 2.1.3-3.64 升级到 2.1.3-6.216,还是直接安装 2.1.3-6.216,都可复现网络接口名称从 ens* 变为 enp* 的现象。

2.1.3-3.64 版本使用 systemd 254.9-1.9 和 v253 命名方案。在该方案下,net_id 会针对受影响的 PCI 拓扑同时生成基于插槽的(ID_NET_NAME_SLOT)和基于路径的(ID_NET_NAME_PATH)候选名称。

2.1.3-6.216 版本使用 systemd 254.27-4.1 和 sle15-sp4 命名方案。由于该方案包含 bridge_no_slot,系统不再为受影响 PCI bridge 后的接口生成基于插槽的候选名称。因此,这些接口会获得基于路径的 enp* 名称,而非之前基于插槽的 ens* 名称。

直接安装测试进一步证实,该行为与 2.1.3-6.216 镜像中包含的 systemd/udev 网络命名方案有关,而不是 Elemental 操作系统升级机制本身造成的。


Workaround

对于从旧版本升级的 Machine,可在 ManagedOSImage 中添加基于 enp* 接口名称或 MAC 地址的配置,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
apiVersion: elemental.cattle.io/v1beta1
kind: ManagedOSImage
metadata:
name: test-upgrade-213-6216
namespace: fleet-default
spec:
osImage: registry.suse.com/suse/sl-micro/6.0/baremetal-os-container:2.1.3-6.216

clusterTargets:
- clusterName: "test"

# 针对不同的裸金属硬件型号,可使用 spec.nodeSelector 选择相应节点。
# https://elemental.docs.rancher.com/managedosimage-reference/#managedosimagespec-reference
nodeSelector:
matchExpressions:
- {key: my-node/label, operator: Exists}

cloudConfig:
name: Configure NetworkManager profiles
stages:
fs.after:
- name: Add upgraded enp bond slave profiles
files:
- path: /etc/NetworkManager/system-connections/bond0-slave-enp1s0f0.nmconnection
permissions: 384
owner: 0
group: 0
content: |
[connection]
id=bond0-slave-enp1s0f0
type=ethernet
interface-name=enp1s0f0
master=bond0
slave-type=bond
autoconnect=true

[ethernet]

[bond-port]

- path: /etc/NetworkManager/system-connections/bond0-slave-enp2s0f0.nmconnection
permissions: 384
owner: 0
group: 0
content: |
[connection]
id=bond0-slave-enp2s0f0
type=ethernet
interface-name=enp2s0f0
master=bond0
slave-type=bond
autoconnect=true

[ethernet]

[bond-port]

对于新安装的主机,可在 MachineRegistration 中添加基于 enp* 接口名称或 MAC 地址的配置,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
apiVersion: elemental.cattle.io/v1beta1
kind: MachineRegistration
metadata:
name: test
namespace: fleet-default
spec:
machineName: "m-${Product/UUID}"

config:
cloud-config:
name: test-machine-registration
stages:
fs:
- name: Configure NetworkManager profiles
files:
- path: /etc/NetworkManager/system-connections/bond0.nmconnection
owner: 0
group: 0
permissions: 384
content: |
[connection]
id=bond0
type=bond
interface-name=bond0
autoconnect=true
autoconnect-slaves=1

[bond]
mode=active-backup
miimon=100

[ipv4]
method=disabled

[ipv6]
method=disabled

- path: /etc/NetworkManager/system-connections/bond0-slave-ens2f0.nmconnection
owner: 0
group: 0
permissions: 384
content: |
[connection]
id=bond0-slave-ens2f0
type=ethernet
interface-name=ens2f0
master=bond0
slave-type=bond
autoconnect=true

[ethernet]

[bond-port]

- path: /etc/NetworkManager/system-connections/bond0-slave-ens7f0.nmconnection
owner: 0
group: 0
permissions: 384
content: |
[connection]
id=bond0-slave-ens7f0
type=ethernet
interface-name=ens7f0
master=bond0
slave-type=bond
autoconnect=true

[ethernet]

[bond-port]

- path: /etc/NetworkManager/system-connections/bond0-slave-enp1s0f0.nmconnection
permissions: 384
owner: 0
group: 0
content: |
[connection]
id=bond0-slave-enp1s0f0
type=ethernet
interface-name=enp1s0f0
master=bond0
slave-type=bond
autoconnect=true

[ethernet]

[bond-port]

- path: /etc/NetworkManager/system-connections/bond0-slave-enp2s0f0.nmconnection
permissions: 384
owner: 0
group: 0
content: |
[connection]
id=bond0-slave-enp2s0f0
type=ethernet
interface-name=enp2s0f0
master=bond0
slave-type=bond
autoconnect=true

[ethernet]

[bond-port]

elemental:
install:
device: /dev/sda
snapshotter:
type: btrfs
maxSnaps: 3
reboot: true

reset:
enabled: true
reset-oem: true
reset-persistent: true
reboot: true

machineInventoryLabels:
author: warner
Author

Warner Chen

Posted on

2026-08-12

Updated on

2026-08-12

Licensed under