前言介绍

PXE Server有哪几部分组成?

1. dhcp服务器

2. tftp服务器

3. 文件服务器,比如http\FTP\NFS等

环境说明:

操作系统:centos7 x86_64 minal

测试的系统:centos7 x86_64 minal  ISO

搭建前的准备工作

1. 关闭selinux

sed -i.bak 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config 

setenforce 0

2. 配置防火墙

# 开启IP伪装,提供给自动获取网段的机器上网

firewall-cmd --add-masquerade --permanent

# 开放必要的服务

firewall-cmd --permanent --add-service={dhcp,proxy-dhcp,http,tftp}

firewall-cmd --reload

搭建DHCP 服务器

# 安装dhcp服务

yum install -y dhcp

# 配置dhcp服务器

vim /etc/dhcp/dhcpd.conf

# 不使用DNS动态更新
ddns-update-style none;
# 忽略客户端DNS更新
ignore client-updates;

authoritative;

# 响应客户端的启动查询(开机时发送的DHCP请求)
allow booting;
allow bootp;
allow unknown-clients;

#DHCP configuration for PXE boot server
option space PXE;
option PXE.mtftp-ip    code 1 = ip-address;
option PXE.mtftp-cport code 2 = unsigned integer 16;
option PXE.mtftp-sport code 3 = unsigned integer 16;
option PXE.mtftp-tmout code 4 = unsigned integer 8;
option PXE.mtftp-delay code 5 = unsigned integer 8;
option arch code 93 = unsigned integer 16; # RFC4578

subnet 10.0.0.0 netmask 255.255.255.0 {
  range 10.0.0.100 10.0.0.199;
  # 设置DNS服务器地址
  option domain-name-servers 223.5.5.5,114.114.114.114;
  # 设置DNS域
  option domain-name "dns1.server.com";
  # 设置客户租的默认网关
  option routers 10.0.0.2;
  option broadcast-address 10.0.0.255;
  # 默认租约时间,单位为秒
  default-lease-time 3600;
  # 设置最大租约时间,单位为秒
  max-lease-time 7200;

  class "pxeclients" {
          match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
          next-server 10.0.0.2;

          # UEFI x86-64 boot (RFC4578 architecture types 7, 8 and 9)
          if option arch = 00:07 {
              filename "uefi/bootx64.efi";
          } else if option arch = 00:08 {
              filename "uefi/bootx64.efi";
          } else if option arch = 00:09 {
              filename "uefi/bootx64.efi";
          } else {
              filename "pxelinux.0";
          }
  }
}

说明:

pxe服务器有两张网卡,一张是管理IP,可以访问互联网;一张是内网段,内网段自动获取IP,内网段IP地址:10.0.0.2  255.255.255.0 10.0.0.1,同时也作为dhcp服务端,地址池为10.0.0.100-199

BIOS的引导文件:pxelinux.0  UEFI引导文件:bootx64.efi

dhcp配置中网关需要指定为dhcp服务端的ip,这样才能实现客户端能通过IP地址伪装访问互联网

# 启动dhcp服务并加入开机启动

systemctl enable dhcpd --now

systemctl status dhcpd

搭建TFTP服务器

# 安装tftp

yum install -y tftp-server

# 配置tftp服务器

yum install -y syslinux

# 复制引导程序到tftp目录下

# 主要由两部分组成:syslinux和系统镜像部分文件

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

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

cp -v /usr/share/syslinux/mboot.c32 /var/lib/tftpboot/

cp -v /usr/share/syslinux/chain.c32 /var/lib/tftpboot/

----------以上主要是传统BIOS引导方式的一些引导文件

# 挂载镜像以拷贝需要的文件

mount -o loop CentOS-7-x86_64-minal-2009.iso /mnt/

cp /mnt/isolinux/{boot.cat,boot.msg,grub.conf,isolinux.bin,splash.png,TRANS.TBL,vesamenu.c32} /var/lib/tftpboot/

# 创建必要的目录

mkdir /var/lib/tftpboot/pxelinux.cfg
mkdir -p /var/lib/tftpboot/networkboot/centos7
mkdir /pub/centos7

