项目实战:PXE

项目实战:PXE

PXE 介绍

对与运维人员来说,如何安装操作系统想必并不陌生。当我们需要大批量安装系统时,就需要自动化安装系统了,PXE技术可以实现这一需求。

PXE(Pre-boot Execution Environment,预启动执行环境):

  • 由 Intel 公司开发
  • C/S(Client/Server)网络模式
  • PXE通过网络引导和安装Windows,linux等多种操作系统。

工作原理

在这里插入图片描述

  1. Client向PXE Server上的DHCP发送IP地址请求消息,DHCP检测Client是否合法(主要是检测Client的网卡MAC地址),如果合法则返回Client的 IP地址,同时将TFTP服务器IP和启动文件pxelinux.0的位置信息一并传送给Client。
  2. Client向PXE Server上的TFTP发送获取pxelinux.0请求消息,TFTP接收到消息之后再向Client发送pxelinux.0大小信息,试探Client是否满意。当TFTP收到Client发回的同意大小信息之后,正式向Client发送pxelinux.0。Client执行接收到的pxelinux.0文件。
  3. Client向TFTP Server发送针对本机的配置信息文件(在TFTP 服务的 pxelinux.cfg目录下),TFTP将配置文件发回Client,继而Client根据配置文件执行后续操作。
  4. Client向TFTP发送Linux内核请求信息,TFTP接收到消息之后将内核文件发送给Client。
  5. Client向TFTP发送initrd.img文件请求信息,TFTP接收到消息之后返回initrd.img。
  6. Client启动Linux内核,加载initrd.img,读取系统启动参数,进而向文件服务器请求系统安装应答文件。文件服务器返回系统安装应答文件。
  7. Client继续向文件服务器请求安装源文件,文件服务器返回安装源文件,开始安装。

简化流程如下:
在这里插入图片描述

实验环境

网络规划:
10.1.8.21 dhcp.djf.cloud dhcp
10.1.8.22 tftp.djf.cloud tftp
10.1.8.23 file.djf.cloud file
10.1.8.24 web.djf.cloud web

在这里插入图片描述

实验环境说明:所有的服务都部署在server节点。

部署 DHCP 服务器

部署服务端

#### 部署 DHCP 服务器
[root@dhcp ~ 17:06:35]# yum install -y dhcp
#将配置文件的示例文件复制改名并覆盖原有配置文件
[root@dhcp ~ 17:14:45]# /bin/cp /usr/share/doc/dhcp*/dhcpd.conf.example /etc/dhcp/dhcpd.conf
#修改配置文件
[root@dhcp ~ 17:16:41]# vim /etc/dhcp/dhcpd.conf

subnet 10.1.8.0 netmask 255.255.255.0 {
  range 10.1.8.101 10.1.8.200;
  option domain-name-servers 223.5.5.5, 223.6.6.6;
  option domain-name "djf.cloud";
  #默认网关
  option routers 10.1.8.2;
  option broadcast-address 10.1.8.255;
  default-lease-time 600;
  max-lease-time 7200;
  # 指定网络引导文件名称
  filename "pxelinux.0";
  # 指定 tftp 服务器
  next-server tftp.djf.cloud;
}

host web.djf.cloud {
  hardware ethernet 00:0C:29:8C:A7:55;
  fixed-address 10.1.8.100;
}

客户端测试

测试 web 是否可以网络引导

删除 web 本地硬盘,添加一块200G空硬盘

在这里插入图片描述

可以被分配到IP,DHCP服务器部署成功

部署 TFTP 服务器

TFTP(Trivial File Transfer Protocol,普通文件传输协议),是一个传输文件的简单协议,基于UDP协议而实现,端口号为69,默认共享数据路径:/var/lib/tftpboot。

TFTP协议是为进行小文件传输设计的。因此它不具备通常的FTP的许多功能,它只能从文件服务器上获得或写入文件,不能列出目录,不进行认证,它传输8位数据。

使用场景:

  • 提供不复杂、开销不大的文件传输服务。
  • 提供操作系统网络引导服务。

部署服务端

