做运维这些年,我见过最让人头疼的场景之一,就是新机房到货——几十台、甚至上百台崭新的服务器整整齐齐摆在机架里,等着装系统。如果你还在一台台插U盘、按Install、选语言、等进度条……那你大概率已经加班到凌晨两点了。

今天这篇,咱们就聊一个老运维必修的硬核技能: 服务器批量自动安装操作系统 。不管你是管5台还是500台,看完这篇文章,你就能把"一台一台装"变成"喝杯咖啡,它们自己就装好了"。

这是「Linux运维系列教程」的第22期。内容比较硬核,但我会尽量讲得通俗,保证你能跟着做出来。

一、批量装机的几种路子,各有什么优劣

在深入PXE之前,咱们先理清常见的几种批量装机方式,心里有个谱:

1. U盘克隆(Clonezilla / dd)

思路很简单:先在一台机器上装好系统,然后用Clonezilla做成镜像,再通过U盘或网络广播到其他机器。适合机器数量不多(十几台以内)、配置相同的场景。优点是简单粗暴,不需要额外服务器;缺点是每台机器都得插U盘,或者依赖组播网络,而且镜像文件通常很大(几十GB),传输慢。

2. U盘+自动应答(U盘批量安装)

这个比纯克隆灵活一些。制作一个"万能U盘",里面放上操作系统的ISO镜像,再加一个自动应答文件(比如CentOS的ks.cfg或者Ubuntu的autoinstall.yaml)。把U盘插到每台机器上,选择从U盘启动后,安装过程就全自动了,不需要人守在旁边点"下一步"。这种方式省了人工干预,但还是得逐台插U盘。适合没有网络启动条件的老旧机房。

3. PXE网络启动(重点推荐)

这才是真正的"大招"。PXE(Preboot Execution Environment,预启动执行环境)允许服务器从网卡启动,通过网络下载引导程序和系统镜像来完成安装。你只需要在机房里部署一台PXE服务器,然后把所有目标机器的网卡设置为网络启动,上电——剩下的事全自动完成。不需要U盘,不需要人工干预,甚至可以同时给几十台不同的机器安装不同的系统。今天这篇的绝大部分篇幅,都会围绕PXE展开。

4. 云平台镜像 / Cobbler / Foreman

如果你用的是云平台或者管理工具,那更简单了。Cobbler是PXE的上层封装,提供Web界面和API;Foreman则是更强大的生命周期管理工具。但它们的底层,依然是PXE。所以学好PXE,是理解一切批量装机工具的基石。

二、PXE到底是怎么工作的

很多运维同学PXE用了很多年,但被问到"PXE启动的完整流程是什么"时,还是说不清楚。咱们花两分钟把这个搞透。

当你把一台服务器设置为网卡优先启动(Network Boot)时,它上电后会经历以下几个阶段:

第一步:DHCP请求

目标机器的网卡会向局域网发送一个DHCP广播包,大意是:"我是这台机器,我的MAC地址是XX:XX:XX,谁给我分配个IP?顺便告诉我,启动文件在哪里?"

第二步:DHCP响应

PXE服务器上的DHCP服务收到请求后,回复一个包,告诉目标机器三件事: 你的IP地址是什么 TFTP服务器的地址(next-server)是什么 你要下载的引导文件(filename)叫什么

第三步:TFTP下载引导程序

目标机器拿到信息后,通过TFTP协议从PXE服务器下载引导文件(通常是pxelinux.0或者grub的efi文件)。TFTP是一个简化版的FTP,专门用于网络引导场景,虽然传输慢,但实现简单,网卡固件里都内置了支持。

第四步:加载配置和内核

引导程序运行后,它会读取自己的配置文件(pxelinux.cfg/default),根据配置继续通过TFTP下载Linux内核(vmlinuz)和初始内存盘(initrd.img)。

第五步:内核启动+自动安装

内核加载完成后,Linux开始启动。这时候它会根据内核启动参数(比如 ks= )去HTTP服务器下载Kickstart自动应答文件,然后全自动完成分区、格式化、安装包、设置密码、配置网络等所有步骤。安装完成后自动重启——一台全新的系统就搞定了。

