ITPub博客

首页 > 应用开发 > IT综合 > PXE启动菜单配置详解:构建灵活网络部署系统

PXE启动菜单配置详解:构建灵活网络部署系统

投稿 IT综合 作者:bhluo 时间:2026-02-02 14:32:09 0 删除 编辑

# PXE启动菜单配置详解:构建灵活网络部署系统


## PXE启动菜单体系架构


PXE启动菜单是现代网络装机系统的核心入口,其本质是一个可交互的引导配置界面,位于网络引导链的TFTP传输环节之后。这个菜单系统并非单一文件,而是一个由配置文件、内核镜像、初始化文件组成的完整体系。当客户端通过DHCP获取引导文件后,便进入菜单系统控制流程,用户的选择直接决定后续安装路径和参数。


主流的PXE菜单系统主要包括三种实现方式:传统的**PXELINUX/SYSLINUX**方案、**GRUB2网络引导**方案,以及各Linux发行版自带的**高级菜单系统**。每种方案各有特点:PXELINUX配置简单直接,GRUB2功能丰富扩展性强,发行版专用方案集成度高但相对封闭。


```bash

# 典型PXE启动菜单文件结构

/var/lib/tftpboot/

├── pxelinux.0                    # PXELINUX引导程序

├── ldlinux.c32                   # 核心模块

├── vesamenu.c32                  # 图形菜单模块

├── pxelinux.cfg/                 # 配置文件目录

│   ├── default                   # 默认菜单配置

│   ├── C0A8000A                  # 按IP地址的特定配置

│   └── 01-11-22-33-44-55         # 按MAC地址的特定配置

├── centos/

│   ├── vmlinuz                   # 内核文件

│   └── initrd.img                # 初始化文件

└── ubuntu/

    ├── linux                     # 内核文件  

    └── initrd.gz                 # 初始化文件

```


## PXE启动菜单配置实战


### 基础菜单配置(PXELINUX方案)


```bash

# /var/lib/tftpboot/pxelinux.cfg/default 基础配置示例


# 菜单显示设置

DEFAULT vesamenu.c32

MENU TITLE 企业网络部署系统

MENU COLOR border       30;44   # 边框颜色

MENU COLOR title        1;36;44 # 标题颜色

MENU COLOR sel          7;37;40 # 选中项颜色

MENU COLOR tabmsg       31;40   # 标签消息颜色

MENU COLOR cmdmark      1;36;40 # 命令标记颜色

TIMEOUT 100                       # 超时时间(1/10秒)

ONTIMEOUT local                   # 超时后默认项


# 第一项:本地启动

LABEL local

  MENU LABEL 从本地硬盘启动

  MENU DEFAULT

  LOCALBOOT 0


# 第二项:CentOS 7 标准安装

LABEL centos7_standard

  MENU LABEL ^CentOS 7 - 标准安装

  KERNEL centos/7/vmlinuz

  APPEND initrd=centos/7/initrd.img inst.repo=http://192.168.1.10/centos/7 ks=http://192.168.1.10/kickstart/centos7.cfg

  TEXT HELP

    标准CentOS 7安装,使用Kickstart自动配置

    适用于通用服务器部署

  ENDTEXT


# 第三项:Ubuntu 20.04 自动化安装

LABEL ubuntu2004_auto

  MENU LABEL ^Ubuntu 20.04 LTS - 自动安装

  KERNEL ubuntu/20.04/linux

  APPEND initrd=ubuntu/20.04/initrd.gz auto=true url=http://192.168.1.10/preseed/ubuntu2004.cfg quiet

  TEXT HELP

    Ubuntu 20.04 LTS自动安装

    包含基础软件包和系统配置

  ENDTEXT


# 第四项:系统救援模式

LABEL rescue

  MENU LABEL 系统^救援模式

  KERNEL centos/7/vmlinuz

  APPEND initrd=centos/7/initrd.img inst.repo=http://192.168.1.10/centos/7 rescue

  TEXT HELP

    进入系统救援环境

    用于故障排查和数据恢复

  ENDTEXT


# 第五项:内存测试

LABEL memtest

  MENU LABEL 内存诊断测试

  KERNEL memtest86+/memtest.bin

  TEXT HELP

    运行Memtest86+内存诊断工具

    建议运行至少一个完整测试循环

  ENDTEXT

```


### 高级GRUB2菜单配置