#### 部署 TFTP 服务器
[root@tftp ~ 17:06:35]# yum install -y tftp-server
[root@tftp ~ 17:50:04]# systemctl enable tftp.service --now
#默认传输目录(默认是/var/lib/tftpboot/)

# 提供网络引导文件pxelinux.0
[root@tftp ~ 17:50:05]# yum install -y syslinux
[root@tftp ~ 17:50:29]# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/

部署菜单文件

## 部署引导菜单文件,引导文件通过iso文件获得。
[root@tftp ~ 17:50:48]# mkdir /dvd
[root@tftp ~ 17:51:58]# mount /dev/sr0 /dvd
mount: /dev/sr0 is write-protected, mounting read-only
#tftp默认传输目录(默认是/var/lib/tftpboot/)
[root@tftp ~ 17:52:05]# cp /dvd/isolinux/* /var/lib/tftpboot/
[root@tftp ~ 18:46:29]# ls /var/lib/tftpboot/
boot.cat   initrd.img    memtest     TRANS.TBL
boot.msg   isolinux.bin  pxelinux.0  vesamenu.c32
grub.conf  isolinux.cfg  splash.png  vmlinuz

引导文件说明:

  • vmlinuz,内核
  • initrd.img,驱动程序
  • vesamenu.c32,图形模块
  • splash.png,背景图片
# 部署网络引导菜单文件
[root@tftp ~ 18:46:36]# mkdir /var/lib/tftpboot/pxelinux.cfg
[root@tftp ~ 18:46:46]# cp /var/lib/tftpboot/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
# 修改网络引导菜单文件,大部分参数保持默认
[root@tftp ~ 18:47:53]# vim /var/lib/tftpboot/pxelinux.cfg/default
default vesamenu.c32 # 默认加载运行图形模块
timeout 30 # 设置为3秒,读秒的时间,单位1/10秒

display boot.msg

# Clear the screen when exiting the menu, instead of leaving the menu displayed.
# For vesamenu, this means the graphical background is still displayed without
# the menu itself for as long as the screen remains in graphics mode.
menu clear
menu background splash.png # 背景图片

# 修改标题内容如下
menu title PXE Server For CentOS 7

......

label linux
  menu label PXE ^Install CentOS 7
  menu default # 添加此条目,设置该label为默认启动条目
  kernel vmlinuz
  # append参数,ks指向应答文件位置
  append initrd=initrd.img inst.ks=http://10.1.8.23/ks.cfg

label check
  menu label Test this ^media & install CentOS 7
  # menu default # 注释该条目,取消作为默认启动条目
  kernel vmlinuz
  append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rd.live.check quiet
......

客户端测试

在这里插入图片描述

部署文件服务器

文件服务器可以使用以下服务实现:

  • httpd
  • vsftpd
  • nfs

我们这里使用 httpd 实现。

部署服务端

#### 部署 FILE 服务器
[root@file ~ 17:06:35]# yum install -y nginx
[root@file ~ 19:02:09]# echo '/dev/sr0 /usr/share/nginx/html/dvd iso9660 defaults        0 0' >> /etc/fstab
[root@file ~ 19:03:06]# mkdir /usr/share/nginx/html/dvd
[root@file ~ 19:03:59]# mount /dev/sr0 
mount: /dev/sr0 is write-protected, mounting read-only
[root@file ~ 19:04:03]# df /dev/sr0 
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sr0         4635056 4635056         0 100% /usr/share/nginx/html/dvd
[root@file ~ 19:04:29]# vim /etc/nginx/nginx.conf
.....
    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html;
        # 设置允许查看目录中文件清单
        autoindex on;
......
[root@file ~ 19:05:24]#  systemctl enable nginx.service --now


客户端测试
  • 测试web服务器,访问http://file.djf.cloud/。

在这里插入图片描述

部署应答文件

Kickstart 是一种 “自动化安装技术”—— 它通过一个 “Kickstart 配置文件(.cfg)” 定义 Linux 系统的安装参数(分区、密码、软件包等),再配合 HTTP/FTP/NFS 服务器(提供安装镜像)DHCP 服务器(分配 IP 和引导信息),共同实现 Linux 的无人值守安装。