说白了,PXE就是让网卡代替U盘,让网络代替人手。核心组件就三个: DHCP服务器 (分配IP和告诉机器去哪找引导文件)、 TFTP服务器 (提供引导文件和内核下载)、 HTTP/FTP/NFS服务器 (提供系统安装包和自动应答文件)。

三、实战:从零搭建PXE服务器(以CentOS 7为例)

下面咱们一步步来。假设你有一台CentOS 7的服务器,IP是192.168.1.10,要给局域网内的其他机器装CentOS 7。整个PXE服务器的搭建,需要搞定四个服务。

3.1 安装所有需要的软件包

一条命令搞定:

yum install -y dhcp tftp-server syslinux httpd

这四个包分别对应: dhcp 是DHCP服务器, tftp-server 是TFTP服务, syslinux 提供pxelinux.0引导程序, httpd 是Apache HTTP服务器,用来放系统镜像和Kickstart文件。

3.2 配置DHCP服务器

这是PXE最关键的一环。DHCP不仅要分配IP,还要告诉目标机器"去哪里下载引导文件"。

编辑 /etc/dhcp/dhcpd.conf :

subnet 192.168.1.0 netmask 255.255.255.0 {

range 192.168.1.100 192.168.1.200;

option domain-name-servers 8.8.8.8;

option routers 192.168.1.1;

next-server 192.168.1.10;

filename "pxelinux.0";

}

这里有两个 绝对不能搞错 的参数:

• next-server :填PXE服务器的IP地址,目标机器会从这个地址下载引导文件。

• filename :引导文件的名称,BIOS模式通常是pxelinux.0,UEFI模式则是grubx64.efi。

配置完成后,启动DHCP服务并设置开机自启:

systemctl start dhcpd systemctl enable dhcpd

3.3 配置TFTP服务器

TFTP默认由xinetd管理,编辑 /etc/xinetd.d/tftp ,把 disable = yes 改成 disable = no 。

TFTP的根目录默认是 /var/lib/tftpboot ,我们需要把引导文件和相关内核复制到这里:

# 复制pxelinux.0引导程序

cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/

# 复制菜单模块

cp /usr/share/syslinux/menu.c32 /var/lib/tftpboot/

# 创建配置目录

mkdir -p /var/lib/tftpboot/pxelinux.cfg

# 挂载CentOS镜像并复制内核文件

mount -o loop /path/to/CentOS-7-x86_64-DVD.iso /mnt

mkdir -p /var/lib/tftpboot/centos7

cp /mnt/isolinux/vmlinuz /var/lib/tftpboot/centos7/

cp /mnt/isolinux/initrd.img /var/lib/tftpboot/centos7/

3.4 配置PXE启动菜单

这是用户体验最好的一环——目标机器启动后,会看到一个选择菜单,你可以自定义里面的选项。

创建 /var/lib/tftpboot/pxelinux.cfg/default :

default menu.c32

prompt 0

timeout 60

menu title ===== 服务器批量安装菜单 =====

label centos7-auto

menu label ^1) CentOS 7 自动安装

kernel centos7/vmlinuz

append initrd=centos7/initrd.img ks=

label centos7-manual

menu label ^2) CentOS 7 手动安装

kernel centos7/vmlinuz

append initrd=centos7/initrd.img method=

label local

menu label ^3) 从本地硬盘启动

localboot 0

这里 timeout 60 表示60秒后自动选择默认选项。每个label对应一个菜单项, append 后面的参数会传递给内核。其中 ks= 参数指定了Kickstart文件的HTTP地址。

3.5 配置HTTP服务器(系统安装源+Kickstart)

HTTP服务器干两件事:一是提供操作系统的完整安装源(ISO里的所有文件),二是提供Kickstart自动应答文件。

首先,把CentOS镜像挂载到HTTP的文档根目录:

mkdir -p /var/www/html/centos/7/os/x86_64 mount -o loop /path/to/CentOS-7-x86_64-DVD.iso /var/www/html/centos/7/os/x86_64/

然后,创建Kickstart自动应答文件:

mkdir -p /var/www/html/ks

cat > /var/www/html/ks/centos7.ks << 'EOF'