```bash

# /var/lib/tftpboot/grub/grub.cfg GRUB2菜单配置


# 基础设置

set timeout=30

set default=0

set menu_color_normal=white/black

set menu_color_highlight=black/white


# 子菜单定义

submenu 'Linux发行版安装' {

    menuentry 'CentOS 8 Stream' {

        set root='tftp,192.168.1.10'

        linux /centos/8/vmlinuz inst.repo=http://192.168.1.10/centos/8 inst.ks=http://192.168.1.10/ks/centos8.cfg

        initrd /centos/8/initrd.img

    }

    

    menuentry 'Ubuntu 22.04 LTS' {

        set root='tftp,192.168.1.10'

        linux /ubuntu/22.04/linux auto=true priority=critical url=http://192.168.1.10/preseed/ubuntu2204.cfg

        initrd /ubuntu/22.04/initrd

    }

    

    menuentry 'Debian 11' {

        set root='tftp,192.168.1.10'

        linux /debian/11/linux auto=true priority=critical url=http://192.168.1.10/preseed/debian11.cfg

        initrd /debian/11/initrd.gz

    }

}


submenu '系统维护工具' {

    menuentry 'GParted Live' {

        set root='tftp,192.168.1.10'

        linux /gparted/vmlinuz boot=live config components union=overlay username=user noswap noeject

        initrd /gparted/initrd.img

    }

    

    menuentry 'Clonezilla 磁盘克隆' {

        set root='tftp,192.168.1.10'

        linux /clonezilla/vmlinuz boot=live union=overlay config components quiet noswap edd=on nomodeset locales=zh_CN.UTF-8

        initrd /clonezilla/initrd.img

    }

}


# 网络启动链

menuentry 'iPXE网络启动' {

    set root='tftp,192.168.1.10'

    chainloader /ipxe/ipxe.efi

}


# 本地启动选项

menuentry '从本地硬盘启动' {

    set root=(hd0,1)

    chainloader +1

}

```


## 智能条件化菜单配置


### 基于硬件类型的自动选择


```bash

# 根据客户端架构和类型动态选择菜单项

# /var/lib/tftpboot/pxelinux.cfg/default 条件化配置


DEFAULT vesamenu.c32

PROMPT 0


# 检测客户端架构

MENU BEGIN arch_select

MENU TITLE 选择系统架构


LABEL x64_uefi

  MENU LABEL ^x64 UEFI 系统

  KERNEL vesamenu.c32

  APPEND pxelinux.cfg/uefi_x64


LABEL x64_bios

  MENU LABEL x64 传统BIOS

  KERNEL vesamenu.c32

  APPEND pxelinux.cfg/bios_x64


LABEL arm64

  MENU LABEL ARM64 系统

  KERNEL vesamenu.c32

  APPEND pxelinux.cfg/arm64


MENU END


# 特定架构配置示例:UEFI x64

# /var/lib/tftpboot/pxelinux.cfg/uefi_x64

DEFAULT vesamenu.c32

MENU TITLE UEFI x64 安装选项


LABEL uefi_centos8

  MENU LABEL CentOS 8 UEFI 安装

  KERNEL centos/8/uefi/vmlinuz

  APPEND initrd=centos/8/uefi/initrd.img inst.repo=http://192.168.1.10/centos/8 inst.ks=http://192.168.1.10/ks/uefi_centos8.cfg inst.ksdevice=link


LABEL uefi_ubuntu2204

  MENU LABEL Ubuntu 22.04 UEFI 安装

  KERNEL ubuntu/22.04/uefi/linux

  APPEND initrd=ubuntu/22.04/uefi/initrd auto=true url=http://192.168.1.10/preseed/uefi_ubuntu2204.cfg

```


### 基于MAC地址的个性化配置


```bash

# 为特定设备创建专属菜单

# /var/lib/tftpboot/pxelinux.cfg/01-11-22-33-44-55

# (MAC地址:11:22:33:44:55)


DEFAULT vesamenu.c32

MENU TITLE Web服务器-专用配置

TIMEOUT 50


LABEL webserver_install

  MENU LABEL ^Web服务器标准部署

  MENU DEFAULT

  KERNEL centos/8/vmlinuz

  APPEND initrd=centos/8/initrd.img inst.repo=http://192.168.1.10/centos/8 inst.ks=http://192.168.1.10/ks/webserver.cfg hostname=webserver01 ip=192.168.1.101::192.168.1.1:255.255.255.0


LABEL webserver_rescue

  MENU LABEL Web服务器救援模式

  KERNEL centos/8/vmlinuz

  APPEND initrd=centos/8/initrd.img inst.repo=http://192.168.1.10/centos/8 rescue inst.ksdevice=link


LABEL local_boot

  MENU LABEL 从本地启动

  LOCALBOOT 0

```


