「Linux」- 搭建 PXE 服务(Debian、CentOS)

问题描述

该笔记将记录:在 Linux 中,手动搭建 PXE 环境的方法(用于 Debian、CentOS 网络启动),以及相关问题的解决方案;

补充说明

如果觉得手动部署整个 PXE 环境非常麻烦(或管理不便),建议使用 Cobbler 服务(它是对 PXE 环境的封装,支持命令行管理、WEB 管理、提供相关 API 访问)

环境概述

关需 PXE 客户端

Microserver Gen10,一台网卡支持 PXE 的设备,即支持 PXE 启动,作为 PXE 客户端。实际上客户端用什么无所谓,重要的是支持 PXE 启动;
作为 PXE 客户端的是 Microserver Gen10,一台网卡支持 PXE 的 GEN10,支持 PXE 启动

关于 PXE 服务端

ThinkPad T540P,Debain 8,一台笔记本,用于搭建 PEX 环境:使用 ISC DHCP 提供 DHCP 服务;使用 TFTP 服务提供预启动文件;使用 HTTP 服务提供操作系统镜像;
作为 PXE 服务端的是 ThinkPad T540P,Debain 8,一台笔记本,用于搭建 PEX 环境;

网络环境

网段:172.31.250.0/24
服务:ThinkPad T540P, 172.31.250.1
客户:Microserver Gen10, 172.31.250.X(IP 地址是 DHCP 分配的,所以 X 需要启动后才知道)

两台设备有线网卡直连(因为路由器的 DHCP 也不支持那么复杂的配置,所以两者直连,即 TFTP、DHCP、HTTP 都在笔记本上,以使用在笔记本上的 DHCP 服务);

在笔记本上有两张网卡,一张是 enp0s25(有线),一张是 wlan0(无线)。计划:将笔记本设置成路由,使 PXE CLINET 接入有线网卡,无线网卡连接外网,然后使用 SNAT(因为在 STATION MODE 下无线网卡无法桥接[1])实现 PXE CLIENT 的外部网络访问;

搭建环境

使用 ISC DHCP 提供 DHCP 服务;使用 TFTP 服务提供预启动文件;使用 HTTP 服务提供操作系统安装中需要的文件;

#1 网络设置

在笔记本(PXE Server)上执行,为有线网卡添加 IP 地址:

#!/bin/sh

# 方法一、使用 NetworkManager 添加
# 为有线网卡添加 IP 地址,不需要设置网关、DNS 这些信息
nmcli connection add connection.id enp0s25 \
      type ethernet connection.interface-name enp0s25 \
      +ipv4.addresses 172.31.250.1/24 \
      ipv4.method manual

# 方法二、直接使用 ip 命令添加
ip address add 172.31.250.1/24 dev enp0s25

#2 搭建 DCHP 服务

在笔记本(PXE 服务端)上执行,搭建 DHCP 服务,添加如下配置:

subnet 172.31.250.0 netmask 255.255.255.0 {
        range 172.31.250.2 172.31.250.254;
        filename "/pxelinux.0";
        next-server 172.31.250.1;
}

# next-server - 指定了 TFTP 服务器的地址
# filename - 指定了要从 tftp 服务器加载的文件

#3 搭建 TFTP 服务

对于 Debian 系统:

################################################################################
# 1. 安装服务,并启动
#     在 Debain 8 中,配置文件为 /etc/default/tftpd-hpa,TFTP 的根目录为 /srv/tftp/;
#     不需要做过多的配置;
################################################################################
apt-get install tftpd-hpa
systemctl start tftpd-hpa.service

################################################################################
# 2. 准备部署需要的文件
################################################################################
# 下载必要的网启文件:https://www.debian.org/distrib/netinst#netboot
# http://ftp.nl.debian.org/debian/dists/stretch/main/installer-amd64/current/images/netboot/netboot.tar.gz
wget http://ftp.nl.debian.org/debian/dists/stretch/main/installer-amd64/current/images/netboot/netboot.tar.gz

# 解压到 TFTP 的根目录
tar -xf netboot.tar.gz -C /srv/tftp/

对于 CentOS 系统:

################################################################################
# 1. 安装服务,并启动
#     在 Debain 8 中,配置文件为 /etc/default/tftpd-hpa,TFTP 的根目录为 /srv/tftp/;
################################################################################
apt-get install tftpd-hpa
systemctl start tftpd-hpa.service