#platform=x86, AMD64, 或 Intel EM64T

lang zh_CN.UTF-8

keyboard us

network --bootproto=dhcp --onboot=yes

rootpw --iscrypted $6$rounds=656000$salt$hash

firewall --disabled

selinux --disabled

timezone Asia/Shanghai

# 磁盘分区

clearpart --all --initlabel

part /boot --fstype="ext4" --size=500

part / --fstype="ext4" --size=50000

part swap --size=4096

# 安装源

url --url=""

# 安装包

%packages

@core

wget

vim

net-tools

%end

# 安装后脚本

%post

echo "PXE安装完成!" > /root/install_done.txt

%end

EOF

Kickstart文件里, clearpart --all --initlabel 会清空所有磁盘分区——这是生产环境里最需要谨慎的地方!建议在实际使用时加上 drives=sda 来指定具体磁盘,避免误删数据。

3.6 启动所有服务

把四个服务全部启动:

systemctl start dhcpd tftp httpd systemctl enable dhcpd tftp httpd

然后验证一下端口是否正常监听:

netstat -tulnp | grep -E "67|69|80"

你应该能看到:UDP 67(DHCP)、UDP 69(TFTP)、TCP 80(HTTP)三个端口在监听。

3.7 测试PXE启动

到这一步,PXE服务器就部署完成了。找一台目标机器,进入BIOS把网卡设置为第一启动项(Network Boot / PXE Boot),保存重启。你应该能看到:

• 屏幕显示DHCP获取IP的信息

• 然后出现TFTP下载引导文件的进度条

• 最后弹出我们刚才配置的启动菜单

• 选择"自动安装"后,全程不需要人工干预

如果是多台机器,只要它们都设置为网络启动,上电后就会自动排队完成安装。我在实际项目中,用这套方案一次性给48台服务器装了系统,整个过程我只需要在机房里按一次电源总开关,然后去喝了杯咖啡。

⚠️ 四、UEFI vs BIOS——这个坑我必须提前告诉你

上面的配置是针对传统BIOS模式的。如果你碰到的服务器是UEFI模式(现在的新机器基本全是UEFI),那引导文件和配置方式都要改。

关键区别:

• BIOS模式:引导文件是pxelinux.0(来自syslinux)

• UEFI模式:引导文件是grubx64.efi(来自GRUB2)

UEFI模式的DHCP配置需要加上:

if option architecture-type = 00:07 or option architecture-type = 00:09 then

filename "grubx64.efi";

else

filename "pxelinux.0";

end

UEFI的引导文件需要从CentOS镜像的EFI目录中获取:

cp /mnt/EFI/BOOT/grubx64.efi /var/lib/tftpboot/

cp /mnt/EFI/BOOT/BOOTX64.EFI /var/lib/tftpboot/

cp /mnt/images/efiboot.img /var/lib/tftpboot/

mkdir -p /var/lib/tftpboot/grub2

cp /mnt/EFI/BOOT/grub.cfg /var/lib/tftpboot/grub2/

这个坑我踩过——有一次新机房到货的机器全是UEFI,我按BIOS模式配了半天,目标机器死活引导不起来。后来查日志才发现DHCP给的是pxelinux.0,但UEFI固件根本不认这个文件。所以 部署前一定先确认目标机器的启动模式

五、U盘批量安装方案(没有PXE条件的备选)

有些场景下,PXE可能用不了——比如机房网络隔离、没有独立PXE服务器权限、或者目标机器网卡不支持PXE。这时候U盘批量安装就是最佳备选方案。

5.1 制作带自动应答的U盘

CentOS方案:

用Rufus或dd把CentOS ISO写入U盘后,在U盘根目录创建 isolinux/ks.cfg ,然后修改U盘上的 isolinux/isolinux.cfg ,在kernel启动参数后面加上 ks=hd:sdb1:/isolinux/ks.cfg (sdb1是U盘的设备名)。

Ubuntu 22.04+方案:

Ubuntu从20.04开始弃用了传统的preseed,改用autoinstall。在U盘上创建 /var/lib/cloud/seed/nocloud-net/ 目录,放入 user-data 和 meta-data 两个文件。内核启动参数加上 autoinstall ds=nocloud 。