### 基于IP地址的网段区分


```bash

# 根据客户端IP地址范围提供不同菜单

# /var/lib/tftpboot/pxelinux.cfg/C0A8000A (192.168.0.10)


DEFAULT vesamenu.c32

MENU TITLE 开发环境部署


# 开发环境特殊配置

LABEL dev_centos

  MENU LABEL 开发环境-CentOS 8

  KERNEL centos/8/vmlinuz

  APPEND initrd=centos/8/initrd.img inst.repo=http://192.168.1.10/centos/8 inst.ks=http://192.168.1.10/ks/dev_centos.cfg inst.sshd inst.git vnc


LABEL dev_ubuntu

  MENU LABEL 开发环境-Ubuntu 22.04

  KERNEL ubuntu/22.04/linux

  APPEND initrd=ubuntu/22.04/initrd auto=true url=http://192.168.1.10/preseed/dev_ubuntu.cfg tasksel=tasksel/first tasks=standard,ubuntu-desktop


# 开发工具链

LABEL dev_tools

  MENU LABEL 开发工具集合

  KERNEL gparted/vmlinuz

  APPEND initrd=gparted/initrd.img boot=live config components union=overlay

```


## 集成自动化部署与参数传递


### Kickstart/Preseed集成配置


```bash

# 带参数传递的高级菜单配置

# /var/lib/tftpboot/pxelinux.cfg/auto_deploy


DEFAULT vesamenu.c32

MENU TITLE 自动化部署系统


# 动态参数示例:通过菜单传递参数给Kickstart

LABEL auto_centos

  MENU LABEL 自动化CentOS部署

  KERNEL centos/8/vmlinuz

  # 关键参数传递:

  APPEND initrd=centos/8/initrd.img 

        inst.repo=http://192.168.1.10/centos/8

        inst.ks=http://192.168.1.10/ks/centos8.cfg

        inst.ksdevice=link          # 使用链接激活的网络设备

        ip=dhcp                     # DHCP获取IP

        inst.lang=en_US.UTF-8       # 语言设置

        inst.keymap=us              # 键盘布局

        console=tty0 console=ttyS0,115200n8  # 串口控制台

        inst.text                   # 文本模式安装

        inst.noninteractive         # 非交互模式


# 带变量替换的配置

LABEL dynamic_ubuntu

  MENU LABEL Ubuntu动态配置安装

  KERNEL ubuntu/22.04/linux

  APPEND initrd=ubuntu/22.04/initrd 

        auto=true 

        priority=critical 

        url=http://192.168.1.10/preseed/ubuntu.cfg

        hostname=ubuntu-${IP}       # 使用IP变量

        domain=example.com

        netcfg/get_ipaddress=${IP}  # 传递IP地址

        netcfg/get_netmask=255.255.255.0

        netcfg/get_gateway=192.168.1.1

        netcfg/get_nameservers="8.8.8.8 8.8.4.4"

        DEBCONF_DEBUG=5             # 调试模式

```

<"uyj.p5k3.org.cn"><"huk.p5k3.org.cn"><"afd.p5k3.org.cn">

### 菜单生成脚本自动化