# 拷贝iso中的引导文件

cp /mnt/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/networkboot/centos7

# 将iso文件挂载到文件服务器目录

mount CentOS-7-x86_64-minal-2009.iso /pub/centos7   # 推荐

或者拷贝

cp -rf /mnt/* /pub/centos7/

---------------------------------------------------------

# 编辑传统BIOS引导的菜单

vim /var/lib/tftpboot/pxelinux.cfg/default

default menu.c32
prompt 0
timeout 300
ONTIMEOUT 1

menu title ########## CentOS 7 PXE Boot Menu ##########

label 1
menu label ^1) Install CentOS 7
menu default
kernel /networkboot/centos7/vmlinuz
append initrd=/networkboot/centos7/initrd.img inst.repo=http://10.0.0.2/centos7 

lable 2
menu label ^2) Install OpenEuler 22.03 lts
meun default
kernel /networkboot/centos7/vmlinuz
append initrd=/networkboot/centos7/initrd.img inst.repo=https://mirrors.nju.edu.cn/openeuler/openEuler-22.03-LTS-SP1/OS/x86_64/ inst.sslverify=0

label 3
menu label ^3) Boot from local drive
localboot 0

------------------------------------------------------------

# 创建UEFI引导的目录

mkdir /var/lib/tftpboot/uefi

# 安装启动引导文件相关rpm

yum install grub2-efi-x64 shim-x64

cp -p /boot/efi/EFI/centos/*.efi /var/lib/tftpboot/uefi/
chmod 755 /var/lib/tftpboot/uefi/*.efi

yum install grub2-efi-x64-modules

# 生成启动文件

grub2-mkstandalone -d /usr/lib/grub/x86_64-efi/ -O x86_64-efi --modules="tftp net efinet linux part_gpt efifwsetup" -o /var/lib/tftpboot/uefi/bootx64.efi


# 编辑UEFI引导的菜单文件

vim /var/lib/tftpboot/uefi/grub.cfg

set default="0"
function load_video {
  insmod efi_gop
  insmod efi_uga
  insmod video_bochs
  insmod video_cirrus
  insmod all_video
}
load_video
set gfxpayload=keep
insmod net
insmod efinet
insmod tftp
insmod gzio
insmod part_gpt
insmod ext2
set timeout=60
menuentry 'Install UEFI CentOS Linux 7' --class fedora --class gnu-linux --class gnu --class os {
  linuxefi (tftp)/networkboot/centos7/vmlinuz ip=dhcp inst.repo=http://10.0.0.2/centos7/
  initrdefi (tftp)/networkboot/centos7/initrd.img
}

menuentry 'OpenEuler22.03 lts' {
  linuxefi  (tftp)/uefi/vmlinuz ip=dhcp inst.repo=https://mirrors.nju.edu.cn/openeuler/openEuler-22.03-LTS-SP1/OS/x86_64/ inst.resolution=1024x768 
  initrdefi (tftp)/uefi/initrd.img
}

# 以上菜单仅供参考

----------------------------------------------------

# 重启tftp服务

systemctl restart tftp.service && systemctl enable tftp --now

搭建文件服务器nginx

# 安装扩展源

yum  install epel-release -y

# 安装nginx

yum makecache fast && yum install nginx -y

# 配置nginx

mkdir -p /pub/centos7

vim /etc/nginx/conf.d/default.conf

server {
    listen 80;
    server_name _;
    root /pub;
    location / {
      autoindex on;
      index index.htm index.html;
    }
}

# 检查配置

nginx -t

# 启动nginx

systemctl enable nginx --now

至此,就已经搭建好PXE Server 支持BIOS+EFI两种引导方式内网环境下网络启动安装系统。

客户端只需要保持和10.0.0.2/24 在同一个交换机上即可设置从网卡启动,自动获取IP地址,进入安装系统。

注意:centos7 安装至少需要2G以上的内存,一般最低给4G内存,内存太小会导致出现问题。

参考资料:

http://m.blog.chinaunix.net/uid-31555782-id-5819768.html

http://hmli.ustc.edu.cn/doc/linux/centos-autoinstall.htm