PXE 装机引导文件提取与验证(Debian 9.13 适配,含 TFTP 传输测试)

在 PXE 批量装机流程中,pxelinux.0vmlinuzinitrd.img是核心引导文件:pxelinux.0作为 PXE 引导入口程序,负责初始化网络引导环境;vmlinuz是系统内核,initrd.img是初始化内存盘,三者缺一不可。本文基于 Debian 9.13(Stretch)镜像,完整讲解引导文件的获取、TFTP 根目录部署及可用性验证。

一、前置知识:Debian 9.13 引导文件的作用与来源

1. 核心引导文件作用

文件名 作用 地位
pxelinux.0 PXE 客户端核心引导程序,接收 DHCP 指令并加载装机菜单 PXE 引导 "入口",需单独安装工具包获取
vmlinuz Debian 9.13 系统内核,完成硬件初始化和系统启动 系统启动核心,来自 ISO 镜像
initrd.img 初始化内存盘,包含内核启动所需驱动 / 工具,实现无盘引导 内核辅助组件,来自 ISO 镜像

2. 引导文件来源说明

  • pxelinux.0:Debian 9.13 需安装syslinux-common包获取(区别于 CentOS 的syslinux包);
  • vmlinuz/initrd.img:来自 Debian 9.13 ISO 镜像的install.amd64/目录(Debian 镜像目录结构与 CentOS 不同)。

二、实操环境准备

  1. 基础环境 :已部署并验证可用的 TFTP 服务器(根目录/var/lib/tftpboot);
  2. 软件依赖 :需安装syslinux-common(获取pxelinux.0)、mount(挂载镜像)、wget(下载镜像);
  3. 文件准备 :下载 Debian 9.13 ISO 镜像(推荐网络安装版debian-9.13.0-amd64-netinst.iso)。

三、核心步骤 1:获取引导文件

步骤 1:安装 syslinux-common,提取 pxelinux.0

Debian 9.13 中pxelinux.0归属syslinux-common包,需先安装再提取:

bash 复制代码
# 1. 更新源并安装syslinux-common
apt update && apt install syslinux-common -y

# 2. 验证安装并查找pxelinux.0路径
dpkg -L syslinux-common | grep pxelinux.0

正常输出(Debian 9.13 标准路径):

plaintext 复制代码
/usr/lib/syslinux/modules/bios/pxelinux.0

3.复制 pxelinux.0 到 TFTP 根目录

cp /usr/lib/syslinux/modules/bios/pxelinux.0 /var/lib/tftpboot/

验证复制结果(权限需为 644,确保客户端可读取)

ls -l /var/lib/tftpboot/pxelinux.0

正常输出:

-rwxr-xr-x. 1 root root 261472 12 月 8 14:00 /var/lib/tftpboot/pxelinux.0

plaintext 复制代码
### 步骤2:挂载Debian 9.13镜像,提取vmlinuz和initrd.img
Debian 9.13镜像的`install.amd64`目录中存放内核和初始化内存盘,以下分"镜像路径确认→挂载→文件提取"三步详细讲解:

#### 子步骤2.1:确认你的Debian镜像路径
首先明确镜像的绝对路径,分两种场景:
##### 场景1:已下载镜像到服务器本地
假设镜像下载到`/root`目录,执行以下命令查看:
```bash
# 列出/root目录下的Debian 9.13镜像
ls -l /root/*.iso | grep debian-9.13

示例输出:

plaintext 复制代码
-rw-r--r--. 1 root root 306708480 12月  8 13:00 /root/debian-9.13.0-amd64-netinst.iso

此时镜像路径为/root/debian-9.13.0-amd64-netinst.iso

场景 2:未下载镜像(补充高速下载命令)

从清华镜像源下载网络安装版(体积小、速度快):

bash 复制代码
# 切换到/root目录
cd /root
# 下载Debian 9.13网络安装版(清华镜像源)
wget -c https://mirrors.tuna.tsinghua.edu.cn/debian-cd/archive/9.13.0/amd64/iso-cd/debian-9.13.0-amd64-netinst.iso

下载完成后,镜像路径为/root/debian-9.13.0-amd64-netinst.iso

子步骤 2.2:创建挂载目录并挂载镜像
bash 复制代码
# 1. 创建镜像挂载目录(若已存在无需重复创建)
mkdir -p /mnt/debian9

# 2. 挂载镜像(替换为你的镜像绝对路径)
mount /root/debian-9.13.0-amd64-netinst.iso /mnt/debian9/
挂载成功 / 失败说明:
  • 成功提示:无报错,仅返回命令行(Debian 挂载 ISO 无额外提示,正常现象);

  • 失败提示 1mount: no such file or directory → 镜像路径输入错误,重新核对;

  • 失败提示 2

    复制代码
    mount: you must specify the filesystem type

    → 补充

    复制代码
    -o loop

    参数:

    bash 复制代码
    mount -o loop /root/debian-9.13.0-amd64-netinst.iso /mnt/debian9/
子步骤 2.3:提取 vmlinuz 和 initrd.img 到 TFTP 根目录

Debian 9.13 的内核和初始化内存盘在install.amd64目录下,需精准提取:

bash 复制代码
# 1. 查看镜像内的引导文件(确认存在)
ls -l /mnt/debian9/install.amd64/ | grep -E "vmlinuz|initrd.gz"

正常输出(Debian 中 initrd 文件后缀为.gz,需解压后使用):

plaintext 复制代码
-r--r--r--. 1 root root  4194304 2020-07-25 12:00 vmlinuz
-r--r--r--. 1 root root 16896000 2020-07-25 12:00 initrd.gz

2. 解压 initrd.gz(Debian 专属步骤,需解压为 initrd.img)

gunzip /mnt/debian9/install.amd64/initrd.gz -c > /var/lib/tftpboot/initrd.img

3. 复制 vmlinuz 到 TFTP 根目录

cp /mnt/debian9/install.amd64/vmlinuz /var/lib/tftpboot/

4. 验证复制结果

ls -l /var/lib/tftpboot/ | grep -E "vmlinuz|initrd.img"

plaintext 复制代码
正常输出(权限需为644):

-r--r--r--. 1 root root 16896000 12 月 8 14:05 /var/lib/tftpboot/initrd.img-r--r--r--. 1 root root 4194304 12 月 8 14:05 /var/lib/tftpboot/vmlinuz

plaintext 复制代码
# 5. 卸载镜像(可选,释放挂载目录)
umount /mnt/debian9/

步骤 3:创建 PXE 菜单目录(为后续装机菜单做准备)

PXE 装机菜单文件需放在pxelinux.cfg目录下,Debian 与 CentOS 目录结构一致:

bash 复制代码
# 创建pxelinux.cfg目录
mkdir -p /var/lib/tftpboot/pxelinux.cfg

# 验证目录结构(核心引导文件全部就位)
tree /var/lib/tftpboot/

正常输出:

plaintext 复制代码
/var/lib/tftpboot/
├── initrd.img
├── pxelinux.0
├── pxelinux.cfg
└── vmlinuz

四、核心步骤 2:验证引导文件可正常下载

TFTP 服务器需确保 Debian 9.13 引导文件能被客户端获取,以下通过本地 / 跨主机测试验证可用性:

验证 1:本地 TFTP 下载测试(二进制模式,必选)

bash 复制代码
# 1. 清理本地旧文件(避免干扰)
rm -f pxelinux.0 vmlinuz initrd.img

# 2. 进入tftp交互模式测试下载
tftp 127.0.0.1
tftp> verbose  # 开启详细输出
Verbose mode on.
tftp> binary   # 二进制模式,防止文件损坏
mode set to octet
tftp> get pxelinux.0  # 下载引导程序
tftp> get vmlinuz     # 下载内核
tftp> get initrd.img  # 下载初始化内存盘
tftp> quit
成功标志(客户端输出字节数)
plaintext 复制代码
getting from 127.0.0.1:pxelinux.0 to pxelinux.0 [octet]
Received 261472 bytes in 0.2 seconds [10458880 bit/s]
getting from 127.0.0.1:vmlinuz to vmlinuz [octet]
Received 4194304 bytes in 1.6 seconds [20971520 bit/s]
getting from 127.0.0.1:initrd.img to initrd.img [octet]
Received 16896000 bytes in 6.5 seconds [20916923 bit/s]
验证文件完整性
bash 复制代码
# 对比TFTP根目录文件大小(确保无丢失)
ls -l /var/lib/tftpboot/pxelinux.0 ./pxelinux.0
ls -l /var/lib/tftpboot/vmlinuz ./vmlinuz
ls -l /var/lib/tftpboot/initrd.img ./initrd.img

正常结果:本地文件与 TFTP 根目录文件大小完全一致

验证 2:跨主机 TFTP 下载测试(模拟真实 PXE 客户端)

找一台与 TFTP 服务器同网段的 Linux 主机,安装tftp客户端后测试:

bash 复制代码
# 1. 目标主机安装tftp客户端(Debian/Ubuntu)
apt install tftp-hpa -y

# 2. 下载引导文件(替换为你的TFTP服务器IP)
tftp 192.168.171.200 -c binary -c get pxelinux.0
tftp 192.168.171.200 -c binary -c get vmlinuz
tftp 192.168.171.200 -c binary -c get initrd.img

# 3. 验证文件存在
ls -l | grep -E "pxelinux.0|vmlinuz|initrd.img"

成功标志:目标主机能看到 3 个文件,且大小与服务器一致。

验证 3:tcpdump 抓包验证(确认传输流量)

在 TFTP 服务器上监听 UDP 69 端口,验证客户端请求:

bash 复制代码
# 监听TFTP流量(替换ens33为你的网卡名称)
tcpdump -i ens33 port 69 -vv

执行跨主机下载后,服务器端会显示RRQ读请求记录,示例:

plaintext 复制代码
14:30:00.123456 IP 192.168.171.202.56789 > 192.168.171.200.69: [udp sum ok] TFTP, length 43, RRQ "pxelinux.0" octet

五、常见问题排障(Debian 9.13 专属)

问题 1:找不到 pxelinux.0 文件

现象
bash 复制代码
dpkg -L syslinux-common | grep pxelinux.0  # 无输出
解决方案
bash 复制代码
# 重新安装syslinux-common
apt reinstall syslinux-common -y
# 若源异常,更换清华源后重试
echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ stretch main contrib non-free" > /etc/apt/sources.list
apt update && apt reinstall syslinux-common -y

问题 2:提取的 initrd.img 无法使用

根因

未解压 Debian 的initrd.gz,直接复制压缩文件导致。

解决方案
bash 复制代码
# 重新解压initrd.gz
gunzip /mnt/debian9/install.amd64/initrd.gz -c > /var/lib/tftpboot/initrd.img

问题 3:跨主机下载提示 Timeout

解决方案
bash 复制代码
# 服务器端关闭防火墙(Debian 9.13)
systemctl stop nftables && systemctl disable nftables
systemctl stop iptables && systemctl disable iptables

# 确认文件权限
chmod 644 /var/lib/tftpboot/*

六、一键部署脚本(Debian 9.13 专属)

bash 复制代码
#!/bin/bash
# Debian 9.13 PXE引导文件一键部署脚本
# 配置参数(修改为你的实际路径)
TFTP_ROOT="/var/lib/tftpboot"
ISO_PATH="/root/debian-9.13.0-amd64-netinst.iso"
MOUNT_DIR="/mnt/debian9"

# 1. 安装依赖
apt update && apt install syslinux-common mount wget -y

# 2. 提取pxelinux.0
PXELINUX_PATH=$(dpkg -L syslinux-common | grep pxelinux.0)
cp ${PXELINUX_PATH} ${TFTP_ROOT}/

# 3. 挂载镜像并提取内核/initrd
mkdir -p ${MOUNT_DIR}
mount -o loop ${ISO_PATH} ${MOUNT_DIR}
# 解压initrd.gz
gunzip ${MOUNT_DIR}/install.amd64/initrd.gz -c > ${TFTP_ROOT}/initrd.img
# 复制vmlinuz
cp ${MOUNT_DIR}/install.amd64/vmlinuz ${TFTP_ROOT}/
umount ${MOUNT_DIR}

# 4. 创建菜单目录并设置权限
mkdir -p ${TFTP_ROOT}/pxelinux.cfg
chmod 644 ${TFTP_ROOT}/*
chmod 755 ${TFTP_ROOT}/pxelinux.cfg

# 5. 验证结果
echo "=== Debian 9.13 PXE引导文件部署结果 ==="
tree ${TFTP_ROOT}/
echo -e "\n✅ 部署完成!请执行TFTP下载测试验证。"

七、总结

本文基于 Debian 9.13 镜像完成了 PXE 引导文件的 "获取 - 部署 - 验证" 全流程,核心差异点:

  1. Debian 需安装syslinux-common包获取pxelinux.0(CentOS 为syslinux);
  2. Debian 的 initrd 文件为initrd.gz,需解压为initrd.img后使用;
  3. 引导文件存放目录与 CentOS 一致,TFTP 传输验证逻辑通用。

至此,Debian 9.13 的 PXE 引导文件已部署完成,结合 DHCP 服务器配置,下一步只需编写 PXE 装机菜单(pxelinux.cfg/default),即可实现 Debian 9.13 的批量网络装机。

相关推荐
wanhengidc6 小时前
云手机 多开无忧 科技运行
运维·服务器·科技·游戏·智能手机
测试人社区—66797 小时前
破茧成蝶:DevOps流水线测试环节的效能跃迁之路
运维·人工智能·学习·flutter·ui·自动化·devops
秋刀鱼 ..8 小时前
第七届国际科技创新学术交流大会暨机械工程与自动化国际学术会议(MEA 2025)
运维·人工智能·python·科技·机器人·自动化
CheungChunChiu15 小时前
Linux 内核设备模型与驱动框架解析 ——以 rk-pcie 为例
linux·运维·ubuntu
姚不倒15 小时前
负载均衡的概念、策略以及两个核心组件 Nginx 和 Kube-proxy 的对比。
运维·nginx·云原生·kubernetes
列逍15 小时前
Linux进程(三)
linux·运维·服务器·环境变量·命令行参数
minji...19 小时前
Linux 基础IO(一) (C语言文件接口、系统调用文件调用接口open,write,close、文件fd)
linux·运维·服务器·网络·数据结构·c++
码龄3年 审核中20 小时前
Linux record 04
linux·运维·服务器
RisunJan20 小时前
Linux命令-ftptop命令(实时监控 ProFTPD 服务器连接状态)
linux·运维·服务器