```bash

#!/bin/bash

# generate_pxe_menu.sh - 动态生成PXE菜单


CONFIG_DIR="/var/lib/tftpboot/pxelinux.cfg"

MENU_FILE="${CONFIG_DIR}/default"

OS_LIST=("centos7" "centos8" "ubuntu2004" "ubuntu2204" "debian11")

ARCH_LIST=("x64" "arm64")


generate_menu_header() {

    cat > "$MENU_FILE" << EOF

DEFAULT vesamenu.c32

MENU TITLE 动态生成部署菜单

MENU COLOR border 30;44

MENU COLOR title 1;36;44

TIMEOUT 300

ONTIMEOUT local


LABEL local

  MENU LABEL ^Local boot

  LOCALBOOT 0


EOF

}


generate_os_entries() {

    for os in "${OS_LIST[@]}"; do

        for arch in "${ARCH_LIST[@]}"; do

            if [ -d "/var/lib/tftpboot/$os/$arch" ]; then

                cat >> "$MENU_FILE" << EOF

LABEL ${os}_${arch}

  MENU LABEL ${os^^} ${arch^^} 安装

  KERNEL ${os}/${arch}/vmlinuz

  APPEND initrd=${os}/${arch}/initrd.img inst.repo=http://192.168.1.10/${os}/${arch} inst.ks=http://192.168.1.10/ks/${os}.cfg


EOF

            fi

        done

    done

}


generate_by_mac() {

    # 为已知设备生成个性化配置

    declare -A DEVICE_MAP=(

        ["11:22:33:44:55:66"]="webserver"

        ["AA:BB:CC:DD:EE:FF"]="database"

        ["12:34:56:78:9A:BC"]="desktop"

    )

    

    for mac in "${!DEVICE_MAP[@]}"; do

        mac_file="${CONFIG_DIR}/$(echo $mac | tr ':' '-')"

        role="${DEVICE_MAP[$mac]}"

        

        cat > "$mac_file" << EOF

DEFAULT vesamenu.c32

MENU TITLE ${role^^}专用部署

TIMEOUT 100


LABEL ${role}_install

  MENU LABEL ^${role}标准部署

  KERNEL centos/8/vmlinuz

  APPEND initrd=centos/8/initrd.img inst.repo=http://192.168.1.10/centos/8 inst.ks=http://192.168.1.10/ks/${role}.cfg


LABEL local

  MENU LABEL 本地启动

  LOCALBOOT 0

EOF

        echo "为MAC $mac 生成 ${role} 配置"

    done

}


# 主执行流程

main() {

    echo "开始生成PXE菜单配置..."

    

    # 生成主菜单

    generate_menu_header

    generate_os_entries

    

    # 生成设备专用配置

    generate_by_mac

    

    # 设置权限

    chmod -R 644 "$CONFIG_DIR"/*

    

    echo "PXE菜单生成完成: $MENU_FILE"

    echo "总配置数量: $(find "$CONFIG_DIR" -name "*" -type f | wc -l)"

}


main "$@"

```


## 菜单系统测试与验证


### 模拟测试工具


```bash

#!/bin/bash

# test_pxe_menu.sh - PXE菜单测试工具


TFTP_ROOT="/var/lib/tftpboot"

TEST_MAC="00:11:22:33:44:55"


test_menu_parsing() {

    echo "测试菜单文件解析..."

    

    # 使用syslinux测试菜单语法

    if command -v syslinux &> /dev/null; then

        syslinux --test "$TFTP_ROOT/pxelinux.cfg/default"

    fi

    

    # 检查所有菜单文件语法

    find "$TFTP_ROOT/pxelinux.cfg" -name "*" -type f | while read file; do

        echo "检查: $file"

        grep -E "^(LABEL|MENU|KERNEL|APPEND|LOCALBOOT)" "$file" || true

    done

}


test_tftp_access() {

    echo "测试TFTP文件可访问性..."

    

    REQUIRED_FILES=(

        "pxelinux.0"

        "ldlinux.c32"

        "vesamenu.c32"

        "pxelinux.cfg/default"

    )

    

    for file in "${REQUIRED_FILES[@]}"; do

        if [ -f "$TFTP_ROOT/$file" ]; then

            echo "✓ $file 存在"

        else

            echo "✗ $file 缺失"

        fi

    done

    

    # 测试TFTP服务

    timeout 5 tftp localhost <<EOF

get pxelinux.0 /tmp/test_pxe

quit

EOF

    

    if [ $? -eq 0 ]; then

        echo "✓ TFTP服务正常"

    else

        echo "✗ TFTP服务异常"

    fi

}


test_dhcp_config() {

    echo "测试DHCP配置..."

    

    # 检查DHCP配置中引导文件设置

    if grep -q "filename.*pxelinux.0" /etc/dhcp/dhcpd.conf; then

        echo "✓ DHCP配置包含PXE引导文件"

    else

        echo "✗ DHCP配置缺少PXE引导文件"

    fi

    

    # 测试DHCP响应

    dhcping -c 255.255.255.255 -h "$TEST_MAC" -s 0.0.0.0 -v

}


main() {

    echo "PXE菜单系统综合测试"

    echo "===================="

    

    test_menu_parsing

    echo

    

    test_tftp_access

    echo

    

    test_dhcp_config

    

    echo -e "\n测试完成,查看上述结果确认系统状态"

}


main

```