示例:自定义一个web服务器应答文件。

[root@file ~ 19:05:50]# vim /usr/share/nginx/html/ks.cfg
#platform=x86, AMD64, 或 Intel EM64T
#version=DEVEL
# Install OS instead of upgrade
install
# Keyboard layouts
keyboard 'us'
# Root password
rootpw --iscrypted $1$yXvOeQqO$dk8Ms2JsWaatjNSSzJcdI.
# System language
lang en_US
# System authorization information
auth  --useshadow  --passalgo=sha512
# Use text mode install
text
firstboot --disable
# SELinux configuration
selinux --disabled

# Firewall configuration
firewall --enabled --http --service=http,https
# Network information
network --bootproto=static --device=ens32 --ip=10.1.8.100  --netmask=255.255.255.0 --gateway=10.1.8.2 --nameserver=223.5.5.5
# Reboot after installation
reboot
# System timezone
timezone Asia/Shanghai
# Use network installation
url --url="http://10.1.8.23/dvd"
# System bootloader configuration
bootloader --location=mbr
# Clear the Master Boot Record
zerombr
# Partition clearing information
clearpart --all --initlabel
# Disk partitioning information
part /boot --fstype="xfs" --size=1024
part swap --fstype="swap" --size=2048
part / --fstype="xfs" --grow --size=1

# 密码通过以下命令获取
# python -c 'import crypt; print(crypt.crypt("123", crypt.mksalt(crypt.METHOD_SHA512)))'
group --name=djf
user --name=djf --groups=wheel --password='$6$8XorqVZnJKEULFYd$rwPDYXneupINfPnAXyBwrBn50rjiGgvgh2CU6euumRGZQizeRNL2aimIY67ekAegkIRoPsstEz7k6pQo4eDoM0'

%post --interpreter=/bin/bash
curl -s -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -s -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum install -y httpd
systemctl enable httpd
echo Hello World > /var/www/html/index.html
echo "
This is a web server.
Be careful." >> /etc/issue
echo webapp.djf.cloud > /etc/hostname
%end

%packages
@^minimal
%end
[root@file ~ 19:07:58]#  systemctl restart nginx.service 

客户端测试

登录界面

在这里插入图片描述

web页面访问测试

在这里插入图片描述

总结

1. 部署 DHCP 服务器(核心:给客户端 “指路”)

目标:给待装机客户端分配 IP,同时告知客户端 TFTP 服务器地址和引导文件名称。

  • 安装 DHCP 服务:yum install -y dhcp
  • 替换配置文件:复制示例配置 cp /usr/share/doc/dhcp*/dhcpd.conf.example /etc/dhcp/dhcpd.conf
  • 关键配置(修改==/etc/dhcp/dhcpd.conf==):
    • 定义 IP 地址池:range 10.1.8.101 10.1.8.200(避免与固定 IP 冲突);
    • 指定引导文件:filename "pxelinux.0"(客户端需下载的 PXE 引导程序);
    • 指向 TFTP 服务器:next-server tftp.djf.cloud(告知客户端去哪里下载引导文件);
  • 启动服务:systemctl enable --now dhcpd
  • 测试:客户端开机可获取到 IP,说明 DHCP 部署成功。

2. 部署 TFTP 服务器(核心:提供 “引导文件”)

