在执行期间网络新的 Subiquity 服务器自动安装程序的部分失败,并出现非零返回代码netplan apply
,进而反复运行udevadm settle -t 0
,返回退出代码 1,直到最终放弃。
据/var/crash
报道:
# date/time removed for readability
DEBUG subiquitycore.netplan:111 config for ens2f0 = {}
DEBUG subiquitycore.netplan:111 config for ens2f0 = {}
DEBUG subiquitycore.netplan:135 config for bond0 =
{'dhcp4': True, 'interfaces': ['ens2f0', 'ens2f1'], 'parameters': {'lacp-rate': 'slow', 'mode': '802.3ad', 'transmit-hash-policy', 'layer2'}}
DEBUG subiquitycore.utils:74 arun_command called: ['netplan', 'apply']
DEBUG subiquitycore.utils:48 run_command called: ['udevadm', 'settle', '-t', '0']
DEBUG subiquitycore.utils:61 ['udevadm', 'settle', '-t', '0'] exited with code 1
DEBUG subiquitycore.controller.network:196 waiting 0.1 to let udev event queue settle
<repeating udevadm settle commands issued>
(相关)自动安装配置:
#cloud-config
autoinstall:
version: 1
# double network due to a bug
# see https://ubuntu.com/server/docs/install/autoinstall-reference#network
network:
network:
version: 2
ethernets:
ens2f0: {}
ens2f1: {}
bonds:
bond0:
dhcp4: true
interfaces:
- ens2f0
- ens2f1
parameters:
mode: 802.3ad
lacp-rate: slow
transmit-hash-policy: layer2
这将生成以下 Netplan 配置(/etc/netplan/00-installer-config.yaml
):
# This is network config written by 'subiquity'
network:
bonds:
bond0:
dhcp4: true
parameters:
mode: 802.3ad
lacp-rate: slow
transmit-hash-policy: layer2
ethernets:
ens2f0: {}
ens2f1: {}
version: 2
我还尝试使用更简单的 netplan 配置,仅在一个端口上使用静态地址(ens2f0
),甚至默认在任何匹配eth*
或的接口上运行 DHCPv4 en*
(在本例中ens2f0
为和ens2f1
)。
我的理论是否有一个模块或某个东西在 udev 中创建了未处理甚至不相关的事件,但我该如何调试它呢?
此外,如果 udev 中存在此类未处理的事件,即使相关设备和接口配置正确,Netplan 也不会继续运行,这难道不是太激进了吗?
设置:
Ubuntu 20.04 每日构建 20200923(尝试了 20.04.1 和初始 LTS 版本)
Netplan 0.99-ubuntuu3~20.04.2
Systemd 245.4-4ubuntu3.2
Supermicro X11DDW-L
Mellanox ConnectX-5 (PCI-E)
BIOS/Legacy 启动(由于 UEFI 中的此 NIC/主板不兼容)
答案1
这实际上是由于我的 贮存 自动安装程序配置的部分,而不是真正由于 Netplan 本身。
我的服务器有 2 个磁盘,我想使用 将它们配置为软件 RAID
mdadm
。由于我使用 BIOS 启动和 gpt 分区表,因此我按照 中的建议在每个驱动器上为 grub 创建了一个 1MB 未格式化的分区
科廷文献。
如果 curtin 的主机系统已使用 UEFI 启动,则 curtin 将把 grub 安装到 esp 分区。如果系统安装介质已使用 MBR 启动,则 grub 将安装到磁盘的 MBR 上。但是,在具有 gpt 分区表的磁盘上,MBR 之后没有足够的空间供 grub 存储其第二阶段 core.img,因此会创建一个未格式化的小分区,其中包含bios_grub需要标志。此分区应放置在磁盘的开头,大小应为 1MB。它不应包含文件系统或安装在系统上的任何位置。
除此之外,我还错误地认为我必须为这些 1MB 分区也创建一个 RAID,但其实没有必要。我没注意到的错误消息出现在 syslog(curtin_log.<pid>
标识符)中,而常规 subiquity 日志(/var/log/installer
和
/var/crash
)中没有提及。我还可以在 curtin 自己的日志(/var/log/curtin
)中看到它,而我之前并不知道这一点。
# /var/log/curtin/install.log
# wrapped for readability
An error occured handling 'md0-bios-boot': ProcessExecutionError -
Unexpected error while running command.
Command: ['mdadm', '--create', '/dev/md0', '--run',
'--metadata=default', '--homehost=ubuntu-server', '--level=raid1',
'--raid-devices=2', '/dev/sda1', '/dev/sdb1']
Exit code: 1
Reason: -
Stdout: ''
Stderr: mdadm: no free space left on /dev/sda1
mdadm: no free space left on /dev/sdb1
mdadm: create aborted
finish: cmd-install/stage-partitioning/builtin/cmd-block-meta: FAIL: configuring raid: md0-bios-boot
<some more noise from curtin>
这似乎触发了未处理的 udev 事件,其原因在于
udevadm settle
返回退出代码 1,从而停止 Netplan 和安装程序。奇怪的是,curtin 中的退出代码 1mdadm
还不足以在到达 Netplan 之前使其崩溃。
删除存储配置的这一部分解决了这个问题,
- id: md0-bios-boot
type: raid
preserve: false
raidlevel: 1
devices:
- sda-bios-boot
- sdb-bios-boot
name: md0
ptable: gpt
完整的存储配置:
storage:
config:
- id: disk-sda
type: disk
preserve: false
ptable: gpt
wipe: superblock
grub_device: true
path: /dev/sda
- id: disk-sdb
type: disk
preserve: false
ptable: gpt
wipe: superblock
grub_device: true
path: /dev/sdb
- id: sda-bios-boot
type: partition
preserve: false
device: disk-sda
number: 1
size: 1MB
flag: bios_grub
- id: sdb-bios-boot
type: partition
preserve: false
device: disk-sdb
number: 1
size: 1MB
flag: bios_grub
# NOTE: part that had to be removed
- id: md0-bios-boot
type: raid
preserve: false
raidlevel: 1
devices:
- sda-bios-boot
- sdb-bios-boot
name: md0
ptable: gpt
- id: sda-root
type: partition
preserve: false
device: disk-sda
number: 2
size: -1
- id: sdb-root
type: partition
preserve: false
device: disk-sdb
number: 2
size: -1
- id: md1-os
type: raid
preserve: false
raidlevel: 1
devices:
- sda-root
- sdb-root
name: md1
ptable: gpt
- id: md1-os-rootfs
type: format
preserve: false
volume: md1-os
fstype: ext4
- id: mount-rootfs
type: mount
device: md1-os-rootfs
path: /