## 菜单优化与维护


### 性能优化建议


```bash

# 1. 文件缓存优化

# 在TFTP服务器配置中启用缓存

# /etc/xinetd.d/tftp 或 systemd配置中

server_args = -s /var/lib/tftpboot -c -B 1468


# 2. 模块精简

# 仅加载必要模块,减少传输时间

# pxelinux.cfg/default 头部

DEFAULT vesamenu.c32

# 只包含实际使用的模块文件


# 3. 内核和initrd压缩优化

# 使用更高效的压缩算法

gzip -9 initrd.img

xz -9 vmlinuz


# 4. 网络优化参数

# 在APPEND行添加网络优化参数

APPEND ... modprobe.blacklist=floppy console=ttyS0,115200

```


### 日志与监控集成


```bash

#!/bin/bash

# pxe_menu_monitor.sh - 菜单使用情况监控


LOG_FILE="/var/log/pxe_menu_access.log"

CONFIG_DIR="/var/lib/tftpboot/pxelinux.cfg"

<"szv.p5k3.org.cn"><"edr.p5k3.org.cn"><"uyr.p5k3.org.cn">

# 监控TFTP访问日志

tail -f /var/log/tftp.log | while read line; do

    if echo "$line" | grep -q "pxelinux.cfg"; then

        client_ip=$(echo "$line" | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+' | head -1)

        config_file=$(echo "$line" | grep -o 'pxelinux.cfg/[^ ]*')

        timestamp=$(date '+%Y-%m-%d %H:%M:%S')

        

        echo "$timestamp - $client_ip accessed $config_file" >> "$LOG_FILE"

        

        # 统计菜单选择

        if [ -f "/tmp/pxe_menu_stats.json" ]; then

            jq --arg cfg "$config_file" \

               --arg ip "$client_ip" \

               '.count += 1 | .last_access = now | .by_config[$cfg] += 1' \

               /tmp/pxe_menu_stats.json > /tmp/pxe_menu_stats.tmp

            mv /tmp/pxe_menu_stats.tmp /tmp/pxe_menu_stats.json

        fi

    fi

done &


# 生成使用统计报告

generate_report() {

    echo "PXE菜单使用统计报告"

    echo "生成时间: $(date)"

    echo "======================"

    

    if [ -f "/tmp/pxe_menu_stats.json" ]; then

        total=$(jq '.count' /tmp/pxe_menu_stats.json)

        echo "总访问次数: $total"

        

        echo -e "\n按配置分布:"

        jq -r '.by_config | to_entries[] | "  \(.key): \(.value)次"' /tmp/pxe_menu_stats.json

        

        echo -e "\n最近24小时活动:"

        grep "$(date -d '24 hours ago' '+%Y-%m-%d')" "$LOG_FILE" | wc -l | xargs echo "  今日访问: 次"

    else

        echo "暂无统计数据"

    fi

}


# 定期生成报告

while true; do

    generate_report > /var/www/html/pxe_report.html

    sleep 3600  # 每小时更新一次

done

```


## 安全加固措施


```bash

# PXE菜单安全配置


# 1. 访问控制

# 基于IP的访问限制(在TFTP配置中)

# /etc/xinetd.d/tftp

10.0.0.0/8


# 2. 菜单文件权限控制

chmod 644 /var/lib/tftpboot/pxelinux.cfg/*

chown root:root /var/lib/tftpboot/pxelinux.cfg


# 3. 签名验证(高级安全)

# 使用GRUB2的安全启动功能

# /var/lib/tftpboot/grub/grub.cfg

set check_signatures=enforce


# 4. 敏感参数保护

# 避免在菜单中硬编码密码

# 使用HTTPS Kickstart配置或加密参数

```


构建高效的PXE启动菜单系统需要综合考虑功能性、可用性和可维护性。通过灵活的配置方案、智能的条件判断和自动化工具,可以创建出既满足多样化部署需求,又便于管理的网络装机入口。在实际实施中,建议先建立基础框架,再逐步添加高级功能,并通过测试确保每个环节的可靠性。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/19545/viewspace-3109721/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-11-01

  • 博文量
    895
  • 访问量
    934868