我已经构建了一个自定义的 Ubuntu 22.04 安装,该安装可通过 USB 记忆棒无人值守运行。我现在正在尝试添加目标将启动的默认静态 IP 地址。这些系统将在可能没有 DHCP 或其他网络服务的微型环境中启动,并将通过安装后脚本进一步定制,但我需要它们在 cloud-init 之后首次启动时即可访问网络。
我不会提前知道任何 mac 地址,甚至不知道接口设备,因为此映像需要跨多个硬件类别工作,这些硬件类别可能具有接口名称格式变体。有没有办法利用 cloud-init 识别“最佳”物理接口并在那里设置静态 IP 的能力?如果服务可用,我还希望它在同一接口上获取 DHCP 地址,但这不是必需的。
我正在创建的 USB 棒有一个 vfat 格式的 CIDATA 分区,其中包含一个按预期工作的用户数据文件。我在文档中读到,用户数据不能用于网络配置,我曾尝试在此分区中创建一个网络配置文件,如下所示,但我认为我走错了路。有人能提供一些关于如何实现我的目标的建议吗?
我尝试过的网络配置文件是:
ethernets:
eno1:
dhcp4: true
dhcp6: false
addresses: [ "192.168.1.13/24" ]```
答案1
我的建议是使用ip=
内核命令行(即您必须修改引导加载程序配置)。我已经使用这种方法超过 2 年了,包括使用 jammy。cloud-init 会导入它而无需执行任何其他操作。如果您只需要一个静态 IP 地址,根据我的经验,这是最简单的解决方案。
在你的情况下,它会是这样的
ip=192.168.1.13::192.168.1.1:255.255.255.0::eno1:off:1.1.1.1
(192.168.1.1
我猜测默认网关1.1.1.1
是 Cloudflare 的公共 DNS 服务器)
更复杂的选项是将 netplan 配置文件添加到 的user-data
部分write_files
,并将netplan apply
添加到您的runcmd
部分。这适用于更复杂的网络配置,但根据您的情况,您可能在 cloud-init 到达 之前没有网络连接runcmd
,因此在某些情况下它可能不起作用。如果我需要分配多个 IP 地址和/或绑定到网络接口,我会使用此方法作为第一种方法的补充。然后操作系统从单个 IP 开始,稍后更改其配置。