处理 ubuntu preseed 过程中 /etc/network/interfaces 被覆盖问题

在通过 cobbler 和 pxe 批量安装 Ubuntu 14.04 时,preseed 的 late_command 中写的网络配置会被 netcfg 覆盖。可通过备份配置文件、编写恢复脚本并修改 cobbler 的 preseed 文件解决。后续版本可指定使用 ifupdown 避免覆盖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

处理 ubuntu preseed 过程中 /etc/network/interfaces 被覆盖问题

通过 cobbler 和 pxe 批量安装 ubuntu 时,在 14.04 上的安装器里面有 bug ,导致在 preseed 的 late_command 中写的网络配置会被 netcfg 覆盖掉,使得 /etc/network/interface 配置总是为默认的配置。

在后续的 netcfg 中修正了这个问题,但是在此之前,需要通过额外的一点代码进行处理这个问题。

d-i preseed/late_command string true && \
wget -q -O- http://$http_server/cblr/svc/op/script/$what/$name/?script=preseed_late_default | chroot /target /bin/bash -s ;\
cp /target/etc/network/interfaces /target/etc/network/interfaces.orig ;\
echo "mv /etc/network/interfaces.orig /etc/network/interfaces && ifdown -a && ifup -a && sed -i '/fixnet.sh/d' /etc/rc.local" > /target/fixnet.sh
sed -i '/exit/ibash /fixnet.sh' /target/etc/rc.local 

在这段 preseed 的代码中,备份网络配置文件为 /etc/network/interfaces.orig ,防止被 netcfg 覆盖掉。写一个 fixnet.sh 的小脚本,在脚本中将备份的网络配置文件恢复,并在 rc.local 中加入调用。

修改相应的 cobbler 中相应的 preseed 文件,将 late_command 改为以上的代码,可解决 /etc/network/interfaces 文件被覆盖的问题。

后续 ubuntu 版本的安装器中,可通过

d-i netcfg/target_network_config select ifupdown

指定使用 ifupdown ,来避免 /etc/network/interfaces 被覆盖。

转载于:https://www.cnblogs.com/fengyc/p/6714267.html