5.2 批量操作的效率技巧

如果机器数量在20台以内,一个U盘挨个插其实也还行。但有几个技巧可以让这个过程快很多:

准备多个U盘 :5台一组同时操作,比一台一台快5倍

设置U盘为第一启动项 :在BIOS里把USB设为最高优先级,插上U盘直接上电就行

利用IPMI远程控制 :如果服务器支持IPMI,可以通过虚拟媒体(Virtual Media)远程挂载ISO,连U盘都省了

使用Ventoy :Ventoy U盘可以放多个ISO,启动时选择,一个U盘搞定多种系统

5.3 Clonezilla批量克隆

如果所有机器配置完全一样(同一型号、同样硬盘),Clonezilla是最省事的方案。它支持两种模式:

本地克隆 :U盘启动后,把本地磁盘做成镜像,再恢复到其他机器的磁盘上

网络克隆(Multicast) :一台机器做源,通过组播同时推送到多台目标机器。这个效率极高,我实测过,50台机器同时恢复一个10GB的镜像,大约只需要15分钟

Clonezilla网络克隆需要额外配置一个DRBL(DRBL Linux)服务器,它本质上是PXE + Clonezilla的组合。如果你已经有PXE服务器了,在这个基础上加Clonezilla的镜像恢复功能就可以了。

六、生产环境最佳实践和避坑指南

理论讲完了,最后分享一些我踩过的坑和总结的经验,这些都是真金白银换来的教训。

1. 网络隔离问题

PXE依赖DHCP广播,如果目标机器和PXE服务器不在同一个VLAN或子网,DHCP请求会被路由器丢弃。解决方案有两个:要么把PXE服务器放到目标机器所在的网络段,要么配置DHCP中继(ip helper-address),把DHCP请求转发到PXE服务器。

2. 防火墙必须放行

PXE服务器的防火墙需要放行以下端口:UDP 67/68(DHCP)、UDP 69(TFTP)、TCP 80(HTTP)。CentOS上可以用firewall-cmd放行,Ubuntu上用ufw。很多人配了半天PXE,最后发现是防火墙拦住了TFTP的69端口。

3. Secure Boot的影响

如果目标机器开启了Secure Boot,非签名的引导文件(如pxelinux.0)会被拒绝加载。这种情况下,要么关闭Secure Boot,要么使用带签名的GRUB引导文件。我建议在装机阶段先关闭Secure Boot,系统安装完成后再根据安全策略决定是否开启。

4. 磁盘分区的自动化策略

不同型号的服务器硬盘数量和大小可能不同。如果你的Kickstart文件里写死了 part / --size=50000 ,碰到硬盘只有40GB的机器就会安装失败。建议使用 --grow 参数让分区自动扩展,或者用 --percent 按百分比分配。

5. 装机前的网络测试

大规模装机前,先用1-2台目标机器做测试。确认DHCP能获取IP、TFTP能下载文件、HTTP能访问安装源、Kickstart没有语法错误。确认无误后,再批量上电。

6. 日志记录和问题排查

PXE服务器的 /var/log/messages 会记录所有DHCP和TFTP的请求。目标机器的安装日志在 /var/log/anaconda/ 里。碰到问题,这两个日志是你的第一手排查资料。

总结一下

批量装机这个事,说复杂也复杂,说简单也简单。核心就是四件套:DHCP分配IP和引导信息,TFTP提供引导文件,HTTP提供安装源,Kickstart/autoinstall搞定自动应答。搭好这四个服务,剩下的就是按开关、喝咖啡、等着收工。
U盘方案适合没有网络启动条件的场景,Clonezilla适合完全同构的机器,而PXE是最通用、最灵活的方案。如果你管理的是几十台以上的服务器集群,PXE是必选项——它不仅能装机,还能装到Cobbler、Foreman这些更高级的工具上,实现从硬件上架到业务部署的全自动化。
下一期,咱们聊聊Linux系统安装完成后的第一步: 系统初始化脚本编写 。从安全加固到性能调优,让新装的系统直接达到生产标准。敬请期待!
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。