目标:让客户端通过 TFTP 协议下载引导程序、内核、初始化镜像和启动菜单。

  • 安装 TFTP 服务:yum install -y tftp-server
  • 启动服务并设开机自启:systemctl enable tftp.service --now(默认共享目录 /var/lib/tftpboot/);
  • 提供核心引导文件:
    • 安装 syslinux(获取 pxelinux.0):yum install -y syslinux
    • 复制引导程序:cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
  • 提取镜像引导文件:
    • 挂载 ISO 镜像:mount /dev/sr0 /dvd
    • 复制镜像中的引导文件到 TFTP 目录:cp /dvd/isolinux/* /var/lib/tftpboot/(含内核 vmlinuz、初始化镜像 initrd.img 等);
  • 配置启动菜单:
    • 创建菜单目录:mkdir /var/lib/tftpboot/pxelinux.cfg
    • 复制并修改菜单文件:cp /var/lib/tftpboot/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
    • 关键修改(default文件):
      • 设置默认启动项:menu default(指向 “PXE Install CentOS 7”);
      • 指定应答文件路径:append initrd=initrd.img inst.ks=http://10.1.8.23/ks.cfg(告知客户端去哪里下载 Kickstart 配置)。

3. 部署文件服务器(核心:提供 “安装镜像 + 应答文件”)

目标:通过 HTTP(Nginx)共享 Linux 安装镜像和 Kickstart 应答文件(ks.cfg),供客户端下载。

  • 安装 Nginx 服务:yum install -y nginx

  • 挂载 ISO 镜像到 Nginx 目录:

    • 创建挂载目录:mkdir /usr/share/nginx/html/dvd
    • 永久挂载:echo '/dev/sr0 /usr/share/nginx/html/dvd iso9660 defaults 0 0' >> /etc/fstab
    • 立即挂载:mount /dev/sr0
  • 配置 Nginx:修改 /etc/nginx/nginx.conf,添加 autoindex on(允许目录浏览,方便安装程序读取镜像文件);

  • 启动 Nginx 并设开机自启:systemctl enable nginx.service --now

  • 部署 Kickstart 应答文件(ks.cfg):

    • 创建 ks.cfg:

      vim /usr/share/nginx/html/ks.cfg
      

      (核心配置如下);

      • 安装源:url --url="http://10.1.8.23/dvd"(指向 Nginx 共享的镜像);
      • 系统配置:root 密码、静态 IP、分区方案、时区、关闭 SELinux 等;
      • 安装后脚本(% post):替换 yum 源、安装 httpd、设置主机名等;
      • 软件包:@^minimal(最小化安装);
  • 重启 Nginx 生效:systemctl restart nginx

  • 测试:浏览器访问 http://10.1.8.23/dvdhttp://10.1.8.23/ks.cfg,可正常访问说明部署成功。

4. 客户端自动装机测试

  • 待装机客户端(空白主机)设置从网络启动;
  • 开机后自动获取 IP → 下载 TFTP 中的引导文件和菜单 → 加载内核和初始化镜像 → 下载 ks.cfg → 按应答文件自动分区、安装系统、配置环境;
  • 安装完成后自动重启,最终得到配置好的 Linux 服务器(如示例中的 web 服务器,可访问 http://10.1.8.100 验证)。

核心逻辑串联

客户端通过 DHCP 拿 IP 和 TFTP 地址 → 从 TFTP 下载引导文件和启动菜单 → 按菜单配置下载内核、初始化镜像 → 从 HTTP 服务器下载 ks.cfg 和安装镜像 → 按 ks.cfg 自动完成安装和环境配置。

关键检查点

  1. DHCP 配置中 filenamenext-server 必须正确(指向 pxelinux.0 和 TFTP 服务器);
  2. TFTP 目录下必须有 pxelinux.0、vmlinuz、initrd.img 和 pxelinux.cfg/default;
  3. Nginx 共享的镜像目录(/dvd)需有完整的 ISO 解压文件(Packages、repodata 等);
  4. ks.cfg 中的安装源 URL 和应答文件路径必须可访问;

核心逻辑串联

客户端通过 DHCP 拿 IP 和 TFTP 地址 → 从 TFTP 下载引导文件和启动菜单 → 按菜单配置下载内核、初始化镜像 → 从 HTTP 服务器下载 ks.cfg 和安装镜像 → 按 ks.cfg 自动完成安装和环境配置。

关键检查点

  1. DHCP 配置中 filenamenext-server 必须正确(指向 pxelinux.0 和 TFTP 服务器);
  2. TFTP 目录下必须有 pxelinux.0、vmlinuz、initrd.img 和 pxelinux.cfg/default;
  3. Nginx 共享的镜像目录(/dvd)需有完整的 ISO 解压文件(Packages、repodata 等);
  4. ks.cfg 中的安装源 URL 和应答文件路径必须可访问;
  5. 所有服务器防火墙需开放对应端口(DHCP:UDP 67/68、TFTP:UDP 69、HTTP:TCP 80)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值