################################################################################
# 2. 准备部署需要的文件
################################################################################
# (部署引导程序)部署 syslinux,它负责显示一个引导菜单
# 下载 syslinux 并保存到 tftp 根目录中。这个软件包中包含了 pxelinux.0 以及 isolinux 相关的文件
yum install -y syslinux
cp -dvr /usr/share/syslinux/* /srv/tftp/

# (设置引导菜单)设置 syslinux 显示的菜单内容
# 创建 /srv/tftp/pxelinux.cfg/default 文件,且文件内容如下
mkdir /srv/tftp/pxelinux.cfg/
cat >> /srv/tftp/pxelinux.cfg/default << EOF
default menu.c32
prompt 0
timeout 300
ONTIMEOUT local

menu title ########## PXE Boot Menu ##########

label 1
menu label ^1) Install CentOS 7 x64 with Local Repo
kernel vmlinuz
append initrd=initrd.img method=http://172.31.250.1/mirror/ devfs=nomount ip=dhcp
EOF

# (系统安装程序)部署操作系统的安装程序
# 复制操作系统安装程序。这些文件的作用就是操作系统安装程序
# 挂载系统安装镜像,返回复制 vmlinuz、initrd.img 文件
mount CentOS-7-x86_64-Minimal-1708.iso /path/to/dir/
cp /path/to/dir/images/pxeboot/vmlinuz /srv/tftp/
cp /path/to/dir/images/pxeboot/initrd.img /srv/tftp/
umount /path/to/dir/

#4 搭建 HTTP 服务(镜像站点)

为什么要搭建 HTTP 服务?
1)在 TFTP 中的那些文件只是一些”引导文件“,这些”引导文件“的作用就是引导并启动”操作系统安装程序“,而”操作系统安装程序“来执行操作系统的安装;
2)但是安装操作系统的过程中需要一些文件(比如软件包),这些文件我们还没有;
3)而 HTTP 服务的作用就是提供这些文件的下载。所以,我们不光需要 HTTP 服务,我们还需要在 HTTP 服务中部署这些文件(软件包);

所以真正要做的事情是:克隆一个 Debian 的镜像站点,并且提供 HTTP 服务,能够让”PXE 客户端“(准确的说是”操作系统安装程序“);

还有一个替代的方法:在”操作系统安装程序“中,他会让你选择镜像站点,我们是自己搭建,实际上它提供了在线的镜像站点。如果网络允许你可以选择在线镜像站点;

注意,下载的 ISO 镜像的目录结构虽然和镜像站看起来一样,但是有很多细微的不同支持,并不能直接挂载后作为镜像站来使用;

对于 Debian 系统,参考「Setting up a Debian archive mirror」手册,以获取创建镜像站点的部署方法;

对于 CentOS 系统,这个 HTTP 服务就是pxelinux.cfg/default文件中的http://172.31.250.1/mirror,其中 mirror 目录中的内容就是 CentOS 操作系统镜像文件的内容,所以直接挂载 iso 文件到 mirror 目录即可:

# mount CentOS-7-x86_64-Minimal-1708.iso /path/to/mirror/

然后测试能够访问即可;

测试 PXE 启动

当测试时,我们通过在 KVM 中创建的 Guest 测试,因为 GEN10 的 PXE 启动没有调试信息,失败了啥也不说。这里也不再开细致的记录了;

总之,只要能找到网卡支持 PXE 启动的机器测试就可以;

关于无人值守安装,参考:
1)Automating Linux Installations
2)DebianInstallerPreseed

还有一个东西是 FAI ,一个非交互式系统,用于在计算机和虚拟机上安装和配置 Linux 系统和软件包,可用于创建虚拟机或云计算平台中使用的自定义磁盘映像;

注释说明

[1]. 如果你的无线网卡已经接入了外部网络(STATION MODE),那它就无法加入主机的桥接;

参考文献

2.4.3. Configuring Static Routes Using nmcli
Installing Debian using network booting
Setting up a ‘PXE Network Boot Server’ for Multiple Linux Distribution Installations in RHEL/CentOS 7
Setting Up a PXE Server
使用 KickStart 进行 CentOS7.4 的自动部署安装
网络 PXE 安装系统环境搭建