<think>我们正在解决PXE安装Ubuntu20.04Server时因cloud-init导致安装停止的问题。用户要求检查并修正grub.cfg配置。根据之前的回答,我们知道可以通过禁用cloud-init或正确配置cloud-init元数据来解决。现在需要检查grub.cfg中的内核启动参数。引用[1]和[2]提供了PXE配置的示例,但针对的是Ubuntu22.04和UEFI环境。我们需要调整这些配置以适用于Ubuntu20.04Server。关键点:1.在grub.cfg中,内核启动参数(linux/vmlinuz...)需要包含必要的参数来避免cloud-init等待。2.我们可以采用以下两种方法之一:a.完全禁用cloud-init:添加`cloud-init=disabled`b.或者,正确配置cloud-init的nocloud-net数据源,确保元数据服务可达。根据用户之前的问题,自动安装停止在“waitingforcloud-init”,通常是因为cloud-init无法获取元数据(如网络配置问题或元数据服务不可用)。因此,我们可以在grub.cfg的内核启动参数中尝试禁用cloud-init,并确保网络接口使用传统命名(避免网卡名不一致导致网络问题)。修正后的grub.cfg配置建议:在`linux`行(或`kernel`行,取决于grub版本)的启动参数中,添加:`cloud-init=disablednet.ifnames=0biosdevname=0`同时,确保自动安装所需的参数(如autoinstall和安装源)正确。示例配置(基于引用[1]的格式,针对Ubuntu20.04):```menuentry"Ubuntu20.04AutoInstall"{setgfxpayload=keeplinux/boot/ubuntu_live/vmlinuzip=dhcpurl=http://<your-server-ip>/ubuntu-20.04-live-server-amd64.isoautoinstallcloud-init=disablednet.ifnames=0biosdevname=0---initrd/boot/ubuntu_live/initrd}```注意:-这里我们添加了`cloud-init=disablednet.ifnames=0biosdevname=0`,这样在安装过程中就不会等待cloud-init。-`ip=dhcp`确保在启动安装环境时获取IP地址。-`url`指定了安装镜像的位置(HTTP方式)。-`autoinstall`参数触发自动安装。另外,如果用户希望保留cloud-init的功能,则需要配置元数据服务。但根据问题描述,安装过程停止在等待cloud-init,所以更直接的解决方法是先禁用它。如果用户需要配置cloud-init元数据服务,则应该:-在内核参数中指定数据源:`ds=nocloud-net;s=http://<pxe-server-ip>/cloud-init/`-并在PXE服务器上创建相应的元数据文件(user-data,meta-data,network-config等),确保这些文件可以通过HTTP访问。但为了避免安装停止,我们建议先禁用cloud-init,安装完成后再根据需要启用。因此,针对用户的问题,我们推荐在grub.cfg中禁用cloud-init。另外,用户提到可以手动开始安装,说明安装环境已经启动,只是自动安装流程被cloud-init阻塞。所以禁用cloud-init应该可以解决问题。总结修正步骤:1.编辑grub.cfg文件(通常在TFTP服务器的grub目录下,如`/var/lib/tftp/grub/grub.cfg`)。2.找到对应的menuentry,在linux行的启动参数末尾(在`---`之前)添加`cloud-init=disablednet.ifnames=0biosdevname=0`。3.保存并重启PXE服务,然后重试安装。注意:如果用户使用的是UEFI环境,可能还需要配置EFI相关文件(如引用[2]中提到的shim.efi和grubx64.efi),但grub.cfg的配置方法相同。如果问题仍然存在,可以进一步检查:-确保网络配置正确,安装环境能够访问安装源(url指定的ISO镜像)和任何需要的元数据服务。-检查TFTP服务器上的内核和initrd文件路径是否正确。由于用户使用的是Ubuntu20.04Server,注意其ISO中的内核和initrd文件路径(与22.04相同,都在/casper目录下)。最后,关于grub.cfg的配置,我们以引用[1]为参考,但根据20.04进行了调整。引用说明:[1]提供了PXE安装Ubuntu22.04的配置示例,包括内核和initrd的路径以及启动参数。[2]提供了UEFI环境下PXE启动所需的EFI文件,但我们的重点在grub.cfg的内核参数。因此,我们给出的修正方法基于[1]的格式,并添加了禁用cloud-init的参数。</think>### PXE安装Ubuntu 20.04 Server时grub.cfg配置检查与修正 #### 问题分析 在PXE安装Ubuntu 20.04 Server时遇到"waiting for cloud-init"导致安装停止,主要原因是: 1. **cloud-init元数据获取失败**:`ds=nocloud-net`配置错误或元数据服务不可达 2. **网络接口命名冲突**:默认的Predictable Network Interface命名导致DHCP失败 3. **内核参数缺失**:缺少关键禁用参数[^1][^2] #### grub.cfg配置检查与修正 以下是针对Ubuntu 20.04 Server的标准修正方案(基于引用[1][2]的实践经验): ```bash # /var/lib/tftp/grub/grub.cfg 修正示例 menuentry "Ubuntu 20.04 AutoInstall" { linux /boot/ubuntu_live/vmlinuz ip=dhcp url=http://your-pxe-server/ubuntu-20.04-live-server-amd64.iso autoinstall ds=nocloud-net;s=http://your-pxe-server/cloud-init/ cloud-init=disabled # 关键修复1:强制禁用cloud-init net.ifnames=0 # 关键修复2:禁用Predictable网络命名 biosdevname=0 # 关键修复3:禁用BIOS设备命名 --- # 分隔符必须保留 initrd /boot/ubuntu_live/initrd } ``` #### 关键修正点说明: 1. **cloud-init=disabled** 直接禁用cloud-init服务,避免其阻塞安装流程[^1] 2. **net.ifnames=0 & biosdevname=0** 强制使用传统网络接口命名(eth0),解决DHCP获取失败问题: ```bash # 安装后验证 ip a show eth0 # 应显示有效IP ``` 3. **ds参数语法修正** 使用分号分隔数据源参数(非转义分号): ```bash ds=nocloud-net;s=http://your-pxe-server/cloud-init/ # 正确 ds=nocloud-net\;s=... # 错误(旧语法) ``` 4. **元数据服务验证** 确保PXE服务器上的元数据可访问: ```bash # 在客户端测试元数据可达性 curl http://your-pxe-server/cloud-init/meta-data ``` #### 配套文件结构要求 ``` /var/www/html/ ├── ubuntu-20.04-live-server-amd64.iso # 安装镜像 └── cloud-init/ # 元数据目录 ├── user-data # 自动安装配置 ├── meta-data # 主机元数据 └── network-config # 网络配置 ``` ##### meta-data 示例 ```yaml instance-id: ubuntu-auto-01 local-hostname: ubuntu-server ``` ##### network-config 示例 ```yaml version: 2 ethernets: eth0: dhcp4: true dhcp-identifier: mac ``` #### 验证与调试步骤 1. **PXE引导时手动检查** 在启动菜单按`e`编辑参数,确保: - `cloud-init=disabled`存在 - 网络参数完整 2. **安装环境调试** 出现卡顿时切换控制台(`Alt+F2`)执行: ```bash journalctl -u cloud-init # 查看服务日志 ip link show # 检查网络接口 ping your-pxe-server # 测试网络连通性 ``` 3. **元数据服务测试** 在安装环境中验证元数据获取: ```bash curl http://your-pxe-server/cloud-init/meta-data ``` > **重要提示**:Ubuntu 20.04的ISO必须使用**server版**(桌面版不支持autoinstall),内核文件路径为`/casper/vmlinuz`和`/casper/initrd`(与22.04相同)[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值