利用PXE网络安装windows系统
PXE(Preboot Execution Environment,预启动执行环境)允许客户机通过网络从远程服务器下载引导镜像并自动化安装操作系统,不需要U盘、光盘等物理介质。
| pxe服务器ip | pxe操作系统 | 客户端ip | 客户端操作系统 |
|---|---|---|---|
| 192.168.31.101 | Ubuntu 24.04 | 192.168.31.201 | Windows Server 2019 |
[TOC]
准备工作
- 登录 pxe服务器,执行如下初始化工作:
#.关闭防火墙
iptables -F
systemctl stop firewalld
systemctl stop ufw
#.设置时区及24小时时间制(重连生效)
timedatectl set-timezone "Asia/Shanghai"
timedatectl status | grep Time
#.设置时间为24小时制,比如 01:02 PM 改为 13:02
echo "LANG=en_US.UTF-8" > /etc/default/locale
echo "LC_TIME=en_DK.UTF-8" >> /etc/default/locale
source /etc/default/locale
date
搭建 PXE 远程安装服务器
- PXE 的工作流程:
1.客户端计算机启动时,BIOS 激活网络适配器,并加载 PXE BootROM
2.BootROM 通过 DHCP 服务器请求 IP 地址和其他网络配置信息
3.DHCP 服务器响应并提供 IP 地址、网关、DNS 服务器以及 PXE 启动文件的地址
4.客户端使用 TFTP 从服务器下载 PXE 启动文件
5.启动文件加载并执行,开始引导操作系统安装程序
1.安装 DHCP
- 使用 isc-dhcp-server 配置 DHCP 服务
注:range 为客户端分配的ip地址范围,routers为网关地址,next-server为tftp地址,filename "pxelinux.0"为pxe启动文件
#.更新apt源
apt update
#.安装服务
apt install -y isc-dhcp-server
#.配置服务
cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.$(date +%Y%m%d%H%M%S)
cat > /etc/dhcp/dhcpd.conf <<EOF
default-lease-time 600;
max-lease-time 7200;
ddns-update-style none;
log-facility local7;
subnet 192.168.31.0 netmask 255.255.255.0 {
range 192.168.31.201 192.168.31.220;
option routers 192.168.31.1;
option subnet-mask 255.255.255.0;
option domain-name-servers 223.5.5.5, 8.8.8.8;
next-server 192.168.31.101;
filename "pxelinux.0";
}
EOF
#.重启服务
systemctl restart isc-dhcp-server
systemctl status isc-dhcp-server
#.确认端口已监听
ss -tulanp|grep -w 67
2.准备 ISO 安装镜像
Ubuntu 24.04.3
- 下载iso镜像文件,并将 iso 中的安装文件复制到tftp根目录
#.创建目录
mkdir -p /var/lib/tftpboot/iso
mkdir -p /var/lib/tftpboot/images/{ubuntu24043,centos79,windows2019,kylin10sp3,openEuler2403}
#.下载镜像
cd /var/lib/tftpboot/iso/
wget -c https://releases.ubuntu.com/24.04/ubuntu-24.04.3-live-server-amd64.iso
#.临时测试
cat /etc/hosts | grep "iso.sqlfans.cn" || echo "192.168.31.168 iso.sqlfans.cn" >> /etc/hosts
cat /etc/hosts | grep "oss.sqlfans.cn" || echo "192.168.31.168 oss.sqlfans.cn" >> /etc/hosts
wget -c http://oss.sqlfans.cn/2025/ubuntu-24.04.3-live-server-amd64.iso
#.制作可引导的镜像
mkdir -p /mnt/iso
mount -o loop ubuntu-24.04.3-live-server-amd64.iso /mnt/iso
#.复制内核
cp /mnt/iso/casper/{vmlinuz,initrd} /var/lib/tftpboot/images/ubuntu24043/
#.复制安装文件
cp -r /mnt/iso/* /var/lib/tftpboot/images/ubuntu24043/
# 卸载ISO文件
umount /mnt/iso
CentOS 7.9
#.创建目录
mkdir -p /var/lib/tftpboot/iso
mkdir -p /var/lib/tftpboot/images/{ubuntu24043,centos79,windows2019,kylin10sp3,openEuler2403}
#.下载镜像
cd /var/lib/tftpboot/iso/
ll CentOS-7.9-x86_64-DVD-2009.iso
#.制作可引导的镜像
mkdir -p /mnt/iso
mount -o loop CentOS-7.9-x86_64-DVD-2009.iso /mnt/iso
#.复制内核
cp /mnt/iso/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/images/centos79/
#.复制安装文件
cp -r /mnt/iso/* /var/lib/tftpboot/images/centos79/
# 卸载ISO文件
umount /mnt/iso
Windows Server 2019
ll Windows_Server_2019_dc_x64_chs.iso
Kylin V10 SP3 2403
ll Kylin-Server-V10-SP3-2403-Release-20240426-X86_64.iso
openEuler 24.03
ll openEuler-24.03-LTS-SP3-x86_64-dvd.iso
3.选择一种引导方式
- PXE(预启动执行环境)有两种启动方式,UEFI 引导相比传统 BIOS(也称Legacy)引导,提供了更快的启动速度、更强的兼容性、更大的存储支持、更高的安全性,并且具有更友好的用户界面
| 特性 | Legacy/BIOS 模式 | UEFI 模式 |
|---|---|---|
| 固件接口 | BIOS | UEFI |
| 引导文件 | pxelinux.0 | bootx64.efi 或 bootia32.efi |
| 文件系统支持 | 仅支持 TFTP | 支持 TFTP、HTTP、HTTPS、NFS |
| Secure Boot | 不支持 | 支持 |
| 操作系统 | 支持32位、64位 | 不再支持32位系统,仅适用于64位 |
| 硬盘分区 | 传统的MBR分区表,最大2TB | 使用GPT格式,不受2TB限制 |
| xxx | xxx | xxx |
3.1.配置 BIOS 引导
- 安装 TFTP 服务用于存储 PXE 启动文件,以便客户端下载
#.安装服务
apt install -y tftpd-hpa
#.配置服务
mkdir -p /var/lib/tftpboot
echo 'TFTP_USERNAME="tftp"' > /etc/default/tftpd-hpa
echo 'TFTP_DIRECTORY="/var/lib/tftpboot"' >> /etc/default/tftpd-hpa
echo 'TFTP_ADDRESS=":69"' >> /etc/default/tftpd-hpa
echo 'TFTP_OPTIONS="--secure"' >> /etc/default/tftpd-hpa
echo 'TFTP_SERVER_args="-l -c -s /var/lib/tftpboot"' >> /etc/default/tftpd-hpa
#.重启服务
systemctl restart tftpd-hpa
systemctl status tftpd-hpa
#.确认端口已监听
ss -tulanp|grep -w 69
#.测试一下
echo 123 > /var/lib/tftpboot/123.txt
curl tftp://127.0.0.1/123.txt
- 针对 BIOS 引导,配置 syslinux(用于加载 Linux 内核的启动加载程序),如是 UEFI 模式,则不需要
注:默认的启动菜单文件在 TFTP 根目录的 pxelinux.cfg子目录下,文件名为 default,而应答文件 ks=xxx.cfg 用于指导自动化安装
#.安装syslinux
apt install -y syslinux-common syslinux pxelinux
#.复制PXE引导程序
mkdir -p /var/lib/tftpboot/pxelinux.cfg
cp /usr/lib/PXELINUX/pxelinux.0 /var/lib/tftpboot/
cp /usr/lib/syslinux/modules/bios/{ldlinux.c32,libutil.c32,menu.c32} /var/lib/tftpboot/
#.配置文件
cat > /var/lib/tftpboot/pxelinux.cfg/default <<EOF
default menu.c32
prompt 0
timeout 30
menu title PXE Boot Menu - By XiukaiYu - Ver 2026.01.15
label ubuntu-24043
menu label - Atuo Install ^Ubuntu 24.04.3 x64
kernel images/ubuntu24043/vmlinuz
initrd images/ubuntu24043/initrd
append root=/dev/ram0 ramdisk_size=1500000 ip=dhcp url=tftp://192.168.31.101/iso/ubuntu-24.04.3-live-server-amd64.iso
label local
menu default
menu label - Boot from ^local disk
localboot 0
EOF
#.重启服务
systemctl restart tftpd-hpa
systemctl status tftpd-hpa
3.2.配置 UEFI 引导
- 安装 nginx
#.开始安装
cd /opt
wget -c http://iso.sqlfans.cn/linux/zlib-1.2.11.tar.gz
wget -c http://iso.sqlfans.cn/linux/pcre-8.44.tar.gz
wget -c http://iso.sqlfans.cn/linux/openssl-1.1.1g.tar.gz
wget -c http://iso.sqlfans.cn/linux/nginx-1.25.0.tar.gz
wget -c http://iso.sqlfans.cn/linux/nginx_openssl_conf.conf
wget -c http://iso.sqlfans.cn/linux/install_nginx_1250.sh
bash install_nginx_1250.sh
#.确认版本
/usr/local/nginx/sbin/nginx -version
#.配置站点
mkdir -p /var/lib/tftpboot
cat > /usr/local/nginx/conf/vhost/pxe.conf <<EOF
server {
listen 80;
server_name localhost;
root /var/lib/tftpboot;
index index.html index.htm index.php;
}
EOF
#.重载配置
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
#.测试一下
echo 123 > /var/lib/tftpboot/123.txt
curl http://127.0.0.1/123.txt
4.客户端设置网络启动
- 若要 PXE 通过网络安装操作系统,需要将目标服务器开机,根据提示按 F2 进入 BIOS
- 选择 Boot,设置网络加载顺序,把 Network boot 调整到最上面,然后按 F10 保存并退出
- 重启之后,如果没有配置无人值守,则依然会通过网络手动安装操作系统。
无人值守安装linux系统
- 从 20.04 版起,服务器安装程序支持一种新的操作模式:自动安装(简称 autoinstall ),此功能也被称为无人值守、甩手或预置安装。
- 自动安装使得用户可以通过提前配置自动安装配置文件回答所有这些安装配置问题,并让安装过程无需任何交互即可自行运行,适合批量安装多台主机。
5.安装 Kickstart
- 使用 Kickstart 来自动化安装过程,通过 Kickstart 配置安装过程中所有的自动化指令。
注:system-config-kickstart was removed after 19.10 because Python 2 deprecation, but we can still get and install it manually.
#.1.通过apt安装 system-config-kickstart
apt install -y system-config-kickstart
#.Python 2 已于 2020年1月1日 停止官方支持,且 Ubuntu 22.04 移除了 Python 2
apt update
apt install -y build-essential checkinstall libreadline-dev libncursesw5-dev
apt install -y libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev zlib1g-dev
cd /opt/
wget -c http://iso.sqlfans.cn/python/Python-2.7.9.tgz
tar -xvf Python-2.7.9.tgz
cd Python-2.7.9
mkdir /usr/local/python27
./configure --prefix=/usr/local/python27
make -j 4 && make install
mv /usr/bin/python /usr/bin/python_bak_$(date +%Y%m%d%H%M%S)
ln -s /usr/local/python27/bin/python /usr/bin/python
python -V
#.2.通过deb安装 system-config-kickstart
cd /opt/
wget http://old-releases.ubuntu.com/ubuntu/pool/universe/p/pygtk/python-gtk2_2.24.0-6_amd64.deb
wget http://old-releases.ubuntu.com/ubuntu/pool/universe/p/pygtk/python-glade2_2.24.0-6_amd64.deb
wget http://archive.ubuntu.com/ubuntu/pool/universe/s/system-config-kickstart/system-config-kickstart_2.5.20-0ubuntu25_all.deb
#.注意顺序
apt install ./python-gtk2_2.24.0-6_amd64.deb
apt install ./python-glade2_2.24.0-6_amd64.deb
apt install ./system-config-kickstart_2.5.20-0ubuntu25_all.deb
#.3.通过python安装 pykickstart
apt install -y git python3 python3-pip python3-setuptools
pip3 install pykickstart
#.4.通过官方仓库安装 pykickstart
cd /opt/
apt install -y git python3 python3-pip python3-setuptools
git clone https://github.com/pykickstart/pykickstart.git
cd pykickstart
python3 setup.py install
#.利用openssl生成root加密密码,示例root明文密码 nXWNiSR2A3_YcQzV
encrypted_pw=$(openssl passwd -6 "nXWNiSR2A3_YcQzV")
#.创建配置文件
cat > /var/lib/tftpboot/images/ubuntu24043/ks.cfg <<EOF
install
cdrom
url --url ftp://10.0.0.12/centos7/repo
keyboard 'us'
lang en_US.UTF-8
timezone Asia/Shanghai
rootpw --iscrypted $encrypted_pw
bootloader --location=mbr
clearpart --all --drives=sda
part / --fstype=ext4 --grow --asprimary --size=40960
part /boot --fstype=ext4 --asprimary --size=2048
part swap --size=1024
network --bootproto=dhcp --device=eth0 --onboot=on --device=link --activate
network --hostname=localhost.localdomain
selinux --disabled
firewall --disabled
reboot
EOF
6.选择一种引导方式
6.1.通过 BIOS 引导
- Legacy BIOS 支持 PXE 启动的前提是在 BIOS 设置里把“Network Boot”功能开启,并设置网络加载顺序。启动时计算机会去找网卡上的 PXE ROM,这个小程序引导计算机通过网络查找 TFTP 服务器来获取启动文件。
6.2.通过 UEFI 引导
- 待补充 ...
遇到的错误
- 场景1:查看 isc-dhcp-server 服务失败,根据服务启动失败的 ProcessID: 1650,利用 journalctl _PID=1650 找到详细的错误信息,得知是参数配置错误 dhcp.pxelinux-config-file
root@ubuntu:~# systemctl status isc-dhcp-server
× isc-dhcp-server.service - ISC DHCP IPv4 server
Process: 1650 ExecStart=/bin/sh -ec CONFIG_FILE=/etc/dhcp/dhcpd.conf; if [ -f /etc/ltsp/dhcpd.conf>
Main PID: 1650 (code=exited, status=1/FAILURE)
root@ubuntu:~# journalctl _PID=1650
Jan 14 10:20:48 ubuntu dhcpd[1650]: /etc/dhcp/dhcpd.conf line 11: unknown option dhcp.pxelinux-config-file
- 场景1:
报错:
PXE-EC8: !PXE structure was not found in UNDI driver code segment.
PXE-M0F: Exiting Intel PXE ROM.
Operating System not found
解决1:由于pxe默认不支持above 4G的置配空间,如开启pxe之后需要关闭above 4G选项。进入主板bios -> 高级 -> above 4G decoding -> 设置为关闭
解决2:打开 Intel 下载中心,搜索 BootUtil,开启 64-Bit BAR of NIC
参考:https://jishuzhan.net/article/1724714707434082305
下载:https://www.intel.com/content/www/us/en/download/15755/intel-ethernet-connections-boot-utility-preboot-images-and-efi-drivers.html
bootutil64e → 查询NIC Port Name,(以下command, "X"为NIC Port Name)
bootutil64e -E
bootutil64e -NIC=X -FLASHENABLE
bootutil64e -NIC=X -64e
bootutil64e -NIC=X -UP=COMBO
解决3:

