20.04 自动安装程序期间,Netplan 应用在 udevadm 解决时失败

20.04 自动安装程序期间,Netplan 应用在 udevadm 解决时失败

在执行期间网络新的 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: /

相关内容